mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 18:21:39 +01:00
blktap2 devices must be handled differently than blktap2
devices. blktap2 devices require a sysfs write to close the underlying
device, as well as extra sysfs writes when the domU is
paused/unpaused. The differences between blktap1 and blktap2 are great
enough to warrant the creation of a new device class, 'tap2', and
device controller for blktap2 devices.
* add a new device controller (Blktap2Controller) and device class
(tap2) for blktap2 devices
* move blktap2 specific code from DevController to Blktap2Controller
* if possible, check xenstore to determine block device class
* use vmpath (/vm/<uuid>/) when releasing devices
* modify linux hotplug cleanup script to handle blktap2 device
removal
Signed-off-by: Ryan O'Connor <rjo@cs.ubc.ca>
44 lines
1.4 KiB
Bash
44 lines
1.4 KiB
Bash
#! /bin/bash
|
|
|
|
dir=$(dirname "$0")
|
|
. "$dir/xen-hotplug-common.sh"
|
|
|
|
# Claim the lock protecting ${XEN_SCRIPT_DIR}/block. This stops a race whereby
|
|
# paths in the store would disappear underneath that script as it attempted to
|
|
# read from the store checking for device sharing.
|
|
# Any other scripts that do similar things will have to have their lock
|
|
# claimed too.
|
|
# This is pretty horrible, but there's not really a nicer way of solving this.
|
|
claim_lock "block"
|
|
|
|
# split backend/DEVCLASS/VMID/DEVID on slashes
|
|
path_array=( ${XENBUS_PATH//\// } )
|
|
# get /vm/UUID path
|
|
vm=$(xenstore_read_default "/local/domain/${path_array[2]}/vm" "")
|
|
# construct /vm/UUID/device/DEVCLASS/DEVID
|
|
if [ "$vm" != "" ]; then
|
|
vm_dev="$vm/device/${path_array[1]}/${path_array[3]}"
|
|
|
|
# if the vm path does not exist and the device class is 'vbd' then we may have
|
|
# a tap2 device
|
|
if [ ! $(xenstore-read "vm_dev" 2>/dev/null) ] \
|
|
&& [ "${path_array[1]}" = "vbd" ]; then
|
|
vm_dev="$vm/device/tap2/${path_array[3]}"
|
|
fi
|
|
else
|
|
vm_dev=
|
|
fi
|
|
|
|
# remove device frontend store entries
|
|
xenstore-rm -t \
|
|
$(xenstore-read "$XENBUS_PATH/frontend" 2>/dev/null) 2>/dev/null || true
|
|
|
|
# remove device backend store entries
|
|
xenstore-rm -t "$XENBUS_PATH" 2>/dev/null || true
|
|
xenstore-rm -t "error/$XENBUS_PATH" 2>/dev/null || true
|
|
|
|
# remove device path from /vm/UUID
|
|
[ "$vm_dev" != "" ] && xenstore-rm -t "$vm_dev" 2>/dev/null || true
|
|
|
|
release_lock "block"
|