]> xenbits.xensource.com Git - people/ssmith/nc2-2.6.27.git/commitdiff
CA-25742: Forward a shutdown-request="force" to userspace from blktap.
authorSteven Smith <ssmith@weybridge.uk.xensource.com>
Tue, 30 Jun 2009 11:55:47 +0000 (12:55 +0100)
committerSteven Smith <ssmith@weybridge.uk.xensource.com>
Tue, 30 Jun 2009 11:55:47 +0000 (12:55 +0100)
drivers/xen/blktap/xenbus.c

index 083a57dca99848f8a94c001c8f9fb3bbe44bf0b3..aca1550291074901febde952e99f847dfb108738 100644 (file)
@@ -54,10 +54,14 @@ struct backend_info
        char *nodename;
        atomic_t refcnt;
        pid_t kthread_pid;
+       int shutdown_requested;
        int shutdown_signalled;
        struct list_head list;
 };
 
+#define BLKTAP_SHUTDOWN_NORMAL 1
+#define BLKTAP_SHUTDOWN_FORCE  2
+
 DECLARE_MUTEX(blktap_dev_sem);
 LIST_HEAD(backend_devices);
 
@@ -443,18 +447,25 @@ static void start_shutdown(struct xenbus_watch *watch,
 
        xenbus_write_state(dev, XenbusStateClosing);
 
-       if (len == sizeof("force") - 1 && !memcmp(type, "force", len))
+       be->shutdown_requested = BLKTAP_SHUTDOWN_NORMAL;
+
+       if (len == sizeof("force") - 1 && !memcmp(type, "force", len)) {
+               be->shutdown_requested = BLKTAP_SHUTDOWN_FORCE;
                if (!kthread_remove(be))
                        signal_shutdown(be); /* shutdown immediately */
+       }
 
        kfree(type);
 }
 
 int signal_tapdisk(struct backend_info *be)
 {
+       const char *req;
        int err;
 
-       err = xenbus_write(XBT_NIL, be->nodename, "shutdown-tapdisk", "");
+       req = be->shutdown_requested == BLKTAP_SHUTDOWN_FORCE ? "force" : "";
+
+       err = xenbus_write(XBT_NIL, be->nodename, "shutdown-tapdisk", req);
        if (err)
                WPRINTK("ERROR writing shutdown-tapdisk\n");
 
@@ -485,6 +496,7 @@ static void blktap_reconnect(struct backend_info *be)
                return;
        }
 
+       be->shutdown_requested = 0;
        be->shutdown_signalled = 0;
 
        xenbus_switch_state(dev, XenbusStateInitWait);