[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 2/2] Fix problems with vbd hotplug on Linux



Speed up finding a loopback device for vbd hotplug.

 - Use the device and inode information provided by losetup to find
   if the vbd backing file is in use on another vbd.

 - Use losetup to find a free loopback device.

Signed-off-by: Gary Grebus <gary.grebus@xxxxxxxxxx>

diff -r 3c31d19aa975 tools/hotplug/Linux/block
--- a/tools/hotplug/Linux/block Mon Oct 26 12:42:38 2009 -0400
+++ b/tools/hotplug/Linux/block Mon Oct 26 12:44:10 2009 -0400
@@ -250,94 +250,27 @@
 mount it read-write in a guest domain."
         fi

-        loopdev=''
-        for dev in /dev/loop*
-        do
-          if [ ! -b "$dev" ]
+        if [ "x$mode" != 'x!' ]
+        then
+          inode=$(stat -c '%i' $file)
+          dev=$(stat -c '%D' $file)
+          if [ -z "$inode" ] || [ -z "$dev" ]
           then
-            continue
+            fatal "Unable to lookup $file: dev: $dev inode: $inode"
           fi

-          f=$(losetup "$dev" 2>/dev/null) || f=''
-
-          if [ "$f" ]
-          then
-            # $dev is in use.  Check sharing.
-            if [ "x$mode" = 'x!' ]
-            then
-              continue
-            fi
-
-            f=$(echo "$f" | sed -e 's/.*(\(.*\)).*/\1/g')
-
-            # $f is the filename, as read from losetup, but the loopback
-            # driver truncates filenames at 64 characters, so we need to go
-            # trawling through the store if it's longer than that.  Truncation
-            # is indicated by an asterisk at the end of the filename.
-            if expr index "$f" '*' >/dev/null
-            then
-              found=""
-              for dom in $(xenstore-list "$XENBUS_BASE_PATH")
-              do
-                for domdev in $(xenstore-list "$XENBUS_BASE_PATH/$dom")
-                do
-                  d=$(xenstore_read_default \
-                        "$XENBUS_BASE_PATH/$dom/$domdev/node" "")
-                  if [ "$d" = "$dev" ]
-                  then
-                    f=$(xenstore_read "$XENBUS_BASE_PATH/$dom/$domdev/params")
-                    found=1
-                    break 2
-                  fi
-                done
-              done
-
-              if [ ! "$found" ]
-              then
-                # This loopback device is in use by someone else, so skip it.
-                log debug "Loopback sharing check skips device $dev."
-                continue
-              fi
-            fi
-
-            # Canonicalise the filename for the comparison.
-
-            # I have seen this readlink fails because the filename given by
-            # losetup is only the basename.  This cannot happen when the loop
-            # device is set up through this script, because file is
-            # canonicalised above, but it may happen when loop devices are set
-            # up some other way.  This readlink may also conceivably fail if
-            # the file backing this loop device has been removed.
-
-            # For maximum safety, in the case that $f does not resolve, we
-            # assume that $file and $f are in the same directory.
-
-            # If you create a loopback filesystem, remove it and continue to
-            # run on it, and then create another file with the same name, then
-            # this check will block that -- don't do that.
-
-            # If you create loop devices through some other mechanism, use
-            # relative filenames, and then use the same filename through this
-            # script, then this check will block that -- don't do that either.
-
-            f=$(readlink -f "$f" || echo $(dirname "$file")/$(basename "$f"))
-
-
-            if [ "$f" = "$file" ]
+          shared_list=$(losetup -a | grep ' \[0*'${dev}'\]:'${inode} |
+                cut -d : -f 1)
+          for dev in "$shared_list"
+          do
+            if [ -n "$dev" ]
             then
               check_file_sharing "$file" "$dev" "$mode"
             fi
-          else
-            # $dev is not in use, so we'll remember it for use later; we want
-            # to finish the sharing check first.
+          done
+        fi

-            if [ "$loopdev" = '' ]
-            then
-              loopdev="$dev"
-            fi
-          fi
-        done
-
+        loopdev=$(losetup -f)
         if [ "$loopdev" = '' ]
         then
           release_lock "block"

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.