]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
block: don't autoload drivers on stat
authorChristoph Hellwig <hch@lst.de>
Wed, 23 Apr 2025 05:37:41 +0000 (07:37 +0200)
committerJens Axboe <axboe@kernel.dk>
Thu, 24 Apr 2025 13:35:23 +0000 (07:35 -0600)
blkdev_get_no_open can trigger the legacy autoload of block drivers.  A
simple stat of a block device has not historically done that, so disable
this behavior again.

Fixes: 9abcfbd235f5 ("block: Add atomic write support for statx")
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Christian Brauner <brauner@kernel.org>
Acked-by: Tejun Heo <tj@kernel.org>
Link: https://lore.kernel.org/r/20250423053810.1683309-4-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bdev.c
block/blk-cgroup.c
block/blk.h
block/fops.c

index b57c2c0853fc89eddfa2af405635fc8ae13dd8d4..520515e4e64ef0a77f0758f537932e29c2887802 100644 (file)
@@ -815,13 +815,13 @@ static void blkdev_put_part(struct block_device *part)
        blkdev_put_whole(whole);
 }
 
-struct block_device *blkdev_get_no_open(dev_t dev)
+struct block_device *blkdev_get_no_open(dev_t dev, bool autoload)
 {
        struct block_device *bdev;
        struct inode *inode;
 
        inode = ilookup(blockdev_superblock, dev);
-       if (!inode && IS_ENABLED(CONFIG_BLOCK_LEGACY_AUTOLOAD)) {
+       if (!inode && autoload && IS_ENABLED(CONFIG_BLOCK_LEGACY_AUTOLOAD)) {
                blk_request_module(dev);
                inode = ilookup(blockdev_superblock, dev);
                if (inode)
@@ -1043,7 +1043,7 @@ struct file *bdev_file_open_by_dev(dev_t dev, blk_mode_t mode, void *holder,
        if (ret)
                return ERR_PTR(ret);
 
-       bdev = blkdev_get_no_open(dev);
+       bdev = blkdev_get_no_open(dev, true);
        if (!bdev)
                return ERR_PTR(-ENXIO);
 
@@ -1321,7 +1321,7 @@ void bdev_statx(struct path *path, struct kstat *stat,
         * use I_BDEV() here; the block device has to be looked up by i_rdev
         * instead.
         */
-       bdev = blkdev_get_no_open(d_backing_inode(path->dentry)->i_rdev);
+       bdev = blkdev_get_no_open(d_backing_inode(path->dentry)->i_rdev, false);
        if (!bdev)
                return;
 
index 5905f277057bc59dcaeaf7a4c050b3cbfd61c122..e172aeda41837e3f4200b4b4712fd723f80a6cfb 100644 (file)
@@ -797,7 +797,7 @@ int blkg_conf_open_bdev(struct blkg_conf_ctx *ctx)
                return -EINVAL;
        input = skip_spaces(input);
 
-       bdev = blkdev_get_no_open(MKDEV(major, minor));
+       bdev = blkdev_get_no_open(MKDEV(major, minor), true);
        if (!bdev)
                return -ENODEV;
        if (bdev_is_partition(bdev)) {
index 939e5e1aec9ca2e892ebed78c56c79e920d62290..328075787814a97337b36b2aaa15328ff8ac80d4 100644 (file)
@@ -94,7 +94,7 @@ static inline void blk_wait_io(struct completion *done)
                wait_for_completion_io(done);
 }
 
-struct block_device *blkdev_get_no_open(dev_t dev);
+struct block_device *blkdev_get_no_open(dev_t dev, bool autoload);
 void blkdev_put_no_open(struct block_device *bdev);
 
 #define BIO_INLINE_VECS 4
index e221fdcaa8aaf898ba83dfbf436673c93834b36c..82b672d15ea4f8500e847b9cbe2229abc99c083e 100644 (file)
@@ -642,7 +642,7 @@ static int blkdev_open(struct inode *inode, struct file *filp)
        if (ret)
                return ret;
 
-       bdev = blkdev_get_no_open(inode->i_rdev);
+       bdev = blkdev_get_no_open(inode->i_rdev, true);
        if (!bdev)
                return -ENXIO;