aboutsummaryrefslogtreecommitdiffstats
path: root/extras
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-04-07 08:15:55 +0100
committerKeir Fraser <keir.fraser@citrix.com>2010-04-07 08:15:55 +0100
commit42e3a21b11ec98ecfd1e3473c9bbc8e9e98b10b5 (patch)
tree7c9cf201fad323d93433f5b211101195c1cfd5a3 /extras
parent449e0d3d0e781aa53b70ae753f9c9c1511ce7e61 (diff)
downloadxen-42e3a21b11ec98ecfd1e3473c9bbc8e9e98b10b5.tar.gz
xen-42e3a21b11ec98ecfd1e3473c9bbc8e9e98b10b5.tar.bz2
xen-42e3a21b11ec98ecfd1e3473c9bbc8e9e98b10b5.zip
mini-os: Fix frontend shutdown wait loop
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>
Diffstat (limited to 'extras')
-rw-r--r--extras/mini-os/blkfront.c2
-rw-r--r--extras/mini-os/fbfront.c15
-rw-r--r--extras/mini-os/netfront.c2
-rw-r--r--extras/mini-os/pcifront.c2
4 files changed, 13 insertions, 8 deletions
diff --git a/extras/mini-os/blkfront.c b/extras/mini-os/blkfront.c
index 9862fb9acb..f47aa69f23 100644
--- a/extras/mini-os/blkfront.c
+++ b/extras/mini-os/blkfront.c
@@ -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);
}
diff --git a/extras/mini-os/fbfront.c b/extras/mini-os/fbfront.c
index fa4fc428cc..6d2268e27e 100644
--- a/extras/mini-os/fbfront.c
+++ b/extras/mini-os/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);
diff --git a/extras/mini-os/netfront.c b/extras/mini-os/netfront.c
index 47f87d1eef..491876fd9a 100644
--- a/extras/mini-os/netfront.c
+++ b/extras/mini-os/netfront.c
@@ -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);
}
diff --git a/extras/mini-os/pcifront.c b/extras/mini-os/pcifront.c
index ccbef3f0e5..638fdb3966 100644
--- a/extras/mini-os/pcifront.c
+++ b/extras/mini-os/pcifront.c
@@ -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);
}