mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
Move block device bind/unbind into hotplug scripts.
Fixes file: devices since unbind now runs after the backend driver closes the loopback device. Also moves name -> node translation into the backend domain. Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
This commit is contained in:
1 parent
781cbee39d
commit
eccd1bf398
6 files changed
+92
-50
No files matched your search
@@ -21,6 +21,7 @@ XEN_CONFIGS += xmexample.vmx
|
||||
XEN_SCRIPT_DIR = /etc/xen/scripts
|
||||
XEN_SCRIPTS = network-bridge vif-bridge
|
||||
XEN_SCRIPTS += network-route vif-route
|
||||
XEN_SCRIPTS += block-phy
|
||||
XEN_SCRIPTS += block-file
|
||||
XEN_SCRIPTS += block-enbd
|
||||
|
||||
|
||||
+20
-20
@@ -3,31 +3,31 @@
|
||||
# Usage: block-enbd [bind server ctl_port |unbind node]
|
||||
#
|
||||
# The file argument to the bind command is the file we are to bind to a
|
||||
# loop device. We print the path to the loop device node to stdout.
|
||||
# loop device.
|
||||
#
|
||||
# The node argument to unbind is the name of the device node we are to
|
||||
# unbind.
|
||||
#
|
||||
# This assumes you're running a correctly configured server at the other end!
|
||||
|
||||
set -e
|
||||
|
||||
case $1 in
|
||||
bind)
|
||||
for dev in /dev/nd*; do
|
||||
if nbd-client $2:$3 $dev; then
|
||||
echo $dev
|
||||
exit 0
|
||||
fi
|
||||
done
|
||||
exit 1
|
||||
;;
|
||||
|
||||
unbind)
|
||||
nbd-client -d $2
|
||||
exit 0
|
||||
;;
|
||||
|
||||
*)
|
||||
echo 'Unknown command: ' $1 >&2
|
||||
echo 'Valid commands are: bind, unbind' >&2
|
||||
exit 1
|
||||
bind)
|
||||
for dev in /dev/nd*; do
|
||||
if nbd-client $2:$3 $dev; then
|
||||
major=$(stat -L -c %t "$dev")
|
||||
minor=$(stat -L -c %T "$dev")
|
||||
pdev=$(printf "0x%02x%02x" 0x$major 0x$minor)
|
||||
xenstore-write "$XENBUS_PATH"/physical-device $pdev \
|
||||
"$XENBUS_PATH"/node $dev
|
||||
exit 0
|
||||
fi
|
||||
done
|
||||
exit 1
|
||||
;;
|
||||
unbind)
|
||||
nbd-client -d $2
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
+20
-20
@@ -3,29 +3,29 @@
|
||||
# Usage: block_loop [bind file|unbind node]
|
||||
#
|
||||
# The file argument to the bind command is the file we are to bind to a
|
||||
# loop device. We print the path to the loop device node to stdout.
|
||||
# loop device.
|
||||
#
|
||||
# The node argument to unbind is the name of the device node we are to
|
||||
# unbind.
|
||||
|
||||
set -e
|
||||
|
||||
case $1 in
|
||||
bind)
|
||||
for dev in /dev/loop*; do
|
||||
if losetup $dev $2; then
|
||||
echo $dev
|
||||
exit 0
|
||||
fi
|
||||
done
|
||||
exit 1
|
||||
;;
|
||||
|
||||
unbind)
|
||||
losetup -d $2
|
||||
exit 0
|
||||
;;
|
||||
|
||||
*)
|
||||
echo 'Unknown command: ' $1 >&2
|
||||
echo 'Valid commands are: bind, unbind' >&2
|
||||
exit 1
|
||||
bind)
|
||||
for dev in /dev/loop*; do
|
||||
if losetup $dev $2; then
|
||||
major=$(stat -L -c %t "$dev")
|
||||
minor=$(stat -L -c %T "$dev")
|
||||
pdev=$(printf "0x%02x%02x" 0x$major 0x$minor)
|
||||
xenstore-write "$XENBUS_PATH"/physical-device $pdev \
|
||||
"$XENBUS_PATH"/node $dev
|
||||
exit 0
|
||||
fi
|
||||
done
|
||||
exit 1
|
||||
;;
|
||||
unbind)
|
||||
losetup -d $2
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
@@ -0,0 +1,30 @@
|
||||
#! /bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
expand_dev() {
|
||||
local dev
|
||||
case $1 in
|
||||
/*)
|
||||
dev=$1
|
||||
;;
|
||||
*)
|
||||
dev=/dev/$1
|
||||
;;
|
||||
esac
|
||||
echo -n $dev
|
||||
}
|
||||
|
||||
case $1 in
|
||||
bind)
|
||||
dev=$(expand_dev $2)
|
||||
major=$(stat -L -c %t "$dev")
|
||||
minor=$(stat -L -c %T "$dev")
|
||||
pdev=$(printf "0x%02x%02x" 0x$major 0x$minor)
|
||||
xenstore-write "$XENBUS_PATH"/physical-device $pdev \
|
||||
"$XENBUS_PATH"/node $dev
|
||||
exit 0
|
||||
;;
|
||||
unbind)
|
||||
;;
|
||||
esac
|
||||
@@ -9,8 +9,26 @@ PATH=/etc/xen/scripts:$PATH
|
||||
|
||||
case "$ACTION" in
|
||||
add)
|
||||
case "$XENBUS_TYPE" in
|
||||
vbd)
|
||||
t=$(xenstore-read "$XENBUS_PATH"/type)
|
||||
params=$(xenstore-read "$XENBUS_PATH"/params)
|
||||
[ -x /etc/xen/scripts/block-"$t" ] && \
|
||||
/etc/xen/scripts/block-"$t" bind $params
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
remove)
|
||||
case "$XENBUS_TYPE" in
|
||||
vbd)
|
||||
t=$(xenstore-read "$XENBUS_PATH"/type)
|
||||
node=$(xenstore-read "$XENBUS_PATH"/node)
|
||||
[ -x /etc/xen/scripts/block-"$t" ] && \
|
||||
/etc/xen/scripts/block-"$t" unbind $node
|
||||
;;
|
||||
esac
|
||||
# remove device backend store entries
|
||||
xenstore-rm "$XENBUS_PATH"
|
||||
;;
|
||||
online)
|
||||
case "$PHYSDEVDRIVER" in
|
||||
|
||||
@@ -413,17 +413,13 @@ class XendDomainInfo:
|
||||
db['backend'] = backdb.getPath()
|
||||
db['backend-id'] = "%i" % backdom.id
|
||||
|
||||
backdb['frontend'] = db.getPath()
|
||||
(type, params) = string.split(sxp.child_value(devconfig, 'uname'), ':', 1)
|
||||
node = Blkctl.block('bind', type, params)
|
||||
backdb['type'] = type
|
||||
backdb['params'] = params
|
||||
backdb['frontend'] = db.getPath()
|
||||
backdb['frontend-id'] = "%i" % self.id
|
||||
backdb['physical-device'] = "%li" % blkdev_name_to_number(node)
|
||||
backdb.saveDB(save=True)
|
||||
|
||||
# Ok, super gross, this really doesn't belong in the frontend db...
|
||||
db['type'] = type
|
||||
db['node'] = node
|
||||
db['params'] = params
|
||||
db.saveDB(save=True)
|
||||
|
||||
return
|
||||
@@ -808,9 +804,6 @@ class XendDomainInfo:
|
||||
if type == 'vbd':
|
||||
typedb = ddb.addChild(type)
|
||||
for dev in typedb.keys():
|
||||
devdb = typedb.addChild(str(dev))
|
||||
Blkctl.block('unbind', devdb['type'].getData(),
|
||||
devdb['node'].getData())
|
||||
typedb[dev].delete()
|
||||
typedb.saveDB(save=True)
|
||||
if type == 'vtpm':
|
||||
|
||||