Author: glen
Date: Wed Jun 17 22:44:43 2009
New Revision: 10395

Modified:
   geninitrd/trunk/mod-multipath.sh
Log:
- update to parse multipath-tools-0.4.8-9.x86_64 output and handle 
udev-core-141-1.x86_64

Modified: geninitrd/trunk/mod-multipath.sh
==============================================================================
--- geninitrd/trunk/mod-multipath.sh    (original)
+++ geninitrd/trunk/mod-multipath.sh    Wed Jun 17 22:44:43 2009
@@ -27,6 +27,9 @@
        if ! is_yes "$USE_MULTIPATH"; then
                return 1
        fi
+if [ "$devpath" = /dev/sys/rootfs ]; then
+       devpath=/dev/mapper/LUN-14
+fi
 
        # multipath nodes are under device mapper
        if [[ "$devpath" != /dev/mapper/* ]]; then
@@ -40,6 +43,8 @@
        fi
 
        local MPATH_WWID=${DM_UUID##*-}
+
+       # just check if it is valid.
        local info=$(multipath -l $MPATH_WWID)
        if [ -z "$info" ]; then
                return 1
@@ -56,6 +61,9 @@
 find_modules_multipath() {
        local devpath="$1"
 
+if [ "$devpath" = /dev/sys/rootfs ]; then
+       devpath=/dev/mapper/LUN-14
+fi
        DM_NAME=
        eval $(dm_export "$devpath")
        if [ -z "$DM_NAME" ]; then
@@ -77,20 +85,24 @@
 
        debug "Finding modules for dm-multipath (WWID=$MPATH_WWID)"
        have_multipath=yes
-       local dev phydevs=$(echo "$info" | awk '$2 ~ 
/^[0-9]+:[0-9]+:[0-9]+:[0-9]+$/{printf("/dev/%s\n", $3)}')
-       for dev in $phydevs; do
-               find_modules_for_devpath $dev
-               lvm_ignore_devices="$lvm_ignore_devices $dev"
+
+       local p list
+       list=$(mp_parse_devs "$info")
+       for p in $list; do
+               find_modules_for_devpath $p
+               lvm_ignore_devices="$lvm_ignore_devices $p"
        done
 
-       local hw hwhandlers=$(echo "$info" | awk 
'/hwhandler=1/{sub(/.*hwhandler=1 /, ""); sub(/\]$/, ""); print}')
-       for hw in $hwhandlers; do
-               find_module "dm-$hw"
+       # TODO: handle newer multipath-tools:
+       # size=7.0G features='0' hwhandler='0' wp=rw
+       list=$(echo "$info" | awk '/hwhandler=1/{sub(/.*hwhandler=1 /, ""); 
sub(/\]$/, ""); print}')
+       for p in $list; do
+               find_module "dm-$p"
        done
 
-       local target targets=$(echo "$info" | awk '/prio=/{print $2}' | sort -u)
-       for target in $targets; do
-               find_module "dm-$target"
+       list=$(mp_parse_policy "$info")
+       for p in $list; do
+               find_module "dm-$p"
        done
 
        find_module "dm-mod"
@@ -105,8 +117,16 @@
        inst_exec /sbin/multipath /sbin
 
        # for udev callouts
-       inst_exec /sbin/scsi_id /lib/udev
-       inst_exec /sbin/mpath* /sbin
+       local scsi_id=$(find_tool /lib/udev/scsi_id /sbin/scsi_id)
+       inst_exec $scsi_id /lib/udev
+
+       if [ -d /lib/multipath ]; then
+               inst_d /lib/multipath
+               inst_exec /lib/multipath/* /lib/multipath
+       else
+               inst_exec /sbin/mpath* /sbin
+       fi
+
        egrep -v '^([   ]*$|#)' /etc/multipath.conf > 
$DESTDIR/etc/multipath.conf
 
        if [ -f /etc/multipath/bindings ]; then
@@ -176,3 +196,75 @@
        esac
 }
 
+# parse blockdevices behind multipath device
+# takes 'multipath -l' output as input
+mp_parse_devs() {
+       local info="$1"
+
+       # parse "0:0:1:0 sdf" -> /dev/sdf
+       #
+       # multipath-tools-0.4.8-0.12.amd64
+       # LUN-02 (36006016002c11800ce520d27c6ebda11) dm-0 DGC     ,RAID 10
+       # [size=12G][features=1 queue_if_no_path][hwhandler=1 emc]
+       # \_ round-robin 0 [prio=0][active]
+       #  \_ 0:0:0:0 sda 8:0   [active][undef]
+       # \_ round-robin 0 [prio=0][enabled]
+       #  \_ 0:0:1:0 sdf 8:80  [active][undef]
+       #
+       # multipath-tools-0.4.8-9.x86_64
+       # LUN-14 (36006016002c118006f4f8bccc7fada11) dm-3 ,
+       # size=7.0G features='0' hwhandler='0' wp=rw
+       # |-+- policy='round-robin 0' prio=-1 status=enabled
+       # | `- #:#:#:# sde 8:64 failed undef running
+       # `-+- policy='round-robin 0' prio=-1 status=active
+       #   `- #:#:#:# sdb 8:16 active undef running
+
+       echo "$info" | awk '{
+               if (match($0, /[#0-9]+:[#0-9]+:[#0-9]+:[#0-9]+ [^ ]+ 
[0-9]+:[0-9]/)) {
+                       # take whole matched part into "l" variable
+                       l = substr($0, RSTART, RLENGTH);
+                       split(l, a, " ");
+                       printf("/dev/%s\n", a[2])
+               }
+       }'
+}
+
+# parse policy output for each device
+# takes 'multipath -l' output as input
+mp_parse_policy() {
+       local info="$1"
+
+       # multipath-tools-0.4.8-0.12.amd64
+       # LUN-02 (36006016002c11800ce520d27c6ebda11) dm-0 DGC     ,RAID 10
+       # [size=12G][features=1 queue_if_no_path][hwhandler=1 emc]
+       # \_ round-robin 0 [prio=0][active]
+       #  \_ 0:0:0:0 sda 8:0   [active][undef]
+       # \_ round-robin 0 [prio=0][enabled]
+       #  \_ 0:0:1:0 sdf 8:80  [active][undef]
+       #
+       # multipath-tools-0.4.8-9.x86_64
+       # LUN-14 (36006016002c118006f4f8bccc7fada11) dm-3 ,
+       # size=7.0G features='0' hwhandler='0' wp=rw
+       # |-+- policy='round-robin 0' prio=-1 status=enabled
+       # | `- #:#:#:# sde 8:64 failed undef running
+       # `-+- policy='round-robin 0' prio=-1 status=active
+       #   `- #:#:#:# sdb 8:16 active undef running
+
+       echo "$info" | awk '
+               # multipath-tools-0.4.8-0.12.amd64
+               /\[prio=/{
+                       print $2
+               }
+               # multipath-tools-0.4.8-9.x86_64
+               /policy=/{
+                       if (match($0, /policy=[^ ]+/)) {
+                               # take whole matched part into "l" variable
+                               l = substr($0, RSTART, RLENGTH);
+                               # remove policy= and single quote,
+                               # which we can not use in this awk inline 
script, therefore the %c hack
+                               sub(sprintf("^policy=%c?", 39), "", l);
+                               print l
+                       }
+               }
+       ' | sort -u
+}
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to