Catch return errors from zpool commands
authorZachary Bedell <zac@thebedells.org>
Sun, 24 Jul 2011 20:53:15 +0000 (16:53 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 25 Jul 2011 17:43:44 +0000 (10:43 -0700)
This fixes a bug that can effect first reboot after install
using Dracut.  The Dracut module didn't check the return
value from several calls to z* functions.  This resulted in
"Using no pools available as root" on boot if the ZFS module
didn't auto-import the pools.  It's most likely to happen on
initial restart after a fresh install & requires juggling in
the Dracut emergency holographic shell to fix.

This patch checks return codes & output from zpool list and
related functions and correctly falls into the explicit zpool
import code branch if the module didn't import the pool at load.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
dracut/90zfs/mount-zfs.sh

index a451bf9..52c55a6 100755 (executable)
@@ -3,6 +3,7 @@
 . /lib/dracut-lib.sh
 
 ZPOOL_FORCE=""
+
 if getargbool 0 zfs_force -y zfs.force -y zfsforce ; then
        warn "ZFS: Will force-import pools if necessary."
        ZPOOL_FORCE="-f"
@@ -18,12 +19,12 @@ case "$root" in
                        # Might be imported by the kernel module, so try searching before
                        # we import anything.
                        zfsbootfs=`zpool list -H -o bootfs | sed 'q'`
-                       if [ "$zfsbootfs" = "" ] ; then
+                       if [ "$?" != "0" ] || [ "$zfsbootfs" = "" ] || [ "$zfsbootfs" = "no pools available" ] ; then
                                # Not there, so we need to import everything.
                                info "ZFS: Attempting to import additional pools."
                                zpool import -N -a ${ZPOOL_FORCE}
                                zfsbootfs=`zpool list -H -o bootfs | sed 'q'`
-                               if [ "$zfsbootfs" = "" ] ; then
+                               if [ "$?" != "0" ] || [ "$zfsbootfs" = "" ] || [ "$zfsbootfs" = "no pools available" ] ; then
                                        rootok=0
                                        pool=""