summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2021-01-24 11:02:36 +0100
committerJens Axboe <axboe@kernel.dk>2021-01-24 18:17:20 -0700
commit30c5d3456c272f0de0d7e7eb9fc355fa64a5f649 (patch)
tree8901f97019c05ddd88c2efa9994c7943519107d1
parent2f9f6221b9b9944e96c80455b469a6f0269c558b (diff)
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: Christoph Hellwig <hch@lst.de> Acked-by: Tejun Heo <tj@kernel.org> Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--block/blk-core.c5
-rw-r--r--include/linux/bio.h2
-rw-r--r--include/linux/blk_types.h1
3 files changed, 6 insertions, 2 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index 64f69022de96..1c1b97a82caa 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -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;
/*
diff --git a/include/linux/bio.h b/include/linux/bio.h
index 12af7aa5db37..2f1155eabaff 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -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)
diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
index 8ebd8be3e050..1bc6f6a01070 100644
--- a/include/linux/blk_types.h
+++ b/include/linux/blk_types.h
@@ -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
};