Message ID | 20211022064748.30136-1-mark-pk.tsai@mediatek.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | dm: add module parameter bdev_wait | expand |
On Fri, Oct 22, 2021 at 02:47:47PM +0800, Mark-PK Tsai wrote: > dm_early_create() fail if the target block device not found in > the late init stage. > The block device is created in mmc_rescan() which kernel do > it async by queue it into system_freezable_wq. > Add module param bdev_wait to support waiting the block device > ready before dm_early_create() like prepare_namespace() does. This adds a busy loop. There is a reason why we usually set up stacking drivers from userspace, in that we have a working event system there. So the answer is not to add further hacks to the in-kernel DM setup hack, but to stop using it.
> > dm_early_create() fail if the target block device not found in > > the late init stage. > > The block device is created in mmc_rescan() which kernel do > > it async by queue it into system_freezable_wq. > > Add module param bdev_wait to support waiting the block device > > ready before dm_early_create() like prepare_namespace() does. > > This adds a busy loop. There is a reason why we usually set up > stacking drivers from userspace, in that we have a working event > system there. So the answer is not to add further hacks to the > in-kernel DM setup hack, but to stop using it. Thanks for your kind reply. But We want to use DM target as root device without adding an initramfs. Is there any other way to do so?
diff --git a/drivers/md/dm-init.c b/drivers/md/dm-init.c index b0c45c6ebe0b..a3d24cafa4f4 100644 --- a/drivers/md/dm-init.c +++ b/drivers/md/dm-init.c @@ -8,11 +8,13 @@ */ #include <linux/ctype.h> +#include <linux/delay.h> #include <linux/device.h> #include <linux/device-mapper.h> #include <linux/init.h> #include <linux/list.h> #include <linux/moduleparam.h> +#include <linux/mount.h> #define DM_MSG_PREFIX "init" #define DM_MAX_DEVICES 256 @@ -20,6 +22,7 @@ #define DM_MAX_STR_SIZE 4096 static char *create; +static char *bdev_wait; /* * Format: dm-mod.create=<name>,<uuid>,<minor>,<flags>,<table>[,<table>+][;<name>,<uuid>,<minor>,<flags>,<table>[,<table>+]+] @@ -286,6 +289,12 @@ static int __init dm_init_init(void) DMINFO("waiting for all devices to be available before creating mapped devices"); wait_for_device_probe(); + if (bdev_wait) { + DMINFO("Waiting for block device %s...", bdev_wait); + while (!name_to_dev_t(bdev_wait)) + msleep(5); + } + list_for_each_entry(dev, &devices, list) { if (dm_early_create(&dev->dmi, dev->table, dev->target_args_array)) @@ -301,3 +310,5 @@ late_initcall(dm_init_init); module_param(create, charp, 0); MODULE_PARM_DESC(create, "Create a mapped device in early boot"); +module_param(bdev_wait, charp, 0); +MODULE_PARM_DESC(bdev_wait, "Wait until the block device ready before dm_early_create");
dm_early_create() fail if the target block device not found in the late init stage. The block device is created in mmc_rescan() which kernel do it async by queue it into system_freezable_wq. Add module param bdev_wait to support waiting the block device ready before dm_early_create() like prepare_namespace() does. Signed-off-by: Mark-PK Tsai <mark-pk.tsai@mediatek.com> --- drivers/md/dm-init.c | 11 +++++++++++ 1 file changed, 11 insertions(+)