]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/mini-os.git/commitdiff
mini-os: Fix frontend shutdown wait loop
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 7 Apr 2010 07:15:55 +0000 (08:15 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 7 Apr 2010 07:15:55 +0000 (08:15 +0100)
minios frontends must wait for backends to be shut down and
reinitialized before freeing resources.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
blkfront.c
fbfront.c
netfront.c
pcifront.c

index 9862fb9acb84c8a6a850f4e89d9d34bcc50ddec4..f47aa69f23cf731822975f12e753961d62601589 100644 (file)
@@ -289,7 +289,7 @@ void shutdown_blkfront(struct blkfront_dev *dev)
         goto close;
     }
     state = xenbus_read_integer(path);
-    if (state < XenbusStateClosed) {
+    while (state < XenbusStateClosed) {
         err = xenbus_wait_for_state_change(path, &state, &dev->events);
         if (err) free(err);
     }
index fa4fc428cc3298237a9f4678bce1b12c47d78425..6d2268e27e0e3de7c69f1f10e4ca1822d80ae8f8 100644 (file)
--- a/fbfront.c
+++ b/fbfront.c
@@ -262,7 +262,7 @@ void shutdown_kbdfront(struct kbdfront_dev *dev)
         goto close_kbdfront;
     }
     state = xenbus_read_integer(path);
-    if (state < XenbusStateClosed) {
+    while (state < XenbusStateClosed) {
         err = xenbus_wait_for_state_change(path, &state, &dev->events);
         if (err) free(err);
     }
@@ -272,8 +272,10 @@ void shutdown_kbdfront(struct kbdfront_dev *dev)
                 XenbusStateInitialising, err);
         goto close_kbdfront;
     }
-    // does not work yet.
-    //xenbus_wait_for_value(path, "2", &dev->events);
+    err = NULL;
+    state = xenbus_read_integer(path);
+    while (err == NULL && (state < XenbusStateInitWait || state >= XenbusStateClosed))
+    err = xenbus_wait_for_state_change(path, &state, &dev->events);
 
 close_kbdfront:
     if (err) free(err);
@@ -660,8 +662,11 @@ void shutdown_fbfront(struct fbfront_dev *dev)
                 XenbusStateInitialising, err);
         goto close_fbfront;
     }
-    // does not work yet
-    //xenbus_wait_for_value(path, "2", &dev->events);
+
+    err = NULL;
+    state = xenbus_read_integer(path);
+    while (err == NULL && (state < XenbusStateInitWait || state >= XenbusStateClosed))
+        err = xenbus_wait_for_state_change(path, &state, &dev->events);
 
 close_fbfront:
     if (err) free(err);
index 47f87d1eef1c3a321197f5c50a39f103de7867d7..491876fd9a7f2feaf8992e27d7a46f28ec1139eb 100644 (file)
@@ -546,7 +546,7 @@ void shutdown_netfront(struct netfront_dev *dev)
         goto close;
     }
     state = xenbus_read_integer(path);
-    if (state < XenbusStateClosed) {
+    while (state < XenbusStateClosed) {
         err = xenbus_wait_for_state_change(path, &state, &dev->events);
         if (err) free(err);
     }
index ccbef3f0e54675d3a3a8c2d6062ad91faa1e6044..638fdb3966381a0e11dfa837d9cf3d78cffc7659 100644 (file)
@@ -354,7 +354,7 @@ void shutdown_pcifront(struct pcifront_dev *dev)
         goto close_pcifront;
     }
     state = xenbus_read_integer(path);
-    if (state < XenbusStateClosed) {
+    while (state < XenbusStateClosed) {
         err = xenbus_wait_for_state_change(path, &state, &dev->events);
         free(err);
     }