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