FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Debian > Debian User

 
 
LinkBack Thread Tools
 
Old 02-04-2009, 03:10 PM
Hans de Goede
 
Default 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
 
Old 02-04-2009, 06:39 PM
Peter Jones
 
Default 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
 
Old 02-10-2009, 04:47 PM
Will Woods
 
Default 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
 

Thread Tools




All times are GMT. The time now is 06:09 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org