From: Steven Smith Date: Tue, 30 Jun 2009 11:55:47 +0000 (+0100) Subject: patch CA-14804-fix-block-unplug-retries X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=be2435af02bc204e187483880552c286c6fb419f;p=people%2Fssmith%2Fnc2-2.6.27.git patch CA-14804-fix-block-unplug-retries --- diff --git a/drivers/xen/blkback/xenbus.c b/drivers/xen/blkback/xenbus.c index d4bf1ba7..de1ef2b2 100644 --- a/drivers/xen/blkback/xenbus.c +++ b/drivers/xen/blkback/xenbus.c @@ -310,6 +310,30 @@ void blkback_close(blkif_t *blkif) blkif->xenblkd = NULL; } +static int xenbus_write_state(struct xenbus_device *dev, + enum xenbus_state state) +{ + int err; + int current_state; + + if (dev->state != state) + return xenbus_switch_state(dev, state); + + err = xenbus_scanf(XBT_NIL, dev->nodename, "state", "%d", + ¤t_state); + if (err != 1) + return 0; + + err = xenbus_printf(XBT_NIL, dev->nodename, "state", "%d", state); + if (err) { + if (state != XenbusStateClosing) /* Avoid looping */ + xenbus_dev_fatal(dev, err, "writing new state"); + return err; + } + + return 0; +} + static void start_shutdown(struct xenbus_watch *watch, const char **vec, unsigned int length) { @@ -334,7 +358,7 @@ static void start_shutdown(struct xenbus_watch *watch, return; } - xenbus_switch_state(dev, XenbusStateClosing); + xenbus_write_state(dev, XenbusStateClosing); if (len == sizeof("force") - 1 && !memcmp(type, "force", len)) if (!kthread_remove(be)) diff --git a/drivers/xen/blktap/xenbus.c b/drivers/xen/blktap/xenbus.c index e0de318a..4ae2fe14 100644 --- a/drivers/xen/blktap/xenbus.c +++ b/drivers/xen/blktap/xenbus.c @@ -353,6 +353,30 @@ void blktap_close(blkif_t *blkif) blkif->xenblkd = NULL; } +static int xenbus_write_state(struct xenbus_device *dev, + enum xenbus_state state) +{ + int err; + int current_state; + + if (dev->state != state) + return xenbus_switch_state(dev, state); + + err = xenbus_scanf(XBT_NIL, dev->nodename, "state", "%d", + ¤t_state); + if (err != 1) + return 0; + + err = xenbus_printf(XBT_NIL, dev->nodename, "state", "%d", state); + if (err) { + if (state != XenbusStateClosing) /* Avoid looping */ + xenbus_dev_fatal(dev, err, "writing new state"); + return err; + } + + return 0; +} + static void start_shutdown(struct xenbus_watch *watch, const char **vec, unsigned int length) { @@ -377,7 +401,7 @@ static void start_shutdown(struct xenbus_watch *watch, return; } - xenbus_switch_state(dev, XenbusStateClosing); + xenbus_write_state(dev, XenbusStateClosing); if (len == sizeof("force") - 1 && !memcmp(type, "force", len)) if (!kthread_remove(be))