};
 
 struct btrfs_raid_bio {
-       struct btrfs_fs_info *fs_info;
        struct btrfs_io_context *bioc;
 
        /* while we're doing rmw on a stripe
 static void start_async_work(struct btrfs_raid_bio *rbio, btrfs_func_t work_func)
 {
        btrfs_init_work(&rbio->work, work_func, NULL, NULL);
-       btrfs_queue_work(rbio->fs_info->rmw_workers, &rbio->work);
+       btrfs_queue_work(rbio->bioc->fs_info->rmw_workers, &rbio->work);
 }
 
 /*
        if (!test_bit(RBIO_CACHE_BIT, &rbio->flags))
                return;
 
-       table = rbio->fs_info->stripe_hash_table;
+       table = rbio->bioc->fs_info->stripe_hash_table;
        h = table->table + bucket;
 
        /* hold the lock for the bucket because we may be
        if (!test_bit(RBIO_CACHE_BIT, &rbio->flags))
                return;
 
-       table = rbio->fs_info->stripe_hash_table;
+       table = rbio->bioc->fs_info->stripe_hash_table;
 
        spin_lock_irqsave(&table->cache_lock, flags);
        __remove_rbio_from_cache(rbio);
        if (!test_bit(RBIO_CACHE_READY_BIT, &rbio->flags))
                return;
 
-       table = rbio->fs_info->stripe_hash_table;
+       table = rbio->bioc->fs_info->stripe_hash_table;
 
        spin_lock_irqsave(&table->cache_lock, flags);
        spin_lock(&rbio->bio_list_lock);
        struct btrfs_raid_bio *cache_drop = NULL;
        int ret = 0;
 
-       h = rbio->fs_info->stripe_hash_table->table + rbio_bucket(rbio);
+       h = rbio->bioc->fs_info->stripe_hash_table->table + rbio_bucket(rbio);
 
        spin_lock_irqsave(&h->lock, flags);
        list_for_each_entry(cur, &h->hash_list, hash_list) {
        int keep_cache = 0;
 
        bucket = rbio_bucket(rbio);
-       h = rbio->fs_info->stripe_hash_table->table + bucket;
+       h = rbio->bioc->fs_info->stripe_hash_table->table + bucket;
 
        if (list_empty(&rbio->plug_list))
                cache_rbio(rbio);
        struct bio *extra;
 
        if (rbio->generic_bio_cnt)
-               btrfs_bio_counter_sub(rbio->fs_info, rbio->generic_bio_cnt);
+               btrfs_bio_counter_sub(rbio->bioc->fs_info, rbio->generic_bio_cnt);
 
        /*
         * At this moment, rbio->bio_list is empty, however since rbio does not
        INIT_LIST_HEAD(&rbio->stripe_cache);
        INIT_LIST_HEAD(&rbio->hash_list);
        rbio->bioc = bioc;
-       rbio->fs_info = fs_info;
        rbio->stripe_len = stripe_len;
        rbio->nr_pages = num_pages;
        rbio->real_stripes = real_stripes;
                bio->bi_end_io = raid_rmw_end_io;
                bio->bi_opf = REQ_OP_READ;
 
-               btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56);
+               btrfs_bio_wq_end_io(rbio->bioc->fs_info, bio, BTRFS_WQ_ENDIO_RAID56);
 
                submit_bio(bio);
        }
 /*
  * our main entry point for writes from the rest of the FS.
  */
-int raid56_parity_write(struct btrfs_fs_info *fs_info, struct bio *bio,
-                       struct btrfs_io_context *bioc, u64 stripe_len)
+int raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc,
+                       u64 stripe_len)
 {
+       struct btrfs_fs_info *fs_info = bioc->fs_info;
        struct btrfs_raid_bio *rbio;
        struct btrfs_plug_cb *plug = NULL;
        struct blk_plug_cb *cb;
                bio->bi_end_io = raid_recover_end_io;
                bio->bi_opf = REQ_OP_READ;
 
-               btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56);
+               btrfs_bio_wq_end_io(rbio->bioc->fs_info, bio, BTRFS_WQ_ENDIO_RAID56);
 
                submit_bio(bio);
        }
  * so we assume the bio they send down corresponds to a failed part
  * of the drive.
  */
-int raid56_parity_recover(struct btrfs_fs_info *fs_info, struct bio *bio,
-                         struct btrfs_io_context *bioc, u64 stripe_len,
-                         int mirror_num, int generic_io)
+int raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc,
+                         u64 stripe_len, int mirror_num, int generic_io)
 {
+       struct btrfs_fs_info *fs_info = bioc->fs_info;
        struct btrfs_raid_bio *rbio;
        int ret;
 
  * is those pages just hold metadata or file data with checksum.
  */
 
-struct btrfs_raid_bio *
-raid56_parity_alloc_scrub_rbio(struct btrfs_fs_info *fs_info, struct bio *bio,
-                              struct btrfs_io_context *bioc, u64 stripe_len,
-                              struct btrfs_device *scrub_dev,
-                              unsigned long *dbitmap, int stripe_nsectors)
+struct btrfs_raid_bio *raid56_parity_alloc_scrub_rbio(struct bio *bio,
+                               struct btrfs_io_context *bioc,
+                               u64 stripe_len, struct btrfs_device *scrub_dev,
+                               unsigned long *dbitmap, int stripe_nsectors)
 {
+       struct btrfs_fs_info *fs_info = bioc->fs_info;
        struct btrfs_raid_bio *rbio;
        int i;
 
                bio->bi_end_io = raid56_parity_scrub_end_io;
                bio->bi_opf = REQ_OP_READ;
 
-               btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56);
+               btrfs_bio_wq_end_io(rbio->bioc->fs_info, bio, BTRFS_WQ_ENDIO_RAID56);
 
                submit_bio(bio);
        }
 /* The following code is used for dev replace of a missing RAID 5/6 device. */
 
 struct btrfs_raid_bio *
-raid56_alloc_missing_rbio(struct btrfs_fs_info *fs_info, struct bio *bio,
-                         struct btrfs_io_context *bioc, u64 length)
+raid56_alloc_missing_rbio(struct bio *bio, struct btrfs_io_context *bioc,
+                         u64 length)
 {
+       struct btrfs_fs_info *fs_info = bioc->fs_info;
        struct btrfs_raid_bio *rbio;
 
        rbio = alloc_rbio(fs_info, bioc, length);
 
 struct btrfs_raid_bio;
 struct btrfs_device;
 
-int raid56_parity_recover(struct btrfs_fs_info *fs_info, struct bio *bio,
-                         struct btrfs_io_context *bioc, u64 stripe_len,
-                         int mirror_num, int generic_io);
-int raid56_parity_write(struct btrfs_fs_info *fs_info, struct bio *bio,
-                       struct btrfs_io_context *bioc, u64 stripe_len);
+int raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc,
+                         u64 stripe_len, int mirror_num, int generic_io);
+int raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc,
+                       u64 stripe_len);
 
 void raid56_add_scrub_pages(struct btrfs_raid_bio *rbio, struct page *page,
                            u64 logical);
 
-struct btrfs_raid_bio *
-raid56_parity_alloc_scrub_rbio(struct btrfs_fs_info *fs_info, struct bio *bio,
-                              struct btrfs_io_context *bioc, u64 stripe_len,
-                              struct btrfs_device *scrub_dev,
-                              unsigned long *dbitmap, int stripe_nsectors);
+struct btrfs_raid_bio *raid56_parity_alloc_scrub_rbio(struct bio *bio,
+                               struct btrfs_io_context *bioc, u64 stripe_len,
+                               struct btrfs_device *scrub_dev,
+                               unsigned long *dbitmap, int stripe_nsectors);
 void raid56_parity_submit_scrub_rbio(struct btrfs_raid_bio *rbio);
 
 struct btrfs_raid_bio *
-raid56_alloc_missing_rbio(struct btrfs_fs_info *fs_info, struct bio *bio,
-                         struct btrfs_io_context *bioc, u64 length);
+raid56_alloc_missing_rbio(struct bio *bio, struct btrfs_io_context *bioc,
+                         u64 length);
 void raid56_submit_missing_rbio(struct btrfs_raid_bio *rbio);
 
 int btrfs_alloc_stripe_hash_table(struct btrfs_fs_info *info);
 
        bio->bi_end_io = scrub_bio_wait_endio;
 
        mirror_num = spage->sblock->pagev[0]->mirror_num;
-       ret = raid56_parity_recover(fs_info, bio, spage->recover->bioc,
+       ret = raid56_parity_recover(bio, spage->recover->bioc,
                                    spage->recover->map_length,
                                    mirror_num, 0);
        if (ret)
        bio->bi_private = sblock;
        bio->bi_end_io = scrub_missing_raid56_end_io;
 
-       rbio = raid56_alloc_missing_rbio(fs_info, bio, bioc, length);
+       rbio = raid56_alloc_missing_rbio(bio, bioc, length);
        if (!rbio)
                goto rbio_out;
 
        bio->bi_private = sparity;
        bio->bi_end_io = scrub_parity_bio_endio;
 
-       rbio = raid56_parity_alloc_scrub_rbio(fs_info, bio, bioc,
-                                             length, sparity->scrub_dev,
+       rbio = raid56_parity_alloc_scrub_rbio(bio, bioc, length,
+                                             sparity->scrub_dev,
                                              sparity->dbitmap,
                                              sparity->nsectors);
        if (!rbio)