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);
901 static int r5l_log_stripe(struct r5l_log *log, struct stripe_head *sh,
921 if (test_and_clear_bit(STRIPE_R5C_PREFLUSH, &sh->state))
924 for (i = 0; i < sh->disks; i++) {
925 if (!test_bit(R5_Wantwrite, &sh->dev[i].flags) ||
926 test_bit(R5_InJournal, &sh->dev[i].flags))
928 if (i == sh->pd_idx || i == sh->qd_idx)
930 if (test_bit(R5_WantFUA, &sh->dev[i].flags) &&
940 raid5_compute_blocknr(sh, i, 0),
941 sh->dev[i].log_checksum, 0, false);
942 r5l_append_payload_page(log, sh->dev[i].page);
947 sh->sector, sh->dev[sh->pd_idx].log_checksum,
948 sh->dev[sh->qd_idx].log_checksum, true);
949 r5l_append_payload_page(log, sh->dev[sh->pd_idx].page);
950 r5l_append_payload_page(log, sh->dev[sh->qd_idx].page);
953 sh->sector, sh->dev[sh->pd_idx].log_checksum,
955 r5l_append_payload_page(log, sh->dev[sh->pd_idx].page);
959 list_add_tail(&sh->log_list, &io->stripe_list);
961 sh->log_io = io;
966 if (sh->log_start == MaxSector) {
967 BUG_ON(!list_empty(&sh->r5c));
968 sh->log_start = io->log_start;
970 list_add_tail(&sh->r5c,
980 struct stripe_head *sh)
983 list_add_tail(&sh->log_list, &log->no_space_stripes);
991 int r5l_write_stripe(struct r5l_log *log, struct stripe_head *sh)
993 struct r5conf *conf = sh->raid_conf;
1004 if (sh->log_io || !test_bit(R5_Wantwrite, &sh->dev[sh->pd_idx].flags) ||
1005 test_bit(STRIPE_SYNCING, &sh->state)) {
1007 clear_bit(STRIPE_LOG_TRAPPED, &sh->state);
1011 WARN_ON(test_bit(STRIPE_R5C_CACHING, &sh->state));
1013 for (i = 0; i < sh->disks; i++) {
1016 if (!test_bit(R5_Wantwrite, &sh->dev[i].flags) ||
1017 test_bit(R5_InJournal, &sh->dev[i].flags))
1022 if (test_bit(STRIPE_LOG_TRAPPED, &sh->state))
1024 addr = kmap_atomic(sh->dev[i].page);
1025 sh->dev[i].log_checksum = crc32c_le(log->uuid_checksum,
1029 parity_pages = 1 + !!(sh->qd_idx >= 0);
1032 set_bit(STRIPE_LOG_TRAPPED, &sh->state);
1037 clear_bit(STRIPE_DELAYED, &sh->state);
1038 atomic_inc(&sh->count);
1046 r5l_add_no_space_stripe(log, sh);
1049 ret = r5l_log_stripe(log, sh, data_pages, parity_pages);
1052 list_add_tail(&sh->log_list,
1060 * not in cache yet (sh->log_start == MaxSector).
1063 sh->log_start == MaxSector) {
1064 r5l_add_no_space_stripe(log, sh);
1068 if (sh->log_start == log->last_checkpoint)
1071 r5l_add_no_space_stripe(log, sh);
1073 ret = r5l_log_stripe(log, sh, data_pages, parity_pages);
1076 list_add_tail(&sh->log_list,
1133 struct stripe_head *sh;
1137 sh = list_first_entry(&log->no_space_stripes,
1139 list_del_init(&sh->log_list);
1140 set_bit(STRIPE_HANDLE, &sh->state);
1141 raid5_release_stripe(sh);
1149 * for write back, returns log_start of first sh in stripe_in_journal_list
1153 struct stripe_head *sh;
1167 sh = list_first_entry(&conf->log->stripe_in_journal_list,
1169 new_cp = sh->log_start;
1184 struct stripe_head *sh;
1189 sh = list_first_entry(&log->no_mem_stripes,
1191 list_del_init(&sh->log_list);
1192 set_bit(STRIPE_HANDLE, &sh->state);
1193 raid5_release_stripe(sh);
1243 void r5l_stripe_write_finished(struct stripe_head *sh)
1247 io = sh->log_io;
1248 sh->log_io = NULL;
1363 static void r5c_flush_stripe(struct r5conf *conf, struct stripe_head *sh)
1365 BUG_ON(list_empty(&sh->lru));
1366 BUG_ON(!test_bit(STRIPE_R5C_CACHING, &sh->state));
1367 BUG_ON(test_bit(STRIPE_HANDLE, &sh->state));
1373 BUG_ON(test_bit(STRIPE_ON_RELEASE_LIST, &sh->state));
1376 list_del_init(&sh->lru);
1377 atomic_inc(&sh->count);
1379 set_bit(STRIPE_HANDLE, &sh->state);
1381 r5c_make_stripe_write_out(sh);
1383 if (test_bit(STRIPE_R5C_PARTIAL_STRIPE, &sh->state))
1387 raid5_release_stripe(sh);
1399 struct stripe_head *sh, *next;
1406 list_for_each_entry_safe(sh, next, &conf->r5c_full_stripe_list, lru) {
1407 r5c_flush_stripe(conf, sh);
1413 list_for_each_entry_safe(sh, next,
1415 r5c_flush_stripe(conf, sh);
1424 struct stripe_head *sh;
1469 list_for_each_entry(sh, &log->stripe_in_journal_list, r5c) {
1478 if (!list_empty(&sh->lru) &&
1479 !test_bit(STRIPE_HANDLE, &sh->state) &&
1480 atomic_read(&sh->count) == 0) {
1481 r5c_flush_stripe(conf, sh);
1804 struct stripe_head *sh,
1815 &dd_idx, sh);
1816 r5l_recovery_read_page(log, ctx, sh->dev[dd_idx].page, log_offset);
1817 sh->dev[dd_idx].log_checksum =
1821 set_bit(R5_Wantwrite, &sh->dev[dd_idx].flags);
1822 set_bit(STRIPE_R5C_CACHING, &sh->state);
1826 struct stripe_head *sh,
1835 r5l_recovery_read_page(log, ctx, sh->dev[sh->pd_idx].page, log_offset);
1836 sh->dev[sh->pd_idx].log_checksum =
1838 set_bit(R5_Wantwrite, &sh->dev[sh->pd_idx].flags);
1840 if (sh->qd_idx >= 0) {
1842 log, ctx, sh->dev[sh->qd_idx].page,
1844 sh->dev[sh->qd_idx].log_checksum =
1846 set_bit(R5_Wantwrite, &sh->dev[sh->qd_idx].flags);
1848 clear_bit(STRIPE_R5C_CACHING, &sh->state);
1851 static void r5l_recovery_reset_stripe(struct stripe_head *sh)
1855 sh->state = 0;
1856 sh->log_start = MaxSector;
1857 for (i = sh->disks; i--; )
1858 sh->dev[i].flags = 0;
1863 struct stripe_head *sh,
1870 for (disk_index = 0; disk_index < sh->disks; disk_index++) {
1871 if (!test_bit(R5_Wantwrite, &sh->dev[disk_index].flags))
1873 if (disk_index == sh->qd_idx || disk_index == sh->pd_idx)
1886 for (disk_index = 0; disk_index < sh->disks; disk_index++) {
1887 if (!test_bit(R5_Wantwrite, &sh->dev[disk_index].flags))
1896 sync_page_io(rdev, sh->sector, PAGE_SIZE,
1897 sh->dev[disk_index].page, REQ_OP_WRITE,
1906 sync_page_io(rrdev, sh->sector, PAGE_SIZE,
1907 sh->dev[disk_index].page, REQ_OP_WRITE,
1916 r5l_recovery_reset_stripe(sh);
1925 struct stripe_head *sh;
1927 sh = raid5_get_active_stripe(conf, NULL, stripe_sect,
1929 if (!sh)
1932 r5l_recovery_reset_stripe(sh);
1934 return sh;
1940 struct stripe_head *sh;
1942 list_for_each_entry(sh, list, lru)
1943 if (sh->sector == sect)
1944 return sh;
1952 struct stripe_head *sh, *next;
1954 list_for_each_entry_safe(sh, next, cached_stripe_list, lru) {
1955 r5l_recovery_reset_stripe(sh);
1956 list_del_init(&sh->lru);
1957 raid5_release_stripe(sh);
1965 struct stripe_head *sh, *next;
1967 list_for_each_entry_safe(sh, next, cached_stripe_list, lru)
1968 if (!test_bit(STRIPE_R5C_CACHING, &sh->state)) {
1969 r5l_recovery_replay_one_stripe(sh->raid_conf, sh, ctx);
1970 list_del_init(&sh->lru);
1971 raid5_release_stripe(sh);
2082 struct stripe_head *sh;
2112 sh = r5c_recovery_lookup_stripe(cached_stripe_list,
2114 if (sh) {
2115 WARN_ON(test_bit(STRIPE_R5C_CACHING, &sh->state));
2116 r5l_recovery_reset_stripe(sh);
2117 list_del_init(&sh->lru);
2118 raid5_release_stripe(sh);
2134 sh = r5c_recovery_lookup_stripe(cached_stripe_list,
2137 if (!sh) {
2138 sh = r5c_recovery_alloc_stripe(conf, stripe_sect, 1);
2143 if (!sh) {
2146 sh = r5c_recovery_alloc_stripe(
2149 if (!sh) {
2164 sh = r5c_recovery_alloc_stripe(
2167 if (!sh) {
2172 list_add_tail(&sh->lru, cached_stripe_list);
2176 if (!test_bit(STRIPE_R5C_CACHING, &sh->state) &&
2177 test_bit(R5_Wantwrite, &sh->dev[sh->pd_idx].flags)) {
2178 r5l_recovery_replay_one_stripe(conf, sh, ctx);
2179 list_move_tail(&sh->lru, cached_stripe_list);
2181 r5l_recovery_load_data(log, sh, ctx, payload,
2184 r5l_recovery_load_parity(log, sh, ctx, payload,
2205 struct stripe_head *sh)
2210 for (i = sh->disks; i--; ) {
2211 dev = sh->dev + i;
2238 struct stripe_head *sh;
2267 list_for_each_entry(sh, &ctx->cached_list, lru) {
2268 WARN_ON(!test_bit(STRIPE_R5C_CACHING, &sh->state));
2269 r5c_recovery_load_one_stripe(log, sh);
2349 struct stripe_head *sh;
2363 list_for_each_entry(sh, &ctx->cached_list, lru) {
2369 WARN_ON(!test_bit(STRIPE_R5C_CACHING, &sh->state));
2376 for (i = sh->disks; i--; ) {
2377 struct r5dev *dev = &sh->dev[i];
2387 raid5_compute_blocknr(sh, i, 0));
2407 sh->log_start = ctx->pos;
2408 list_add_tail(&sh->r5c, &log->stripe_in_journal_list);
2412 next_checkpoint = sh->log_start;
2424 struct stripe_head *sh, *next;
2436 list_for_each_entry_safe(sh, next, &ctx->cached_list, lru) {
2437 r5c_make_stripe_write_out(sh);
2438 set_bit(STRIPE_HANDLE, &sh->state);
2439 list_del_init(&sh->lru);
2440 raid5_release_stripe(sh);
2634 struct stripe_head *sh,
2649 if (!test_bit(STRIPE_R5C_CACHING, &sh->state)) {
2667 set_bit(STRIPE_R5C_CACHING, &sh->state);
2678 if (s->failed || test_bit(STRIPE_SYNCING, &sh->state)) {
2679 r5c_make_stripe_write_out(sh);
2684 dev = &sh->dev[i];
2688 r5c_make_stripe_write_out(sh);
2694 if (!test_bit(STRIPE_R5C_PARTIAL_STRIPE, &sh->state) &&
2695 !test_bit(STRIPE_R5C_FULL_STRIPE, &sh->state)) {
2696 tree_index = r5c_tree_index(conf, sh->sector);
2717 r5c_make_stripe_write_out(sh);
2727 set_bit(STRIPE_R5C_PARTIAL_STRIPE, &sh->state);
2732 dev = &sh->dev[i];
2748 set_bit(STRIPE_LOG_TRAPPED, &sh->state);
2757 void r5c_release_extra_page(struct stripe_head *sh)
2759 struct r5conf *conf = sh->raid_conf;
2764 sh->dev[0].orig_page == conf->disks[0].extra_page;
2766 for (i = sh->disks; i--; )
2767 if (sh->dev[i].page != sh->dev[i].orig_page) {
2768 struct page *p = sh->dev[i].orig_page;
2770 sh->dev[i].orig_page = sh->dev[i].page;
2771 clear_bit(R5_OrigPageUPTDODATE, &sh->dev[i].flags);
2783 void r5c_use_extra_page(struct stripe_head *sh)
2785 struct r5conf *conf = sh->raid_conf;
2789 for (i = sh->disks; i--; ) {
2790 dev = &sh->dev[i];
2802 struct stripe_head *sh,
2812 if (!log || !test_bit(R5_InJournal, &sh->dev[sh->pd_idx].flags))
2815 WARN_ON(test_bit(STRIPE_R5C_CACHING, &sh->state));
2816 clear_bit(R5_InJournal, &sh->dev[sh->pd_idx].flags);
2821 for (i = sh->disks; i--; ) {
2822 clear_bit(R5_InJournal, &sh->dev[i].flags);
2823 if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags))
2833 if (test_and_clear_bit(STRIPE_FULL_WRITE, &sh->state))
2841 list_del_init(&sh->r5c);
2843 sh->log_start = MaxSector;
2849 if (test_bit(STRIPE_R5C_PARTIAL_STRIPE, &sh->state) ||
2850 test_bit(STRIPE_R5C_FULL_STRIPE, &sh->state)) {
2851 tree_index = r5c_tree_index(conf, sh->sector);
2868 if (test_and_clear_bit(STRIPE_R5C_PARTIAL_STRIPE, &sh->state)) {
2874 if (test_and_clear_bit(STRIPE_R5C_FULL_STRIPE, &sh->state)) {
2880 r5l_append_flush_payload(log, sh->sector);
2882 if (test_bit(STRIPE_SYNC_REQUESTED, &sh->state))
2883 set_bit(STRIPE_HANDLE, &sh->state);
2886 int r5c_cache_data(struct r5l_log *log, struct stripe_head *sh)
2888 struct r5conf *conf = sh->raid_conf;
2896 for (i = 0; i < sh->disks; i++) {
2899 if (!test_bit(R5_Wantwrite, &sh->dev[i].flags))
2901 addr = kmap_atomic(sh->dev[i].page);
2902 sh->dev[i].log_checksum = crc32c_le(log->uuid_checksum,
2913 clear_bit(STRIPE_DELAYED, &sh->state);
2914 atomic_inc(&sh->count);
2921 sh->log_start == MaxSector)
2922 r5l_add_no_space_stripe(log, sh);
2924 if (sh->log_start == log->last_checkpoint)
2927 r5l_add_no_space_stripe(log, sh);
2929 ret = r5l_log_stripe(log, sh, pages, 0);
2932 list_add_tail(&sh->log_list, &log->no_mem_stripes);