Commit 30c5d345 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

block: do not reassig ->bi_bdev when partition remapping



There is no good reason to reassign ->bi_bdev when remapping the
partition-relative block number to the device wide one, as all the
information required by the drivers comes from the gendisk anyway.

Keeping the original ->bi_bdev alive will allow to greatly simplify
the partition-away I/O accounting.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Acked-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 2f9f6221
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -752,7 +752,7 @@ static int blk_partition_remap(struct bio *bio)
				      bio->bi_iter.bi_sector -
				      p->bd_start_sect);
	}
	bio->bi_bdev = bdev_whole(p);
	bio_set_flag(bio, BIO_REMAPPED);
	return 0;
}

@@ -817,7 +817,8 @@ static noinline_for_stack bool submit_bio_checks(struct bio *bio)
		goto end_io;
	if (unlikely(bio_check_eod(bio)))
		goto end_io;
	if (bio->bi_bdev->bd_partno && unlikely(blk_partition_remap(bio)))
	if (bio->bi_bdev->bd_partno && !bio_flagged(bio, BIO_REMAPPED) &&
	    unlikely(blk_partition_remap(bio)))
		goto end_io;

	/*
+2 −0
Original line number Diff line number Diff line
@@ -485,6 +485,7 @@ extern const char *bio_devname(struct bio *bio, char *buffer);

#define bio_set_dev(bio, bdev) 				\
do {							\
	bio_clear_flag(bio, BIO_REMAPPED);		\
	if ((bio)->bi_bdev != (bdev))			\
		bio_clear_flag(bio, BIO_THROTTLED);	\
	(bio)->bi_bdev = (bdev);			\
@@ -493,6 +494,7 @@ do { \

#define bio_copy_dev(dst, src)			\
do {						\
	bio_clear_flag(dst, BIO_REMAPPED);		\
	(dst)->bi_bdev = (src)->bi_bdev;	\
	bio_clone_blkg_association(dst, src);	\
} while (0)
+1 −0
Original line number Diff line number Diff line
@@ -303,6 +303,7 @@ enum {
				 * of this bio. */
	BIO_CGROUP_ACCT,	/* has been accounted to a cgroup */
	BIO_TRACKED,		/* set if bio goes through the rq_qos path */
	BIO_REMAPPED,
	BIO_FLAG_LAST
};