>>>>> "Guillaume" == Guillaume Gonnet <[email protected]> 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 <[email protected]>
> ---
> 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/[email protected]/
> https://lore.kernel.org/all/[email protected]/
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