[Ovirt-devel] [PATCH node] Improve performance of multipath translations

Mike Burns mburns at redhat.com
Wed Mar 10 04:18:14 UTC 2010


Cleanup the translations of /dev/sdX to /dev/mapper and
vice-versa.

Signed-off-by: Mike Burns <mburns at redhat.com>
---
 scripts/ovirt-config-storage |   24 +++++++++++++++---------
 scripts/ovirt-functions      |   22 ++++++++++++++++++++++
 2 files changed, 37 insertions(+), 9 deletions(-)

diff --git a/scripts/ovirt-config-storage b/scripts/ovirt-config-storage
index aea73f8..cf73aa4 100755
--- a/scripts/ovirt-config-storage
+++ b/scripts/ovirt-config-storage
@@ -38,13 +38,12 @@ swap_min_size=5
 get_sd_name() {
     local id=$1
     local device_var=$2
-    for device in $(ls /sys/block)
-    do
-        if [[ $id = $(cat /sys/block/$device/dev) ]]; then
-            eval $device_var=$device
-            return
-        fi
-    done
+    local device_sys=$(grep -H "^$id$" /sys/block/*/dev | cut -d: -f1)
+
+    if [ -n "$device_sys" ]; then
+        eval $device_var=$(basename $(dirname $device_sys))
+        return
+    fi
     eval $device_var=1
 }

@@ -83,10 +82,17 @@ translate_multipath_device() {
     local dev=$1
     local mpath_var=$2

+    if [[ $dev =~ "/dev/mapper" ]]; then
+        eval $mpath_var=$dev
+        return
+    fi
+
     local basedev=$(basename $dev)

-    local mpath_device=$(multipath -ll $dev |grep -n . | \
-        grep "^1:" |awk '{print $1}' | sed 's/^1:/\/dev\/mapper\//g')
+    local dm_dev=/dev/$(multipath -ll $dev | egrep dm-[0-9]+ | sed -r 's/^.& (dm-[0-9]+) .*$/\1/')
+
+    local mpath_device=
+    get_dm_device $dm_dev $mpath_device

     if [ -z "$mpath_device" ]; then
         mpath_device=$dev
diff --git a/scripts/ovirt-functions b/scripts/ovirt-functions
index 6839614..5661bee 100644
--- a/scripts/ovirt-functions
+++ b/scripts/ovirt-functions
@@ -765,6 +765,28 @@ test_ntp_configuration () {

 }

+get_dm_device ()
+{
+    local device=$1
+    local return_var=$2
+    major=$(stat -c '%t' $(readlink -f $device))
+    minor=$(stat -c '%T' $(readlink -f $device))
+    local dm_device=
+    local rc=1
+    for dm in /dev/mapper/*; do
+        if [ $major = $(stat -c '%t' $dm) -a \
+            $minor = $(stat -c '%T' $dm) ]; then
+            local dm_device=$dm
+            rc=0
+            break
+        fi
+    done
+
+    eval $return_var=$dm_device
+
+    return $rc
+}
+
 # execute a function if called as a script, e.g.
 #   ovirt-functions ovirt_store_config /etc/hosts

-- 
1.6.6.1




More information about the ovirt-devel mailing list