* Initialize a btrfs_bio structure.  This skips the embedded bio itself as it
  * is already initialized by the block layer.
  */
-void btrfs_bio_init(struct btrfs_bio *bbio, struct btrfs_inode *inode,
+void btrfs_bio_init(struct btrfs_bio *bbio, struct btrfs_fs_info *fs_info,
                    btrfs_bio_end_io_t end_io, void *private)
 {
        memset(bbio, 0, offsetof(struct btrfs_bio, bio));
-       bbio->inode = inode;
+       bbio->fs_info = fs_info;
        bbio->end_io = end_io;
        bbio->private = private;
        atomic_set(&bbio->pending_ios, 1);
  * a mempool.
  */
 struct btrfs_bio *btrfs_bio_alloc(unsigned int nr_vecs, blk_opf_t opf,
-                                 struct btrfs_inode *inode,
+                                 struct btrfs_fs_info *fs_info,
                                  btrfs_bio_end_io_t end_io, void *private)
 {
        struct btrfs_bio *bbio;
 
        bio = bio_alloc_bioset(NULL, nr_vecs, opf, GFP_NOFS, &btrfs_bioset);
        bbio = btrfs_bio(bio);
-       btrfs_bio_init(bbio, inode, end_io, private);
+       btrfs_bio_init(bbio, fs_info, end_io, private);
        return bbio;
 }
 
                                GFP_NOFS, &btrfs_clone_bioset);
        }
        bbio = btrfs_bio(bio);
-       btrfs_bio_init(bbio, orig_bbio->inode, NULL, orig_bbio);
-
+       btrfs_bio_init(bbio, fs_info, NULL, orig_bbio);
+       bbio->inode = orig_bbio->inode;
        bbio->file_offset = orig_bbio->file_offset;
        if (!(orig_bbio->bio.bi_opf & REQ_BTRFS_ONE_ORDERED))
                orig_bbio->file_offset += map_length;
        __bio_add_page(repair_bio, bv->bv_page, bv->bv_len, bv->bv_offset);
 
        repair_bbio = btrfs_bio(repair_bio);
-       btrfs_bio_init(repair_bbio, failed_bbio->inode, NULL, fbio);
+       btrfs_bio_init(repair_bbio, fs_info, NULL, fbio);
+       repair_bbio->inode = failed_bbio->inode;
        repair_bbio->file_offset = failed_bbio->file_offset + bio_offset;
 
        mirror = next_repair_mirror(fbio, failed_bbio->mirror_num);
        struct btrfs_failed_bio *fbio = NULL;
        u32 offset = 0;
 
+       /* Read-repair requires the inode field to be set by the submitter. */
+       ASSERT(inode);
+
        /*
         * Hand off repair bios to the repair code as there is no upper level
         * submitter for them.
        struct btrfs_bio *bbio = container_of(work, struct btrfs_bio, end_io_work);
 
        /* Metadata reads are checked and repaired by the submitter. */
-       if (bbio->bio.bi_opf & REQ_META)
-               bbio->end_io(bbio);
-       else
+       if (bbio->inode && !(bbio->bio.bi_opf & REQ_META))
                btrfs_check_read_bio(bbio, bbio->bio.bi_private);
+       else
+               bbio->end_io(bbio);
 }
 
 static void btrfs_simple_end_io(struct bio *bio)
 {
        struct btrfs_bio *bbio = btrfs_bio(bio);
        struct btrfs_device *dev = bio->bi_private;
-       struct btrfs_fs_info *fs_info = bbio->inode->root->fs_info;
+       struct btrfs_fs_info *fs_info = bbio->fs_info;
 
        btrfs_bio_counter_dec(fs_info);
 
 
        btrfs_bio_counter_dec(bioc->fs_info);
        bbio->mirror_num = bioc->mirror_num;
-       if (bio_op(bio) == REQ_OP_READ && !(bbio->bio.bi_opf & REQ_META))
+       if (bio_op(bio) == REQ_OP_READ && bbio->inode &&
+           !(bbio->bio.bi_opf & REQ_META))
                btrfs_check_read_bio(bbio, NULL);
        else
                btrfs_orig_bbio_end_io(bbio);
         * in order.
         */
        if (bbio->bio.bi_opf & REQ_META) {
-               struct btrfs_fs_info *fs_info = bbio->inode->root->fs_info;
+               struct btrfs_fs_info *fs_info = bbio->fs_info;
 
                if (btrfs_is_zoned(fs_info))
                        return false;
                                struct btrfs_io_context *bioc,
                                struct btrfs_io_stripe *smap, int mirror_num)
 {
-       struct btrfs_fs_info *fs_info = bbio->inode->root->fs_info;
+       struct btrfs_fs_info *fs_info = bbio->fs_info;
        struct async_submit_bio *async;
 
        async = kmalloc(sizeof(*async), GFP_NOFS);
 static bool btrfs_submit_chunk(struct btrfs_bio *bbio, int mirror_num)
 {
        struct btrfs_inode *inode = bbio->inode;
-       struct btrfs_fs_info *fs_info = inode->root->fs_info;
+       struct btrfs_fs_info *fs_info = bbio->fs_info;
        struct btrfs_bio *orig_bbio = bbio;
        struct bio *bio = &bbio->bio;
        u64 logical = bio->bi_iter.bi_sector << 9;
         * Save the iter for the end_io handler and preload the checksums for
         * data reads.
         */
-       if (bio_op(bio) == REQ_OP_READ && !(bio->bi_opf & REQ_META)) {
+       if (bio_op(bio) == REQ_OP_READ && inode && !(bio->bi_opf & REQ_META)) {
                bbio->saved_iter = bio->bi_iter;
                ret = btrfs_lookup_bio_sums(bbio);
                if (ret)
                 * Csum items for reloc roots have already been cloned at this
                 * point, so they are handled as part of the no-checksum case.
                 */
-               if (!(inode->flags & BTRFS_INODE_NODATASUM) &&
+               if (inode && !(inode->flags & BTRFS_INODE_NODATASUM) &&
                    !test_bit(BTRFS_FS_STATE_NO_CSUMS, &fs_info->fs_state) &&
                    !btrfs_is_data_reloc_root(inode->root)) {
                        if (should_async_write(bbio) &&
 
 void btrfs_submit_bio(struct btrfs_bio *bbio, int mirror_num)
 {
+       /* If bbio->inode is not populated, its file_offset must be 0. */
+       ASSERT(bbio->inode || bbio->file_offset == 0);
+
        while (!btrfs_submit_chunk(bbio, mirror_num))
                ;
 }
 
  * passed to btrfs_submit_bio for mapping to the physical devices.
  */
 struct btrfs_bio {
-       /* Inode and offset into it that this I/O operates on. */
+       /*
+        * Inode and offset into it that this I/O operates on.
+        * Only set for data I/O.
+        */
        struct btrfs_inode *inode;
        u64 file_offset;
 
        atomic_t pending_ios;
        struct work_struct end_io_work;
 
+       /* File system that this I/O operates on. */
+       struct btrfs_fs_info *fs_info;
+
        /*
         * This member must come last, bio_alloc_bioset will allocate enough
         * bytes for entire btrfs_bio but relies on bio being last.
 int __init btrfs_bioset_init(void);
 void __cold btrfs_bioset_exit(void);
 
-void btrfs_bio_init(struct btrfs_bio *bbio, struct btrfs_inode *inode,
+void btrfs_bio_init(struct btrfs_bio *bbio, struct btrfs_fs_info *fs_info,
                    btrfs_bio_end_io_t end_io, void *private);
 struct btrfs_bio *btrfs_bio_alloc(unsigned int nr_vecs, blk_opf_t opf,
-                                 struct btrfs_inode *inode,
+                                 struct btrfs_fs_info *fs_info,
                                  btrfs_bio_end_io_t end_io, void *private);
 
 static inline void btrfs_bio_end_io(struct btrfs_bio *bbio, blk_status_t status)
 
                container_of(bbio, struct btrfs_dio_private, bbio);
        struct btrfs_dio_data *dio_data = iter->private;
 
-       btrfs_bio_init(bbio, BTRFS_I(iter->inode), btrfs_dio_end_io, bio->bi_private);
+       btrfs_bio_init(bbio, BTRFS_I(iter->inode)->root->fs_info,
+                      btrfs_dio_end_io, bio->bi_private);
+       bbio->inode = BTRFS_I(iter->inode);
        bbio->file_offset = file_offset;
 
        dip->file_offset = file_offset;
                                          u64 file_offset, u64 disk_bytenr,
                                          u64 disk_io_size, struct page **pages)
 {
+       struct btrfs_fs_info *fs_info = inode->root->fs_info;
        struct btrfs_encoded_read_private priv = {
                .pending = ATOMIC_INIT(1),
        };
 
        init_waitqueue_head(&priv.wait);
 
-       bbio = btrfs_bio_alloc(BIO_MAX_VECS, REQ_OP_READ, inode,
-                             btrfs_encoded_read_endio, &priv);
+       bbio = btrfs_bio_alloc(BIO_MAX_VECS, REQ_OP_READ, fs_info,
+                              btrfs_encoded_read_endio, &priv);
        bbio->bio.bi_iter.bi_sector = disk_bytenr >> SECTOR_SHIFT;
+       bbio->inode = inode;
 
        do {
                size_t bytes = min_t(u64, disk_io_size, PAGE_SIZE);
                        atomic_inc(&priv.pending);
                        btrfs_submit_bio(bbio, 0);
 
-                       bbio = btrfs_bio_alloc(BIO_MAX_VECS, REQ_OP_READ, inode,
+                       bbio = btrfs_bio_alloc(BIO_MAX_VECS, REQ_OP_READ, fs_info,
                                               btrfs_encoded_read_endio, &priv);
                        bbio->bio.bi_iter.bi_sector = disk_bytenr >> SECTOR_SHIFT;
+                       bbio->inode = inode;
                        continue;
                }