| From b8ccd8a745fdcb09743f94aef1eba2baa7fdb49e Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 23 Apr 2025 07:37:41 +0200 |
| Subject: block: don't autoload drivers on stat |
| |
| From: Christoph Hellwig <hch@lst.de> |
| |
| [ Upstream commit 5f33b5226c9d92359e58e91ad0bf0c1791da36a1 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| block/bdev.c | 8 ++++---- |
| block/blk-cgroup.c | 2 +- |
| block/blk.h | 2 +- |
| block/fops.c | 2 +- |
| 4 files changed, 7 insertions(+), 7 deletions(-) |
| |
| diff --git a/block/bdev.c b/block/bdev.c |
| index 89235796e51a5..5aebcf437f17c 100644 |
| --- a/block/bdev.c |
| +++ b/block/bdev.c |
| @@ -773,13 +773,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) |
| @@ -1001,7 +1001,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); |
| |
| @@ -1279,7 +1279,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; |
| |
| diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c |
| index 9ed93d91d754a..c94efae5bcfaf 100644 |
| --- a/block/blk-cgroup.c |
| +++ b/block/blk-cgroup.c |
| @@ -796,7 +796,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)) { |
| diff --git a/block/blk.h b/block/blk.h |
| index c0120a3d9dc57..9dcc92c7f2b50 100644 |
| --- a/block/blk.h |
| +++ b/block/blk.h |
| @@ -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 |
| diff --git a/block/fops.c b/block/fops.c |
| index be9f1dbea9ce0..d23ddb2dc1138 100644 |
| --- a/block/fops.c |
| +++ b/block/fops.c |
| @@ -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; |
| |
| -- |
| 2.39.5 |
| |