Re: [PATCH] dm init: ensure device probing has finished in dm-mod.waitfor=

From: Peter Korsgaard

Date: Wed Mar 18 2026 - 04:26:25 EST


>>>>> "Guillaume" == Guillaume Gonnet <ggonnet.linux@xxxxxxxxx> writes:

Hello,

> The early_lookup_bdev() function returns successfully when the disk
> device is present but not necessarily its partitions. In this situation,
> dm_early_create() fails as the partition block device does not exist
> yet.

> In my case, this phenomenon occurs quite often because the device is
> an SD card with slow reading times, on which kernel takes time to
> enumerate available partitions.

> Fortunately, the underlying device is back to "probing" state while
> enumerating partitions. Waiting for all probing to end is enough to fix
> this issue.

> That's also the reason why this problem never occurs with rootwait=
> parameter: the while loop inside wait_for_root() explicitly waits for
> probing to be done and then the function calls async_synchronize_full().
> These lines were omitted in 035641b, even though the commit says it's
> based on the rootwait logic...

> Anyway, calling wait_for_device_probe() after our while loop does the
> job (it both waits for probing and calls async_synchronize_full).

> Fixes: 035641b01e72 ("dm init: add dm-mod.waitfor to wait for asynchronously probed block devices")
> Signed-off-by: Guillaume Gonnet <ggonnet.linux@xxxxxxxxx>
> ---

> Hello,

> This patch is my attempt to fix the dm-mod.waitfor= issue. I had this
> fix for quite a while now, but I've never made the effort to contribute
> until recently.

> Some have tried to fix it this issue in the past but without finding
> its real root cause (ie. not waiting for device probe to end).

Interesting, this is the first I hear about this (was not CC'ed on these
other patches).


> Here are the links to those patches, for reference:
> https://lore.kernel.org/all/b5c5cd56-b9dd-4368-a8e1-b9e0a07b79b4@xxxxxxxxxxxx/
> https://lore.kernel.org/all/20250410080056.43247-1-chanho.min@xxxxxxx/

I see that Christoph does not like the whole dm-mod.waitfor logic, but
this patch seems quite clear to me about what the issue is and how to
fix it.


> diff --git a/drivers/md/dm-init.c b/drivers/md/dm-init.c
> index 7403823384c5..c1bacba92c65 100644
> --- a/drivers/md/dm-init.c
> +++ b/drivers/md/dm-init.c
> @@ -303,8 +303,10 @@ static int __init dm_init_init(void)
> }
> }

> - if (waitfor[0])
> + if (waitfor[0]) {
> + wait_for_device_probe();

There is already a wait_for_device_probe() just above the loop, so what
does this fix exactly? Do we need both?

Interesting enough, I have never encountered this issue myself. I do use
a partition identifier (dm-mod.waitfor="PARTLABEL=root-a") which
presumably sidetracks the /dev/mmcblk0 available, but partition table
not yet parsed issue.

--
Bye, Peter Korsgaard