[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/1] tools/hotplug: Scan xenstore once when attaching shared images files
Create the list of shared loopback devices from within check_sharing, rather than calling check_sharing for every loopback device using the same shared image. This change prevents the xenstore database from being walked for every shared device, which causes an exponential decrease in performance. Signed-off-by: Mike Latimer <mlatimer@xxxxxxxx> --- tools/hotplug/Linux/block | 67 +++++++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/tools/hotplug/Linux/block b/tools/hotplug/Linux/block index 8d2ee9d..aef051c 100644 --- a/tools/hotplug/Linux/block +++ b/tools/hotplug/Linux/block @@ -38,7 +38,7 @@ find_free_loopback_dev() { } ## -# check_sharing device mode +# check_sharing devtype device mode [inode] # # Check whether the device requested is already in use. To use the device in # read-only mode, it may be in use in read-only mode, but may not be in use in @@ -56,10 +56,27 @@ find_free_loopback_dev() { # check_sharing() { - local dev="$1" - local mode="$2" + local devtype=$1 + local dev="$2" + local mode="$3" + + if [ "$devtype" = "file" ]; + then + local inode="$4" + + shared_list=$(losetup -a | + sed -n -e "s@^\([^:]\+\)\(:[[:blank:]]\[0*${dev}\]:${inode}[[:blank:]](.*)\)@\1@p" ) + for dev in $shared_list + do + if [ -n "$dev" ] + then + devmm="${devmm}$(device_major_minor $dev)," + fi + done + else + local devmm="$(device_major_minor "$dev")," + fi - local devmm=$(device_major_minor "$dev") local file if [ "$mode" = 'w' ] @@ -75,9 +92,9 @@ check_sharing() then local d=$(device_major_minor "$file") - if [ "$d" = "$devmm" ] + if [[ "$devmm" == *"$d,"* ]] then - echo 'local' + echo "local $d" return fi fi @@ -90,13 +107,13 @@ check_sharing() do d=$(xenstore_read_default "$base_path/$dom/$dev/physical-device" "") - if [ "$d" = "$devmm" ] + if [ -n "$d" ] && [[ "$devmm" == *"$d,"* ]] then if [ "$mode" = 'w' ] then if ! same_vm $dom then - echo 'guest' + echo "guest $d" return fi else @@ -107,7 +124,7 @@ check_sharing() then if ! same_vm $dom then - echo 'guest' + echo "guest $d" return fi fi @@ -129,6 +146,7 @@ check_device_sharing() { local dev="$1" local mode=$(canonicalise_mode "$2") + local type="device" local result if [ "x$mode" = 'x!' ] @@ -136,33 +154,38 @@ check_device_sharing() return 0 fi - result=$(check_sharing "$dev" "$mode") + result=$(check_sharing "$type" "$dev" "$mode") if [ "$result" != 'ok' ] then - do_ebusy "Device $dev is mounted " "$mode" "$result" + do_ebusy "Device $dev is mounted " "$mode" "${result%% *}" fi } ## -# check_device_sharing file dev mode +# check_device_sharing file dev mode inode # -# Perform the sharing check for the given file mounted through the given -# loopback interface, in the given mode. +# Perform the sharing check for the given file, with its corresponding +# device, inode and mode. As the file can be mounted multiple times, +# the inode is passed through to check_sharing for all instances to be +# checked. # check_file_sharing() { local file="$1" local dev="$2" local mode="$3" + local inode="$4" + local type="file" + local result - result=$(check_sharing "$dev" "$mode") + result=$(check_sharing "$type" "$dev" "$mode" "$inode") if [ "$result" != 'ok' ] then - do_ebusy "File $file is loopback-mounted through $dev, -which is mounted " "$mode" "$result" + do_ebusy "File $file is loopback-mounted through ${result#* }, +which is mounted " "$mode" "${result%% *}" fi } @@ -281,15 +304,7 @@ mount it read-write in a guest domain." fatal "Unable to lookup $file: dev: $dev inode: $inode" fi - shared_list=$(losetup -a | - sed -n -e "s@^\([^:]\+\)\(:[[:blank:]]\[0*${dev}\]:${inode}[[:blank:]](.*)\)@\1@p" ) - for dev in $shared_list - do - if [ -n "$dev" ] - then - check_file_sharing "$file" "$dev" "$mode" - fi - done + check_file_sharing "$file" "$dev" "$mode" "$inode" fi loopdev=$(losetup -f 2>/dev/null || find_free_loopback_dev) -- 1.8.4.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |