Lines Matching refs:stripe
232 static void release_scrub_stripe(struct scrub_stripe *stripe) in release_scrub_stripe() argument
234 if (!stripe) in release_scrub_stripe()
238 if (stripe->pages[i]) in release_scrub_stripe()
239 __free_page(stripe->pages[i]); in release_scrub_stripe()
240 stripe->pages[i] = NULL; in release_scrub_stripe()
242 kfree(stripe->sectors); in release_scrub_stripe()
243 kfree(stripe->csums); in release_scrub_stripe()
244 stripe->sectors = NULL; in release_scrub_stripe()
245 stripe->csums = NULL; in release_scrub_stripe()
246 stripe->sctx = NULL; in release_scrub_stripe()
247 stripe->state = 0; in release_scrub_stripe()
251 struct scrub_stripe *stripe) in init_scrub_stripe() argument
255 memset(stripe, 0, sizeof(*stripe)); in init_scrub_stripe()
257 stripe->nr_sectors = BTRFS_STRIPE_LEN >> fs_info->sectorsize_bits; in init_scrub_stripe()
258 stripe->state = 0; in init_scrub_stripe()
260 init_waitqueue_head(&stripe->io_wait); in init_scrub_stripe()
261 init_waitqueue_head(&stripe->repair_wait); in init_scrub_stripe()
262 atomic_set(&stripe->pending_io, 0); in init_scrub_stripe()
263 spin_lock_init(&stripe->write_error_lock); in init_scrub_stripe()
265 ret = btrfs_alloc_page_array(SCRUB_STRIPE_PAGES, stripe->pages); in init_scrub_stripe()
269 stripe->sectors = kcalloc(stripe->nr_sectors, in init_scrub_stripe()
272 if (!stripe->sectors) in init_scrub_stripe()
275 stripe->csums = kcalloc(BTRFS_STRIPE_LEN >> fs_info->sectorsize_bits, in init_scrub_stripe()
277 if (!stripe->csums) in init_scrub_stripe()
281 release_scrub_stripe(stripe); in init_scrub_stripe()
285 static void wait_scrub_stripe_io(struct scrub_stripe *stripe) in wait_scrub_stripe_io() argument
287 wait_event(stripe->io_wait, atomic_read(&stripe->pending_io) == 0); in wait_scrub_stripe_io()
583 static struct page *scrub_stripe_get_page(struct scrub_stripe *stripe, int sector_nr) in scrub_stripe_get_page() argument
585 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_stripe_get_page()
588 return stripe->pages[page_index]; in scrub_stripe_get_page()
591 static unsigned int scrub_stripe_get_page_offset(struct scrub_stripe *stripe, in scrub_stripe_get_page_offset() argument
594 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_stripe_get_page_offset()
599 static void scrub_verify_one_metadata(struct scrub_stripe *stripe, int sector_nr) in scrub_verify_one_metadata() argument
601 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_verify_one_metadata()
603 const u64 logical = stripe->logical + (sector_nr << fs_info->sectorsize_bits); in scrub_verify_one_metadata()
604 const struct page *first_page = scrub_stripe_get_page(stripe, sector_nr); in scrub_verify_one_metadata()
605 const unsigned int first_off = scrub_stripe_get_page_offset(stripe, sector_nr); in scrub_verify_one_metadata()
620 bitmap_set(&stripe->csum_error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
621 bitmap_set(&stripe->error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
624 logical, stripe->mirror_num, in scrub_verify_one_metadata()
630 bitmap_set(&stripe->meta_error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
631 bitmap_set(&stripe->error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
634 logical, stripe->mirror_num, in scrub_verify_one_metadata()
640 bitmap_set(&stripe->meta_error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
641 bitmap_set(&stripe->error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
644 logical, stripe->mirror_num, in scrub_verify_one_metadata()
656 struct page *page = scrub_stripe_get_page(stripe, i); in scrub_verify_one_metadata()
657 unsigned int page_off = scrub_stripe_get_page_offset(stripe, i); in scrub_verify_one_metadata()
665 bitmap_set(&stripe->meta_error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
666 bitmap_set(&stripe->error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
669 logical, stripe->mirror_num, in scrub_verify_one_metadata()
674 if (stripe->sectors[sector_nr].generation != in scrub_verify_one_metadata()
676 bitmap_set(&stripe->meta_error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
677 bitmap_set(&stripe->error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
680 logical, stripe->mirror_num, in scrub_verify_one_metadata()
682 stripe->sectors[sector_nr].generation); in scrub_verify_one_metadata()
685 bitmap_clear(&stripe->error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
686 bitmap_clear(&stripe->csum_error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
687 bitmap_clear(&stripe->meta_error_bitmap, sector_nr, sectors_per_tree); in scrub_verify_one_metadata()
690 static void scrub_verify_one_sector(struct scrub_stripe *stripe, int sector_nr) in scrub_verify_one_sector() argument
692 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_verify_one_sector()
693 struct scrub_sector_verification *sector = &stripe->sectors[sector_nr]; in scrub_verify_one_sector()
695 struct page *page = scrub_stripe_get_page(stripe, sector_nr); in scrub_verify_one_sector()
696 unsigned int pgoff = scrub_stripe_get_page_offset(stripe, sector_nr); in scrub_verify_one_sector()
700 ASSERT(sector_nr >= 0 && sector_nr < stripe->nr_sectors); in scrub_verify_one_sector()
703 if (!test_bit(sector_nr, &stripe->extent_sector_bitmap)) in scrub_verify_one_sector()
707 if (test_bit(sector_nr, &stripe->io_error_bitmap)) in scrub_verify_one_sector()
720 if (unlikely(sector_nr + sectors_per_tree > stripe->nr_sectors)) { in scrub_verify_one_sector()
723 stripe->logical + in scrub_verify_one_sector()
725 stripe->logical); in scrub_verify_one_sector()
728 scrub_verify_one_metadata(stripe, sector_nr); in scrub_verify_one_sector()
737 clear_bit(sector_nr, &stripe->error_bitmap); in scrub_verify_one_sector()
743 set_bit(sector_nr, &stripe->csum_error_bitmap); in scrub_verify_one_sector()
744 set_bit(sector_nr, &stripe->error_bitmap); in scrub_verify_one_sector()
746 clear_bit(sector_nr, &stripe->csum_error_bitmap); in scrub_verify_one_sector()
747 clear_bit(sector_nr, &stripe->error_bitmap); in scrub_verify_one_sector()
752 static void scrub_verify_one_stripe(struct scrub_stripe *stripe, unsigned long bitmap) in scrub_verify_one_stripe() argument
754 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_verify_one_stripe()
758 for_each_set_bit(sector_nr, &bitmap, stripe->nr_sectors) { in scrub_verify_one_stripe()
759 scrub_verify_one_sector(stripe, sector_nr); in scrub_verify_one_stripe()
760 if (stripe->sectors[sector_nr].is_metadata) in scrub_verify_one_stripe()
765 static int calc_sector_number(struct scrub_stripe *stripe, struct bio_vec *first_bvec) in calc_sector_number() argument
769 for (i = 0; i < stripe->nr_sectors; i++) { in calc_sector_number()
770 if (scrub_stripe_get_page(stripe, i) == first_bvec->bv_page && in calc_sector_number()
771 scrub_stripe_get_page_offset(stripe, i) == first_bvec->bv_offset) in calc_sector_number()
774 ASSERT(i < stripe->nr_sectors); in calc_sector_number()
786 struct scrub_stripe *stripe = bbio->private; in scrub_repair_read_endio() local
787 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_repair_read_endio()
789 int sector_nr = calc_sector_number(stripe, bio_first_bvec_all(&bbio->bio)); in scrub_repair_read_endio()
793 ASSERT(sector_nr < stripe->nr_sectors); in scrub_repair_read_endio()
799 bitmap_set(&stripe->io_error_bitmap, sector_nr, in scrub_repair_read_endio()
801 bitmap_set(&stripe->error_bitmap, sector_nr, in scrub_repair_read_endio()
804 bitmap_clear(&stripe->io_error_bitmap, sector_nr, in scrub_repair_read_endio()
808 if (atomic_dec_and_test(&stripe->pending_io)) in scrub_repair_read_endio()
809 wake_up(&stripe->io_wait); in scrub_repair_read_endio()
818 static void scrub_stripe_submit_repair_read(struct scrub_stripe *stripe, in scrub_stripe_submit_repair_read() argument
821 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_stripe_submit_repair_read()
823 const unsigned long old_error_bitmap = stripe->error_bitmap; in scrub_stripe_submit_repair_read()
826 ASSERT(stripe->mirror_num >= 1); in scrub_stripe_submit_repair_read()
827 ASSERT(atomic_read(&stripe->pending_io) == 0); in scrub_stripe_submit_repair_read()
829 for_each_set_bit(i, &old_error_bitmap, stripe->nr_sectors) { in scrub_stripe_submit_repair_read()
834 page = scrub_stripe_get_page(stripe, i); in scrub_stripe_submit_repair_read()
835 pgoff = scrub_stripe_get_page_offset(stripe, i); in scrub_stripe_submit_repair_read()
838 if (bbio && ((i > 0 && !test_bit(i - 1, &stripe->error_bitmap)) || in scrub_stripe_submit_repair_read()
841 atomic_inc(&stripe->pending_io); in scrub_stripe_submit_repair_read()
844 wait_scrub_stripe_io(stripe); in scrub_stripe_submit_repair_read()
849 bbio = btrfs_bio_alloc(stripe->nr_sectors, REQ_OP_READ, in scrub_stripe_submit_repair_read()
850 fs_info, scrub_repair_read_endio, stripe); in scrub_stripe_submit_repair_read()
851 bbio->bio.bi_iter.bi_sector = (stripe->logical + in scrub_stripe_submit_repair_read()
860 atomic_inc(&stripe->pending_io); in scrub_stripe_submit_repair_read()
863 wait_scrub_stripe_io(stripe); in scrub_stripe_submit_repair_read()
868 struct scrub_stripe *stripe) in scrub_stripe_report_errors() argument
881 if (test_bit(SCRUB_STRIPE_FLAG_NO_REPORT, &stripe->state)) in scrub_stripe_report_errors()
890 if (!bitmap_empty(&stripe->init_error_bitmap, stripe->nr_sectors)) { in scrub_stripe_report_errors()
893 int stripe_index = stripe->mirror_num - 1; in scrub_stripe_report_errors()
897 ASSERT(stripe->mirror_num >= 1); in scrub_stripe_report_errors()
899 stripe->logical, &mapped_len, &bioc, in scrub_stripe_report_errors()
913 for_each_set_bit(sector_nr, &stripe->extent_sector_bitmap, stripe->nr_sectors) { in scrub_stripe_report_errors()
916 if (stripe->sectors[sector_nr].is_metadata) { in scrub_stripe_report_errors()
920 if (!stripe->sectors[sector_nr].csum) in scrub_stripe_report_errors()
924 if (test_bit(sector_nr, &stripe->init_error_bitmap) && in scrub_stripe_report_errors()
925 !test_bit(sector_nr, &stripe->error_bitmap)) { in scrub_stripe_report_errors()
931 if (!test_bit(sector_nr, &stripe->init_error_bitmap)) in scrub_stripe_report_errors()
942 stripe->logical, btrfs_dev_name(dev), in scrub_stripe_report_errors()
947 stripe->logical, stripe->mirror_num); in scrub_stripe_report_errors()
956 stripe->logical, btrfs_dev_name(dev), in scrub_stripe_report_errors()
961 stripe->logical, stripe->mirror_num); in scrub_stripe_report_errors()
964 if (test_bit(sector_nr, &stripe->io_error_bitmap)) in scrub_stripe_report_errors()
967 stripe->logical, physical); in scrub_stripe_report_errors()
968 if (test_bit(sector_nr, &stripe->csum_error_bitmap)) in scrub_stripe_report_errors()
971 stripe->logical, physical); in scrub_stripe_report_errors()
972 if (test_bit(sector_nr, &stripe->meta_error_bitmap)) in scrub_stripe_report_errors()
975 stripe->logical, physical); in scrub_stripe_report_errors()
979 sctx->stat.data_extents_scrubbed += stripe->nr_data_extents; in scrub_stripe_report_errors()
980 sctx->stat.tree_extents_scrubbed += stripe->nr_meta_extents; in scrub_stripe_report_errors()
984 sctx->stat.read_errors += stripe->init_nr_io_errors; in scrub_stripe_report_errors()
985 sctx->stat.csum_errors += stripe->init_nr_csum_errors; in scrub_stripe_report_errors()
986 sctx->stat.verify_errors += stripe->init_nr_meta_errors; in scrub_stripe_report_errors()
988 bitmap_weight(&stripe->error_bitmap, stripe->nr_sectors); in scrub_stripe_report_errors()
993 static void scrub_write_sectors(struct scrub_ctx *sctx, struct scrub_stripe *stripe,
1011 struct scrub_stripe *stripe = container_of(work, struct scrub_stripe, work); in scrub_stripe_read_repair_worker() local
1012 struct scrub_ctx *sctx = stripe->sctx; in scrub_stripe_read_repair_worker()
1014 int num_copies = btrfs_num_copies(fs_info, stripe->bg->start, in scrub_stripe_read_repair_worker()
1015 stripe->bg->length); in scrub_stripe_read_repair_worker()
1019 ASSERT(stripe->mirror_num > 0); in scrub_stripe_read_repair_worker()
1021 wait_scrub_stripe_io(stripe); in scrub_stripe_read_repair_worker()
1022 scrub_verify_one_stripe(stripe, stripe->extent_sector_bitmap); in scrub_stripe_read_repair_worker()
1024 stripe->init_error_bitmap = stripe->error_bitmap; in scrub_stripe_read_repair_worker()
1025 stripe->init_nr_io_errors = bitmap_weight(&stripe->io_error_bitmap, in scrub_stripe_read_repair_worker()
1026 stripe->nr_sectors); in scrub_stripe_read_repair_worker()
1027 stripe->init_nr_csum_errors = bitmap_weight(&stripe->csum_error_bitmap, in scrub_stripe_read_repair_worker()
1028 stripe->nr_sectors); in scrub_stripe_read_repair_worker()
1029 stripe->init_nr_meta_errors = bitmap_weight(&stripe->meta_error_bitmap, in scrub_stripe_read_repair_worker()
1030 stripe->nr_sectors); in scrub_stripe_read_repair_worker()
1032 if (bitmap_empty(&stripe->init_error_bitmap, stripe->nr_sectors)) in scrub_stripe_read_repair_worker()
1041 for (mirror = calc_next_mirror(stripe->mirror_num, num_copies); in scrub_stripe_read_repair_worker()
1042 mirror != stripe->mirror_num; in scrub_stripe_read_repair_worker()
1044 const unsigned long old_error_bitmap = stripe->error_bitmap; in scrub_stripe_read_repair_worker()
1046 scrub_stripe_submit_repair_read(stripe, mirror, in scrub_stripe_read_repair_worker()
1048 wait_scrub_stripe_io(stripe); in scrub_stripe_read_repair_worker()
1049 scrub_verify_one_stripe(stripe, old_error_bitmap); in scrub_stripe_read_repair_worker()
1050 if (bitmap_empty(&stripe->error_bitmap, stripe->nr_sectors)) in scrub_stripe_read_repair_worker()
1065 for (i = 0, mirror = stripe->mirror_num; in scrub_stripe_read_repair_worker()
1068 const unsigned long old_error_bitmap = stripe->error_bitmap; in scrub_stripe_read_repair_worker()
1070 scrub_stripe_submit_repair_read(stripe, mirror, in scrub_stripe_read_repair_worker()
1072 wait_scrub_stripe_io(stripe); in scrub_stripe_read_repair_worker()
1073 scrub_verify_one_stripe(stripe, old_error_bitmap); in scrub_stripe_read_repair_worker()
1074 if (bitmap_empty(&stripe->error_bitmap, stripe->nr_sectors)) in scrub_stripe_read_repair_worker()
1083 if (!bitmap_empty(&stripe->error_bitmap, stripe->nr_sectors)) in scrub_stripe_read_repair_worker()
1088 bitmap_andnot(&repaired, &stripe->init_error_bitmap, in scrub_stripe_read_repair_worker()
1089 &stripe->error_bitmap, stripe->nr_sectors); in scrub_stripe_read_repair_worker()
1090 scrub_write_sectors(sctx, stripe, repaired, false); in scrub_stripe_read_repair_worker()
1091 wait_scrub_stripe_io(stripe); in scrub_stripe_read_repair_worker()
1094 scrub_stripe_report_errors(sctx, stripe); in scrub_stripe_read_repair_worker()
1095 set_bit(SCRUB_STRIPE_FLAG_REPAIR_DONE, &stripe->state); in scrub_stripe_read_repair_worker()
1096 wake_up(&stripe->repair_wait); in scrub_stripe_read_repair_worker()
1101 struct scrub_stripe *stripe = bbio->private; in scrub_read_endio() local
1104 bitmap_set(&stripe->io_error_bitmap, 0, stripe->nr_sectors); in scrub_read_endio()
1105 bitmap_set(&stripe->error_bitmap, 0, stripe->nr_sectors); in scrub_read_endio()
1107 bitmap_clear(&stripe->io_error_bitmap, 0, stripe->nr_sectors); in scrub_read_endio()
1110 if (atomic_dec_and_test(&stripe->pending_io)) { in scrub_read_endio()
1111 wake_up(&stripe->io_wait); in scrub_read_endio()
1112 INIT_WORK(&stripe->work, scrub_stripe_read_repair_worker); in scrub_read_endio()
1113 queue_work(stripe->bg->fs_info->scrub_workers, &stripe->work); in scrub_read_endio()
1119 struct scrub_stripe *stripe = bbio->private; in scrub_write_endio() local
1120 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_write_endio()
1122 int sector_nr = calc_sector_number(stripe, bio_first_bvec_all(&bbio->bio)); in scrub_write_endio()
1132 spin_lock_irqsave(&stripe->write_error_lock, flags); in scrub_write_endio()
1133 bitmap_set(&stripe->write_error_bitmap, sector_nr, in scrub_write_endio()
1135 spin_unlock_irqrestore(&stripe->write_error_lock, flags); in scrub_write_endio()
1139 if (atomic_dec_and_test(&stripe->pending_io)) in scrub_write_endio()
1140 wake_up(&stripe->io_wait); in scrub_write_endio()
1144 struct scrub_stripe *stripe, in scrub_submit_write_bio() argument
1150 stripe->logical; in scrub_submit_write_bio()
1152 fill_writer_pointer_gap(sctx, stripe->physical + bio_off); in scrub_submit_write_bio()
1153 atomic_inc(&stripe->pending_io); in scrub_submit_write_bio()
1154 btrfs_submit_repair_write(bbio, stripe->mirror_num, dev_replace); in scrub_submit_write_bio()
1161 wait_scrub_stripe_io(stripe); in scrub_submit_write_bio()
1168 &stripe->write_error_bitmap)) in scrub_submit_write_bio()
1185 static void scrub_write_sectors(struct scrub_ctx *sctx, struct scrub_stripe *stripe, in scrub_write_sectors() argument
1188 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in scrub_write_sectors()
1192 for_each_set_bit(sector_nr, &write_bitmap, stripe->nr_sectors) { in scrub_write_sectors()
1193 struct page *page = scrub_stripe_get_page(stripe, sector_nr); in scrub_write_sectors()
1194 unsigned int pgoff = scrub_stripe_get_page_offset(stripe, sector_nr); in scrub_write_sectors()
1198 ASSERT(test_bit(sector_nr, &stripe->extent_sector_bitmap)); in scrub_write_sectors()
1202 scrub_submit_write_bio(sctx, stripe, bbio, dev_replace); in scrub_write_sectors()
1206 bbio = btrfs_bio_alloc(stripe->nr_sectors, REQ_OP_WRITE, in scrub_write_sectors()
1207 fs_info, scrub_write_endio, stripe); in scrub_write_sectors()
1208 bbio->bio.bi_iter.bi_sector = (stripe->logical + in scrub_write_sectors()
1216 scrub_submit_write_bio(sctx, stripe, bbio, dev_replace); in scrub_write_sectors()
1470 struct scrub_stripe *stripe, in fill_one_extent_info() argument
1474 for (u64 cur_logical = max(stripe->logical, extent_start); in fill_one_extent_info()
1475 cur_logical < min(stripe->logical + BTRFS_STRIPE_LEN, in fill_one_extent_info()
1478 const int nr_sector = (cur_logical - stripe->logical) >> in fill_one_extent_info()
1481 &stripe->sectors[nr_sector]; in fill_one_extent_info()
1483 set_bit(nr_sector, &stripe->extent_sector_bitmap); in fill_one_extent_info()
1491 static void scrub_stripe_reset_bitmaps(struct scrub_stripe *stripe) in scrub_stripe_reset_bitmaps() argument
1493 stripe->extent_sector_bitmap = 0; in scrub_stripe_reset_bitmaps()
1494 stripe->init_error_bitmap = 0; in scrub_stripe_reset_bitmaps()
1495 stripe->init_nr_io_errors = 0; in scrub_stripe_reset_bitmaps()
1496 stripe->init_nr_csum_errors = 0; in scrub_stripe_reset_bitmaps()
1497 stripe->init_nr_meta_errors = 0; in scrub_stripe_reset_bitmaps()
1498 stripe->error_bitmap = 0; in scrub_stripe_reset_bitmaps()
1499 stripe->io_error_bitmap = 0; in scrub_stripe_reset_bitmaps()
1500 stripe->csum_error_bitmap = 0; in scrub_stripe_reset_bitmaps()
1501 stripe->meta_error_bitmap = 0; in scrub_stripe_reset_bitmaps()
1517 struct scrub_stripe *stripe) in scrub_find_fill_first_stripe() argument
1531 memset(stripe->sectors, 0, sizeof(struct scrub_sector_verification) * in scrub_find_fill_first_stripe()
1532 stripe->nr_sectors); in scrub_find_fill_first_stripe()
1533 scrub_stripe_reset_bitmaps(stripe); in scrub_find_fill_first_stripe()
1546 stripe->nr_meta_extents++; in scrub_find_fill_first_stripe()
1548 stripe->nr_data_extents++; in scrub_find_fill_first_stripe()
1557 stripe->logical = round_down(cur_logical - bg->start, BTRFS_STRIPE_LEN) + in scrub_find_fill_first_stripe()
1559 stripe->physical = physical + stripe->logical - logical_start; in scrub_find_fill_first_stripe()
1560 stripe->dev = dev; in scrub_find_fill_first_stripe()
1561 stripe->bg = bg; in scrub_find_fill_first_stripe()
1562 stripe->mirror_num = mirror_num; in scrub_find_fill_first_stripe()
1563 stripe_end = stripe->logical + BTRFS_STRIPE_LEN - 1; in scrub_find_fill_first_stripe()
1566 fill_one_extent_info(fs_info, stripe, extent_start, extent_len, in scrub_find_fill_first_stripe()
1583 stripe->nr_meta_extents++; in scrub_find_fill_first_stripe()
1585 stripe->nr_data_extents++; in scrub_find_fill_first_stripe()
1586 fill_one_extent_info(fs_info, stripe, extent_start, extent_len, in scrub_find_fill_first_stripe()
1597 ASSERT(stripe->csums); in scrub_find_fill_first_stripe()
1606 stripe->logical, stripe_end, in scrub_find_fill_first_stripe()
1607 stripe->csums, &csum_bitmap); in scrub_find_fill_first_stripe()
1613 for_each_set_bit(sector_nr, &csum_bitmap, stripe->nr_sectors) { in scrub_find_fill_first_stripe()
1614 stripe->sectors[sector_nr].csum = stripe->csums + in scrub_find_fill_first_stripe()
1618 set_bit(SCRUB_STRIPE_FLAG_INITIALIZED, &stripe->state); in scrub_find_fill_first_stripe()
1623 static void scrub_reset_stripe(struct scrub_stripe *stripe) in scrub_reset_stripe() argument
1625 scrub_stripe_reset_bitmaps(stripe); in scrub_reset_stripe()
1627 stripe->nr_meta_extents = 0; in scrub_reset_stripe()
1628 stripe->nr_data_extents = 0; in scrub_reset_stripe()
1629 stripe->state = 0; in scrub_reset_stripe()
1631 for (int i = 0; i < stripe->nr_sectors; i++) { in scrub_reset_stripe()
1632 stripe->sectors[i].is_metadata = false; in scrub_reset_stripe()
1633 stripe->sectors[i].csum = NULL; in scrub_reset_stripe()
1634 stripe->sectors[i].generation = 0; in scrub_reset_stripe()
1639 struct scrub_stripe *stripe) in scrub_submit_initial_read() argument
1643 int mirror = stripe->mirror_num; in scrub_submit_initial_read()
1645 ASSERT(stripe->bg); in scrub_submit_initial_read()
1646 ASSERT(stripe->mirror_num > 0); in scrub_submit_initial_read()
1647 ASSERT(test_bit(SCRUB_STRIPE_FLAG_INITIALIZED, &stripe->state)); in scrub_submit_initial_read()
1650 scrub_read_endio, stripe); in scrub_submit_initial_read()
1653 bbio->bio.bi_iter.bi_sector = stripe->logical >> SECTOR_SHIFT; in scrub_submit_initial_read()
1657 ret = bio_add_page(&bbio->bio, stripe->pages[i], PAGE_SIZE, 0); in scrub_submit_initial_read()
1661 atomic_inc(&stripe->pending_io); in scrub_submit_initial_read()
1670 !stripe->dev->bdev)) { in scrub_submit_initial_read()
1671 int num_copies = btrfs_num_copies(fs_info, stripe->bg->start, in scrub_submit_initial_read()
1672 stripe->bg->length); in scrub_submit_initial_read()
1679 static bool stripe_has_metadata_error(struct scrub_stripe *stripe) in stripe_has_metadata_error() argument
1683 for_each_set_bit(i, &stripe->error_bitmap, stripe->nr_sectors) { in stripe_has_metadata_error()
1684 if (stripe->sectors[i].is_metadata) { in stripe_has_metadata_error()
1685 struct btrfs_fs_info *fs_info = stripe->bg->fs_info; in stripe_has_metadata_error()
1689 stripe->logical, in stripe_has_metadata_error()
1690 stripe->logical + (i << fs_info->sectorsize_bits)); in stripe_has_metadata_error()
1710 struct scrub_stripe *stripe = &sctx->stripes[first_slot + i]; in submit_initial_group_read() local
1713 ASSERT(test_bit(SCRUB_STRIPE_FLAG_INITIALIZED, &stripe->state)); in submit_initial_group_read()
1714 scrub_submit_initial_read(sctx, stripe); in submit_initial_group_read()
1722 struct scrub_stripe *stripe; in flush_scrub_stripes() local
1739 stripe = &sctx->stripes[i]; in flush_scrub_stripes()
1741 wait_event(stripe->repair_wait, in flush_scrub_stripes()
1742 test_bit(SCRUB_STRIPE_FLAG_REPAIR_DONE, &stripe->state)); in flush_scrub_stripes()
1760 stripe = &sctx->stripes[i]; in flush_scrub_stripes()
1762 ASSERT(stripe->dev == fs_info->dev_replace.srcdev); in flush_scrub_stripes()
1764 bitmap_andnot(&good, &stripe->extent_sector_bitmap, in flush_scrub_stripes()
1765 &stripe->error_bitmap, stripe->nr_sectors); in flush_scrub_stripes()
1766 scrub_write_sectors(sctx, stripe, good, true); in flush_scrub_stripes()
1772 stripe = &sctx->stripes[i]; in flush_scrub_stripes()
1774 wait_scrub_stripe_io(stripe); in flush_scrub_stripes()
1775 scrub_reset_stripe(stripe); in flush_scrub_stripes()
1792 struct scrub_stripe *stripe; in queue_scrub_stripe() local
1801 stripe = &sctx->stripes[sctx->cur_stripe]; in queue_scrub_stripe()
1802 scrub_reset_stripe(stripe); in queue_scrub_stripe()
1805 mirror_num, logical, length, stripe); in queue_scrub_stripe()
1810 *found_logical_ret = stripe->logical; in queue_scrub_stripe()
1839 struct scrub_stripe *stripe; in scrub_raid56_parity_stripe() local
1863 stripe = &sctx->raid56_data_stripes[i]; in scrub_raid56_parity_stripe()
1870 scrub_reset_stripe(stripe); in scrub_raid56_parity_stripe()
1871 set_bit(SCRUB_STRIPE_FLAG_NO_REPORT, &stripe->state); in scrub_raid56_parity_stripe()
1875 BTRFS_STRIPE_LEN, stripe); in scrub_raid56_parity_stripe()
1883 stripe->logical = full_stripe_start + in scrub_raid56_parity_stripe()
1885 stripe->dev = map->stripes[stripe_index].dev; in scrub_raid56_parity_stripe()
1886 stripe->mirror_num = 1; in scrub_raid56_parity_stripe()
1887 set_bit(SCRUB_STRIPE_FLAG_INITIALIZED, &stripe->state); in scrub_raid56_parity_stripe()
1893 stripe = &sctx->raid56_data_stripes[i]; in scrub_raid56_parity_stripe()
1894 if (!bitmap_empty(&stripe->extent_sector_bitmap, stripe->nr_sectors)) { in scrub_raid56_parity_stripe()
1905 stripe = &sctx->raid56_data_stripes[i]; in scrub_raid56_parity_stripe()
1906 scrub_submit_initial_read(sctx, stripe); in scrub_raid56_parity_stripe()
1909 stripe = &sctx->raid56_data_stripes[i]; in scrub_raid56_parity_stripe()
1911 wait_event(stripe->repair_wait, in scrub_raid56_parity_stripe()
1912 test_bit(SCRUB_STRIPE_FLAG_REPAIR_DONE, &stripe->state)); in scrub_raid56_parity_stripe()
1927 stripe = &sctx->raid56_data_stripes[i]; in scrub_raid56_parity_stripe()
1933 bitmap_and(&error, &stripe->error_bitmap, in scrub_raid56_parity_stripe()
1934 &stripe->extent_sector_bitmap, stripe->nr_sectors); in scrub_raid56_parity_stripe()
1935 if (!bitmap_empty(&error, stripe->nr_sectors)) { in scrub_raid56_parity_stripe()
1938 full_stripe_start, i, stripe->nr_sectors, in scrub_raid56_parity_stripe()
1944 &stripe->extent_sector_bitmap, stripe->nr_sectors); in scrub_raid56_parity_stripe()
1971 stripe = &sctx->raid56_data_stripes[i]; in scrub_raid56_parity_stripe()
1973 raid56_parity_cache_data_pages(rbio, stripe->pages, in scrub_raid56_parity_stripe()