Add proper partition and type support
authorBryn M. Reeves <bmr@redhat.com>
Thu, 15 Nov 2012 22:02:05 +0000 (22:02 +0000)
committerBryn M. Reeves <bmr@redhat.com>
Thu, 15 Nov 2012 22:02:05 +0000 (22:02 +0000)
Store the partition number (use 0 for whole disk) as well as the
type in the map and enforce type and partition match in map().

blkdevalias

index f22e442..22c42b6 100755 (executable)
@@ -23,6 +23,7 @@
 declare -A WWIDMAP
 declare -A NAMEMAP
 declare -A TYPEMAP
+declare -A PARTMAP
 
 BA_DEBUG=yes
 BA_DEFAULT_USER="oracle"
@@ -69,7 +70,7 @@ ba_store_wwid_map() {
         exit 1
     fi
     for WWID in ${!WWIDMAP[@]}; do
-        echo "$WWID ${WWIDMAP[$WWID]} ${TYPEMAP[$WWID]}"
+        echo "$WWID ${WWIDMAP[$WWID]} ${TYPEMAP[$WWID]} ${PARTMAP[$WWID]}"
     done  >> $TMP_MAP
     mv $TMP_MAP $BA_MAP_PATH
 }
@@ -80,23 +81,26 @@ ba_load_wwid_map() {
         _error "$BA_MAP_PATH does not exist or is not readable"
         exit 1
     fi
-    while read WWID ALIAS TYPE; do
+    while read WWID ALIAS TYPE PART; do
         if [[ $WWID == \#* ]] || [[ $WWID == "" ]]; then
             continue
         fi
         WWIDMAP[$WWID]="$ALIAS"
         NAMEMAP[$ALIAS]="$WWID"
         TYPEMAP[$WWID]="$TYPE"
+        PARTMAP[$WWID]="$PART"
     done < $BA_MAP_PATH
 }
 
-# ba_add_wwid_mapping <wwid> <alias> <sd|mpath>
+# ba_add_wwid_mapping <wwid> <alias> <sd|mpath> <part>
 ba_add_wwid_mapping() {
     local WWID
     WWID="$1"
     ALIAS="$2"
     TYPE="$3"
-    _debug "ba_add_wwid_mapping WWID=\"$WWID\" ALIAS=\"$ALIAS\""
+    PART="$4"
+    _debug "ba_add_wwid_mapping: WWID=\"$WWID\" ALIAS=\"$ALIAS\"" \
+        "TYPE=\"$TYPE\" PART=\"$PART\""
     if [ "$WWID" == "" ]; then
         _warn "no wwid given"
         return
@@ -105,12 +109,16 @@ ba_add_wwid_mapping() {
         _warn "no alias given"
         return
     fi
+    if [ "$PART" == "" ]; then
+        _warn "no partition number given"
+    fi
     if [ "${NAMEMAP[$WWID]}" != "" ]; then
         _warn "$WWID already mapped to alias ${NAMEMAP[$WWID]}; replacing it."
     fi
     WWIDMAP[$WWID]="$ALIAS"
     NAMEMAP[$ALIAS]="$WWID"
     TYPEMAP[$WWID]=${TYPE:-"sd"}
+    PARTMAP[$WWID]="$PART"
 }
 
 # ba_del_wwid_mapping <wwid>
@@ -130,6 +138,24 @@ ba_del_wwid_mapping() {
     unset TYPEMAP[$WWID]
 }
 
+ba_get_partnum () {
+    local DEV="$1"
+    if [[ $DEV == dm-* ]]; then
+        DEV=$DM_NAME
+    fi
+    _debug "ba_get_partnum: $DEV"
+    /sbin/dmsetup info $DEV > /dev/null 2>&1
+    if [ "$?" == "0" ]; then
+        NUM=$(echo $DEV | sed -e 's/\/dev.*\///' -e 's/.*p\([0-9]*\).*/\1/')
+    else
+        NUM=$(echo $DEV | sed 's/\(\/dev\/\)*sd[a-z]*//')
+    fi
+    if [ "$NUM" == "" ]; then
+        NUM="0"
+    fi
+    echo $NUM
+}
+
 ba_scsi_id () {
     local DEV=$1
     _debug "ba_scsi_id: getting ID for device $DEV"
@@ -193,7 +219,7 @@ EOF
 
 # createdisk <alias> <device>
 ba_createdisk () {
-    local WWID DEV ALIAS
+    local WWID DEV ALIAS PART
     ALIAS="$1"
     DEV="$2"
     if [ "$DEV" == "" ] || [ "$ALIAS" == "" ]; then
@@ -207,14 +233,16 @@ ba_createdisk () {
         _error "could not get SCSI ID for $DEV"
         exit 1
     fi
-    if [[ $DEV == *mpath* ]]; then
-        TYPE=mpath
-        _debug "wm_createdisk: WWID=\"$WWID\" DEV=\"$DEV\" ALIAS=\"$ALIAS\""
+
+    if dmsetup info $DEV > /dev/null  2>&1; then
+        TYPE="mpath"
     else
-        TYPE=sd
+        TYPE="sd"
     fi
-    ba_add_wwid_mapping $WWID $ALIAS $TYPE
+
+    PART=$(ba_get_partnum $DEV) 
+
+    ba_add_wwid_mapping $WWID $ALIAS $TYPE $PART
     ba_store_wwid_map
 }
 
@@ -275,12 +303,22 @@ ba_scandisks () {
 }
 
 ba_map () {
-    local WWID
+    local WWID TYPE PART
     WWID="$1"
     if [ "$WWID" == "" ] || [ "${WWIDMAP[$WWID]}" == "" ]; then
         echo "Usage: $0 map <wwid>" 1>&2
         exit 2
     fi
+    PART=$(ba_get_partnum $DEVNAME)
+    if [ "$ID_BUS" == "scsi" ]; then
+        TYPE=sd
+    else
+        TYPE=mpath
+    fi
+    if [ "$PART" != ${PARTMAP[$WWID]} ] \
+        || [ "$TYPE" != ${TYPEMAP[$WWID]} ] ; then
+        exit 1
+    fi
     echo "BA_WWID=$WWID"
     echo "BA_NAME=$BA_DEV_PATH/${WWIDMAP[$WWID]}"
     echo "BA_TYPE=${TYPEMAP[$WWID]}"