udev/qvm-block: exclude device if its partition is already attached
This prevents simultaneous attachment of the same device (in practice) to multiple VMs. This change to be effective requires udev action being called when such device is attached/detached to some domain. Script /etc/xen/scripts/block will take care of it. Fixes QubesOS/qubes-issues#1081
This commit is contained in:
parent
efd9854376
commit
098bfb634d
@ -36,11 +36,21 @@ is_used() {
|
||||
return 1
|
||||
}
|
||||
|
||||
is_attached() {
|
||||
dev_hex=$(stat -c %t:%T /dev/$(basename $1))
|
||||
xenstore-ls backend/vbd | grep -q "physical-device = \"$dev_hex\""
|
||||
}
|
||||
|
||||
# update info about parent devices, if any:
|
||||
if [ -f /sys$DEVPATH/partition ]; then
|
||||
parent=$(dirname $(readlink -f /sys$DEVPATH))
|
||||
udevadm trigger \
|
||||
--property-match=DEVPATH=/$(realpath --relative-to=/sys $parent)
|
||||
# if parent device is already attached, skip its partitions
|
||||
if is_attached $parent; then
|
||||
xs_remove
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# and underlying devices of device-mapper (if any)
|
||||
@ -58,12 +68,18 @@ if is_used /sys$DEVPATH; then
|
||||
fi
|
||||
|
||||
# or one of its partitions is used
|
||||
# or already attached (prevent attaching both device and its partition(s) at
|
||||
# the same time)
|
||||
for part in /sys$DEVPATH/$NAME*; do
|
||||
if [ -d $part ]; then
|
||||
if is_used $part; then
|
||||
xs_remove
|
||||
exit 0
|
||||
fi
|
||||
if is_attached $part; then
|
||||
xs_remove
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user