]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blobdiff - fs/btrfs/scrub.c
btrfs: root->fs_info cleanup, add fs_info convenience variables
[mirror_ubuntu-hirsute-kernel.git] / fs / btrfs / scrub.c
index 6834ff8dc0ab26c6341b9e468ae1d790132e8780..8aef00b0ff845bd34e12804383cf06f3fc7abc7a 100644 (file)
@@ -489,8 +489,8 @@ struct scrub_ctx *scrub_setup_ctx(struct btrfs_device *dev, int is_dev_replace)
                        sctx->bios[i]->next_free = -1;
        }
        sctx->first_free = 0;
-       sctx->nodesize = dev->fs_info->nodesize;
-       sctx->sectorsize = dev->fs_info->sectorsize;
+       sctx->nodesize = fs_info->nodesize;
+       sctx->sectorsize = fs_info->sectorsize;
        atomic_set(&sctx->bios_in_flight, 0);
        atomic_set(&sctx->workers_pending, 0);
        atomic_set(&sctx->cancel_req, 0);
@@ -789,6 +789,7 @@ out:
 
 static void scrub_fixup_nodatasum(struct btrfs_work *work)
 {
+       struct btrfs_fs_info *fs_info;
        int ret;
        struct scrub_fixup_nodatasum *fixup;
        struct scrub_ctx *sctx;
@@ -798,6 +799,7 @@ static void scrub_fixup_nodatasum(struct btrfs_work *work)
 
        fixup = container_of(work, struct scrub_fixup_nodatasum, work);
        sctx = fixup->sctx;
+       fs_info = fixup->root->fs_info;
 
        path = btrfs_alloc_path();
        if (!path) {
@@ -823,9 +825,8 @@ static void scrub_fixup_nodatasum(struct btrfs_work *work)
         * (once it's finished) and rewrite the failed sector if a good copy
         * can be found.
         */
-       ret = iterate_inodes_from_logical(fixup->logical, fixup->root->fs_info,
-                                               path, scrub_fixup_readpage,
-                                               fixup);
+       ret = iterate_inodes_from_logical(fixup->logical, fs_info, path,
+                                         scrub_fixup_readpage, fixup);
        if (ret < 0) {
                uncorrectable = 1;
                goto out;
@@ -843,9 +844,9 @@ out:
                spin_lock(&sctx->stat_lock);
                ++sctx->stat.uncorrectable_errors;
                spin_unlock(&sctx->stat_lock);
-               btrfs_dev_replace_stats_inc(&sctx->fs_info->dev_replace.
-                                               num_uncorrectable_read_errors);
-               btrfs_err_rl_in_rcu(sctx->fs_info,
+               btrfs_dev_replace_stats_inc(
+                       &fs_info->dev_replace.num_uncorrectable_read_errors);
+               btrfs_err_rl_in_rcu(fs_info,
                    "unable to fixup (nodatasum) error at logical %llu on dev %s",
                        fixup->logical, rcu_str_deref(fixup->dev->name));
        }
@@ -1176,8 +1177,7 @@ nodatasum_case:
                        if (scrub_write_page_to_dev_replace(sblock_other,
                                                            page_num) != 0) {
                                btrfs_dev_replace_stats_inc(
-                                       &sctx->fs_info->dev_replace.
-                                       num_write_errors);
+                                       &fs_info->dev_replace.num_write_errors);
                                success = 0;
                        }
                } else if (sblock_other) {
@@ -1563,6 +1563,7 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad,
 {
        struct scrub_page *page_bad = sblock_bad->pagev[page_num];
        struct scrub_page *page_good = sblock_good->pagev[page_num];
+       struct btrfs_fs_info *fs_info = sblock_bad->sctx->fs_info;
 
        BUG_ON(page_bad->page == NULL);
        BUG_ON(page_good->page == NULL);
@@ -1572,7 +1573,7 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad,
                int ret;
 
                if (!page_bad->dev->bdev) {
-                       btrfs_warn_rl(sblock_bad->sctx->fs_info,
+                       btrfs_warn_rl(fs_info,
                                "scrub_repair_page_from_good_copy(bdev == NULL) is unexpected");
                        return -EIO;
                }
@@ -1594,8 +1595,7 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad,
                        btrfs_dev_stat_inc_and_print(page_bad->dev,
                                BTRFS_DEV_STAT_WRITE_ERRS);
                        btrfs_dev_replace_stats_inc(
-                               &sblock_bad->sctx->fs_info->
-                               dev_replace.num_write_errors);
+                               &fs_info->dev_replace.num_write_errors);
                        bio_put(bio);
                        return -EIO;
                }
@@ -1607,6 +1607,7 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad,
 
 static void scrub_write_block_to_dev_replace(struct scrub_block *sblock)
 {
+       struct btrfs_fs_info *fs_info = sblock->sctx->fs_info;
        int page_num;
 
        /*
@@ -1622,8 +1623,7 @@ static void scrub_write_block_to_dev_replace(struct scrub_block *sblock)
                ret = scrub_write_page_to_dev_replace(sblock, page_num);
                if (ret)
                        btrfs_dev_replace_stats_inc(
-                               &sblock->sctx->fs_info->dev_replace.
-                               num_write_errors);
+                               &fs_info->dev_replace.num_write_errors);
        }
 }
 
@@ -1857,8 +1857,7 @@ static int scrub_checksum_tree_block(struct scrub_block *sblock)
 {
        struct scrub_ctx *sctx = sblock->sctx;
        struct btrfs_header *h;
-       struct btrfs_root *root = sctx->fs_info->dev_root;
-       struct btrfs_fs_info *fs_info = root->fs_info;
+       struct btrfs_fs_info *fs_info = sctx->fs_info;
        u8 calculated_csum[BTRFS_CSUM_SIZE];
        u8 on_disk_csum[BTRFS_CSUM_SIZE];
        struct page *page;
@@ -2138,6 +2137,7 @@ static void scrub_missing_raid56_worker(struct btrfs_work *work)
 {
        struct scrub_block *sblock = container_of(work, struct scrub_block, work);
        struct scrub_ctx *sctx = sblock->sctx;
+       struct btrfs_fs_info *fs_info = sctx->fs_info;
        u64 logical;
        struct btrfs_device *dev;
 
@@ -2151,14 +2151,14 @@ static void scrub_missing_raid56_worker(struct btrfs_work *work)
                spin_lock(&sctx->stat_lock);
                sctx->stat.read_errors++;
                spin_unlock(&sctx->stat_lock);
-               btrfs_err_rl_in_rcu(sctx->fs_info,
+               btrfs_err_rl_in_rcu(fs_info,
                        "IO error rebuilding logical %llu for dev %s",
                        logical, rcu_str_deref(dev->name));
        } else if (sblock->header_error || sblock->checksum_error) {
                spin_lock(&sctx->stat_lock);
                sctx->stat.uncorrectable_errors++;
                spin_unlock(&sctx->stat_lock);
-               btrfs_err_rl_in_rcu(sctx->fs_info,
+               btrfs_err_rl_in_rcu(fs_info,
                        "failed to rebuild valid logical %llu for dev %s",
                        logical, rcu_str_deref(dev->name));
        } else {
@@ -2749,6 +2749,7 @@ static void scrub_parity_bio_endio_worker(struct btrfs_work *work)
 static void scrub_parity_bio_endio(struct bio *bio)
 {
        struct scrub_parity *sparity = (struct scrub_parity *)bio->bi_private;
+       struct btrfs_fs_info *fs_info = sparity->sctx->fs_info;
 
        if (bio->bi_error)
                bitmap_or(sparity->ebitmap, sparity->ebitmap, sparity->dbitmap,
@@ -2758,14 +2759,14 @@ static void scrub_parity_bio_endio(struct bio *bio)
 
        btrfs_init_work(&sparity->work, btrfs_scrubparity_helper,
                        scrub_parity_bio_endio_worker, NULL, NULL);
-       btrfs_queue_work(sparity->sctx->fs_info->scrub_parity_workers,
-                        &sparity->work);
+       btrfs_queue_work(fs_info->scrub_parity_workers, &sparity->work);
 }
 
 static void scrub_parity_check_and_repair(struct scrub_parity *sparity)
 {
        struct scrub_ctx *sctx = sparity->sctx;
-       struct btrfs_root *dev_root = sctx->fs_info->dev_root;
+       struct btrfs_fs_info *fs_info = sctx->fs_info;
+       struct btrfs_root *dev_root = fs_info->dev_root;
        struct bio *bio;
        struct btrfs_raid_bio *rbio;
        struct scrub_page *spage;
@@ -2778,8 +2779,7 @@ static void scrub_parity_check_and_repair(struct scrub_parity *sparity)
                goto out;
 
        length = sparity->logic_end - sparity->logic_start;
-       ret = btrfs_map_sblock(sctx->fs_info, BTRFS_MAP_WRITE,
-                              sparity->logic_start,
+       ret = btrfs_map_sblock(fs_info, BTRFS_MAP_WRITE, sparity->logic_start,
                               &length, &bbio, 0, 1);
        if (ret || !bbio || !bbio->raid_map)
                goto bbio_out;
@@ -2866,7 +2866,7 @@ static noinline_for_stack int scrub_raid56_parity(struct scrub_ctx *sctx,
        int extent_mirror_num;
        int stop_loop = 0;
 
-       nsectors = div_u64(map->stripe_len, root->fs_info->sectorsize);
+       nsectors = div_u64(map->stripe_len, fs_info->sectorsize);
        bitmap_len = scrub_calc_parity_bitmap_len(nsectors);
        sparity = kzalloc(sizeof(struct scrub_parity) + 2 * bitmap_len,
                          GFP_NOFS);
@@ -2937,7 +2937,7 @@ static noinline_for_stack int scrub_raid56_parity(struct scrub_ctx *sctx,
                                goto next;
 
                        if (key.type == BTRFS_METADATA_ITEM_KEY)
-                               bytes = root->fs_info->nodesize;
+                               bytes = fs_info->nodesize;
                        else
                                bytes = key.offset;
 
@@ -3290,7 +3290,7 @@ static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx,
                                goto next;
 
                        if (key.type == BTRFS_METADATA_ITEM_KEY)
-                               bytes = root->fs_info->nodesize;
+                               bytes = fs_info->nodesize;
                        else
                                bytes = key.offset;
 
@@ -3497,8 +3497,8 @@ int scrub_enumerate_chunks(struct scrub_ctx *sctx,
 {
        struct btrfs_dev_extent *dev_extent = NULL;
        struct btrfs_path *path;
-       struct btrfs_root *root = sctx->fs_info->dev_root;
-       struct btrfs_fs_info *fs_info = root->fs_info;
+       struct btrfs_fs_info *fs_info = sctx->fs_info;
+       struct btrfs_root *root = fs_info->dev_root;
        u64 length;
        u64 chunk_offset;
        int ret = 0;
@@ -3747,16 +3747,16 @@ static noinline_for_stack int scrub_supers(struct scrub_ctx *sctx,
        u64     bytenr;
        u64     gen;
        int     ret;
-       struct btrfs_root *root = sctx->fs_info->dev_root;
+       struct btrfs_fs_info *fs_info = sctx->fs_info;
 
-       if (test_bit(BTRFS_FS_STATE_ERROR, &root->fs_info->fs_state))
+       if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state))
                return -EIO;
 
        /* Seed devices of a new filesystem has their own generation. */
-       if (scrub_dev->fs_devices != root->fs_info->fs_devices)
+       if (scrub_dev->fs_devices != fs_info->fs_devices)
                gen = scrub_dev->generation;
        else
-               gen = root->fs_info->last_trans_committed;
+               gen = fs_info->last_trans_committed;
 
        for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {
                bytenr = btrfs_sb_offset(i);
@@ -4052,16 +4052,17 @@ int btrfs_scrub_cancel_dev(struct btrfs_fs_info *fs_info,
 int btrfs_scrub_progress(struct btrfs_root *root, u64 devid,
                         struct btrfs_scrub_progress *progress)
 {
+       struct btrfs_fs_info *fs_info = root->fs_info;
        struct btrfs_device *dev;
        struct scrub_ctx *sctx = NULL;
 
-       mutex_lock(&root->fs_info->fs_devices->device_list_mutex);
-       dev = btrfs_find_device(root->fs_info, devid, NULL, NULL);
+       mutex_lock(&fs_info->fs_devices->device_list_mutex);
+       dev = btrfs_find_device(fs_info, devid, NULL, NULL);
        if (dev)
                sctx = dev->scrub_device;
        if (sctx)
                memcpy(progress, &sctx->stat, sizeof(*progress));
-       mutex_unlock(&root->fs_info->fs_devices->device_list_mutex);
+       mutex_unlock(&fs_info->fs_devices->device_list_mutex);
 
        return dev ? (sctx ? 0 : -ENOTCONN) : -ENODEV;
 }
@@ -4171,20 +4172,17 @@ static void copy_nocow_pages_worker(struct btrfs_work *work)
        struct scrub_copy_nocow_ctx *nocow_ctx =
                container_of(work, struct scrub_copy_nocow_ctx, work);
        struct scrub_ctx *sctx = nocow_ctx->sctx;
+       struct btrfs_fs_info *fs_info = sctx->fs_info;
+       struct btrfs_root *root = fs_info->extent_root;
        u64 logical = nocow_ctx->logical;
        u64 len = nocow_ctx->len;
        int mirror_num = nocow_ctx->mirror_num;
        u64 physical_for_dev_replace = nocow_ctx->physical_for_dev_replace;
        int ret;
        struct btrfs_trans_handle *trans = NULL;
-       struct btrfs_fs_info *fs_info;
        struct btrfs_path *path;
-       struct btrfs_root *root;
        int not_written = 0;
 
-       fs_info = sctx->fs_info;
-       root = fs_info->extent_root;
-
        path = btrfs_alloc_path();
        if (!path) {
                spin_lock(&sctx->stat_lock);