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

Reply via email to