]> granicus.if.org Git - zfs/commitdiff
Additional SYSV init script fixes.
authorTurbo Fredriksson <turbo@bayour.com>
Thu, 11 Jun 2015 21:03:04 +0000 (23:03 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 17 Jun 2015 20:30:03 +0000 (13:30 -0700)
Use the 'mount' command instead of /proc/mounts to get a list of matching
filesystems.

This because /proc/mounts reports a pool with a space 'rpool 1' as
'rpool\0401'. The space is encoded as 3-digit octal which is legal.
However 'printf "%b"', which we use to filter out other illegal
characters (such as slash, space etc) can't properly interpret this
because it expects 4-digit octal. We get a \ 1 instead of the space
we expected. The correct value should have been 'rpool\00401' (note
the additional leading zero).

So use 'mount', which interprets all backslash-escapes correctly,
instead.

Signed-off-by: Turbo Fredriksson turbo@bayour.com
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #3488

etc/init.d/zfs-functions.in

index 372bae8037fe8467f4c4d976bd422f645b41abb3..24c0bdbd1a1d45bb48d03b39245826d2c45c1a7d 100644 (file)
@@ -371,13 +371,16 @@ read_mtab()
        # Unset all MTAB_* variables
        unset $(env | grep ^MTAB_ | sed 's,=.*,,')
 
-       while read -r fs mntpnt fstype opts rest; do
-               if echo "$fs $mntpnt $fstype $opts" | grep -qE "$match"; then
-                       mntpnt=$(printf '%b\n' "$mntpnt" | sed -e 's,/,_,g' \
-                           -e 's,-,_,g' -e 's,\.,_,g')
-                       eval export MTAB_$mntpnt="$fs"
-               fi
-       done < /proc/mounts
+       mount | \
+           grep -E "$match" | \
+           sed "s,\(.*\) on \(.*\) type .*,\1;\2," | \
+           while read line; do
+               mntpnt=$(echo "$line" | sed -e 's,;.*,,' -e 's,/,_,g' \
+                   -e 's,-,_,g' -e 's,\.,_,g' -e 's, ,_,g')
+               fs=$(echo "$line" | sed 's,.*;,,')
+
+               eval export MTAB_$mntpnt="'$fs'"
+       done
 }
 
 in_mtab()