DomU creation with xl with file backed disks fails in vnd allocation because xl runs the hotplug scripts in parallel. C.f. port-xen/50659 and pkg/51008. Would people please test the attached scripts by installing them in the appropriate xen/scripts directory? I'd like to commit them as soonish. I've tested them locally and they work for me. --chris
Attachment:
locking.sh
Description: Bourne shell script
#!/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"
. "${DIR}/locking.sh"
PATH=${BINDIR}:${SBINDIR}:${LIBEXEC_BIN}:/bin:/usr/bin:/sbin:/usr/sbin
export PATH
error() {
echo "$@" >&2
xenstore-write $xpath/hotplug-status error \
$xpath/hotplug-error "$@"
release_lock block
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)
claim_lock block
vnd=$(xenstore-read "$xpath/vnd" || echo none)
if [ $vnd != none ]; then
vnconfig -u $vnd
fi
release_lock block
;;
phy)
;;
*)
echo "unknown type $xtype" >&2
;;
esac
xenstore-rm $xpath
exit 0
;;
2)
claim_lock block
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
release_lock block
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
release_lock block
exit 0
;;
*)
exit 0
;;
esac