Additional SYSV init script fixes (3).

* In read_mtab(), fix problems (!?) in the mounts file. It will record
  'rpool 1' as 'rpool\0401' instead of 'rpool\00401' which seems to be the
  correct (at least as far as 'printf' is concerned). Use this using the
  external 'echo' command (and not the one built in to the shell) because
  the internal one would interpret the backslash code (incorrectly), giving
  us a  instead.
* Remove reregister_mounts() - no longer needed.
* For Gentoo, the zfs_log_failure_msg() should use eend(), not eerror()
  (which requires an error message, which we don't have).

Signed-off-by: Turbo Fredriksson <turbo@bayour.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #3488
Closes #3509
Closes #3514
This commit is contained in:
Turbo Fredriksson 2015-06-19 16:22:14 +02:00 committed by Brian Behlendorf
parent 216f9d04a6
commit 16421a1dc8
2 changed files with 22 additions and 54 deletions

View File

@ -68,7 +68,7 @@ elif type einfo > /dev/null 2>&1 ; then
# Gentoo functions # Gentoo functions
zfs_log_begin_msg() { ebegin "$1"; } zfs_log_begin_msg() { ebegin "$1"; }
zfs_log_end_msg() { eend "$1"; } zfs_log_end_msg() { eend "$1"; }
zfs_log_failure_msg() { eerror "$1"; } zfs_log_failure_msg() { eend "$1"; }
# zfs_log_progress_msg() { echo -n "$1"; } # zfs_log_progress_msg() { echo -n "$1"; }
zfs_log_progress_msg() { echo -n; } zfs_log_progress_msg() { echo -n; }
else else
@ -304,42 +304,6 @@ checksystem()
return 0 return 0
} }
reregister_mounts()
{
local fs mntpnt fstype opts rest tmpdir
tmpdir=removethismountpointhoweverpossible
while read -r fs mntpnt fstype opts rest ; do
fs=$(printf '%b\n' "$fs")
mntpnt=$(printf '%b\n' "$mntpnt")
if [ "$fstype" = "zfs" ] ; then
if [ "$mntpnt" = "/" ] ; then
mount -f -o zfsutil -t zfs --move / /$tmpdir
umount --fake /$tmpdir
else
umount --fake "$mntpnt"
fi
elif echo "$fs" | grep -qE "^/dev/(zd|zvol)" ; then
if [ "$mntpnt" = "/" ] ; then
mount -f -t "$fstype" --move / /$tmpdir
umount --fake /$tmpdir
else
umount --fake "$mntpnt"
fi
fi
done < /proc/mounts
while read -r fs mntpnt fstype opts rest ; do
fs=$(printf '%b\n' "$fs")
mntpnt=$(printf '%b\n' "$mntpnt")
if [ "$fstype" = "zfs" ] ; then
mount -f -t zfs -o zfsutil "$fs" "$mntpnt"
elif echo "$fs" | grep -q "^/dev/zd" ; then
mount -f -t "$fstype" -o "$opts" "$fs" "$mntpnt"
fi
done < /proc/mounts
}
get_root_pool() get_root_pool()
{ {
set -- $(mount | grep ' on / ') set -- $(mount | grep ' on / ')
@ -373,9 +337,23 @@ read_mtab()
while read -r fs mntpnt fstype opts rest; do while read -r fs mntpnt fstype opts rest; do
if echo "$fs $mntpnt $fstype $opts" | grep -qE "$match"; then if echo "$fs $mntpnt $fstype $opts" | grep -qE "$match"; then
# * Fix problems (!?) in the mounts file. It will record
# 'rpool 1' as 'rpool\0401' instead of 'rpool\00401'
# which seems to be the correct (at least as far as
# 'printf' is concerned).
# * We need to use the external echo, because the
# internal one would interpret the backslash code
# (incorrectly), giving us a  instead.
mntpnt=$(/bin/echo "$mntpnt" | sed "s,\\\0,\\\00,")
fs=$(/bin/echo "$fs" | sed "s,\\\0,\\\00,")
# Replace 'unwanted' characters with underscore.
mntpnt=$(printf '%b\n' "$mntpnt" | sed -e 's,/,_,g' \ mntpnt=$(printf '%b\n' "$mntpnt" | sed -e 's,/,_,g' \
-e 's,-,_,g' -e 's,\.,_,g') -e 's,-,_,g' -e 's,\.,_,g' -e 's, ,_,g')
eval export MTAB_$mntpnt="$fs" fs=$(printf '%b\n' "$fs")
# Set the variable.
eval export MTAB_$mntpnt=\"$fs\"
fi fi
done < /proc/mounts done < /proc/mounts
} }

View File

@ -165,15 +165,11 @@ do_start()
{ {
check_module_loaded || exit 0 check_module_loaded || exit 0
# fix mtab to include already-mounted fs filesystems, in case there are any case "$ZFS_MOUNT" in
# we ONLY do this if mtab does not point to /proc/mounts [Oo][Ff][Ff]|[Nn][Oo]|''|0)
# which is the case in some systems (systemd may bring that soon) exit 3
if ! readlink /etc/mtab | grep -q /proc ; then ;;
if grep -qE "(^/dev/zd|^/dev/zvol| zfs )" /proc/mounts ; then esac
zfs_action "Registering already-mounted ZFS filesystems and volumes" \
reregister_mounts
fi
fi
# Ensure / exists in /etc/mtab, if not update mtab accordingly. # Ensure / exists in /etc/mtab, if not update mtab accordingly.
# This should be handled by rc.sysinit but lets be paranoid. # This should be handled by rc.sysinit but lets be paranoid.
@ -182,12 +178,6 @@ do_start()
mount -f / mount -f /
fi fi
case "$ZFS_MOUNT" in
[Oo][Ff][Ff]|[Nn][Oo]|''|0)
exit 3
;;
esac
do_mount do_mount
} }