Commit d0e5cb2b authored by Christoph Hellwig's avatar Christoph Hellwig Committed by David Sterba
Browse files

btrfs: add a btrfs_inode pointer to struct btrfs_bio



All btrfs_bio I/Os are associated with an inode.  Add a pointer to that
inode, which will allow to simplify a lot of calling conventions, and
which will be needed in the I/O completion path in the future.

This grow the btrfs_bio structure by a pointer, but that grows will
be offset by the removal of the device pointer soon.

Reviewed-by: default avatarAnand Jain <anand.jain@oracle.com>
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent e0cfbb2c
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -22,9 +22,11 @@ static struct bio_set btrfs_bioset;
 * is already initialized by the block layer.
 */
static inline void btrfs_bio_init(struct btrfs_bio *bbio,
				  struct btrfs_inode *inode,
				  btrfs_bio_end_io_t end_io, void *private)
{
	memset(bbio, 0, offsetof(struct btrfs_bio, bio));
	bbio->inode = inode;
	bbio->end_io = end_io;
	bbio->private = private;
}
@@ -37,16 +39,18 @@ static inline void btrfs_bio_init(struct btrfs_bio *bbio,
 * a mempool.
 */
struct bio *btrfs_bio_alloc(unsigned int nr_vecs, blk_opf_t opf,
			    struct btrfs_inode *inode,
			    btrfs_bio_end_io_t end_io, void *private)
{
	struct bio *bio;

	bio = bio_alloc_bioset(NULL, nr_vecs, opf, GFP_NOFS, &btrfs_bioset);
	btrfs_bio_init(btrfs_bio(bio), end_io, private);
	btrfs_bio_init(btrfs_bio(bio), inode, end_io, private);
	return bio;
}

struct bio *btrfs_bio_clone_partial(struct bio *orig, u64 offset, u64 size,
				    struct btrfs_inode *inode,
				    btrfs_bio_end_io_t end_io, void *private)
{
	struct bio *bio;
@@ -56,7 +60,7 @@ struct bio *btrfs_bio_clone_partial(struct bio *orig, u64 offset, u64 size,

	bio = bio_alloc_clone(orig->bi_bdev, orig, GFP_NOFS, &btrfs_bioset);
	bbio = btrfs_bio(bio);
	btrfs_bio_init(bbio, end_io, private);
	btrfs_bio_init(bbio, inode, end_io, private);

	bio_trim(bio, offset >> 9, size >> 9);
	bbio->iter = bio->bi_iter;
+4 −1
Original line number Diff line number Diff line
@@ -41,7 +41,8 @@ struct btrfs_bio {
	unsigned int is_metadata:1;
	struct bvec_iter iter;

	/* File offset that this I/O operates on. */
	/* Inode and offset into it that this I/O operates on. */
	struct btrfs_inode *inode;
	u64 file_offset;

	/* @device is for stripe IO submission. */
@@ -80,8 +81,10 @@ int __init btrfs_bioset_init(void);
void __cold btrfs_bioset_exit(void);

struct bio *btrfs_bio_alloc(unsigned int nr_vecs, blk_opf_t opf,
			    struct btrfs_inode *inode,
			    btrfs_bio_end_io_t end_io, void *private);
struct bio *btrfs_bio_clone_partial(struct bio *orig, u64 offset, u64 size,
				    struct btrfs_inode *inode,
				    btrfs_bio_end_io_t end_io, void *private);


+2 −1
Original line number Diff line number Diff line
@@ -344,7 +344,8 @@ static struct bio *alloc_compressed_bio(struct compressed_bio *cb, u64 disk_byte
	struct bio *bio;
	int ret;

	bio = btrfs_bio_alloc(BIO_MAX_VECS, opf, endio_func, cb);
	bio = btrfs_bio_alloc(BIO_MAX_VECS, opf, BTRFS_I(cb->inode), endio_func,
			      cb);
	bio->bi_iter.bi_sector = disk_bytenr >> SECTOR_SHIFT;

	em = btrfs_get_chunk_map(fs_info, disk_bytenr, fs_info->sectorsize);
+4 −4
Original line number Diff line number Diff line
@@ -740,7 +740,8 @@ int btrfs_repair_one_sector(struct btrfs_inode *inode, struct btrfs_bio *failed_
		return -EIO;
	}

	repair_bio = btrfs_bio_alloc(1, REQ_OP_READ, failed_bbio->end_io,
	repair_bio = btrfs_bio_alloc(1, REQ_OP_READ, failed_bbio->inode,
				     failed_bbio->end_io,
				     failed_bbio->private);
	repair_bbio = btrfs_bio(repair_bio);
	repair_bbio->file_offset = start;
@@ -1394,9 +1395,8 @@ static int alloc_new_bio(struct btrfs_inode *inode,
	struct bio *bio;
	int ret;

	ASSERT(bio_ctrl->end_io_func);

	bio = btrfs_bio_alloc(BIO_MAX_VECS, opf, bio_ctrl->end_io_func, NULL);
	bio = btrfs_bio_alloc(BIO_MAX_VECS, opf, inode, bio_ctrl->end_io_func,
			      NULL);
	/*
	 * For compressed page range, its disk_bytenr is always @disk_bytenr
	 * passed in, no matter if we have added any range into previous bio.
+3 −1
Original line number Diff line number Diff line
@@ -8097,7 +8097,8 @@ static void btrfs_submit_direct(const struct iomap_iter *iter,
		 * the allocation is backed by btrfs_bioset.
		 */
		bio = btrfs_bio_clone_partial(dio_bio, clone_offset, clone_len,
					      btrfs_end_dio_bio, dip);
					      BTRFS_I(inode), btrfs_end_dio_bio,
					      dip);
		btrfs_bio(bio)->file_offset = file_offset;

		if (bio_op(bio) == REQ_OP_ZONE_APPEND) {
@@ -10409,6 +10410,7 @@ int btrfs_encoded_read_regular_fill_pages(struct btrfs_inode *inode,

			if (!bio) {
				bio = btrfs_bio_alloc(BIO_MAX_VECS, REQ_OP_READ,
						      inode,
						      btrfs_encoded_read_endio,
						      &priv);
				bio->bi_iter.bi_sector =