Relying on blkid to do tag resolution will fail when the root device doesn't yet exist. This is, of course, bad for USB root devices. Signed-off-by: Dave Reisner <dreisner@archlinux.org> --- Also fixes a really unfortunate typo that I'm surprised hasn't caused more issues... init_functions | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/init_functions b/init_functions index e9a0cb9..5bcc159 100644 --- a/init_functions +++ b/init_functions @@ -156,14 +156,29 @@ fsck_root() { resolve_device() { local major minor dev device=$1 + # do lazy resolution of devices by tag when udev is + # available. this allows us to wait on disks that + # might not show up immediately (e.g. USB). If udev + # isn't running, fall back on using blkid. case $device in - # resolve tag name to block device - UUID=*|LABEL=*) - dev=$(blkid -lt "$device" -o device) - [ -n "$device" ] && device=$dev + UUID=*) + if [ "$udevd_running" -eq 1 ]; then + dev=/dev/disk/by-uuid/${device#UUID=} + else + dev=$(blkid -lt "$device" -o device) + fi + ;; + LABEL=*) + if [ "$udevd_running" -eq 1 ]; then + dev=/dev/disk/by-label/${device#LABEL=} + else + dev=$(blkid -lt "$device" -o device) + fi ;; esac + [ -n "$dev" ] && device=$dev + case $device in /dev/*) if poll_device "$device" "$rootdelay"; then -- 1.7.9.2