diff options
author | Zachary Bedell <[email protected]> | 2011-07-04 13:25:31 -0400 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2011-07-06 09:20:28 -0700 |
commit | fde4ce992db516796df3a7d1c0e018c5f8c537f6 (patch) | |
tree | 50714e99cd11b1ad75f29adcea03d5ae512216d7 /dracut/90zfs/mount-zfs.sh | |
parent | e93ced48475b697734ae4fbc65c4e600b9752849 (diff) |
Update for Dracut-010
Update Dracut module for Dracut-010 and fix race conditions that
caused boot to fail on MP systems. Add support for zfs_force flag
and parsing of spl_hostid from kernel command line.
Signed-off-by: Brian Behlendorf <[email protected]>
Diffstat (limited to 'dracut/90zfs/mount-zfs.sh')
-rwxr-xr-x | dracut/90zfs/mount-zfs.sh | 72 |
1 files changed, 62 insertions, 10 deletions
diff --git a/dracut/90zfs/mount-zfs.sh b/dracut/90zfs/mount-zfs.sh index b4a4de6ff..e067c18a0 100755 --- a/dracut/90zfs/mount-zfs.sh +++ b/dracut/90zfs/mount-zfs.sh @@ -2,15 +2,67 @@ . /lib/dracut-lib.sh -if [ "$rootfs" = "zfs" ]; then - zfsrootfs=`echo "$root" | sed 's|^zfs:||'` - zfspool=`echo "$zfsrootfs" | sed 's|/.*||g'` - zpool import -N "$zfspool" - mount -o zfsutil -t "$rootfs" "$zfsrootfs" "$NEWROOT" - if [ "$?" = "0" ] - then - ROOTFS_MOUNTED=yes +ZPOOL_FORCE="" +if getargbool 0 zfs_force -y zfs.force -y zfsforce ; then + warn "ZFS: Will force-import pools if necessary." + ZPOOL_FORCE="-f" +fi + +case "$root" in + zfs:*) + # We have ZFS modules loaded, so we're able to import pools now. + if [ "$root" = "zfs:AUTO" ] ; then + # Need to parse bootfs attribute + info "ZFS: Attempting to detect root from imported ZFS pools." + + # 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 + # 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 + rootok=0 + pool="" + + warn "ZFS: No bootfs attribute found in importable pools." + + # Re-export everything since we're not prepared to take + # responsibility for them. + zpool list -H | while read fs rest ; do + zpool export "$fs" + done + + return 1 + fi + fi + info "ZFS: Using ${zfsbootfs} as root." else - mount -t "$rootfs" "$zfsrootfs" "$NEWROOT" && ROOTFS_MOUNTED=yes + # Should have an explicit pool set, so just import it and we're done. + zfsbootfs="${root#zfs:}" + pool="${zfsbootfs%%/*}" + if ! zpool list -H $pool > /dev/null ; then + # pool wasn't imported automatically by the kernel module, so + # try it manually. + info "ZFS: Importing pool ${pool}..." + if ! zpool import -N ${ZPOOL_FORCE} $pool ; then + warn "ZFS: Unable to import pool ${pool}." + rootok=0 + + return 1 + fi + fi fi -fi + + # Above should have left our rpool imported and pool/dataset in $root. + # We need zfsutil for non-legacy mounts and not for legacy mounts. + mountpoint=`zfs get -H -o value mountpoint $zfsbootfs` + if [ "$mountpoint" = "legacy" ] ; then + mount -t zfs "$zfsbootfs" "$NEWROOT" && ROOTFS_MOUNTED=yes + else + mount -o zfsutil -t zfs "$zfsbootfs" "$NEWROOT" && ROOTFS_MOUNTED=yes + fi + ;; +esac |