]> xenbits.xensource.com Git - people/ssmith/nc2-2.6.27.git/commitdiff
patch CA-14804-fix-block-unplug-retries
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/blkback/xenbus.c
drivers/xen/blktap/xenbus.c

index d4bf1ba7da00b2be4bf6ef03ec5e9b5925abb636..de1ef2b28f910fe33499d1657d73b0c4fb81e53f 100644 (file)
@@ -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",
+                          &current_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))
index e0de318ad518a154f4491a0b323904e4c39a74e4..4ae2fe144afbf808875bdfed91cf3935e2103021 100644 (file)
@@ -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",
+                          &current_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))