Lines Matching defs:sparity

108 	struct scrub_parity	*sparity;
234 static void scrub_parity_get(struct scrub_parity *sparity);
235 static void scrub_parity_put(struct scrub_parity *sparity);
1601 if (sblock->sparity)
1929 if (sblock->sparity)
1930 scrub_parity_put(sblock->sparity);
2296 static inline void __scrub_mark_bitmap(struct scrub_parity *sparity,
2303 int sectorsize = sparity->sctx->fs_info->sectorsize;
2305 if (len >= sparity->stripe_len) {
2306 bitmap_set(bitmap, 0, sparity->nsectors);
2310 start -= sparity->logic_start;
2311 start = div64_u64_rem(start, sparity->stripe_len, &offset);
2318 if (offset + nsectors <= sparity->nsectors) {
2323 bitmap_set(bitmap, offset, sparity->nsectors - offset);
2324 bitmap_set(bitmap, 0, nsectors - (sparity->nsectors - offset));
2327 static inline void scrub_parity_mark_sectors_error(struct scrub_parity *sparity,
2330 __scrub_mark_bitmap(sparity, sparity->ebitmap, start, len);
2333 static inline void scrub_parity_mark_sectors_data(struct scrub_parity *sparity,
2336 __scrub_mark_bitmap(sparity, sparity->dbitmap, start, len);
2357 if (sblock->sparity && corrupted && !sblock->data_corrected) {
2362 scrub_parity_mark_sectors_error(sblock->sparity,
2457 static int scrub_pages_for_parity(struct scrub_parity *sparity,
2462 struct scrub_ctx *sctx = sparity->sctx;
2479 sblock->sparity = sparity;
2480 scrub_parity_get(sparity);
2501 list_add_tail(&spage->list, &sparity->spages);
2541 static int scrub_extent_for_parity(struct scrub_parity *sparity,
2546 struct scrub_ctx *sctx = sparity->sctx;
2552 scrub_parity_mark_sectors_error(sparity, logical, len);
2557 blocksize = sparity->stripe_len;
2559 blocksize = sparity->stripe_len;
2575 ret = scrub_pages_for_parity(sparity, logical, l, physical, dev,
2632 static void scrub_free_parity(struct scrub_parity *sparity)
2634 struct scrub_ctx *sctx = sparity->sctx;
2638 nbits = bitmap_weight(sparity->ebitmap, sparity->nsectors);
2646 list_for_each_entry_safe(curr, next, &sparity->spages, list) {
2651 kfree(sparity);
2656 struct scrub_parity *sparity = container_of(work, struct scrub_parity,
2658 struct scrub_ctx *sctx = sparity->sctx;
2660 scrub_free_parity(sparity);
2666 struct scrub_parity *sparity = (struct scrub_parity *)bio->bi_private;
2667 struct btrfs_fs_info *fs_info = sparity->sctx->fs_info;
2670 bitmap_or(sparity->ebitmap, sparity->ebitmap, sparity->dbitmap,
2671 sparity->nsectors);
2675 btrfs_init_work(&sparity->work, scrub_parity_bio_endio_worker, NULL,
2677 btrfs_queue_work(fs_info->scrub_parity_workers, &sparity->work);
2680 static void scrub_parity_check_and_repair(struct scrub_parity *sparity)
2682 struct scrub_ctx *sctx = sparity->sctx;
2690 if (!bitmap_andnot(sparity->dbitmap, sparity->dbitmap, sparity->ebitmap,
2691 sparity->nsectors))
2694 length = sparity->logic_end - sparity->logic_start;
2697 ret = btrfs_map_sblock(fs_info, BTRFS_MAP_WRITE, sparity->logic_start,
2703 bio->bi_iter.bi_sector = sparity->logic_start >> 9;
2704 bio->bi_private = sparity;
2708 length, sparity->scrub_dev,
2709 sparity->dbitmap,
2710 sparity->nsectors);
2723 bitmap_or(sparity->ebitmap, sparity->ebitmap, sparity->dbitmap,
2724 sparity->nsectors);
2729 scrub_free_parity(sparity);
2737 static void scrub_parity_get(struct scrub_parity *sparity)
2739 refcount_inc(&sparity->refs);
2742 static void scrub_parity_put(struct scrub_parity *sparity)
2744 if (!refcount_dec_and_test(&sparity->refs))
2747 scrub_parity_check_and_repair(sparity);
2773 struct scrub_parity *sparity;
2781 sparity = kzalloc(sizeof(struct scrub_parity) + 2 * bitmap_len,
2783 if (!sparity) {
2790 sparity->stripe_len = map->stripe_len;
2791 sparity->nsectors = nsectors;
2792 sparity->sctx = sctx;
2793 sparity->scrub_dev = sdev;
2794 sparity->logic_start = logic_start;
2795 sparity->logic_end = logic_end;
2796 refcount_set(&sparity->refs, 1);
2797 INIT_LIST_HEAD(&sparity->spages);
2798 sparity->dbitmap = sparity->bitmap;
2799 sparity->ebitmap = (void *)sparity->bitmap + bitmap_len;
2896 scrub_parity_mark_sectors_data(sparity, extent_logical,
2924 ret = scrub_extent_for_parity(sparity, extent_logical,
2963 scrub_parity_mark_sectors_error(sparity, logic_start,
2965 scrub_parity_put(sparity);