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);
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");
return;
}
+ be->shutdown_requested = 0;
be->shutdown_signalled = 0;
xenbus_switch_state(dev, XenbusStateInitWait);