WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

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

To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH 2/2] Fix problems with vbd hotplug on Linux
From: Gary Grebus <Gary.Grebus@xxxxxxxxxx>
Date: Mon, 02 Nov 2009 16:35:22 -0500
Delivery-date: Mon, 02 Nov 2009 13:37:18 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 2.0.0.23 (X11/20090825)
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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH 2/2] Fix problems with vbd hotplug on Linux, Gary Grebus <=