Commit fbdee71b authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe

block: deprecate autoloading based on dev_t

Make the legacy dev_t based autoloading optional and add a deprecation
warning.  This kind of autoloading has ceased to be useful about 20 years
ago.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20220104071647.164918-1-hch@lst.deSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 26291c54
...@@ -26,6 +26,18 @@ menuconfig BLOCK ...@@ -26,6 +26,18 @@ menuconfig BLOCK
if BLOCK if BLOCK
config BLOCK_LEGACY_AUTOLOAD
bool "Legacy autoloading support"
help
Enable loading modules and creating block device instances based on
accesses through their device special file. This is a historic Linux
feature and makes no sense in a udev world where device files are
created on demand.
Say N here unless booting or other functionality broke without it, in
which case you should also send a report to your distribution and
linux-block@vger.kernel.org.
config BLK_RQ_ALLOC_TIME config BLK_RQ_ALLOC_TIME
bool bool
......
...@@ -733,12 +733,15 @@ struct block_device *blkdev_get_no_open(dev_t dev) ...@@ -733,12 +733,15 @@ struct block_device *blkdev_get_no_open(dev_t dev)
struct inode *inode; struct inode *inode;
inode = ilookup(blockdev_superblock, dev); inode = ilookup(blockdev_superblock, dev);
if (!inode) { if (!inode && IS_ENABLED(CONFIG_BLOCK_LEGACY_AUTOLOAD)) {
blk_request_module(dev); blk_request_module(dev);
inode = ilookup(blockdev_superblock, dev); inode = ilookup(blockdev_superblock, dev);
if (!inode) if (inode)
return NULL; pr_warn_ratelimited(
"block device autoloading is deprecated. It will be removed in Linux 5.19\n");
} }
if (!inode)
return NULL;
/* switch from the inode reference to a device mode one: */ /* switch from the inode reference to a device mode one: */
bdev = &BDEV_I(inode)->bdev; bdev = &BDEV_I(inode)->bdev;
......
...@@ -185,7 +185,9 @@ static struct blk_major_name { ...@@ -185,7 +185,9 @@ static struct blk_major_name {
struct blk_major_name *next; struct blk_major_name *next;
int major; int major;
char name[16]; char name[16];
#ifdef CONFIG_BLOCK_LEGACY_AUTOLOAD
void (*probe)(dev_t devt); void (*probe)(dev_t devt);
#endif
} *major_names[BLKDEV_MAJOR_HASH_SIZE]; } *major_names[BLKDEV_MAJOR_HASH_SIZE];
static DEFINE_MUTEX(major_names_lock); static DEFINE_MUTEX(major_names_lock);
static DEFINE_SPINLOCK(major_names_spinlock); static DEFINE_SPINLOCK(major_names_spinlock);
...@@ -275,7 +277,9 @@ int __register_blkdev(unsigned int major, const char *name, ...@@ -275,7 +277,9 @@ int __register_blkdev(unsigned int major, const char *name,
} }
p->major = major; p->major = major;
#ifdef CONFIG_BLOCK_LEGACY_AUTOLOAD
p->probe = probe; p->probe = probe;
#endif
strlcpy(p->name, name, sizeof(p->name)); strlcpy(p->name, name, sizeof(p->name));
p->next = NULL; p->next = NULL;
index = major_to_index(major); index = major_to_index(major);
...@@ -679,6 +683,7 @@ static ssize_t disk_badblocks_store(struct device *dev, ...@@ -679,6 +683,7 @@ static ssize_t disk_badblocks_store(struct device *dev,
return badblocks_store(disk->bb, page, len, 0); return badblocks_store(disk->bb, page, len, 0);
} }
#ifdef CONFIG_BLOCK_LEGACY_AUTOLOAD
void blk_request_module(dev_t devt) void blk_request_module(dev_t devt)
{ {
unsigned int major = MAJOR(devt); unsigned int major = MAJOR(devt);
...@@ -698,6 +703,7 @@ void blk_request_module(dev_t devt) ...@@ -698,6 +703,7 @@ void blk_request_module(dev_t devt)
/* Make old-style 2.4 aliases work */ /* Make old-style 2.4 aliases work */
request_module("block-major-%d", MAJOR(devt)); request_module("block-major-%d", MAJOR(devt));
} }
#endif /* CONFIG_BLOCK_LEGACY_AUTOLOAD */
/* /*
* print a full list of all partitions - intended for places where the root * print a full list of all partitions - intended for places where the root
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment