[Ovirt-devel] [PATCH] Ensures that persist and unpersist work with relative paths.

Darryl L. Pierce dpierce at redhat.com
Tue Mar 23 18:35:45 UTC 2010


As they iterate through their list of arguments, both
ovirt_storage_config and remove_config first convert each of them into a
fully qualified path before processing.

Related: rhbz#576239

Signed-off-by: Darryl L. Pierce <dpierce at redhat.com>
---
 scripts/ovirt-functions |   80 +++++++++++++++++++++++------------------------
 1 files changed, 39 insertions(+), 41 deletions(-)

diff --git a/scripts/ovirt-functions b/scripts/ovirt-functions
index cfcedbb..c2ef94b 100644
--- a/scripts/ovirt-functions
+++ b/scripts/ovirt-functions
@@ -464,13 +464,14 @@ ovirt_store_config() {
     rc=0
     if grep -q " /config ext3" /proc/mounts; then
         for p in "$@"; do
+            local filename=$(readlink -f $p)
             local persist_it=true
 
             # ensure that, if this is a directory
             # that it's not already persisted
-            if [ -d $p ]; then
-                if [ -d /config$p ]; then
-                    printf "Directory already persisted: $p\n"
+            if [ -d $filename ]; then
+                if [ -d /config$filename ]; then
+                    printf "Directory already persisted: ${filename}\n"
                     printf "You need to unpersist its child directories and/or files and try again.\n"
                     persist_it=false
                 fi
@@ -478,34 +479,32 @@ ovirt_store_config() {
 
             # if it's a file then make sure it's not already
             # persisted
-            if [ -f $p ]; then
-                if [ -f /config$p ]; then
-                    local md5root=$(md5 $p)
-                    local md5stored=$(md5 /config$p)
+            if [ -f $filename ]; then
+                if [ -f /config$filename ]; then
+                    local md5root=$(md5 $filename)
+                    local md5stored=$(md5 /config$filename)
                     if [ "$md5root" = "$md5stored" ]; then
-                        printf "File already persisted: $p\n"
+                        printf "File already persisted: ${filename}\n"
                         persist_it=false
                     else
                         # persistent copy needs refresh
-                        umount -n $p 2> /dev/null || :
-                        rm -f /config$p
+                        umount -n $filename 2> /dev/null || :
+                        rm -f /config$filename
                     fi
                 fi
             fi
 
             if $persist_it; then
-                local f=$(readlink -f $p)
-                printf "$f"
                 # skip if file does not exist or is empty
-                if [ ! -s "$f" ]; then
-                    printf " Skipping, file '%s' does not exist or is empty\n" $p
+                if [ ! -s "${filename}" ]; then
+                    printf " Skipping, file '${filename}' does not exist or is empty\n"
                     continue
                 fi
                 # skip if already bind-mounted
-                if ! grep -q " $f ext3" /proc/mounts ; then
-                    mkdir -p /config$(dirname $f)
-                    cp -a $f /config$f \
-                        && mount -n --bind /config$f $f
+                if ! grep -q " $filename ext3" /proc/mounts ; then
+                    mkdir -p /config$(dirname $filename)
+                    cp -a $filename /config$filename \
+                        && mount -n --bind /config$filename $filename
                     if [ $? -ne 0 ]; then
                         printf " Failed to persist\n"
                         rc=1
@@ -514,10 +513,10 @@ ovirt_store_config() {
                     fi
                 fi
                 # register in /config/files used by rc.sysinit
-                if ! grep -q "^$f$" /config/files 2> /dev/null ; then
-                    printf "$f\n" >> /config/files
+                if ! grep -q "^${filename}$" /config/files 2> /dev/null ; then
+                    printf "${filename}\n" >> /config/files
                 fi
-                printf "\nSuccessfully persisted $f\n"
+                printf "\nSuccessfully persisted ${filename}\n"
             fi
         done
         echo
@@ -563,41 +562,40 @@ remove_config() {
 
     if grep -q " /config ext3" /proc/mounts; then
         for p in "$@"; do
-            grep "^${p}\$" /config/files > /dev/null 2>&1
-            if [ $? -eq 0 ]; then
-                f=$(readlink -f $p)
-                if grep -q " $f ext3" /proc/mounts ; then
-                    if umount -n $f; then
-                        if [ -d $f ]; then
-                            cp -ar /config/$f/* $f
+            local filename=$(readlink -f $p)
+            if grep "^${filename}\$" /config/files > /dev/null 2>&1; then
+                if grep -q " $filename ext3" /proc/mounts ; then
+                    if umount -n $filename; then
+                        if [ -d $filename ]; then
+                            cp -ar /config/$filename/* $filename
                             if [ $? -ne 0 ]; then
-                                printf " Failed to unpersist ${f}\n" $f
+                                printf " Failed to unpersist ${filename}\n"
                                 exit 1
                             else
-                                printf " $f successully unpersisted\n" $f
+                                printf " ${filename} successully unpersisted\n"
                             fi
                         else
-                            if [ -f /config$f ]; then
-                            # refresh the file in rootfs if it was mounted over
-                                cp -a /config$f $f
+                            if [ -f /config$filename ]; then
+                                # refresh the file in rootfs if it was mounted over
+                                cp -a /config$filename $filename
                                 if [ $? -ne 0 ]; then
-                                    printf " Failed to unpersist %s\n" $f
+                                    printf " Failed to unpersist ${filename}\n"
                                     exit 1
                                 else
-                                    printf " %s successully unpersisted\n" $f
+                                    printf " ${filename} successully unpersisted\n"
                                 fi
                             fi
                         fi
                     fi
+                    # clean up the persistent store
+                    rm -Rf /config$filename
+                    # unregister in /config/files used by rc.sysinit
+                    sed --copy -i "\|^${filename}$|d" /config/files
                 else
-                    printf "$f is not a persisted file.\n"
+                    printf "$filename is not a persisted file.\n"
                 fi
-                # clean up the persistent store
-                rm -Rf /config$f
-                # unregister in /config/files used by rc.sysinit
-                sed --copy -i "\|^$f$|d" /config/files
             else
-                printf "File not explicitly persisted: $p\n"
+                printf "File not explicitly persisted: ${filename}\n"
             fi
         done
     fi
-- 
1.6.6.1




More information about the ovirt-devel mailing list