OSDN Git Service

block: do not reassig ->bi_bdev when partition remapping
authorChristoph Hellwig <hch@lst.de>
Sun, 24 Jan 2021 10:02:36 +0000 (11:02 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 25 Jan 2021 01:17:20 +0000 (18:17 -0700)
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>
block/blk-core.c
include/linux/bio.h
include/linux/blk_types.h

index 64f6902..1c1b97a 100644 (file)
@@ -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;
 
        /*
index 12af7aa..2f1155e 100644 (file)
@@ -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)
index 8ebd8be..1bc6f6a 100644 (file)
@@ -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
 };