Lines Matching refs:sh

141 	/* all stripes in r5cache, in the order of seq at sh->log_start */
193 * sect: align_bi->bi_iter.bi_sector or sh->sector
308 struct stripe_head *sh, int disks)
312 for (i = sh->disks; i--; ) {
313 if (sh->dev[i].written) {
314 set_bit(R5_UPTODATE, &sh->dev[i].flags);
315 r5c_return_dev_pending_writes(conf, &sh->dev[i]);
316 md_bitmap_endwrite(conf->mddev->bitmap, sh->sector,
318 !test_bit(STRIPE_DEGRADED, &sh->state),
449 void r5c_make_stripe_write_out(struct stripe_head *sh)
451 struct r5conf *conf = sh->raid_conf;
456 WARN_ON(!test_bit(STRIPE_R5C_CACHING, &sh->state));
457 clear_bit(STRIPE_R5C_CACHING, &sh->state);
459 if (!test_and_set_bit(STRIPE_PREREAD_ACTIVE, &sh->state))
463 static void r5c_handle_data_cached(struct stripe_head *sh)
467 for (i = sh->disks; i--; )
468 if (test_and_clear_bit(R5_Wantwrite, &sh->dev[i].flags)) {
469 set_bit(R5_InJournal, &sh->dev[i].flags);
470 clear_bit(R5_LOCKED, &sh->dev[i].flags);
472 clear_bit(STRIPE_LOG_TRAPPED, &sh->state);
479 static void r5c_handle_parity_cached(struct stripe_head *sh)
483 for (i = sh->disks; i--; )
484 if (test_bit(R5_InJournal, &sh->dev[i].flags))
485 set_bit(R5_Wantwrite, &sh->dev[i].flags);
492 static void r5c_finish_cache_stripe(struct stripe_head *sh)
494 struct r5l_log *log = sh->raid_conf->log;
497 BUG_ON(test_bit(STRIPE_R5C_CACHING, &sh->state));
504 set_bit(R5_InJournal, &sh->dev[sh->pd_idx].flags);
505 } else if (test_bit(STRIPE_R5C_CACHING, &sh->state)) {
506 r5c_handle_data_cached(sh);
508 r5c_handle_parity_cached(sh);
509 set_bit(R5_InJournal, &sh->dev[sh->pd_idx].flags);
515 struct stripe_head *sh, *next;
517 list_for_each_entry_safe(sh, next, &io->stripe_list, log_list) {
518 list_del_init(&sh->log_list);
520 r5c_finish_cache_stripe(sh);
522 set_bit(STRIPE_HANDLE, &sh->state);
523 raid5_release_stripe(sh);
902 static int r5l_log_stripe(struct r5l_log *log, struct stripe_head *sh,
922 if (test_and_clear_bit(STRIPE_R5C_PREFLUSH, &sh->state))
925 for (i = 0; i < sh->disks; i++) {
926 if (!test_bit(R5_Wantwrite, &sh->dev[i].flags) ||
927 test_bit(R5_InJournal, &sh->dev[i].flags))
929 if (i == sh->pd_idx || i == sh->qd_idx)
931 if (test_bit(R5_WantFUA, &sh->dev[i].flags) &&
941 raid5_compute_blocknr(sh, i, 0),
942 sh->dev[i].log_checksum, 0, false);
943 r5l_append_payload_page(log, sh->dev[i].page);
948 sh->sector, sh->dev[sh->pd_idx].log_checksum,
949 sh->dev[sh->qd_idx].log_checksum, true);
950 r5l_append_payload_page(log, sh->dev[sh->pd_idx].page);
951 r5l_append_payload_page(log, sh->dev[sh->qd_idx].page);
954 sh->sector, sh->dev[sh->pd_idx].log_checksum,
956 r5l_append_payload_page(log, sh->dev[sh->pd_idx].page);
960 list_add_tail(&sh->log_list, &io->stripe_list);
962 sh->log_io = io;
967 if (sh->log_start == MaxSector) {
968 BUG_ON(!list_empty(&sh->r5c));
969 sh->log_start = io->log_start;
971 list_add_tail(&sh->r5c,
981 struct stripe_head *sh)
984 list_add_tail(&sh->log_list, &log->no_space_stripes);
992 int r5l_write_stripe(struct r5l_log *log, struct stripe_head *sh)
994 struct r5conf *conf = sh->raid_conf;
1005 if (sh->log_io || !test_bit(R5_Wantwrite, &sh->dev[sh->pd_idx].flags) ||
1006 test_bit(STRIPE_SYNCING, &sh->state)) {
1008 clear_bit(STRIPE_LOG_TRAPPED, &sh->state);
1012 WARN_ON(test_bit(STRIPE_R5C_CACHING, &sh->state));
1014 for (i = 0; i < sh->disks; i++) {
1017 if (!test_bit(R5_Wantwrite, &sh->dev[i].flags) ||
1018 test_bit(R5_InJournal, &sh->dev[i].flags))
1023 if (test_bit(STRIPE_LOG_TRAPPED, &sh->state))
1025 addr = kmap_atomic(sh->dev[i].page);
1026 sh->dev[i].log_checksum = crc32c_le(log->uuid_checksum,
1030 parity_pages = 1 + !!(sh->qd_idx >= 0);
1033 set_bit(STRIPE_LOG_TRAPPED, &sh->state);
1038 clear_bit(STRIPE_DELAYED, &sh->state);
1039 atomic_inc(&sh->count);
1047 r5l_add_no_space_stripe(log, sh);
1050 ret = r5l_log_stripe(log, sh, data_pages, parity_pages);
1053 list_add_tail(&sh->log_list,
1061 * not in cache yet (sh->log_start == MaxSector).
1064 sh->log_start == MaxSector) {
1065 r5l_add_no_space_stripe(log, sh);
1069 if (sh->log_start == log->last_checkpoint)
1072 r5l_add_no_space_stripe(log, sh);
1074 ret = r5l_log_stripe(log, sh, data_pages, parity_pages);
1077 list_add_tail(&sh->log_list,
1134 struct stripe_head *sh;
1138 sh = list_first_entry(&log->no_space_stripes,
1140 list_del_init(&sh->log_list);
1141 set_bit(STRIPE_HANDLE, &sh->state);
1142 raid5_release_stripe(sh);
1150 * for write back, returns log_start of first sh in stripe_in_journal_list
1154 struct stripe_head *sh;
1168 sh = list_first_entry(&conf->log->stripe_in_journal_list,
1170 new_cp = sh->log_start;
1185 struct stripe_head *sh;
1190 sh = list_first_entry(&log->no_mem_stripes,
1192 list_del_init(&sh->log_list);
1193 set_bit(STRIPE_HANDLE, &sh->state);
1194 raid5_release_stripe(sh);
1244 void r5l_stripe_write_finished(struct stripe_head *sh)
1248 io = sh->log_io;
1249 sh->log_io = NULL;
1364 static void r5c_flush_stripe(struct r5conf *conf, struct stripe_head *sh)
1366 BUG_ON(list_empty(&sh->lru));
1367 BUG_ON(!test_bit(STRIPE_R5C_CACHING, &sh->state));
1368 BUG_ON(test_bit(STRIPE_HANDLE, &sh->state));
1374 BUG_ON(test_bit(STRIPE_ON_RELEASE_LIST, &sh->state));
1377 list_del_init(&sh->lru);
1378 atomic_inc(&sh->count);
1380 set_bit(STRIPE_HANDLE, &sh->state);
1382 r5c_make_stripe_write_out(sh);
1384 if (test_bit(STRIPE_R5C_PARTIAL_STRIPE, &sh->state))
1388 raid5_release_stripe(sh);
1400 struct stripe_head *sh, *next;
1407 list_for_each_entry_safe(sh, next, &conf->r5c_full_stripe_list, lru) {
1408 r5c_flush_stripe(conf, sh);
1414 list_for_each_entry_safe(sh, next,
1416 r5c_flush_stripe(conf, sh);
1425 struct stripe_head *sh;
1470 list_for_each_entry(sh, &log->stripe_in_journal_list, r5c) {
1479 if (!list_empty(&sh->lru) &&
1480 !test_bit(STRIPE_HANDLE, &sh->state) &&
1481 atomic_read(&sh->count) == 0) {
1482 r5c_flush_stripe(conf, sh);
1811 struct stripe_head *sh,
1822 &dd_idx, sh);
1823 r5l_recovery_read_page(log, ctx, sh->dev[dd_idx].page, log_offset);
1824 sh->dev[dd_idx].log_checksum =
1828 set_bit(R5_Wantwrite, &sh->dev[dd_idx].flags);
1829 set_bit(STRIPE_R5C_CACHING, &sh->state);
1833 struct stripe_head *sh,
1842 r5l_recovery_read_page(log, ctx, sh->dev[sh->pd_idx].page, log_offset);
1843 sh->dev[sh->pd_idx].log_checksum =
1845 set_bit(R5_Wantwrite, &sh->dev[sh->pd_idx].flags);
1847 if (sh->qd_idx >= 0) {
1849 log, ctx, sh->dev[sh->qd_idx].page,
1851 sh->dev[sh->qd_idx].log_checksum =
1853 set_bit(R5_Wantwrite, &sh->dev[sh->qd_idx].flags);
1855 clear_bit(STRIPE_R5C_CACHING, &sh->state);
1858 static void r5l_recovery_reset_stripe(struct stripe_head *sh)
1862 sh->state = 0;
1863 sh->log_start = MaxSector;
1864 for (i = sh->disks; i--; )
1865 sh->dev[i].flags = 0;
1870 struct stripe_head *sh,
1877 for (disk_index = 0; disk_index < sh->disks; disk_index++) {
1878 if (!test_bit(R5_Wantwrite, &sh->dev[disk_index].flags))
1880 if (disk_index == sh->qd_idx || disk_index == sh->pd_idx)
1893 for (disk_index = 0; disk_index < sh->disks; disk_index++) {
1894 if (!test_bit(R5_Wantwrite, &sh->dev[disk_index].flags))
1903 sync_page_io(rdev, sh->sector, PAGE_SIZE,
1904 sh->dev[disk_index].page, REQ_OP_WRITE, 0,
1913 sync_page_io(rrdev, sh->sector, PAGE_SIZE,
1914 sh->dev[disk_index].page, REQ_OP_WRITE, 0,
1923 r5l_recovery_reset_stripe(sh);
1932 struct stripe_head *sh;
1934 sh = raid5_get_active_stripe(conf, stripe_sect, 0, noblock, 0);
1935 if (!sh)
1938 r5l_recovery_reset_stripe(sh);
1940 return sh;
1946 struct stripe_head *sh;
1948 list_for_each_entry(sh, list, lru)
1949 if (sh->sector == sect)
1950 return sh;
1958 struct stripe_head *sh, *next;
1960 list_for_each_entry_safe(sh, next, cached_stripe_list, lru) {
1961 r5l_recovery_reset_stripe(sh);
1962 list_del_init(&sh->lru);
1963 raid5_release_stripe(sh);
1971 struct stripe_head *sh, *next;
1973 list_for_each_entry_safe(sh, next, cached_stripe_list, lru)
1974 if (!test_bit(STRIPE_R5C_CACHING, &sh->state)) {
1975 r5l_recovery_replay_one_stripe(sh->raid_conf, sh, ctx);
1976 list_del_init(&sh->lru);
1977 raid5_release_stripe(sh);
2088 struct stripe_head *sh;
2118 sh = r5c_recovery_lookup_stripe(cached_stripe_list,
2120 if (sh) {
2121 WARN_ON(test_bit(STRIPE_R5C_CACHING, &sh->state));
2122 r5l_recovery_reset_stripe(sh);
2123 list_del_init(&sh->lru);
2124 raid5_release_stripe(sh);
2140 sh = r5c_recovery_lookup_stripe(cached_stripe_list,
2143 if (!sh) {
2144 sh = r5c_recovery_alloc_stripe(conf, stripe_sect, 1);
2149 if (!sh) {
2152 sh = r5c_recovery_alloc_stripe(
2155 if (!sh) {
2170 sh = r5c_recovery_alloc_stripe(
2173 if (!sh) {
2178 list_add_tail(&sh->lru, cached_stripe_list);
2182 if (!test_bit(STRIPE_R5C_CACHING, &sh->state) &&
2183 test_bit(R5_Wantwrite, &sh->dev[sh->pd_idx].flags)) {
2184 r5l_recovery_replay_one_stripe(conf, sh, ctx);
2185 list_move_tail(&sh->lru, cached_stripe_list);
2187 r5l_recovery_load_data(log, sh, ctx, payload,
2190 r5l_recovery_load_parity(log, sh, ctx, payload,
2211 struct stripe_head *sh)
2216 for (i = sh->disks; i--; ) {
2217 dev = sh->dev + i;
2244 struct stripe_head *sh;
2273 list_for_each_entry(sh, &ctx->cached_list, lru) {
2274 WARN_ON(!test_bit(STRIPE_R5C_CACHING, &sh->state));
2275 r5c_recovery_load_one_stripe(log, sh);
2355 struct stripe_head *sh;
2369 list_for_each_entry(sh, &ctx->cached_list, lru) {
2375 WARN_ON(!test_bit(STRIPE_R5C_CACHING, &sh->state));
2382 for (i = sh->disks; i--; ) {
2383 struct r5dev *dev = &sh->dev[i];
2393 raid5_compute_blocknr(sh, i, 0));
2413 sh->log_start = ctx->pos;
2414 list_add_tail(&sh->r5c, &log->stripe_in_journal_list);
2418 next_checkpoint = sh->log_start;
2430 struct stripe_head *sh, *next;
2442 list_for_each_entry_safe(sh, next, &ctx->cached_list, lru) {
2443 r5c_make_stripe_write_out(sh);
2444 set_bit(STRIPE_HANDLE, &sh->state);
2445 list_del_init(&sh->lru);
2446 raid5_release_stripe(sh);
2637 struct stripe_head *sh,
2652 if (!test_bit(STRIPE_R5C_CACHING, &sh->state)) {
2670 set_bit(STRIPE_R5C_CACHING, &sh->state);
2681 if (s->failed || test_bit(STRIPE_SYNCING, &sh->state)) {
2682 r5c_make_stripe_write_out(sh);
2687 dev = &sh->dev[i];
2691 r5c_make_stripe_write_out(sh);
2697 if (!test_bit(STRIPE_R5C_PARTIAL_STRIPE, &sh->state) &&
2698 !test_bit(STRIPE_R5C_FULL_STRIPE, &sh->state)) {
2699 tree_index = r5c_tree_index(conf, sh->sector);
2720 r5c_make_stripe_write_out(sh);
2730 set_bit(STRIPE_R5C_PARTIAL_STRIPE, &sh->state);
2735 dev = &sh->dev[i];
2751 set_bit(STRIPE_LOG_TRAPPED, &sh->state);
2760 void r5c_release_extra_page(struct stripe_head *sh)
2762 struct r5conf *conf = sh->raid_conf;
2767 sh->dev[0].orig_page == conf->disks[0].extra_page;
2769 for (i = sh->disks; i--; )
2770 if (sh->dev[i].page != sh->dev[i].orig_page) {
2771 struct page *p = sh->dev[i].orig_page;
2773 sh->dev[i].orig_page = sh->dev[i].page;
2774 clear_bit(R5_OrigPageUPTDODATE, &sh->dev[i].flags);
2786 void r5c_use_extra_page(struct stripe_head *sh)
2788 struct r5conf *conf = sh->raid_conf;
2792 for (i = sh->disks; i--; ) {
2793 dev = &sh->dev[i];
2805 struct stripe_head *sh,
2815 if (!log || !test_bit(R5_InJournal, &sh->dev[sh->pd_idx].flags))
2818 WARN_ON(test_bit(STRIPE_R5C_CACHING, &sh->state));
2819 clear_bit(R5_InJournal, &sh->dev[sh->pd_idx].flags);
2824 for (i = sh->disks; i--; ) {
2825 clear_bit(R5_InJournal, &sh->dev[i].flags);
2826 if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags))
2836 if (test_and_clear_bit(STRIPE_FULL_WRITE, &sh->state))
2844 list_del_init(&sh->r5c);
2846 sh->log_start = MaxSector;
2852 if (test_bit(STRIPE_R5C_PARTIAL_STRIPE, &sh->state) ||
2853 test_bit(STRIPE_R5C_FULL_STRIPE, &sh->state)) {
2854 tree_index = r5c_tree_index(conf, sh->sector);
2871 if (test_and_clear_bit(STRIPE_R5C_PARTIAL_STRIPE, &sh->state)) {
2877 if (test_and_clear_bit(STRIPE_R5C_FULL_STRIPE, &sh->state)) {
2883 r5l_append_flush_payload(log, sh->sector);
2885 if (test_bit(STRIPE_SYNC_REQUESTED, &sh->state))
2886 set_bit(STRIPE_HANDLE, &sh->state);
2889 int r5c_cache_data(struct r5l_log *log, struct stripe_head *sh)
2891 struct r5conf *conf = sh->raid_conf;
2899 for (i = 0; i < sh->disks; i++) {
2902 if (!test_bit(R5_Wantwrite, &sh->dev[i].flags))
2904 addr = kmap_atomic(sh->dev[i].page);
2905 sh->dev[i].log_checksum = crc32c_le(log->uuid_checksum,
2916 clear_bit(STRIPE_DELAYED, &sh->state);
2917 atomic_inc(&sh->count);
2924 sh->log_start == MaxSector)
2925 r5l_add_no_space_stripe(log, sh);
2927 if (sh->log_start == log->last_checkpoint)
2930 r5l_add_no_space_stripe(log, sh);
2932 ret = r5l_log_stripe(log, sh, pages, 0);
2935 list_add_tail(&sh->log_list, &log->no_mem_stripes);