# HG changeset patch
# User emellor@xxxxxxxxxxxxxxxxxxxxxx
# Node ID 8853631252d828c0205e4e89c2bc521aa1f34934
# Parent d088ce2d3528e4014c5f8aca8a261229f2d5465c
Added a 'state' field to the xenbus_device structure, which caches the state
at the local end of the xenbus connection (i.e. that value that is passed
through xenbus_switch_state). This means that xenbus_probe can wait for all
the boot devices to become ready without having to hurt the store.
Also, fix this probing -- previously, the wrong value was being returned by
all_devices_ready_, so this polling would only have waited for one device.
Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx>
diff -r d088ce2d3528 -r 8853631252d8
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c Fri Mar 3
14:56:34 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c Sat Mar 4
18:10:56 2006
@@ -95,18 +95,25 @@
*/
int current_state;
-
- int err = xenbus_scanf(xbt, dev->nodename, "state", "%d",
+ int err;
+
+ if (state == dev->state)
+ return 0;
+
+ err = xenbus_scanf(xbt, dev->nodename, "state", "%d",
¤t_state);
- if ((err == 1 && (XenbusState)current_state == state) ||
- err == -ENOENT)
+ if (err != 1)
return 0;
err = xenbus_printf(xbt, dev->nodename, "state", "%d", state);
if (err) {
- xenbus_dev_fatal(dev, err, "writing new state");
+ if (state != XenbusStateClosing) /* Avoid looping */
+ xenbus_dev_fatal(dev, err, "writing new state");
return err;
}
+
+ dev->state = state;
+
return 0;
}
EXPORT_SYMBOL(xenbus_switch_state);
@@ -138,7 +145,6 @@
ret = vsnprintf(printf_buffer+len, PRINTF_BUFFER_SIZE-len, fmt, ap);
BUG_ON(len + ret > PRINTF_BUFFER_SIZE-1);
- dev->has_error = 1;
dev_err(&dev->dev, "%s\n", printf_buffer);
diff -r d088ce2d3528 -r 8853631252d8
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c Fri Mar 3
14:56:34 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c Sat Mar 4
18:10:56 2006
@@ -888,16 +888,13 @@
{
struct xenbus_device *xendev = to_xenbus_device(dev);
int *result = data;
- int state;
-
- int err = xenbus_scanf(XBT_NULL, xendev->nodename, "state", "%d",
- &state);
- if (err != 1 || state != XenbusStateConnected) {
+
+ if (xendev->state != XenbusStateConnected) {
result = 0;
return 1;
}
- return 1;
+ return 0;
}
diff -r d088ce2d3528 -r 8853631252d8 linux-2.6-xen-sparse/include/xen/xenbus.h
--- a/linux-2.6-xen-sparse/include/xen/xenbus.h Fri Mar 3 14:56:34 2006
+++ b/linux-2.6-xen-sparse/include/xen/xenbus.h Sat Mar 4 18:10:56 2006
@@ -63,7 +63,7 @@
int otherend_id;
struct xenbus_watch otherend_watch;
struct device dev;
- int has_error;
+ XenbusState state;
void *data;
};
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|