diff --git a/common/block_cleanup b/common/block_cleanup new file mode 100755 index 0000000..bc4535f --- /dev/null +++ b/common/block_cleanup @@ -0,0 +1,8 @@ +#!/bin/sh + +DEVID=$[ $MAJOR * 256 + $MINOR ] + +XS_PATH="device/vbd/$DEVID" + +# Double check that DEVID is not empty +[ -n "$DEVID" ] && xenstore-rm $XS_PATH diff --git a/common/block_remove b/common/block_remove index 4825dea..21502c3 100755 --- a/common/block_remove +++ b/common/block_remove @@ -3,3 +3,30 @@ NAME=${DEVNAME#/dev/} XS_KEY="qubes-block-devices/$NAME" xenstore-rm "$XS_KEY" + +# If device was connected to some VM - detach it +# Notice: this can be run also in VM, so we cannot use xl... + +device_detach() { + xs_path=$1 + + xenstore-write $xs_path/online 0 $xs_path/state 5 + + # Wait for backend to finish dev shutdown + try=30 + # -lt will break loop also when 'state' will be empty + while [ "`xenstore-read $xs_path/state 2> /dev/null`" -lt 6 ]; do + try=$[ $try - 1 ] + [ "$try" -le 0 ] && break + sleep 0.1 + done + xenstore-rm $xs_path +} + +for XS_DEV_PATH in `xenstore-ls -f backend/vbd | grep 'backend/vbd/[0-9]*/[0-9]* ' | cut -f 1 -d ' '`; do + CUR_DEVICE=`xenstore-read "$XS_DEV_PATH/params"` + if [ "$CUR_DEVICE" == "$DEVNAME" ]; then + device_detach "$XS_DEV_PATH" + exit 0 + fi +done diff --git a/common/qubes_block.rules b/common/qubes_block.rules index 644834f..1a0864e 100644 --- a/common/qubes_block.rules +++ b/common/qubes_block.rules @@ -17,3 +17,6 @@ ACTION=="change", RUN+="/usr/lib/qubes/block_add_change" ACTION=="remove", RUN+="/usr/lib/qubes/block_remove" LABEL="qubes_block_end" + +# Cleanup disconnected frontend from xenstore +ACTION=="remove", SUBSYSTEM=="block", ENV{MAJOR}=="202", RUN+="/usr/lib/qubes/block_cleanup" diff --git a/rpm_spec/core-commonvm.spec b/rpm_spec/core-commonvm.spec index fdf2bb3..ba12323 100644 --- a/rpm_spec/core-commonvm.spec +++ b/rpm_spec/core-commonvm.spec @@ -84,6 +84,7 @@ cp setup_ip $RPM_BUILD_ROOT/usr/lib/qubes/ cp qubes_download_dom0_updates.sh $RPM_BUILD_ROOT/usr/lib/qubes/ cp block_add_change $RPM_BUILD_ROOT/usr/lib/qubes/ cp block_remove $RPM_BUILD_ROOT/usr/lib/qubes/ +cp block_cleanup $RPM_BUILD_ROOT/usr/lib/qubes/ mkdir -p $RPM_BUILD_ROOT/etc/yum/post-actions cp qubes_trigger_sync_appmenus.action $RPM_BUILD_ROOT/etc/yum/post-actions/ mkdir -p $RPM_BUILD_ROOT/usr/lib/qubes @@ -254,4 +255,5 @@ rm -rf $RPM_BUILD_ROOT /usr/lib/qubes/qubes_download_dom0_updates.sh /usr/lib/qubes/block_add_change /usr/lib/qubes/block_remove +/usr/lib/qubes/block_cleanup /lib/firmware/updates