From: Victor Lowther Date: Sat, 15 Aug 2009 21:46:34 +0000 (-0500) Subject: Make hostonly check for dmraid only pass if root is really on X-Git-Tag: 001~46 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=dc670134f8adac834426cf4c2151ba505359dcb3;p=thirdparty%2Fdracut.git Make hostonly check for dmraid only pass if root is really on a dmraid volume somehow. --- diff --git a/modules.d/90dmraid/check b/modules.d/90dmraid/check index 45e14052e..1757dfd75 100755 --- a/modules.d/90dmraid/check +++ b/modules.d/90dmraid/check @@ -4,11 +4,39 @@ # in trying to support it in the initramfs. which dmraid >/dev/null 2>&1 || exit 1 -# Hostonly checking should really fail if the root device is not on a -# dmraid volume. I am lazy. Therefore, fail the hostonly check only -# if we are not using dmraid right now. -if [[ $1 = -h ]]; then - dmraid -r | grep -q ok || exit 1 +is_dmraid() { /lib/udev/vol_id /dev/block/$1 |grep -v linux_raid_member | \ + grep -q _raid_member; } + +check_block_and_slaves() ( + # $1 = block device in major:minor format + local x + cd /sys/dev/block/$1 + [[ -b /dev/block/$1 ]] || return 1 # Not a block device? So sorry. + is_dmraid $1 && return + [[ -d slaves ]] || return 1 # there are no underlying devices, done. + # we want to search the tree breadthwise, so... + for x in slaves/*/dev; do + is_dmraid $(cat "$x") && return 0 + done + for x in slaves/*/dev; do + check_block_and_slaves $(cat "$x") && return 0 + done + return 1 +) + +if [[ $1 = '-h' ]] ; then + rootdev='' + while read blkdev fs type opts misc; do + [[ $blkdev = rootfs ]] && continue # skip rootfs entry + [[ $fs = / ]] && { rootdev=$blkdev; break; } + done < /proc/mounts + [[ -b $rootdev ]] || exit 1 # Not on a block device? Definitly not dmraid + # get major/minor for the device + majmin=$(ls -nLl "$rootdev" | \ + (read x x x x maj min x; maj=${maj//,/}; echo $maj:$min)) + # now, walk backwards though our master/slave relationships looking + # for a dmraid device + check_block_and_slaves $majmin || exit 1 fi exit 0