init: factor the root_wait logic in prepare_namespace into a helper
authorChristoph Hellwig <hch@lst.de>
Wed, 31 May 2023 12:55:22 +0000 (14:55 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 5 Jun 2023 16:55:20 +0000 (10:55 -0600)
The root_wait logic is a bit obsfucated right now.  Expand it and move it
into a helper.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20230531125535.676098-12-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
init/do_mounts.c

index be6d147..d5c06c1 100644 (file)
@@ -606,6 +606,26 @@ void __init mount_root(char *root_device_name)
        }
 }
 
+/* wait for any asynchronous scanning to complete */
+static void __init wait_for_root(char *root_device_name)
+{
+       if (ROOT_DEV != 0)
+               return;
+
+       pr_info("Waiting for root device %s...\n", root_device_name);
+
+       for (;;) {
+               if (driver_probe_done()) {
+                       ROOT_DEV = name_to_dev_t(root_device_name);
+                       if (ROOT_DEV)
+                               break;
+               }
+               msleep(5);
+       }
+       async_synchronize_full();
+
+}
+
 static dev_t __init parse_root_device(char *root_device_name)
 {
        if (!strncmp(root_device_name, "mtd", 3) ||
@@ -642,16 +662,8 @@ void __init prepare_namespace(void)
        if (initrd_load(saved_root_name))
                goto out;
 
-       /* wait for any asynchronous scanning to complete */
-       if ((ROOT_DEV == 0) && root_wait) {
-               printk(KERN_INFO "Waiting for root device %s...\n",
-                       saved_root_name);
-               while (!driver_probe_done() ||
-                       (ROOT_DEV = name_to_dev_t(saved_root_name)) == 0)
-                       msleep(5);
-               async_synchronize_full();
-       }
-
+       if (root_wait)
+               wait_for_root(saved_root_name);
        mount_root(saved_root_name);
 out:
        devtmpfs_mount();