# HG changeset patch # User Daniel Stodden # Date 1278590394 -3600 # Node ID 95410b9efc9a51ccefa25f2e5048c25cef2bd1b4 # Parent 383da5eaa8ae4555c33afea04d5f7a19c5c726c3 scripts/block: Update and disable blkback queue state callbacks. Fixed, then disabled for now. The change handler is only left around for reference, and upstreaming to xen.org, eventually. The queue state variable in kernel space was eliminated, we now exit the dispatcher for any of pause/shutdown/disconnect operations. Instead we cleanly write/remove the kthread-pid before signalling transitions. Scripts now can hook into shutdown-done too. This is useful because the hotplug scripts want time to ack the shutdown change, before the agent gets to remove the backend. Exit signalling might later aid in other areas, e.g. for consistent ionice modes. Signed-off-by: Daniel Stodden diff -r 383da5eaa8ae -r 95410b9efc9a scripts/block --- a/scripts/block Thu Jul 08 11:21:19 2010 +0100 +++ b/scripts/block Thu Jul 08 12:59:54 2010 +0100 @@ -11,9 +11,15 @@ XAPI=/xapi/${DOMID}/hotplug/${TYPE}/${DEVID} HOTPLUG="${XAPI}/hotplug" + +KTHREAD_PID="${XENBUS_PATH}/kthread-pid" + PAUSE="${XENBUS_PATH}/pause" PAUSE_DONE="${XENBUS_PATH}/pause-done" +SHUTDOWN="${XENBUS_PATH}/shutdown-request" +SHUTDOWN_DONE="${XENBUS_PATH}/shutdown-done" + syslog () { logger -pdaemon.info -tscripts-block -- "$DEVNAME[$ACTION]: $*" @@ -24,26 +30,37 @@ syslog "writing $HOTPLUG = online" xenstore write "$HOTPLUG" "online" - echo $(((1<<1) | (1<<3))) > $SYSFS_PATH/queue_events # running|paused + # RUNNING (1<<0) + # PAUSE_DONE (1<<1) + # SHUTDOWN_DONE (1<<2) + # PAUSE_REQUEST (1<<3) + # SHUTDOWN_REQUEST (1<<4) + + # echo $(((1<<1) | (1<<3))) > $SYSFS_PATH/queue_events # unpaused|paused ;; change) - state=$(xenstore read "${XENBUS_PATH}/queue-state") - case "$state" in - 1) state=running;; - 3) state=paused;; - *) state="unexpected-$state";; - esac + if pid=$(xenstore read "$KTHREAD_PID" 2>/dev/null) + then + state=running + else + state=stopped + fi - syslog "queue-state = $state" + syslog "kthread-pid = '$pid'" case "$state" in - paused) + stopped) if xenstore exists "$PAUSE" then syslog "writing $PAUSE_DONE" xenstore write "$PAUSE_DONE" "" fi + if xenstore exists "$SHUTDOWN" + then + syslog "writing $SHUTDOWN_DONE" + xenstore write "$SHUTDOWN_DONE" "" + fi ;; running) if xenstore exists "$PAUSE_DONE" @@ -51,12 +68,16 @@ syslog "removing $PAUSE_DONE" xenstore rm "$PAUSE_DONE" fi + if xenstore exists "$SHUTDOWN_DONE" + then + syslog "WARNING: queue restart in shutdown state." + fi ;; esac ;; remove) syslog "removing $HOTPLUG" - xenstore rm "${XAPI}/hotplug" + xenstore rm "$HOTPLUG" ;; esac