Re: [PATCH] block: retry call probe after request_module in blk_request_module

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 */
 




[Index of Archives]     [Linux RAID]     [Linux SCSI]     [Linux ATA RAID]     [IDE]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Device Mapper]

  Powered by Linux