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]);
448 void r5c_make_stripe_write_out(struct stripe_head *sh)
450 struct r5conf *conf = sh->raid_conf;
455 WARN_ON(!test_bit(STRIPE_R5C_CACHING, &sh->state));
456 clear_bit(STRIPE_R5C_CACHING, &sh->state);
458 if (!test_and_set_bit(STRIPE_PREREAD_ACTIVE, &sh->state))
462 static void r5c_handle_data_cached(struct stripe_head *sh)
466 for (i = sh->disks; i--; )
467 if (test_and_clear_bit(R5_Wantwrite, &sh->dev[i].flags)) {
468 set_bit(R5_InJournal, &sh->dev[i].flags);
469 clear_bit(R5_LOCKED, &sh->dev[i].flags);
471 clear_bit(STRIPE_LOG_TRAPPED, &sh->state);
478 static void r5c_handle_parity_cached(struct stripe_head *sh)
482 for (i = sh->disks; i--; )
483 if (test_bit(R5_InJournal, &sh->dev[i].flags))
484 set_bit(R5_Wantwrite, &sh->dev[i].flags);
491 static void r5c_finish_cache_stripe(struct stripe_head *sh)
493 struct r5l_log *log = READ_ONCE(sh->raid_conf->log);
496 BUG_ON(test_bit(STRIPE_R5C_CACHING, &sh->state));
503 set_bit(R5_InJournal, &sh->dev[sh->pd_idx].flags);
504 } else if (test_bit(STRIPE_R5C_CACHING, &sh->state)) {
505 r5c_handle_data_cached(sh);
507 r5c_handle_parity_cached(sh);
508 set_bit(R5_InJournal, &sh->dev[sh->pd_idx].flags);
514 struct stripe_head *sh, *next;
516 list_for_each_entry_safe(sh, next, &io->stripe_list, log_list) {
517 list_del_init(&sh->log_list);
519 r5c_finish_cache_stripe(sh);
521 set_bit(STRIPE_HANDLE, &sh->state);
522 raid5_release_stripe(sh);
899 static int r5l_log_stripe(struct r5l_log *log, struct stripe_head *sh,
919 if (test_and_clear_bit(STRIPE_R5C_PREFLUSH, &sh->state))
922 for (i = 0; i < sh->disks; i++) {
923 if (!test_bit(R5_Wantwrite, &sh->dev[i].flags) ||
924 test_bit(R5_InJournal, &sh->dev[i].flags))
926 if (i == sh->pd_idx || i == sh->qd_idx)
928 if (test_bit(R5_WantFUA, &sh->dev[i].flags) &&
938 raid5_compute_blocknr(sh, i, 0),
939 sh->dev[i].log_checksum, 0, false);
940 r5l_append_payload_page(log, sh->dev[i].page);
945 sh->sector, sh->dev[sh->pd_idx].log_checksum,
946 sh->dev[sh->qd_idx].log_checksum, true);
947 r5l_append_payload_page(log, sh->dev[sh->pd_idx].page);
948 r5l_append_payload_page(log, sh->dev[sh->qd_idx].page);
951 sh->sector, sh->dev[sh->pd_idx].log_checksum,
953 r5l_append_payload_page(log, sh->dev[sh->pd_idx].page);
957 list_add_tail(&sh->log_list, &io->stripe_list);
959 sh->log_io = io;
964 if (sh->log_start == MaxSector) {
965 BUG_ON(!list_empty(&sh->r5c));
966 sh->log_start = io->log_start;
968 list_add_tail(&sh->r5c,
978 struct stripe_head *sh)
981 list_add_tail(&sh->log_list, &log->no_space_stripes);
989 int r5l_write_stripe(struct r5l_log *log, struct stripe_head *sh)
991 struct r5conf *conf = sh->raid_conf;
1002 if (sh->log_io || !test_bit(R5_Wantwrite, &sh->dev[sh->pd_idx].flags) ||
1003 test_bit(STRIPE_SYNCING, &sh->state)) {
1005 clear_bit(STRIPE_LOG_TRAPPED, &sh->state);
1009 WARN_ON(test_bit(STRIPE_R5C_CACHING, &sh->state));
1011 for (i = 0; i < sh->disks; i++) {
1014 if (!test_bit(R5_Wantwrite, &sh->dev[i].flags) ||
1015 test_bit(R5_InJournal, &sh->dev[i].flags))
1020 if (test_bit(STRIPE_LOG_TRAPPED, &sh->state))
1022 addr = kmap_local_page(sh->dev[i].page);
1023 sh->dev[i].log_checksum = crc32c_le(log->uuid_checksum,
1027 parity_pages = 1 + !!(sh->qd_idx >= 0);
1030 set_bit(STRIPE_LOG_TRAPPED, &sh->state);
1035 clear_bit(STRIPE_DELAYED, &sh->state);
1036 atomic_inc(&sh->count);
1044 r5l_add_no_space_stripe(log, sh);
1047 ret = r5l_log_stripe(log, sh, data_pages, parity_pages);
1050 list_add_tail(&sh->log_list,
1058 * not in cache yet (sh->log_start == MaxSector).
1061 sh->log_start == MaxSector) {
1062 r5l_add_no_space_stripe(log, sh);
1066 if (sh->log_start == log->last_checkpoint)
1069 r5l_add_no_space_stripe(log, sh);
1071 ret = r5l_log_stripe(log, sh, data_pages, parity_pages);
1074 list_add_tail(&sh->log_list,
1131 struct stripe_head *sh;
1135 sh = list_first_entry(&log->no_space_stripes,
1137 list_del_init(&sh->log_list);
1138 set_bit(STRIPE_HANDLE, &sh->state);
1139 raid5_release_stripe(sh);
1147 * for write back, returns log_start of first sh in stripe_in_journal_list
1151 struct stripe_head *sh;
1165 sh = list_first_entry(&log->stripe_in_journal_list,
1167 new_cp = sh->log_start;
1182 struct stripe_head *sh;
1187 sh = list_first_entry(&log->no_mem_stripes,
1189 list_del_init(&sh->log_list);
1190 set_bit(STRIPE_HANDLE, &sh->state);
1191 raid5_release_stripe(sh);
1241 void r5l_stripe_write_finished(struct stripe_head *sh)
1245 io = sh->log_io;
1246 sh->log_io = NULL;
1361 static void r5c_flush_stripe(struct r5conf *conf, struct stripe_head *sh)
1363 BUG_ON(list_empty(&sh->lru));
1364 BUG_ON(!test_bit(STRIPE_R5C_CACHING, &sh->state));
1365 BUG_ON(test_bit(STRIPE_HANDLE, &sh->state));
1371 BUG_ON(test_bit(STRIPE_ON_RELEASE_LIST, &sh->state));
1374 list_del_init(&sh->lru);
1375 atomic_inc(&sh->count);
1377 set_bit(STRIPE_HANDLE, &sh->state);
1379 r5c_make_stripe_write_out(sh);
1381 if (test_bit(STRIPE_R5C_PARTIAL_STRIPE, &sh->state))
1385 raid5_release_stripe(sh);
1397 struct stripe_head *sh, *next;
1404 list_for_each_entry_safe(sh, next, &conf->r5c_full_stripe_list, lru) {
1405 r5c_flush_stripe(conf, sh);
1411 list_for_each_entry_safe(sh, next,
1413 r5c_flush_stripe(conf, sh);
1422 struct stripe_head *sh;
1467 list_for_each_entry(sh, &log->stripe_in_journal_list, r5c) {
1476 if (!list_empty(&sh->lru) &&
1477 !test_bit(STRIPE_HANDLE, &sh->state) &&
1478 atomic_read(&sh->count) == 0) {
1479 r5c_flush_stripe(conf, sh);
1802 struct stripe_head *sh,
1813 &dd_idx, sh);
1814 r5l_recovery_read_page(log, ctx, sh->dev[dd_idx].page, log_offset);
1815 sh->dev[dd_idx].log_checksum =
1819 set_bit(R5_Wantwrite, &sh->dev[dd_idx].flags);
1820 set_bit(STRIPE_R5C_CACHING, &sh->state);
1824 struct stripe_head *sh,
1833 r5l_recovery_read_page(log, ctx, sh->dev[sh->pd_idx].page, log_offset);
1834 sh->dev[sh->pd_idx].log_checksum =
1836 set_bit(R5_Wantwrite, &sh->dev[sh->pd_idx].flags);
1838 if (sh->qd_idx >= 0) {
1840 log, ctx, sh->dev[sh->qd_idx].page,
1842 sh->dev[sh->qd_idx].log_checksum =
1844 set_bit(R5_Wantwrite, &sh->dev[sh->qd_idx].flags);
1846 clear_bit(STRIPE_R5C_CACHING, &sh->state);
1849 static void r5l_recovery_reset_stripe(struct stripe_head *sh)
1853 sh->state = 0;
1854 sh->log_start = MaxSector;
1855 for (i = sh->disks; i--; )
1856 sh->dev[i].flags = 0;
1861 struct stripe_head *sh,
1868 for (disk_index = 0; disk_index < sh->disks; disk_index++) {
1869 if (!test_bit(R5_Wantwrite, &sh->dev[disk_index].flags))
1871 if (disk_index == sh->qd_idx || disk_index == sh->pd_idx)
1884 for (disk_index = 0; disk_index < sh->disks; disk_index++) {
1885 if (!test_bit(R5_Wantwrite, &sh->dev[disk_index].flags))
1892 sync_page_io(rdev, sh->sector, PAGE_SIZE,
1893 sh->dev[disk_index].page, REQ_OP_WRITE,
1900 sync_page_io(rrdev, sh->sector, PAGE_SIZE,
1901 sh->dev[disk_index].page, REQ_OP_WRITE,
1908 r5l_recovery_reset_stripe(sh);
1917 struct stripe_head *sh;
1919 sh = raid5_get_active_stripe(conf, NULL, stripe_sect,
1921 if (!sh)
1924 r5l_recovery_reset_stripe(sh);
1926 return sh;
1932 struct stripe_head *sh;
1934 list_for_each_entry(sh, list, lru)
1935 if (sh->sector == sect)
1936 return sh;
1944 struct stripe_head *sh, *next;
1946 list_for_each_entry_safe(sh, next, cached_stripe_list, lru) {
1947 r5l_recovery_reset_stripe(sh);
1948 list_del_init(&sh->lru);
1949 raid5_release_stripe(sh);
1957 struct stripe_head *sh, *next;
1959 list_for_each_entry_safe(sh, next, cached_stripe_list, lru)
1960 if (!test_bit(STRIPE_R5C_CACHING, &sh->state)) {
1961 r5l_recovery_replay_one_stripe(sh->raid_conf, sh, ctx);
1962 list_del_init(&sh->lru);
1963 raid5_release_stripe(sh);
2074 struct stripe_head *sh;
2104 sh = r5c_recovery_lookup_stripe(cached_stripe_list,
2106 if (sh) {
2107 WARN_ON(test_bit(STRIPE_R5C_CACHING, &sh->state));
2108 r5l_recovery_reset_stripe(sh);
2109 list_del_init(&sh->lru);
2110 raid5_release_stripe(sh);
2126 sh = r5c_recovery_lookup_stripe(cached_stripe_list,
2129 if (!sh) {
2130 sh = r5c_recovery_alloc_stripe(conf, stripe_sect, 1);
2135 if (!sh) {
2138 sh = r5c_recovery_alloc_stripe(
2141 if (!sh) {
2156 sh = r5c_recovery_alloc_stripe(
2159 if (!sh) {
2164 list_add_tail(&sh->lru, cached_stripe_list);
2168 if (!test_bit(STRIPE_R5C_CACHING, &sh->state) &&
2169 test_bit(R5_Wantwrite, &sh->dev[sh->pd_idx].flags)) {
2170 r5l_recovery_replay_one_stripe(conf, sh, ctx);
2171 list_move_tail(&sh->lru, cached_stripe_list);
2173 r5l_recovery_load_data(log, sh, ctx, payload,
2176 r5l_recovery_load_parity(log, sh, ctx, payload,
2197 struct stripe_head *sh)
2202 for (i = sh->disks; i--; ) {
2203 dev = sh->dev + i;
2230 struct stripe_head *sh;
2259 list_for_each_entry(sh, &ctx->cached_list, lru) {
2260 WARN_ON(!test_bit(STRIPE_R5C_CACHING, &sh->state));
2261 r5c_recovery_load_one_stripe(log, sh);
2341 struct stripe_head *sh;
2355 list_for_each_entry(sh, &ctx->cached_list, lru) {
2361 WARN_ON(!test_bit(STRIPE_R5C_CACHING, &sh->state));
2368 for (i = sh->disks; i--; ) {
2369 struct r5dev *dev = &sh->dev[i];
2379 raid5_compute_blocknr(sh, i, 0));
2399 sh->log_start = ctx->pos;
2400 list_add_tail(&sh->r5c, &log->stripe_in_journal_list);
2404 next_checkpoint = sh->log_start;
2416 struct stripe_head *sh, *next;
2428 list_for_each_entry_safe(sh, next, &ctx->cached_list, lru) {
2429 r5c_make_stripe_write_out(sh);
2430 set_bit(STRIPE_HANDLE, &sh->state);
2431 list_del_init(&sh->lru);
2432 raid5_release_stripe(sh);
2624 struct stripe_head *sh,
2639 if (!test_bit(STRIPE_R5C_CACHING, &sh->state)) {
2657 set_bit(STRIPE_R5C_CACHING, &sh->state);
2668 if (s->failed || test_bit(STRIPE_SYNCING, &sh->state)) {
2669 r5c_make_stripe_write_out(sh);
2674 dev = &sh->dev[i];
2678 r5c_make_stripe_write_out(sh);
2684 if (!test_bit(STRIPE_R5C_PARTIAL_STRIPE, &sh->state) &&
2685 !test_bit(STRIPE_R5C_FULL_STRIPE, &sh->state)) {
2686 tree_index = r5c_tree_index(conf, sh->sector);
2707 r5c_make_stripe_write_out(sh);
2717 set_bit(STRIPE_R5C_PARTIAL_STRIPE, &sh->state);
2722 dev = &sh->dev[i];
2738 set_bit(STRIPE_LOG_TRAPPED, &sh->state);
2747 void r5c_release_extra_page(struct stripe_head *sh)
2749 struct r5conf *conf = sh->raid_conf;
2754 sh->dev[0].orig_page == conf->disks[0].extra_page;
2756 for (i = sh->disks; i--; )
2757 if (sh->dev[i].page != sh->dev[i].orig_page) {
2758 struct page *p = sh->dev[i].orig_page;
2760 sh->dev[i].orig_page = sh->dev[i].page;
2761 clear_bit(R5_OrigPageUPTDODATE, &sh->dev[i].flags);
2773 void r5c_use_extra_page(struct stripe_head *sh)
2775 struct r5conf *conf = sh->raid_conf;
2779 for (i = sh->disks; i--; ) {
2780 dev = &sh->dev[i];
2792 struct stripe_head *sh,
2801 if (!log || !test_bit(R5_InJournal, &sh->dev[sh->pd_idx].flags))
2804 WARN_ON(test_bit(STRIPE_R5C_CACHING, &sh->state));
2805 clear_bit(R5_InJournal, &sh->dev[sh->pd_idx].flags);
2810 for (i = sh->disks; i--; ) {
2811 clear_bit(R5_InJournal, &sh->dev[i].flags);
2812 if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags))
2813 wake_up_bit(&sh->dev[i].flags, R5_Overlap);
2822 if (test_and_clear_bit(STRIPE_FULL_WRITE, &sh->state))
2827 list_del_init(&sh->r5c);
2829 sh->log_start = MaxSector;
2835 if (test_bit(STRIPE_R5C_PARTIAL_STRIPE, &sh->state) ||
2836 test_bit(STRIPE_R5C_FULL_STRIPE, &sh->state)) {
2837 tree_index = r5c_tree_index(conf, sh->sector);
2854 if (test_and_clear_bit(STRIPE_R5C_PARTIAL_STRIPE, &sh->state)) {
2860 if (test_and_clear_bit(STRIPE_R5C_FULL_STRIPE, &sh->state)) {
2866 r5l_append_flush_payload(log, sh->sector);
2868 if (test_bit(STRIPE_SYNC_REQUESTED, &sh->state))
2869 set_bit(STRIPE_HANDLE, &sh->state);
2872 int r5c_cache_data(struct r5l_log *log, struct stripe_head *sh)
2874 struct r5conf *conf = sh->raid_conf;
2882 for (i = 0; i < sh->disks; i++) {
2885 if (!test_bit(R5_Wantwrite, &sh->dev[i].flags))
2887 addr = kmap_local_page(sh->dev[i].page);
2888 sh->dev[i].log_checksum = crc32c_le(log->uuid_checksum,
2899 clear_bit(STRIPE_DELAYED, &sh->state);
2900 atomic_inc(&sh->count);
2907 sh->log_start == MaxSector)
2908 r5l_add_no_space_stripe(log, sh);
2910 if (sh->log_start == log->last_checkpoint)
2913 r5l_add_no_space_stripe(log, sh);
2915 ret = r5l_log_stripe(log, sh, pages, 0);
2918 list_add_tail(&sh->log_list, &log->no_mem_stripes);