On Mon, Dec 09, 2024 at 10:20:33AM +0800, Yang Erkun wrote: > Before commit e418de3abcda ("block: switch gendisk lookup to a simple > xarray"), open loop0 will success. lookup_gendisk will first use > base_probe to load module loop, and then the retry will call loop_probe > to prepare the loop disk. Finally open for this disk will success. > However, after this commit, we lose the retry logic, and open will fail > with ENXIO. Block device autoloading is deprecated and will be removed > soon, but maybe we should keep open success until we really remove it. > So, give a retry to fix it. This looks sensible. But can we clean the logic up a bit by adding a helper to make it easier to understand? Something like the untested patch below: diff --git a/block/genhd.c b/block/genhd.c index 6fcb09b8371d..654c2cc5d8e5 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -797,7 +797,7 @@ static ssize_t disk_badblocks_store(struct device *dev, } #ifdef CONFIG_BLOCK_LEGACY_AUTOLOAD -void blk_request_module(dev_t devt) +static bool blk_probe_dev(dev_t devt) { unsigned int major = MAJOR(devt); struct blk_major_name **n; @@ -807,14 +807,26 @@ void blk_request_module(dev_t devt) if ((*n)->major == major && (*n)->probe) { (*n)->probe(devt); mutex_unlock(&major_names_lock); - return; + return true; } } mutex_unlock(&major_names_lock); + return false; +} + +void blk_request_module(dev_t devt) +{ + int error; + + if (blk_probe_dev(devt)) + return; - if (request_module("block-major-%d-%d", MAJOR(devt), MINOR(devt)) > 0) - /* Make old-style 2.4 aliases work */ - request_module("block-major-%d", MAJOR(devt)); + error = request_module("block-major-%d-%d", MAJOR(devt), MINOR(devt)); + /* Make old-style 2.4 aliases work */ + if (error > 0) + error = request_module("block-major-%d", MAJOR(devt)); + if (!error) + blk_probe_dev(devt); } #endif /* CONFIG_BLOCK_LEGACY_AUTOLOAD */