bdev: move ->bd_has_subit_bio to ->__bd_flags
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 12 Apr 2024 05:21:45 +0000 (01:21 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 3 May 2024 00:00:37 +0000 (20:00 -0400)
In bdev_alloc() we have all flags initialized to false, so
assignment to ->bh_has_submit_bio n there is a no-op unless
we have partno != 0 and flag already set on entire device.

In device_add_disk() we have just allocated the block_device
in question and it had been a full-device one, so the flag
is guaranteed to be still clear when we get to assignment.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
block/bdev.c
block/blk-core.c
block/genhd.c
include/linux/blk_types.h

index 9df9a59f09004baa1f5d1700e006788975f8b2aa..fae30eae7741a15ee39cd88e8ae5988cb0b18740 100644 (file)
@@ -414,10 +414,8 @@ struct block_device *bdev_alloc(struct gendisk *disk, u8 partno)
        atomic_set(&bdev->__bd_flags, partno);
        bdev->bd_inode = inode;
        bdev->bd_queue = disk->queue;
-       if (partno)
-               bdev->bd_has_submit_bio = disk->part0->bd_has_submit_bio;
-       else
-               bdev->bd_has_submit_bio = false;
+       if (partno && bdev_test_flag(disk->part0, BD_HAS_SUBMIT_BIO))
+               bdev_set_flag(bdev, BD_HAS_SUBMIT_BIO);
        bdev->bd_stats = alloc_percpu(struct disk_stats);
        if (!bdev->bd_stats) {
                iput(inode);
index 20322abc60822ab5f2b8335cee8d3e6c797bf852..f61460b65408733d828fbeaefec328eaaa71449e 100644 (file)
@@ -615,7 +615,7 @@ static void __submit_bio(struct bio *bio)
        if (unlikely(!blk_crypto_bio_prep(&bio)))
                return;
 
-       if (!bio->bi_bdev->bd_has_submit_bio) {
+       if (!bdev_test_flag(bio->bi_bdev, BD_HAS_SUBMIT_BIO)) {
                blk_mq_submit_bio(bio);
        } else if (likely(bio_queue_enter(bio) == 0)) {
                struct gendisk *disk = bio->bi_bdev->bd_disk;
@@ -723,7 +723,7 @@ void submit_bio_noacct_nocheck(struct bio *bio)
         */
        if (current->bio_list)
                bio_list_add(&current->bio_list[0], bio);
-       else if (!bio->bi_bdev->bd_has_submit_bio)
+       else if (!bdev_test_flag(bio->bi_bdev, BD_HAS_SUBMIT_BIO))
                __submit_bio_noacct_mq(bio);
        else
                __submit_bio_noacct(bio);
index bb29a68e1d67662533653d8e74742554ae09b39a..19cd1a31fa807411f19886b74b34aa4e3195baf5 100644 (file)
@@ -413,7 +413,8 @@ int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
        elevator_init_mq(disk->queue);
 
        /* Mark bdev as having a submit_bio, if needed */
-       disk->part0->bd_has_submit_bio = disk->fops->submit_bio != NULL;
+       if (disk->fops->submit_bio)
+               bdev_set_flag(disk->part0, BD_HAS_SUBMIT_BIO);
 
        /*
         * If the driver provides an explicit major number it also must provide
index e45a490d488eda0f2f1924d3f3af361b8e2ce94a..11b9e8eeb79f73e581d2cce5e3d3f79399fca631 100644 (file)
@@ -49,7 +49,7 @@ struct block_device {
 #define BD_PARTNO              255     // lower 8 bits; assign-once
 #define BD_READ_ONLY           (1u<<8) // read-only policy
 #define BD_WRITE_HOLDER                (1u<<9)
-       bool                    bd_has_submit_bio;
+#define BD_HAS_SUBMIT_BIO      (1u<<10)
        dev_t                   bd_dev;
        struct inode            *bd_inode;      /* will die */