PATCH: Streamline mkinitrd storage device dedection
Hi all,
We've had this weird code for ages which calls findstoragedriver() twice once with a /dev/xxxx path and once with a /sys/block/xxx path. Also our findstoragedriverinsys() method iterates over slaves, but does not check if the slaves are dm or md, and thus does not call handledm / handleraid when needed for slaves. We got away with this sofar atleast for lvm on mdraid, as we handled lvm seperately in handlevordev, calling findstorage driver there for each lvm pv, and thus not depending on findstoragedriverinsys() to properly iterate over the slaves. As one of my latest patches removed handlelvordev, it has also broken lvm on mdraid. Likewise in the mdraid code we were iterating over the mdraid slaves instead of letting the slave iteration in findstoragedriverinsys() handle it. This patch streamlines the whole storagehandling, it makes the following changes: 1) Only call findstoragedriver() with a /dev/xxx path, and let it resolve this to a /sys/block/xxx path itself, iow do not call it twice 2) Always check if a sysfs dir we are checking for storage devices represent perhaps a mdraid or dm block device, also when iterating over slaves 3) No longer call findstoragedriver in handleraid, the slave iteration takes care of this 4) Now that we no longer have 3 different code paths to detect the same storage device we also no longer need to have 3 different lists to keep track of if we already checked a sysfs dir / a device. --- mkinitrd | 189 ++++++++++++++++++++++++-------------------------------------- 1 files changed, 72 insertions(+), 117 deletions(-) diff --git a/mkinitrd b/mkinitrd index fb1cf3f..6f4847f 100755 --- a/mkinitrd +++ b/mkinitrd @@ -283,7 +283,7 @@ access() { finddevnoinsys() { majmin="$1" if [ -n "$majmin" ]; then - dev=$(for x in /sys/block/* ; do findall $x/ -name dev ; done | while read device ; do + dev=$(for x in /sys/block/* ; do findall $x -name dev ; done | while read device ; do echo "$majmin" | cmp -s $device && echo $device ; done) if [ -n "$dev" ]; then dev=${dev%%/dev} @@ -295,60 +295,7 @@ finddevnoinsys() { return 1 } -findblockdevinsys() { - devname=$(resolve_device_name "$1") - if [[ "$devname" =~ ^/sys/block/ ]]; then - echo "$devname" - fi - # check if it's a dm-crypt device. if so, just return the /dev/mapper path - if [[ "$devname" =~ ^/dev/mapper/ ]]; then - type=$(/sbin/dmsetup table $(basename $devname) | awk '{print $3}') - if [ "$type" == "crypt" ]; then - echo "$devname" - return 0 - fi - fi - majmin=$(get_numeric_dev dec $devname) - finddevnoinsys "$majmin" -} - -slavestried="" -handledsysfspaths="" - -findstoragedriverinsys () { - while [ ! -L device ]; do - for slave in $(ls -d slaves/* 2>/dev/null) ; do - [ -e $slave ] || continue - slavename=${slave##*/} - case " $slavestried " in - *" $slavename "*) - continue - ;; - *) - slavestried="$slavestried $slavename" - if [ -L $slave ]; then - slave=$(readlink $slave) - fi - qpushd $slave - findstoragedriverinsys - qpopd - ;; - esac - done - [ "$PWD" = "/sys" ] && return - cd .. - done - - cd $(readlink ./device) - case " $handledsysfspaths " in - *" $PWD "*) - return - ;; - *) - handledsysfspaths="$handledsysfspaths $PWD" - ;; - esac - +finddevicedriverinsys () { if is_iscsi $PWD; then handleiscsi "$PWD" return @@ -376,40 +323,69 @@ findstoragedriverinsys () { done } -findstoragedriver () { - for device in $@ ; do - case " $handleddevices " in - *" $device "*) - continue ;; - *) handleddevices="$handleddevices $device" ;; - esac - if [[ "$device" =~ "^md[0-9]+" ]]; then - vecho "Found RAID component $device" - handleraid "$device" - continue - fi - vecho "Looking for driver for device $device" - if [[ "$device" =~ ^/sys ]]; then - device=${device##*/} - fi - if [[ "$device" =~ ^(dm-|mapper/) ]]; then - majmin=$(get_numeric_dev dec "/dev/$device") - sysfs=$(finddevnoinsys $majmin) - handledm $(echo "$majmin" |cut -d : -f 1) $(echo "$majmin" |cut -d : -f 2) - else - sysfs="" - device=$(echo "$device" | sed 's,/,!,g') - if [ -d /sys/block/$device/ ]; then - sysfs="/sys/block/$device" - else - sysfs=$(for x in /sys/block/* ; do findone -type d $x/ -name $device; done) - fi - fi - [ -z "$sysfs" -o ! -e "$sysfs" ] && continue - qpushd $sysfs - findstoragedriverinsys - qpopd +findstoragedriverinsys () { + local sysfs=$(readlink "$1") + + # if its a partition look at the device holding the partition + if [ -f "$sysfs/partition" ]; then + sysfs=$(readlink ${sysfs%/*}) + fi + + if [[ ! "$sysfs" =~ '^/sys/devices/.*/block/.*$' ]]; then + error "WARNING: $sysfs is a not a block sysfs path, skipping" + return + fi + + if [ ! -e "$sysfs" ]; then + error "WARNING: sysfspath $sysfs does not exist, skipping" + return + fi + + case " $handleddevices " in + *" $sysfs "*) + return ;; + *) handleddevices="$handleddevices $sysfs" ;; + esac + + if [[ "$sysfs" =~ '^/sys/devices/virtual/block/md[0-9]+$' ]]; then + local raid=${sysfs##*/} + vecho "Found MDRAID component $raid" + handleraid $raid + fi + if [[ "$sysfs" =~ '^/sys/devices/virtual/block/dm-[0-9]+$' ]]; then + vecho "Found DeviceMapper component ${sysfs##*/}" + handledm $(cat $sysfs/dev |cut -d : -f 1) $(cat $sysfs/dev |cut -d : -f 2) + fi + + for slave in $(ls -d "$sysfs"/slaves/* 2>/dev/null) ; do + findstoragedriverinsys "$slave" done + + if [ -L "$sysfs/device" ]; then + qpushd $(readlink "$sysfs/device") + finddevicedriverinsys + qpopd + fi +} + +findstoragedriver () { + local device="$1" + + if [ ! -b "$device" ]; then + error "WARNING: $device is a not a block device, skipping" + return + fi + + local majmin=$(get_numeric_dev dec "$device") + local sysfs=$(finddevnoinsys "$majmin") + + if [ -z "$sysfs" ]; then + error "WARNING: $device major:minor $majmin not found, skipping" + return + fi + + vecho "Looking for driver for $device in $sysfs" + findstoragedriverinsys "$sysfs" } findnetdriver() { @@ -581,7 +557,7 @@ handledm() { fi let ncryptodevs++ - findstoragedriver "$slavedev" + findstoragedriver "/dev/$slavedev" ;; esac done << EOF @@ -623,7 +599,6 @@ handleraid() { fi levels=$(awk "/^$1[ ]*:/ { print$4 }" /proc/mdstat) - devs=$(gawk "/^$1[ ]*:/ { print gensub("\[[0-9]*\](\([FSW]\))*","","g",gensub("^md.*raid[0-9]*","","1")) }" /proc/mdstat) for level in $levels ; do case $level in @@ -645,7 +620,6 @@ handleraid() { ;; esac done - findstoragedriver $devs if [ "$start" = 1 ]; then raiddevices="$raiddevices $1" fi @@ -1070,8 +1044,10 @@ if [ "x$PROBE" == "xyes" ]; then [ -z "$rootdev" ] && rootdev=$(awk '/^[ ]*[^#]/ { if ($2 == "/") { print $1; }}' $fstab) # check if it's nfsroot physdev="" - if [ "$rootfs" == "nfs" -a "x$net_list" == "x" ]; then - handlenfs $rootdev + if [ "$rootfs" == "nfs" ]; then + if [ "x$net_list" == "x" ]; then + handlenfs $rootdev + fi else # check if it's root by label rdev=$rootdev @@ -1079,19 +1055,7 @@ if [ "x$PROBE" == "xyes" ]; then rdev=$(resolve_device_name "$rdev") fi rootopts=$(echo $rootopts | sed -e 's/^r[ow],//' -e 's/,_netdev//' -e 's/_netdev//' -e 's/,r[ow],$//' -e 's/,r[ow],/,/' -e 's/^r[ow]$/defaults/' -e 's/$/,ro/') - physdev=$(findblockdevinsys "$rdev") - physdev=${physdev##*/dev/} - if [ -n "$physdev" ]; then - vecho "Found root device $physdev for $rdev" - else - physdev="$rdev" - fi - fi - if [ "$rootfs" != "nfs" ]; then - if [ -n "$physdev" -a "$physdev" != "$rdev" ]; then - findstoragedriver "$physdev" - fi - findstoragedriver ${rdev##/dev/} + findstoragedriver "$rdev" fi # find the first swap dev which would get used for swsusp @@ -1101,16 +1065,7 @@ if [ "x$PROBE" == "xyes" ]; then if [[ "$swsuspdev" =~ ^(UUID=|LABEL=) ]]; then swsuspdev=$(resolve_device_name "$swsuspdev") fi - - suspdev=$(findblockdevinsys "$swsuspdev") - suspdev=${suspdev##*/dev/} - if [ -n "$suspdev" ]; then - vecho "Found swsusp device $suspdev for $swsuspdev" - fi - if [ -n "$suspdev" -a "$suspdev" != "$swsuspdev" ]; then - findstoragedriver "$suspdev" - fi - findstoragedriver "${swsuspdev##/dev/}" + findstoragedriver "$swsuspdev" fi fi @@ -1161,7 +1116,7 @@ if [ -n "${loopfs}" ] || [[ "$rootopts" =~ "loop" ]]; then # FIXME: label support if [ "$loopfs" != "nfs" ]; then - findstoragedriver ${loopdev##/dev/} + findstoragedriver "$loopdev" fi fi -- 1.6.1.2 _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@redhat.com https://www.redhat.com/mailman/listinfo/anaconda-devel-list |
PATCH: Streamline mkinitrd storage device dedection
Hans de Goede wrote:
mkinitrd | 189 ++++++++++++++++++++++++-------------------------------------- 1 files changed, 72 insertions(+), 117 deletions(-) diff --git a/mkinitrd b/mkinitrd index fb1cf3f..6f4847f 100755 --- a/mkinitrd +++ b/mkinitrd @@ -283,7 +283,7 @@ access() { finddevnoinsys() { majmin="$1" if [ -n "$majmin" ]; then - dev=$(for x in /sys/block/* ; do findall $x/ -name dev ; done | while read device ; do + dev=$(for x in /sys/block/* ; do findall $x -name dev ; done | while read device ; do echo "$majmin" | cmp -s $device && echo $device ; done) if [ -n "$dev" ]; then dev=${dev%%/dev} @@ -295,60 +295,7 @@ finddevnoinsys() { return 1 } This bit is obviated by the fix in the other thread. -findblockdevinsys() { - devname=$(resolve_device_name "$1") - if [[ "$devname" =~ ^/sys/block/ ]]; then - echo "$devname" - fi - # check if it's a dm-crypt device. if so, just return the /dev/mapper path - if [[ "$devname" =~ ^/dev/mapper/ ]]; then - type=$(/sbin/dmsetup table $(basename $devname) | awk '{print $3}') - if [ "$type" == "crypt" ]; then - echo "$devname" - return 0 - fi - fi - majmin=$(get_numeric_dev dec $devname) - finddevnoinsys "$majmin" -} - -slavestried="" -handledsysfspaths="" - -findstoragedriverinsys () { - while [ ! -L device ]; do - for slave in $(ls -d slaves/* 2>/dev/null) ; do - [ -e $slave ] || continue - slavename=${slave##*/} - case " $slavestried " in - *" $slavename "*) - continue - ;; - *) - slavestried="$slavestried $slavename" - if [ -L $slave ]; then - slave=$(readlink $slave) - fi - qpushd $slave - findstoragedriverinsys - qpopd - ;; - esac - done - [ "$PWD" = "/sys" ] && return - cd .. - done - - cd $(readlink ./device) - case " $handledsysfspaths " in - *" $PWD "*) - return - ;; - *) - handledsysfspaths="$handledsysfspaths $PWD" - ;; - esac - +finddevicedriverinsys () { if is_iscsi $PWD; then handleiscsi "$PWD" return @@ -376,40 +323,69 @@ findstoragedriverinsys () { done } -findstoragedriver () { - for device in $@ ; do - case " $handleddevices " in - *" $device "*) - continue ;; - *) handleddevices="$handleddevices $device" ;; - esac - if [[ "$device" =~ "^md[0-9]+" ]]; then - vecho "Found RAID component $device" - handleraid "$device" - continue - fi - vecho "Looking for driver for device $device" - if [[ "$device" =~ ^/sys ]]; then - device=${device##*/} - fi - if [[ "$device" =~ ^(dm-|mapper/) ]]; then - majmin=$(get_numeric_dev dec "/dev/$device") - sysfs=$(finddevnoinsys $majmin) - handledm $(echo "$majmin" |cut -d : -f 1) $(echo "$majmin" |cut -d : -f 2) - else - sysfs="" - device=$(echo "$device" | sed 's,/,!,g') - if [ -d /sys/block/$device/ ]; then - sysfs="/sys/block/$device" - else - sysfs=$(for x in /sys/block/* ; do findone -type d $x/ -name $device; done) - fi - fi - [ -z "$sysfs" -o ! -e "$sysfs" ] && continue - qpushd $sysfs - findstoragedriverinsys - qpopd +findstoragedriverinsys () { + local sysfs=$(readlink "$1") + + # if its a partition look at the device holding the partition + if [ -f "$sysfs/partition" ]; then + sysfs=$(readlink ${sysfs%/*}) + fi + + if [[ ! "$sysfs" =~ '^/sys/devices/.*/block/.*$' ]]; then + error "WARNING: $sysfs is a not a block sysfs path, skipping" + return + fi + + if [ ! -e "$sysfs" ]; then + error "WARNING: sysfspath $sysfs does not exist, skipping" + return + fi If we hit this test, isn't the kernel totally broken? + + case " $handleddevices " in + *" $sysfs "*) + return ;; + *) handleddevices="$handleddevices $sysfs" ;; + esac + + if [[ "$sysfs" =~ '^/sys/devices/virtual/block/md[0-9]+$' ]]; then + local raid=${sysfs##*/} + vecho "Found MDRAID component $raid" + handleraid $raid + fi + if [[ "$sysfs" =~ '^/sys/devices/virtual/block/dm-[0-9]+$' ]]; then + vecho "Found DeviceMapper component ${sysfs##*/}" + handledm $(cat $sysfs/dev |cut -d : -f 1) $(cat $sysfs/dev |cut -d : -f 2) + fi cut isn't allowed because it's in /usr/bin ; use sed for this. Basically I think this patch should work, but I'm not entirely sure cciss won't break. -- Peter Power corrupts. Absolute power is kind of neat. -- John Lehman, Secretary of the Navy, 1981-1987 _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@redhat.com https://www.redhat.com/mailman/listinfo/anaconda-devel-list |
PATCH: Streamline mkinitrd storage device dedection
On Wed, 2009-02-04 at 14:39 -0500, Peter Jones wrote:
> Hans de Goede wrote: > > + if [[ "$sysfs" =~ '^/sys/devices/virtual/block/dm-[0-9]+$' ]]; then > > + vecho "Found DeviceMapper component ${sysfs##*/}" > > + handledm $(cat $sysfs/dev |cut -d : -f 1) $(cat $sysfs/dev |cut > > -d : -f 2) > > + fi > > cut isn't allowed because it's in /usr/bin ; use sed for this. You can also use shell builtins: majmin=$(< $sysfs/dev) # $(< FILE) == $(cat FILE) handledm ${majmin/:/ } # replace ":" with " ", let shell split -w (who hates subshells) _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@redhat.com https://www.redhat.com/mailman/listinfo/anaconda-devel-list |
| All times are GMT. The time now is 05:28 PM. |
VBulletin, Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.