vfs_mountroot: Check for root dev before waiting

If GEOM is idle but the root device is not yet present when we enter
vfs_mountroot_wait_if_necessary, we call vfs_mountroot_wait to wait
for root holds (e.g. CAM or USB initialization).  Upon returning from
vfs_mountroot_wait, we wait 100 ms at a time until the root device
shows up.

Since the root device most likely appeared during vfs_mountroot_wait
-- waiting for subsystems which may be responsible for the root
device is the whole purpose of that function -- it makes sense to
check if the device is now present rather than printing a warning
and pausing for 100 ms before checking.

Reviewed by:	trasz
Fixes: a3ba3d09c2 Make root mount wait mechanism smarter
Sponsored by:	https://www.patreon.com/cperciva
Differential Revision:	https://reviews.freebsd.org/D33593

(cherry picked from commit 33812d60b9)
This commit is contained in:
Colin Percival 2021-12-20 09:55:36 -08:00
parent 72f61780a4
commit 972796d007

View file

@ -1041,6 +1041,8 @@ vfs_mountroot_wait_if_neccessary(const char *fs, const char *dev)
* to behave exactly as it used to work before.
*/
vfs_mountroot_wait();
if (parse_mount_dev_present(dev))
return (0);
printf("mountroot: waiting for device %s...\n", dev);
delay = hz / 10;
timeout = root_mount_timeout * hz;