mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 18:21:39 +01:00
xend used to set the xenbus backend entry "type" to either "phy" or "file", but now libxl sets it to "phy" for both file and block device. We have to manually check for the type of the "param" field in order to detect if we are trying to attach a file or a block device. Signed-off-by: Christoph Egger <Christoph.Egger@amd.com> Signed-off-by: Roger Pau Monne <roger.pau@citrix.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> Committed-by: Ian Campbell <ian.campbell@citrix.com>
98 lines
2.0 KiB
Bash
98 lines
2.0 KiB
Bash
#!/bin/sh -e
|
|
|
|
# $NetBSD: block-nbsd,v 1.1.1.1 2008/08/07 20:26:57 cegger Exp $
|
|
# Called by xenbackendd
|
|
# Usage: block xsdir_backend_path state
|
|
|
|
DIR=$(dirname "$0")
|
|
. "${DIR}/hotplugpath.sh"
|
|
|
|
PATH=${BINDIR}:${SBINDIR}:${LIBEXEC}:${PRIVATE_BINDIR}:/bin:/usr/bin:/sbin:/usr/sbin
|
|
export PATH
|
|
|
|
error() {
|
|
echo "$@" >&2
|
|
xenstore-write $xpath/hotplug-status error \
|
|
$xpath/hotplug-error "$@"
|
|
exit 1
|
|
}
|
|
|
|
|
|
xpath=$1
|
|
xstatus=$2
|
|
xparams=$(xenstore-read "$xpath/params")
|
|
if [ -b "$xparams" ]; then
|
|
xtype="phy"
|
|
elif [ -f "$xparams" ]; then
|
|
xtype="file"
|
|
elif [ -z "$xparams" ]; then
|
|
error "$xpath/params is empty, unable to attach block device."
|
|
else
|
|
error "$xparams is not a valid file type to use as block device." \
|
|
"Only block and regular image files accepted."
|
|
fi
|
|
|
|
case $xstatus in
|
|
6)
|
|
# device removed
|
|
case $xtype in
|
|
file)
|
|
vnd=$(xenstore-read "$xpath/vnd" || echo none)
|
|
if [ $vnd != none ]; then
|
|
vnconfig -u $vnd
|
|
fi
|
|
;;
|
|
phy)
|
|
;;
|
|
*)
|
|
echo "unknown type $xtype" >&2
|
|
;;
|
|
esac
|
|
xenstore-rm $xpath
|
|
exit 0
|
|
;;
|
|
2)
|
|
case $xtype in
|
|
file)
|
|
# Store the list of available vnd(4) devices in
|
|
#``available_disks'', and mark them as ``free''.
|
|
list=`ls -1 /dev/vnd[0-9]*d | sed "s,/dev/vnd,,;s,d,," | sort -n`
|
|
for i in $list; do
|
|
disk="vnd$i"
|
|
available_disks="$available_disks $disk"
|
|
eval $disk=free
|
|
done
|
|
# Mark the used vnd(4) devices as ``used''.
|
|
for disk in `sysctl hw.disknames`; do
|
|
case $disk in
|
|
vnd[0-9]*) eval $disk=used ;;
|
|
esac
|
|
done
|
|
# Configure the first free vnd(4) device.
|
|
for disk in $available_disks; do
|
|
eval status=\$$disk
|
|
if [ "$status" = "free" ] && \
|
|
vnconfig /dev/${disk}d $xparams >/dev/null; then
|
|
device=/dev/${disk}d
|
|
break
|
|
fi
|
|
done
|
|
if [ x$device = x ] ; then
|
|
error "no available vnd device"
|
|
fi
|
|
xenstore-write $xpath/vnd $device
|
|
;;
|
|
phy)
|
|
device=$xparams
|
|
;;
|
|
esac
|
|
physical_device=$(stat -f '%r' "$device")
|
|
xenstore-write $xpath/physical-device $physical_device
|
|
xenstore-write $xpath/hotplug-status connected
|
|
exit 0
|
|
;;
|
|
*)
|
|
exit 0
|
|
;;
|
|
esac
|