[Ovirt-devel] [PATCH node][REPOST 1/2] Fix uninstall to detect and cleanup correct partitions

Mike Burns mburns at redhat.com
Wed Mar 24 13:03:24 UTC 2010


Previous implementation had staticly defined partitions to remove.
This would break in the case of split Root and HostVG devices.

Signed-off-by: Mike Burns <mburns at redhat.com>
---
 scripts/ovirt-config-boot      |   11 +--------
 scripts/ovirt-config-uninstall |   48 ++++++++++++++++++++++++---------------
 scripts/ovirt-functions        |   33 +++++++++++++++++++++++++++
 3 files changed, 63 insertions(+), 29 deletions(-)

diff --git a/scripts/ovirt-config-boot b/scripts/ovirt-config-boot
index 28d1572..ac43daa 100755
--- a/scripts/ovirt-config-boot
+++ b/scripts/ovirt-config-boot
@@ -50,12 +50,7 @@ ovirt_boot_setup() {
     fi

     # check that /boot mounted ok and find partition number for GRUB
-    eval $(readlink -f /dev/disk/by-label/$grub_dev_label|awk {'
-        print "disk=" substr($1,1,length($1)-1);
-        print "disk2=" substr($1,1,length($1)-2);
-        partN=substr($1,length($1),1); partN--;
-        print "partN=" partN;
-    }')
+    get_part_info $(readlink -f /dev/disk/by-label/$grub_dev_label disk partN
     rc=$?
     if [ $rc -ne 0 -o $partN -lt 0 ]; then
       log "unable to determine Root partition"
@@ -70,10 +65,6 @@ ovirt_boot_setup() {
           return 1
         fi

-        if [ ! -e "$disk" ]; then
-            # e.g. c0d0p1
-            disk="$disk2"
-        fi
         # prepare Root partition update
         candidate=
         if [ -e /dev/disk/by-label/RootBackup ]; then
diff --git a/scripts/ovirt-config-uninstall b/scripts/ovirt-config-uninstall
index 3b7b48d..b6675e7 100755
--- a/scripts/ovirt-config-uninstall
+++ b/scripts/ovirt-config-uninstall
@@ -37,27 +37,37 @@ if ask_yes_or_no "Do you wish to continue and uninstall this node ([Y]es/[N]o)?"
         rm -f /var/lib/multipath/bindings
         unmount_logging
         unmount_config /etc/default/ovirt
+        #get partition info
+        root2=""
+        if findfs LABEL=RootBackup 2>&1 >/dev/null; then
+            root2=RootBackup
+        elif findfs LABEL=RootUpdate 2>&1 >/dev/null; then
+            root2=RootUpdate
+        elif findfs LABEL=RootNew 2>&1 >/dev/null; then
+            root2=RootNew
+        fi
+        if ! get_part_info $(findfs LABEL=Root 2>/dev/null) root_dev root_part; then
+            log "Can't find Root device"
+            exit 2
+        fi
+        if ! get_part_info $(findfs LABEL=${root2} 2>/dev/null) root2_dev root2_part; then
+            log "Can't find RootBackup/RootNew/RootUpdate device"
+            exit 3
+        fi
+        if ! get_part_info $(pvs --noheadings -o pv_name,vg_name | grep HostVG | awk '{print $1}') pv_dev pv_part; then
+            log "Can't find HostVG device"
+            exit 4
+        fi
         log "Removing volume group"
         wipe_volume_group "HostVG"
-        partition=$(readlink -f $(findfs LABEL=Root))
-        if [ -n "$partition" ]; then
-            log "Removing partitions"
-            eval $(echo $partition | awk ' {
-                print "drive=" substr($0,1,length($1)-1);
-                print "drive2=" substr($0,1,length($1)-2);
-            }')
-            if [ ! -e "$drive" ]; then
-                drive="$drive2"
-                partpv="$drive}p2"
-            else
-                partpv="${drive}2"
-            fi
-	        parted -s $drive "rm 1"
-            pvremove ${partpv}
-	        parted -s $drive "rm 2"
-            parted -s $drive "rm 3"
-            wipe_partitions $drive
-	    fi
+        log "Removing partitions"
+        parted -s $root_dev "rm $root_part"
+        pvremove ${vg_dev}
+        parted -s $root2_dev "rm $root2_part"
+        parted -s $vg_dev "rm $vg_part"
+        wipe_partitions $pv_dev
+        wipe_partitions $root_dev
+        wipe_partitions $root2_dev
         #restart multipath
         multipath -F
         multipath -v3
diff --git a/scripts/ovirt-functions b/scripts/ovirt-functions
index c2ef94b..b98e31a 100644
--- a/scripts/ovirt-functions
+++ b/scripts/ovirt-functions
@@ -851,6 +851,39 @@ get_dm_device ()
     return $rc
 }

+#Function to determine partition and device names
+get_part_info() {
+    local drive_in=$1
+    local dev_var=$2
+    local part_var=$3
+    local devname_1 devname2 part_number
+    local rc=0
+
+    eval $(readlink -f $drive_in|awk {'
+        print "devname_1=" substr($1,1,length($1)-1);
+        print "devname_2=" substr($1,1,length($1)-2);
+        part_number=substr($1,length($1),1);
+        print "part_number=" part_number;
+    }')
+    rc=$?
+
+    if [[ "part_number" -lt 1 ]]; then
+        log "Partition number was invalid"
+        return 2
+    fi
+
+
+    if [ -e ${devname_1} ]; then
+        eval "${dev_var}"="${devname_1}"
+    elif [ -e ${devname_2} ]; then
+        eval "${dev_var}"="${devname_2}"
+    else
+        return 1
+    fi
+    eval "${part_var}"="${part_number}"
+    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