2021-10-22 06:50:16

by Mark-PK Tsai

[permalink] [raw]
Subject: [PATCH] dm: add module parameter bdev_wait

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 <[email protected]>
---
drivers/md/dm-init.c | 11 +++++++++++
1 file changed, 11 insertions(+)

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");
--
2.18.0


2021-10-27 18:36:32

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [PATCH] dm: add module parameter bdev_wait

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.

2021-10-28 05:52:24

by Mark-PK Tsai

[permalink] [raw]
Subject: Re: [PATCH] dm: add module parameter bdev_wait

> > 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?