• Home
  • Raw
  • Download

Lines Matching full:stripe

96 	 * Set for data stripes if it's triggered from P/Q stripe.
125 * How many data/meta extents are in this stripe. Only for scrub status
136 * Indicate the states of the stripe. Bits are defined in
145 * The errors hit during the initial read of the stripe.
180 * Checksum for the whole stripe if this stripe is inside a data block
235 static void release_scrub_stripe(struct scrub_stripe *stripe) in release_scrub_stripe() argument
237 if (!stripe) in release_scrub_stripe()
241 if (stripe->pages[i]) in release_scrub_stripe()
242 __free_page(stripe->pages[i]); in release_scrub_stripe()
243 stripe->pages[i] = NULL; in release_scrub_stripe()
245 kfree(stripe->sectors); in release_scrub_stripe()
246 kfree(stripe->csums); in release_scrub_stripe()
247 stripe->sectors = NULL; in release_scrub_stripe()
248 stripe->csums = NULL; in release_scrub_stripe()
249 stripe->sctx = NULL; in release_scrub_stripe()
250 stripe->state = 0; in release_scrub_stripe()
254 struct scrub_stripe *stripe) in init_scrub_stripe() argument
258 memset(stripe, 0, sizeof(*stripe)); in init_scrub_stripe()
260 stripe->nr_sectors = BTRFS_STRIPE_LEN >> fs_info->sectorsize_bits; in init_scrub_stripe()
261 stripe->state = 0; in init_scrub_stripe()
263 init_waitqueue_head(&stripe->io_wait); in init_scrub_stripe()
264 init_waitqueue_head(&stripe->repair_wait); in init_scrub_stripe()
265 atomic_set(&stripe->pending_io, 0); in init_scrub_stripe()
266 spin_lock_init(&stripe->write_error_lock); in init_scrub_stripe()
268 ret = btrfs_alloc_page_array(SCRUB_STRIPE_PAGES, stripe->pages); in init_scrub_stripe()
272 stripe->sectors = kcalloc(stripe->nr_sectors, in init_scrub_stripe()
275 if (!stripe->sectors) in init_scrub_stripe()
278 stripe->csums = kcalloc(BTRFS_STRIPE_LEN >> fs_info->sectorsize_bits, in init_scrub_stripe()
280 if (!stripe->csums) in init_scrub_stripe()
284 release_scrub_stripe(stripe); in init_scrub_stripe()
288 static void wait_scrub_stripe_io(struct scrub_stripe *stripe) in wait_scrub_stripe_io() argument
290 wait_event(stripe->io_wait, atomic_read(&stripe->pending_io) == 0); in wait_scrub_stripe_io()
586 static struct page *scrub_stripe_get_page(struct scrub_stripe *stripe, int sector_nr) in scrub_stripe_get_page() argument
588 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_stripe_get_page()
591 return stripe->pages[page_index]; in scrub_stripe_get_page()
594 static unsigned int scrub_stripe_get_page_offset(struct scrub_stripe *stripe, in scrub_stripe_get_page_offset() argument
597 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_stripe_get_page_offset()
602 static void scrub_verify_one_metadata(struct scrub_stripe *stripe, int sector_nr) in scrub_verify_one_metadata() argument
604 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_verify_one_metadata()
606 const u64 logical = stripe->logical + (sector_nr << fs_info->sectorsize_bits); in scrub_verify_one_metadata()
607 const struct page *first_page = scrub_stripe_get_page(stripe, sector_nr); in scrub_verify_one_metadata()
608 const unsigned int first_off = scrub_stripe_get_page_offset(stripe, sector_nr); in scrub_verify_one_metadata()
623 bitmap_set(&stripe->meta_error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
624 bitmap_set(&stripe->error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
627 logical, stripe->mirror_num, in scrub_verify_one_metadata()
633 bitmap_set(&stripe->meta_error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
634 bitmap_set(&stripe->error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
637 logical, stripe->mirror_num, in scrub_verify_one_metadata()
643 bitmap_set(&stripe->meta_error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
644 bitmap_set(&stripe->error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
647 logical, stripe->mirror_num, in scrub_verify_one_metadata()
659 struct page *page = scrub_stripe_get_page(stripe, i); in scrub_verify_one_metadata()
660 unsigned int page_off = scrub_stripe_get_page_offset(stripe, i); in scrub_verify_one_metadata()
668 bitmap_set(&stripe->meta_error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
669 bitmap_set(&stripe->error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
672 logical, stripe->mirror_num, in scrub_verify_one_metadata()
677 if (stripe->sectors[sector_nr].generation != in scrub_verify_one_metadata()
679 bitmap_set(&stripe->meta_gen_error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
680 bitmap_set(&stripe->error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
683 logical, stripe->mirror_num, in scrub_verify_one_metadata()
685 stripe->sectors[sector_nr].generation); in scrub_verify_one_metadata()
688 bitmap_clear(&stripe->error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
689 bitmap_clear(&stripe->csum_error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
690 bitmap_clear(&stripe->meta_error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
691 bitmap_clear(&stripe->meta_gen_error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
694 static void scrub_verify_one_sector(struct scrub_stripe *stripe, int sector_nr) in scrub_verify_one_sector() argument
696 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_verify_one_sector()
697 struct scrub_sector_verification *sector = &stripe->sectors[sector_nr]; in scrub_verify_one_sector()
699 struct page *page = scrub_stripe_get_page(stripe, sector_nr); in scrub_verify_one_sector()
700 unsigned int pgoff = scrub_stripe_get_page_offset(stripe, sector_nr); in scrub_verify_one_sector()
704 ASSERT(sector_nr >= 0 && sector_nr < stripe->nr_sectors); in scrub_verify_one_sector()
707 if (!test_bit(sector_nr, &stripe->extent_sector_bitmap)) in scrub_verify_one_sector()
711 if (test_bit(sector_nr, &stripe->io_error_bitmap)) in scrub_verify_one_sector()
717 * Check if the tree block crosses the stripe boudary. If in scrub_verify_one_sector()
722 * are not ensured to be stripe aligned. in scrub_verify_one_sector()
724 if (unlikely(sector_nr + sectors_per_tree > stripe->nr_sectors)) { in scrub_verify_one_sector()
726 "tree block at %llu crosses stripe boundary %llu", in scrub_verify_one_sector()
727 stripe->logical + in scrub_verify_one_sector()
729 stripe->logical); in scrub_verify_one_sector()
732 scrub_verify_one_metadata(stripe, sector_nr); in scrub_verify_one_sector()
741 clear_bit(sector_nr, &stripe->error_bitmap); in scrub_verify_one_sector()
747 set_bit(sector_nr, &stripe->csum_error_bitmap); in scrub_verify_one_sector()
748 set_bit(sector_nr, &stripe->error_bitmap); in scrub_verify_one_sector()
750 clear_bit(sector_nr, &stripe->csum_error_bitmap); in scrub_verify_one_sector()
751 clear_bit(sector_nr, &stripe->error_bitmap); in scrub_verify_one_sector()
755 /* Verify specified sectors of a stripe. */
756 static void scrub_verify_one_stripe(struct scrub_stripe *stripe, unsigned long bitmap) in scrub_verify_one_stripe() argument
758 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_verify_one_stripe()
762 for_each_set_bit(sector_nr, &bitmap, stripe->nr_sectors) { in scrub_verify_one_stripe()
763 scrub_verify_one_sector(stripe, sector_nr); in scrub_verify_one_stripe()
764 if (stripe->sectors[sector_nr].is_metadata) in scrub_verify_one_stripe()
769 static int calc_sector_number(struct scrub_stripe *stripe, struct bio_vec *first_bvec) in calc_sector_number() argument
773 for (i = 0; i < stripe->nr_sectors; i++) { in calc_sector_number()
774 if (scrub_stripe_get_page(stripe, i) == first_bvec->bv_page && in calc_sector_number()
775 scrub_stripe_get_page_offset(stripe, i) == first_bvec->bv_offset) in calc_sector_number()
778 ASSERT(i < stripe->nr_sectors); in calc_sector_number()
790 struct scrub_stripe *stripe = bbio->private; in scrub_repair_read_endio() local
791 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_repair_read_endio()
793 int sector_nr = calc_sector_number(stripe, bio_first_bvec_all(&bbio->bio)); in scrub_repair_read_endio()
797 ASSERT(sector_nr < stripe->nr_sectors); in scrub_repair_read_endio()
803 bitmap_set(&stripe->io_error_bitmap, sector_nr, in scrub_repair_read_endio()
805 bitmap_set(&stripe->error_bitmap, sector_nr, in scrub_repair_read_endio()
808 bitmap_clear(&stripe->io_error_bitmap, sector_nr, in scrub_repair_read_endio()
812 if (atomic_dec_and_test(&stripe->pending_io)) in scrub_repair_read_endio()
813 wake_up(&stripe->io_wait); in scrub_repair_read_endio()
822 static void scrub_stripe_submit_repair_read(struct scrub_stripe *stripe, in scrub_stripe_submit_repair_read() argument
825 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_stripe_submit_repair_read()
827 const unsigned long old_error_bitmap = stripe->error_bitmap; in scrub_stripe_submit_repair_read()
830 ASSERT(stripe->mirror_num >= 1); in scrub_stripe_submit_repair_read()
831 ASSERT(atomic_read(&stripe->pending_io) == 0); in scrub_stripe_submit_repair_read()
833 for_each_set_bit(i, &old_error_bitmap, stripe->nr_sectors) { in scrub_stripe_submit_repair_read()
838 page = scrub_stripe_get_page(stripe, i); in scrub_stripe_submit_repair_read()
839 pgoff = scrub_stripe_get_page_offset(stripe, i); in scrub_stripe_submit_repair_read()
842 if (bbio && ((i > 0 && !test_bit(i - 1, &stripe->error_bitmap)) || in scrub_stripe_submit_repair_read()
845 atomic_inc(&stripe->pending_io); in scrub_stripe_submit_repair_read()
848 wait_scrub_stripe_io(stripe); in scrub_stripe_submit_repair_read()
853 bbio = btrfs_bio_alloc(stripe->nr_sectors, REQ_OP_READ, in scrub_stripe_submit_repair_read()
854 fs_info, scrub_repair_read_endio, stripe); in scrub_stripe_submit_repair_read()
855 bbio->bio.bi_iter.bi_sector = (stripe->logical + in scrub_stripe_submit_repair_read()
864 atomic_inc(&stripe->pending_io); in scrub_stripe_submit_repair_read()
867 wait_scrub_stripe_io(stripe); in scrub_stripe_submit_repair_read()
872 struct scrub_stripe *stripe) in scrub_stripe_report_errors() argument
885 if (test_bit(SCRUB_STRIPE_FLAG_NO_REPORT, &stripe->state)) in scrub_stripe_report_errors()
894 if (!bitmap_empty(&stripe->init_error_bitmap, stripe->nr_sectors)) { in scrub_stripe_report_errors()
897 int stripe_index = stripe->mirror_num - 1; in scrub_stripe_report_errors()
901 ASSERT(stripe->mirror_num >= 1); in scrub_stripe_report_errors()
903 stripe->logical, &mapped_len, &bioc, in scrub_stripe_report_errors()
917 for_each_set_bit(sector_nr, &stripe->extent_sector_bitmap, stripe->nr_sectors) { in scrub_stripe_report_errors()
920 if (stripe->sectors[sector_nr].is_metadata) { in scrub_stripe_report_errors()
924 if (!stripe->sectors[sector_nr].csum) in scrub_stripe_report_errors()
928 if (test_bit(sector_nr, &stripe->init_error_bitmap) && in scrub_stripe_report_errors()
929 !test_bit(sector_nr, &stripe->error_bitmap)) { in scrub_stripe_report_errors()
935 if (!test_bit(sector_nr, &stripe->init_error_bitmap)) in scrub_stripe_report_errors()
946 stripe->logical, btrfs_dev_name(dev), in scrub_stripe_report_errors()
951 stripe->logical, stripe->mirror_num); in scrub_stripe_report_errors()
960 stripe->logical, btrfs_dev_name(dev), in scrub_stripe_report_errors()
965 stripe->logical, stripe->mirror_num); in scrub_stripe_report_errors()
968 if (test_bit(sector_nr, &stripe->io_error_bitmap)) in scrub_stripe_report_errors()
971 stripe->logical, physical); in scrub_stripe_report_errors()
972 if (test_bit(sector_nr, &stripe->csum_error_bitmap)) in scrub_stripe_report_errors()
975 stripe->logical, physical); in scrub_stripe_report_errors()
976 if (test_bit(sector_nr, &stripe->meta_error_bitmap)) in scrub_stripe_report_errors()
979 stripe->logical, physical); in scrub_stripe_report_errors()
980 if (test_bit(sector_nr, &stripe->meta_gen_error_bitmap)) in scrub_stripe_report_errors()
983 stripe->logical, physical); in scrub_stripe_report_errors()
987 for (int i = 0; i < stripe->init_nr_io_errors; i++) in scrub_stripe_report_errors()
988 btrfs_dev_stat_inc_and_print(stripe->dev, BTRFS_DEV_STAT_READ_ERRS); in scrub_stripe_report_errors()
989 for (int i = 0; i < stripe->init_nr_csum_errors; i++) in scrub_stripe_report_errors()
990 btrfs_dev_stat_inc_and_print(stripe->dev, BTRFS_DEV_STAT_CORRUPTION_ERRS); in scrub_stripe_report_errors()
992 for (int i = 0; i < stripe->init_nr_meta_gen_errors; in scrub_stripe_report_errors()
994 btrfs_dev_stat_inc_and_print(stripe->dev, BTRFS_DEV_STAT_GENERATION_ERRS); in scrub_stripe_report_errors()
997 sctx->stat.data_extents_scrubbed += stripe->nr_data_extents; in scrub_stripe_report_errors()
998 sctx->stat.tree_extents_scrubbed += stripe->nr_meta_extents; in scrub_stripe_report_errors()
1002 sctx->stat.read_errors += stripe->init_nr_io_errors; in scrub_stripe_report_errors()
1003 sctx->stat.csum_errors += stripe->init_nr_csum_errors; in scrub_stripe_report_errors()
1004 sctx->stat.verify_errors += stripe->init_nr_meta_errors + in scrub_stripe_report_errors()
1005 stripe->init_nr_meta_gen_errors; in scrub_stripe_report_errors()
1007 bitmap_weight(&stripe->error_bitmap, stripe->nr_sectors); in scrub_stripe_report_errors()
1012 static void scrub_write_sectors(struct scrub_ctx *sctx, struct scrub_stripe *stripe,
1030 struct scrub_stripe *stripe = container_of(work, struct scrub_stripe, work); in scrub_stripe_read_repair_worker() local
1031 struct scrub_ctx *sctx = stripe->sctx; in scrub_stripe_read_repair_worker()
1033 int num_copies = btrfs_num_copies(fs_info, stripe->bg->start, in scrub_stripe_read_repair_worker()
1034 stripe->bg->length); in scrub_stripe_read_repair_worker()
1039 ASSERT(stripe->mirror_num > 0); in scrub_stripe_read_repair_worker()
1041 wait_scrub_stripe_io(stripe); in scrub_stripe_read_repair_worker()
1042 scrub_verify_one_stripe(stripe, stripe->extent_sector_bitmap); in scrub_stripe_read_repair_worker()
1044 stripe->init_error_bitmap = stripe->error_bitmap; in scrub_stripe_read_repair_worker()
1045 stripe->init_nr_io_errors = bitmap_weight(&stripe->io_error_bitmap, in scrub_stripe_read_repair_worker()
1046 stripe->nr_sectors); in scrub_stripe_read_repair_worker()
1047 stripe->init_nr_csum_errors = bitmap_weight(&stripe->csum_error_bitmap, in scrub_stripe_read_repair_worker()
1048 stripe->nr_sectors); in scrub_stripe_read_repair_worker()
1049 stripe->init_nr_meta_errors = bitmap_weight(&stripe->meta_error_bitmap, in scrub_stripe_read_repair_worker()
1050 stripe->nr_sectors); in scrub_stripe_read_repair_worker()
1051 stripe->init_nr_meta_gen_errors = bitmap_weight(&stripe->meta_gen_error_bitmap, in scrub_stripe_read_repair_worker()
1052 stripe->nr_sectors); in scrub_stripe_read_repair_worker()
1054 if (bitmap_empty(&stripe->init_error_bitmap, stripe->nr_sectors)) in scrub_stripe_read_repair_worker()
1063 for (mirror = calc_next_mirror(stripe->mirror_num, num_copies); in scrub_stripe_read_repair_worker()
1064 mirror != stripe->mirror_num; in scrub_stripe_read_repair_worker()
1066 const unsigned long old_error_bitmap = stripe->error_bitmap; in scrub_stripe_read_repair_worker()
1068 scrub_stripe_submit_repair_read(stripe, mirror, in scrub_stripe_read_repair_worker()
1070 wait_scrub_stripe_io(stripe); in scrub_stripe_read_repair_worker()
1071 scrub_verify_one_stripe(stripe, old_error_bitmap); in scrub_stripe_read_repair_worker()
1072 if (bitmap_empty(&stripe->error_bitmap, stripe->nr_sectors)) in scrub_stripe_read_repair_worker()
1087 for (i = 0, mirror = stripe->mirror_num; in scrub_stripe_read_repair_worker()
1090 const unsigned long old_error_bitmap = stripe->error_bitmap; in scrub_stripe_read_repair_worker()
1092 scrub_stripe_submit_repair_read(stripe, mirror, in scrub_stripe_read_repair_worker()
1094 wait_scrub_stripe_io(stripe); in scrub_stripe_read_repair_worker()
1095 scrub_verify_one_stripe(stripe, old_error_bitmap); in scrub_stripe_read_repair_worker()
1096 if (bitmap_empty(&stripe->error_bitmap, stripe->nr_sectors)) in scrub_stripe_read_repair_worker()
1104 bitmap_andnot(&repaired, &stripe->init_error_bitmap, &stripe->error_bitmap, in scrub_stripe_read_repair_worker()
1105 stripe->nr_sectors); in scrub_stripe_read_repair_worker()
1106 if (!sctx->readonly && !bitmap_empty(&repaired, stripe->nr_sectors)) { in scrub_stripe_read_repair_worker()
1110 scrub_write_sectors(sctx, stripe, repaired, false); in scrub_stripe_read_repair_worker()
1111 wait_scrub_stripe_io(stripe); in scrub_stripe_read_repair_worker()
1115 scrub_stripe_report_errors(sctx, stripe); in scrub_stripe_read_repair_worker()
1116 set_bit(SCRUB_STRIPE_FLAG_REPAIR_DONE, &stripe->state); in scrub_stripe_read_repair_worker()
1117 wake_up(&stripe->repair_wait); in scrub_stripe_read_repair_worker()
1122 struct scrub_stripe *stripe = bbio->private; in scrub_read_endio() local
1124 int sector_nr = calc_sector_number(stripe, bio_first_bvec_all(&bbio->bio)); in scrub_read_endio()
1129 ASSERT(sector_nr < stripe->nr_sectors); in scrub_read_endio()
1132 num_sectors = bio_size >> stripe->bg->fs_info->sectorsize_bits; in scrub_read_endio()
1135 bitmap_set(&stripe->io_error_bitmap, sector_nr, num_sectors); in scrub_read_endio()
1136 bitmap_set(&stripe->error_bitmap, sector_nr, num_sectors); in scrub_read_endio()
1138 bitmap_clear(&stripe->io_error_bitmap, sector_nr, num_sectors); in scrub_read_endio()
1141 if (atomic_dec_and_test(&stripe->pending_io)) { in scrub_read_endio()
1142 wake_up(&stripe->io_wait); in scrub_read_endio()
1143 INIT_WORK(&stripe->work, scrub_stripe_read_repair_worker); in scrub_read_endio()
1144 queue_work(stripe->bg->fs_info->scrub_workers, &stripe->work); in scrub_read_endio()
1150 struct scrub_stripe *stripe = bbio->private; in scrub_write_endio() local
1151 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_write_endio()
1153 int sector_nr = calc_sector_number(stripe, bio_first_bvec_all(&bbio->bio)); in scrub_write_endio()
1163 spin_lock_irqsave(&stripe->write_error_lock, flags); in scrub_write_endio()
1164 bitmap_set(&stripe->write_error_bitmap, sector_nr, in scrub_write_endio()
1166 spin_unlock_irqrestore(&stripe->write_error_lock, flags); in scrub_write_endio()
1168 btrfs_dev_stat_inc_and_print(stripe->dev, in scrub_write_endio()
1173 if (atomic_dec_and_test(&stripe->pending_io)) in scrub_write_endio()
1174 wake_up(&stripe->io_wait); in scrub_write_endio()
1178 struct scrub_stripe *stripe, in scrub_submit_write_bio() argument
1184 stripe->logical; in scrub_submit_write_bio()
1186 fill_writer_pointer_gap(sctx, stripe->physical + bio_off); in scrub_submit_write_bio()
1187 atomic_inc(&stripe->pending_io); in scrub_submit_write_bio()
1188 btrfs_submit_repair_write(bbio, stripe->mirror_num, dev_replace); in scrub_submit_write_bio()
1195 wait_scrub_stripe_io(stripe); in scrub_submit_write_bio()
1202 &stripe->write_error_bitmap)) in scrub_submit_write_bio()
1219 static void scrub_write_sectors(struct scrub_ctx *sctx, struct scrub_stripe *stripe, in scrub_write_sectors() argument
1222 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_write_sectors()
1226 for_each_set_bit(sector_nr, &write_bitmap, stripe->nr_sectors) { in scrub_write_sectors()
1227 struct page *page = scrub_stripe_get_page(stripe, sector_nr); in scrub_write_sectors()
1228 unsigned int pgoff = scrub_stripe_get_page_offset(stripe, sector_nr); in scrub_write_sectors()
1232 ASSERT(test_bit(sector_nr, &stripe->extent_sector_bitmap)); in scrub_write_sectors()
1236 scrub_submit_write_bio(sctx, stripe, bbio, dev_replace); in scrub_write_sectors()
1240 bbio = btrfs_bio_alloc(stripe->nr_sectors, REQ_OP_WRITE, in scrub_write_sectors()
1241 fs_info, scrub_write_endio, stripe); in scrub_write_sectors()
1242 bbio->bio.bi_iter.bi_sector = (stripe->logical + in scrub_write_sectors()
1250 scrub_submit_write_bio(sctx, stripe, bbio, dev_replace); in scrub_write_sectors()
1311 * logical offset. if this is a parity stripe, it will return
1312 * the most left data stripe's logical offset.
1314 * return 0 if it is a data stripe, 1 means parity stripe.
1339 /* Work out the disk rotation on this stripe-set */ in get_raid56_logic_offset()
1341 /* calculate which stripe this data locates */ in get_raid56_logic_offset()
1390 * return the extent item. This is for data extent crossing stripe boundary.
1504 struct scrub_stripe *stripe, in fill_one_extent_info() argument
1508 for (u64 cur_logical = max(stripe->logical, extent_start); in fill_one_extent_info()
1509 cur_logical < min(stripe->logical + BTRFS_STRIPE_LEN, in fill_one_extent_info()
1512 const int nr_sector = (cur_logical - stripe->logical) >> in fill_one_extent_info()
1515 &stripe->sectors[nr_sector]; in fill_one_extent_info()
1517 set_bit(nr_sector, &stripe->extent_sector_bitmap); in fill_one_extent_info()
1525 static void scrub_stripe_reset_bitmaps(struct scrub_stripe *stripe) in scrub_stripe_reset_bitmaps() argument
1527 stripe->extent_sector_bitmap = 0; in scrub_stripe_reset_bitmaps()
1528 stripe->init_error_bitmap = 0; in scrub_stripe_reset_bitmaps()
1529 stripe->init_nr_io_errors = 0; in scrub_stripe_reset_bitmaps()
1530 stripe->init_nr_csum_errors = 0; in scrub_stripe_reset_bitmaps()
1531 stripe->init_nr_meta_errors = 0; in scrub_stripe_reset_bitmaps()
1532 stripe->init_nr_meta_gen_errors = 0; in scrub_stripe_reset_bitmaps()
1533 stripe->error_bitmap = 0; in scrub_stripe_reset_bitmaps()
1534 stripe->io_error_bitmap = 0; in scrub_stripe_reset_bitmaps()
1535 stripe->csum_error_bitmap = 0; in scrub_stripe_reset_bitmaps()
1536 stripe->meta_error_bitmap = 0; in scrub_stripe_reset_bitmaps()
1537 stripe->meta_gen_error_bitmap = 0; in scrub_stripe_reset_bitmaps()
1541 * Locate one stripe which has at least one extent in its range.
1543 * Return 0 if found such stripe, and store its info into @stripe.
1544 * Return >0 if there is no such stripe in the specified range.
1553 struct scrub_stripe *stripe) in scrub_find_fill_first_stripe() argument
1571 memset(stripe->sectors, 0, sizeof(struct scrub_sector_verification) * in scrub_find_fill_first_stripe()
1572 stripe->nr_sectors); in scrub_find_fill_first_stripe()
1573 scrub_stripe_reset_bitmaps(stripe); in scrub_find_fill_first_stripe()
1586 stripe->nr_meta_extents++; in scrub_find_fill_first_stripe()
1588 stripe->nr_data_extents++; in scrub_find_fill_first_stripe()
1592 * Round down to stripe boundary. in scrub_find_fill_first_stripe()
1597 stripe->logical = round_down(cur_logical - bg->start, BTRFS_STRIPE_LEN) + in scrub_find_fill_first_stripe()
1599 stripe->physical = physical + stripe->logical - logical_start; in scrub_find_fill_first_stripe()
1600 stripe->dev = dev; in scrub_find_fill_first_stripe()
1601 stripe->bg = bg; in scrub_find_fill_first_stripe()
1602 stripe->mirror_num = mirror_num; in scrub_find_fill_first_stripe()
1603 stripe_end = stripe->logical + BTRFS_STRIPE_LEN - 1; in scrub_find_fill_first_stripe()
1605 /* Fill the first extent info into stripe->sectors[] array. */ in scrub_find_fill_first_stripe()
1606 fill_one_extent_info(fs_info, stripe, extent_start, extent_len, in scrub_find_fill_first_stripe()
1623 stripe->nr_meta_extents++; in scrub_find_fill_first_stripe()
1625 stripe->nr_data_extents++; in scrub_find_fill_first_stripe()
1626 fill_one_extent_info(fs_info, stripe, extent_start, extent_len, in scrub_find_fill_first_stripe()
1637 ASSERT(stripe->csums); in scrub_find_fill_first_stripe()
1646 stripe->logical, stripe_end, in scrub_find_fill_first_stripe()
1647 stripe->csums, &csum_bitmap); in scrub_find_fill_first_stripe()
1653 for_each_set_bit(sector_nr, &csum_bitmap, stripe->nr_sectors) { in scrub_find_fill_first_stripe()
1654 stripe->sectors[sector_nr].csum = stripe->csums + in scrub_find_fill_first_stripe()
1658 set_bit(SCRUB_STRIPE_FLAG_INITIALIZED, &stripe->state); in scrub_find_fill_first_stripe()
1663 static void scrub_reset_stripe(struct scrub_stripe *stripe) in scrub_reset_stripe() argument
1665 scrub_stripe_reset_bitmaps(stripe); in scrub_reset_stripe()
1667 stripe->nr_meta_extents = 0; in scrub_reset_stripe()
1668 stripe->nr_data_extents = 0; in scrub_reset_stripe()
1669 stripe->state = 0; in scrub_reset_stripe()
1671 for (int i = 0; i < stripe->nr_sectors; i++) { in scrub_reset_stripe()
1672 stripe->sectors[i].is_metadata = false; in scrub_reset_stripe()
1673 stripe->sectors[i].csum = NULL; in scrub_reset_stripe()
1674 stripe->sectors[i].generation = 0; in scrub_reset_stripe()
1679 struct scrub_stripe *stripe) in scrub_submit_initial_read() argument
1683 unsigned int nr_sectors = min_t(u64, BTRFS_STRIPE_LEN, stripe->bg->start + in scrub_submit_initial_read()
1684 stripe->bg->length - stripe->logical) >> in scrub_submit_initial_read()
1686 int mirror = stripe->mirror_num; in scrub_submit_initial_read()
1688 ASSERT(stripe->bg); in scrub_submit_initial_read()
1689 ASSERT(stripe->mirror_num > 0); in scrub_submit_initial_read()
1690 ASSERT(test_bit(SCRUB_STRIPE_FLAG_INITIALIZED, &stripe->state)); in scrub_submit_initial_read()
1693 scrub_read_endio, stripe); in scrub_submit_initial_read()
1695 bbio->bio.bi_iter.bi_sector = stripe->logical >> SECTOR_SHIFT; in scrub_submit_initial_read()
1698 struct page *page = scrub_stripe_get_page(stripe, cur); in scrub_submit_initial_read()
1699 unsigned int pgoff = scrub_stripe_get_page_offset(stripe, cur); in scrub_submit_initial_read()
1706 atomic_inc(&stripe->pending_io); in scrub_submit_initial_read()
1715 !stripe->dev->bdev)) { in scrub_submit_initial_read()
1716 int num_copies = btrfs_num_copies(fs_info, stripe->bg->start, in scrub_submit_initial_read()
1717 stripe->bg->length); in scrub_submit_initial_read()
1724 static bool stripe_has_metadata_error(struct scrub_stripe *stripe) in stripe_has_metadata_error() argument
1728 for_each_set_bit(i, &stripe->error_bitmap, stripe->nr_sectors) { in stripe_has_metadata_error()
1729 if (stripe->sectors[i].is_metadata) { in stripe_has_metadata_error()
1730 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in stripe_has_metadata_error()
1733 "stripe %llu has unrepaired metadata sector at %llu", in stripe_has_metadata_error()
1734 stripe->logical, in stripe_has_metadata_error()
1735 stripe->logical + (i << fs_info->sectorsize_bits)); in stripe_has_metadata_error()
1755 struct scrub_stripe *stripe = &sctx->stripes[first_slot + i]; in submit_initial_group_read() local
1758 ASSERT(test_bit(SCRUB_STRIPE_FLAG_INITIALIZED, &stripe->state)); in submit_initial_group_read()
1759 scrub_submit_initial_read(sctx, stripe); in submit_initial_group_read()
1767 struct scrub_stripe *stripe; in flush_scrub_stripes() local
1784 stripe = &sctx->stripes[i]; in flush_scrub_stripes()
1786 wait_event(stripe->repair_wait, in flush_scrub_stripes()
1787 test_bit(SCRUB_STRIPE_FLAG_REPAIR_DONE, &stripe->state)); in flush_scrub_stripes()
1805 stripe = &sctx->stripes[i]; in flush_scrub_stripes()
1807 ASSERT(stripe->dev == fs_info->dev_replace.srcdev); in flush_scrub_stripes()
1809 bitmap_andnot(&good, &stripe->extent_sector_bitmap, in flush_scrub_stripes()
1810 &stripe->error_bitmap, stripe->nr_sectors); in flush_scrub_stripes()
1811 scrub_write_sectors(sctx, stripe, good, true); in flush_scrub_stripes()
1817 stripe = &sctx->stripes[i]; in flush_scrub_stripes()
1819 wait_scrub_stripe_io(stripe); in flush_scrub_stripes()
1820 scrub_reset_stripe(stripe); in flush_scrub_stripes()
1837 struct scrub_stripe *stripe; in queue_scrub_stripe() local
1849 stripe = &sctx->stripes[sctx->cur_stripe]; in queue_scrub_stripe()
1850 scrub_reset_stripe(stripe); in queue_scrub_stripe()
1853 mirror_num, logical, length, stripe); in queue_scrub_stripe()
1857 *found_logical_ret = stripe->logical; in queue_scrub_stripe()
1886 struct scrub_stripe *stripe; in scrub_raid56_parity_stripe() local
1896 * For data stripe search, we cannot re-use the same extent/csum paths, in scrub_raid56_parity_stripe()
1897 * as the data stripe bytenr may be smaller than previous extent. Thus in scrub_raid56_parity_stripe()
1910 stripe = &sctx->raid56_data_stripes[i]; in scrub_raid56_parity_stripe()
1917 scrub_reset_stripe(stripe); in scrub_raid56_parity_stripe()
1918 set_bit(SCRUB_STRIPE_FLAG_NO_REPORT, &stripe->state); in scrub_raid56_parity_stripe()
1922 BTRFS_STRIPE_LEN, stripe); in scrub_raid56_parity_stripe()
1926 * No extent in this data stripe, need to manually mark them in scrub_raid56_parity_stripe()
1930 stripe->logical = full_stripe_start + in scrub_raid56_parity_stripe()
1932 stripe->dev = map->stripes[stripe_index].dev; in scrub_raid56_parity_stripe()
1933 stripe->mirror_num = 1; in scrub_raid56_parity_stripe()
1934 set_bit(SCRUB_STRIPE_FLAG_INITIALIZED, &stripe->state); in scrub_raid56_parity_stripe()
1940 stripe = &sctx->raid56_data_stripes[i]; in scrub_raid56_parity_stripe()
1941 if (!bitmap_empty(&stripe->extent_sector_bitmap, stripe->nr_sectors)) { in scrub_raid56_parity_stripe()
1952 stripe = &sctx->raid56_data_stripes[i]; in scrub_raid56_parity_stripe()
1953 scrub_submit_initial_read(sctx, stripe); in scrub_raid56_parity_stripe()
1956 stripe = &sctx->raid56_data_stripes[i]; in scrub_raid56_parity_stripe()
1958 wait_event(stripe->repair_wait, in scrub_raid56_parity_stripe()
1959 test_bit(SCRUB_STRIPE_FLAG_REPAIR_DONE, &stripe->state)); in scrub_raid56_parity_stripe()
1974 stripe = &sctx->raid56_data_stripes[i]; in scrub_raid56_parity_stripe()
1978 * As we may hit an empty data stripe while it's missing. in scrub_raid56_parity_stripe()
1980 bitmap_and(&error, &stripe->error_bitmap, in scrub_raid56_parity_stripe()
1981 &stripe->extent_sector_bitmap, stripe->nr_sectors); in scrub_raid56_parity_stripe()
1982 if (!bitmap_empty(&error, stripe->nr_sectors)) { in scrub_raid56_parity_stripe()
1984 "unrepaired sectors detected, full stripe %llu data stripe %u errors %*pbl", in scrub_raid56_parity_stripe()
1985 full_stripe_start, i, stripe->nr_sectors, in scrub_raid56_parity_stripe()
1991 &stripe->extent_sector_bitmap, stripe->nr_sectors); in scrub_raid56_parity_stripe()
1994 /* Now we can check and regenerate the P/Q stripe. */ in scrub_raid56_parity_stripe()
2018 stripe = &sctx->raid56_data_stripes[i]; in scrub_raid56_parity_stripe()
2020 raid56_parity_cache_data_pages(rbio, stripe->pages, in scrub_raid56_parity_stripe()
2037 * (Including all range in SINGLE/DUP/RAID1/RAID1C*, and each stripe in
2105 /* Calculate the full stripe length for simple stripe based profiles */
2114 /* Get the logical bytenr for the stripe */
2131 /* Get the mirror number for the stripe */
2158 * Inside each stripe, RAID0 is just SINGLE, and RAID10 is in scrub_simple_stripe()
2160 * this stripe. in scrub_simple_stripe()
2167 /* Skip to next stripe which belongs to the target device */ in scrub_simple_stripe()
2169 /* For physical offset, we just go to next stripe */ in scrub_simple_stripe()
2192 /* The logical increment after finishing one stripe */ in scrub_stripe()
2243 * mirrored duplication without stripe. in scrub_stripe()
2264 /* Calculate the logical end of the stripe */ in scrub_stripe()
2274 * Due to the rotation, for RAID56 it's better to iterate each stripe in scrub_stripe()
2292 * Now we're at a data stripe, scrub each extents in the range. in scrub_stripe()
2295 * stripe it is no different than SINGLE profile. in scrub_stripe()