ab11ed5
From 9d36d4fb1d0774d9ef0597abb79390e88771bf1e Mon Sep 17 00:00:00 2001
ab11ed5
From: Harald Hoyer <harald@redhat.com>
ab11ed5
Date: Tue, 9 Apr 2013 10:47:39 +0200
ab11ed5
Subject: [PATCH] dracut-functions.sh: make use of findmnt
ab11ed5
ab11ed5
---
ab11ed5
 dracut-functions.sh | 163 +++++++++++++++++++++-------------------------------
ab11ed5
 1 file changed, 64 insertions(+), 99 deletions(-)
ab11ed5
ab11ed5
diff --git a/dracut-functions.sh b/dracut-functions.sh
ab11ed5
index eba7412..96d3c6e 100755
ab11ed5
--- a/dracut-functions.sh
ab11ed5
+++ b/dracut-functions.sh
ab11ed5
@@ -319,131 +319,96 @@ get_maj_min() {
ab11ed5
 # $ find_block_device /usr
ab11ed5
 # 8:4
ab11ed5
 find_block_device() {
ab11ed5
-    local _x _mpt _majmin _dev _fs _maj _min _find_mpt
ab11ed5
+    local _majmin _dev _majmin _find_mpt
ab11ed5
     _find_mpt="$1"
ab11ed5
     if [[ $use_fstab != yes ]]; then
ab11ed5
-        while read _x; do
ab11ed5
-            set -- $_x
ab11ed5
-            _majmin="$3"
ab11ed5
-            _mpt="$5"
ab11ed5
-            [[ $8 = "-" ]] && shift
ab11ed5
-            _fs="$8"
ab11ed5
-            _dev="$9"
ab11ed5
-            [[ $_mpt = $_find_mpt ]] || continue
ab11ed5
-            [[ $_fs = nfs ]] && { echo $_dev; return 0;}
ab11ed5
-            [[ $_fs = nfs3 ]] && { echo $_dev; return 0;}
ab11ed5
-            [[ $_fs = nfs4 ]] && { echo $_dev; return 0;}
ab11ed5
-            [[ $_fs = btrfs ]] && {
ab11ed5
-                get_maj_min $_dev
ab11ed5
-                return 0;
ab11ed5
-            }
ab11ed5
-            if [[ ${_majmin#0:} = $_majmin ]]; then
ab11ed5
-                echo $_majmin
ab11ed5
-                return 0 # we have a winner!
ab11ed5
+        [[ -d $_find_mpt/. ]]
ab11ed5
+        while read _majmin _dev; do
ab11ed5
+            if [[ -b $_dev ]]; then
ab11ed5
+                if ! [[ $_majmin ]] || [[ $_majmin == 0:* ]]; then
ab11ed5
+                    read _majmin < <(get_maj_min $_dev)
ab11ed5
+                fi
ab11ed5
+                if [[ $_majmin ]]; then
ab11ed5
+                    echo $_majmin
ab11ed5
+                else
ab11ed5
+                    echo $_dev
ab11ed5
+                fi
ab11ed5
+                return 0
ab11ed5
+            fi
ab11ed5
+            if [[ $_dev = *:* ]]; then
ab11ed5
+                echo $_dev
ab11ed5
+                return 0
ab11ed5
             fi
ab11ed5
-        done < /proc/self/mountinfo
ab11ed5
+        done < <(findmnt -e -v -n -o 'MAJ:MIN,SOURCE' "$_find_mpt")
ab11ed5
     fi
ab11ed5
     # fall back to /etc/fstab
ab11ed5
-    while read _dev _mpt _fs _x; do
ab11ed5
-        [ "${_dev%%#*}" != "$_dev" ] && continue
ab11ed5
-
ab11ed5
-        if [[ $_mpt = $_find_mpt ]]; then
ab11ed5
-            [[ $_fs = nfs ]] && { echo $_dev; return 0;}
ab11ed5
-            [[ $_fs = nfs3 ]] && { echo $_dev; return 0;}
ab11ed5
-            [[ $_fs = nfs4 ]] && { echo $_dev; return 0;}
ab11ed5
-            [[ $_dev != ${_dev#UUID=} ]] && _dev=/dev/disk/by-uuid/${_dev#UUID=}
ab11ed5
-            [[ $_dev != ${_dev#LABEL=} ]] && _dev=/dev/disk/by-label/${_dev#LABEL=}
ab11ed5
-            [[ -b $_dev ]] || return 1 # oops, not a block device.
ab11ed5
-            get_maj_min "$_dev" && return 0
ab11ed5
+
ab11ed5
+    while read _majmin _dev; do
ab11ed5
+        if ! [[ $_dev ]]; then
ab11ed5
+            _dev="$_majmin"
ab11ed5
+            unset _majmin
ab11ed5
+        fi
ab11ed5
+        if [[ -b $_dev ]]; then
ab11ed5
+            [[ $_majmin ]] || read _majmin < <(get_maj_min $_dev)
ab11ed5
+            if [[ $_majmin ]]; then
ab11ed5
+                echo $_majmin
ab11ed5
+            else
ab11ed5
+                echo $_dev
ab11ed5
+            fi
ab11ed5
+            return 0
ab11ed5
+        fi
ab11ed5
+        if [[ $_dev = *:* ]]; then
ab11ed5
+            echo $_dev
ab11ed5
+            return 0
ab11ed5
         fi
ab11ed5
-    done < /etc/fstab
ab11ed5
+    done < <(findmnt -e --fstab -v -n -o 'MAJ:MIN,SOURCE' "$_find_mpt")
ab11ed5
 
ab11ed5
     return 1
ab11ed5
 }
ab11ed5
 
ab11ed5
-# find_dev_fstype <device>
ab11ed5
-# Echo the filesystem type for a given device.
ab11ed5
+# find_mp_fstype <mountpoint>
ab11ed5
+# Echo the filesystem type for a given mountpoint.
ab11ed5
 # /proc/self/mountinfo is taken as the primary source of information
ab11ed5
 # and /etc/fstab is used as a fallback.
ab11ed5
 # No newline is appended!
ab11ed5
 # Example:
ab11ed5
-# $ find_dev_fstype /dev/sda2;echo
ab11ed5
+# $ find_mp_fstype /;echo
ab11ed5
 # ext4
ab11ed5
-find_dev_fstype() {
ab11ed5
-    local _x _mpt _majmin _dev _fs _maj _min _find_dev
ab11ed5
-    _find_dev="$1"
ab11ed5
-    strstr "$_find_dev" "/dev" || _find_dev="/dev/block/$_find_dev"
ab11ed5
-    while read _x; do
ab11ed5
-        set -- $_x
ab11ed5
-        _majmin="$3"
ab11ed5
-        _mpt="$5"
ab11ed5
-        [[ $8 = "-" ]] && shift
ab11ed5
-        _fs="$8"
ab11ed5
-        _dev="$9"
ab11ed5
-        strstr "$_dev" "/dev" || continue
ab11ed5
-        [[ $_dev -ef $_find_dev ]] || continue
ab11ed5
-        [[ $_fs = "autofs" ]] && continue
ab11ed5
-        echo -n $_fs;
ab11ed5
-        return 0;
ab11ed5
-    done < /proc/self/mountinfo
ab11ed5
+find_mp_fstype() {
ab11ed5
+    local _fs
ab11ed5
 
ab11ed5
-    # fall back to /etc/fstab
ab11ed5
-    while read _dev _mpt _fs _x; do
ab11ed5
-        [ "${_dev%%#*}" != "$_dev" ] && continue
ab11ed5
-        case "$_dev" in
ab11ed5
-            LABEL=*)
ab11ed5
-                _dev="$(echo $_dev | sed 's,/,\\x2f,g')"
ab11ed5
-                _dev="/dev/disk/by-label/${_dev#LABEL=}"
ab11ed5
-                ;;
ab11ed5
-            UUID=*)
ab11ed5
-                _dev="/dev/disk/by-uuid/${_dev#UUID=}"
ab11ed5
-                ;;
ab11ed5
-            PARTUUID=*)
ab11ed5
-                _dev="/dev/disk/by-partuuid/${_dev#PARTUUID=}"
ab11ed5
-                ;;
ab11ed5
-        esac
ab11ed5
+    if [[ $use_fstab != yes ]]; then
ab11ed5
+        while read _fs; do
ab11ed5
+            [[ $_fs ]] || continue
ab11ed5
+            [[ $_fs = "autofs" ]] && continue
ab11ed5
+            echo -n $_fs
ab11ed5
+            return 0
ab11ed5
+        done < <(findmnt -e -v -n -o 'FSTYPE' "$1")
ab11ed5
+    fi
ab11ed5
 
ab11ed5
-        [[ $_dev -ef $_find_dev ]] || continue
ab11ed5
-        echo -n $_fs;
ab11ed5
-        return 0;
ab11ed5
-    done < /etc/fstab
ab11ed5
+    while read _fs; do
ab11ed5
+        [[ $_fs ]] || continue
ab11ed5
+        [[ $_fs = "autofs" ]] && continue
ab11ed5
+        echo -n $_fs
ab11ed5
+        return 0
ab11ed5
+    done < <(findmnt --fstab -e -v -n -o 'FSTYPE' "$1")
ab11ed5
 
ab11ed5
     return 1
ab11ed5
 }
ab11ed5
 
ab11ed5
-# find_mp_fstype <mountpoint>
ab11ed5
-# Echo the filesystem type for a given mountpoint.
ab11ed5
+# find_dev_fstype <device>
ab11ed5
+# Echo the filesystem type for a given device.
ab11ed5
 # /proc/self/mountinfo is taken as the primary source of information
ab11ed5
 # and /etc/fstab is used as a fallback.
ab11ed5
 # No newline is appended!
ab11ed5
 # Example:
ab11ed5
-# $ find_mp_fstype /;echo
ab11ed5
+# $ find_dev_fstype /dev/sda2;echo
ab11ed5
 # ext4
ab11ed5
-find_mp_fstype() {
ab11ed5
-    local _x _mpt _majmin _dev _fs _maj _min _find_mpt
ab11ed5
-    _find_mpt="$1"
ab11ed5
-    while read _x; do
ab11ed5
-        set -- $_x
ab11ed5
-        _majmin="$3"
ab11ed5
-        _mpt="$5"
ab11ed5
-        [[ $8 = "-" ]] && shift
ab11ed5
-        _fs="$8"
ab11ed5
-        _dev="$9"
ab11ed5
-        [[ $_mpt = $_find_mpt ]] || continue
ab11ed5
-        [[ $_fs = "autofs" ]] && continue
ab11ed5
-        echo -n $_fs;
ab11ed5
-        return 0;
ab11ed5
-    done < /proc/self/mountinfo
ab11ed5
-
ab11ed5
-    # fall back to /etc/fstab
ab11ed5
-    while read _dev _mpt _fs _x; do
ab11ed5
-        [ "${_dev%%#*}" != "$_dev" ] && continue
ab11ed5
-        [[ $_mpt = $_find_mpt ]] || continue
ab11ed5
-        echo -n $_fs;
ab11ed5
-        return 0;
ab11ed5
-    done < /etc/fstab
ab11ed5
-
ab11ed5
-    return 1
ab11ed5
+find_dev_fstype() {
ab11ed5
+    local _x _mpt _majmin _dev _fs _maj _min _find_dev
ab11ed5
+    _find_dev="$1"
ab11ed5
+    [[ "$_find_dev" = /dev* ]] || _find_dev="/dev/block/$_find_dev"
ab11ed5
+    find_mp_fstype "$_find_dev"
ab11ed5
 }
ab11ed5
 
ab11ed5
 # finds the major:minor of the block device backing the root filesystem.