summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominique Martinet <asmadeus@codewreck.org>2015-11-02 18:24:55 +0100
committerDominique Martinet <asmadeus@codewreck.org>2015-11-02 18:24:55 +0100
commit0681a79c6aa62f6b0240b6ac10fc59f3b19114ec (patch)
treedba5d8c6c32ef371afe9580306b94ae3a304113c
parentbbeeb12335293ab89283b572f8d1829f4a90768c (diff)
cleaner cleanup
-rwxr-xr-xkvm-wrapper.sh71
1 files changed, 37 insertions, 34 deletions
diff --git a/kvm-wrapper.sh b/kvm-wrapper.sh
index b9b8109..e830220 100755
--- a/kvm-wrapper.sh
+++ b/kvm-wrapper.sh
@@ -460,8 +460,8 @@ function ib_sriov()
function ib_unsriov()
{
for PCIDOMAIN in ${KVM_VFIO_DOMAIN}; do
- [[ -e /sys/class/infiniband/*/iov/$PCIDOMAIN ]] || continue
- grep -lZv none /sys/class/infiniband/*/iov/$PCIDOMAIN/ports/1/pkey_idx/* | \
+ test -e /sys/class/infiniband/*/iov/"$PCIDOMAIN" || continue
+ grep -lZv none /sys/class/infiniband/*/iov/"$PCIDOMAIN"/ports/1/pkey_idx/* | \
tr '\0' '\n' | \
while read file; do
echo none > $file
@@ -588,6 +588,20 @@ function kvm_top ()
# Main function: start a virtual machine
function kvm_start_vm ()
{
+ CLEANUP=( )
+ cleanup()
+ {
+ echo "Cleaning up"
+ if [ ${#CLEANUP[*]} -gt 0 ]; then
+ local LAST_ELEMENT=$((${#CLEANUP[*]}-1))
+ for i in `seq $LAST_ELEMENT -1 0`; do
+ eval ${CLEANUP[$i]}
+ done
+ fi
+ }
+
+ trap cleanup EXIT
+
check_create_dir "$PID_DIR"
check_create_dir "$MONITOR_DIR"
check_create_dir "$SERIAL_DIR"
@@ -595,6 +609,18 @@ function kvm_start_vm ()
[[ -z "$KVM_BIN" ]] && KVM_BIN="/usr/bin/kvm"
require_exec "$KVM_BIN"
+ # More sanity checks: VM running, monitor socket existing, etc.
+ if [[ -z "$FORCE" ]]; then
+ test_pid_from_file "$PID_FILE" && fail_exit "VM $VM_NAME seems to be running already.\nPID file $PID_FILE exists"
+ rm -rf "$MONITOR_FILE"
+ rm -rf "$SERIAL_FILE"
+ test_socket "$MONITOR_FILE" && fail_exit "Monitor socket $MONITOR_FILE already existing and couldn't be removed"
+ test_socket "$SERIAL_FILE" && fail_exit "Serial socket $SERIAL_FILE already existing and couldn't be removed"
+
+ # Fork change_perms
+ [[ -n "$SERIAL_USER" ]] || [[ -n "$SERIAL_GROUP" ]] && serial_perms_forked &
+ fi
+
# Build KVM Drives (hdd, cdrom) parameters
local KVM_DRIVES=""
KVM_DRIVE_IF="${KVM_DRIVE_IF:-ide-hd}"
@@ -620,6 +646,7 @@ function kvm_start_vm ()
# If drive is a lv in the main vg, activate the lv
prepare_disks
+ CLEANUP+=("unprepare_disks")
# Network scripts
local KVM_NET_SCRIPT="$ROOTDIR/net"
@@ -660,16 +687,19 @@ function kvm_start_vm ()
local KVM_PCIASSIGN=""
for i in ${!KVM_PCIASSIGN_DOMAIN[@]}; do
pci_stubify "${KVM_PCIASSIGN_DOMAIN[$i]}"
+ CLEANUP+=("pci_unstubify \"${KVM_PCIASSIGN_DOMAIN[$i]}\"")
KVM_PCIASSIGN+="-device pci-assign,id=${KVM_PCIASSIGN_ID[$i]:-pciassign${i}},host=${KVM_PCIASSIGN_DOMAIN[$i]} "
done
# IB sriov
- [[ -n "$KVM_SRIOV_PKEYS$KVM_SRIOV_DEV" ]] && ib_sriov "$KVM_SRIOV_PKEYS" "$KVM_SRIOV_DEV"
+ [[ -n "$KVM_SRIOV_PKEYS$KVM_SRIOV_DEV" ]] && ib_sriov "$KVM_SRIOV_PKEYS" "$KVM_SRIOV_DEV" && \
+ CLEANUP+=("ib_unsriov")
# vfio assignement
local KVM_VFIO=""
for i in ${!KVM_VFIO_DOMAIN[@]}; do
pci_vfiofy "${KVM_VFIO_DOMAIN[$i]}"
+ CLEANUP+=("pci_unvfiofy \"${KVM_VFIO_DOMAIN[$i]}\"")
KVM_VFIO+="-device vfio-pci,id=${KVM_VFIO_ID[$i]:-vfio${i}},host=${KVM_VFIO_DOMAIN[$i]} "
done
@@ -680,17 +710,7 @@ function kvm_start_vm ()
# Build kvm exec string
local EXEC_STRING="$KVM_BIN -name $VM_NAME,process=\"kvm-$VM_NAME\" -m $KVM_MEM -smp $KVM_CPU_NUM $KVM_PREPEND_PARAMS $KVM_PCIASSIGN $KVM_VFIO $KVM_NET $KVM_DRIVES $KVM_BOOTDEVICE $KVM_KEYMAP $KVM_OUTPUT $LINUXBOOT $KVM_MONITORDEV $KVM_SERIALDEV -pidfile $PID_FILE $KVM_ADDITIONNAL_PARAMS"
- # More sanity checks: VM running, monitor socket existing, etc.
- if [[ -z "$FORCE" ]]; then
- test_pid_from_file "$PID_FILE" && fail_exit "VM $VM_NAME seems to be running already.\nPID file $PID_FILE exists"
- rm -rf "$MONITOR_FILE"
- rm -rf "$SERIAL_FILE"
- test_socket "$MONITOR_FILE" && fail_exit "Monitor socket $MONITOR_FILE already existing and couldn't be removed"
- test_socket "$SERIAL_FILE" && fail_exit "Serial socket $SERIAL_FILE already existing and couldn't be removed"
-
- # Fork change_perms
- [[ -n "$SERIAL_USER" ]] || [[ -n "$SERIAL_GROUP" ]] && serial_perms_forked &
- fi
+ CLEANUP+=("rm -f \"$PID_FILE\" \"$MONITOR_FILE\" \"$SERIAL_FILE\"")
# Now run kvm
echo $EXEC_STRING
@@ -700,26 +720,9 @@ function kvm_start_vm ()
local KVM_RETURN_VALUE="$?"
- # Cleanup files
- rm -rf "$PID_FILE"
- rm -rf "$MONITOR_FILE"
- rm -rf "$SERIAL_FILE"
-
- # If drive is a lv in the main vg, deactivate the lv
- unprepare_disks
- ib_unsriov
- for DOMAIN in ${KVM_PCIASSIGN_DOMAIN[@]}; do
- pci_unstubify $DOMAIN
- done
- for DOMAIN in ${KVM_VFIO_DOMAIN[@]}; do
- pci_unvfiofy $DOMAIN
- done
-
- [[ "$KVM_RETURN_VALUE" != "0" ]] && fail_exit "Something went wrong with kvm execution, read above"
+ [[ "$KVM_RETURN_VALUE" != "0" ]] && fail_exit "qemu returned $KVM_RETURN_VALUE, read above"
-
- # Exit
- return 0
+ return $KVM_RETURN_VALUE
}
function kvm_stop_vm ()
@@ -907,7 +910,7 @@ function kvm_bootstrap_vm ()
fi
}
- local CLEANUP=( )
+ CLEANUP=( )
set -e
trap cleanup EXIT