# HG changeset patch
# User cl349@xxxxxxxxxxxxxxxxxxxx
# Node ID 2796d45c58356cf8554a07dcc73038a95c6f1ecc
# Parent 0a2cc72ee6e47287ffc27b1dac4a4e6a1741f952
Fire watches once immediately upon registration.
It matches the model of programming used to avoid races with watches,
and also makes re-establishing watches on daemon restart easier.
Signed-off-by: Rusty Russell <rusty@xxxxxxxxxxxxxxx>
Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>
diff -r 0a2cc72ee6e4 -r 2796d45c5835
linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Mon Sep 19 14:36:15 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Mon Sep 19 14:47:56 2005
@@ -228,6 +228,7 @@
be->dev = dev;
be->backend_watch.node = dev->nodename;
be->backend_watch.callback = backend_changed;
+ /* Will implicitly call backend_changed once. */
err = register_xenbus_watch(&be->backend_watch);
if (err) {
be->backend_watch.node = NULL;
@@ -249,8 +250,6 @@
}
dev->data = be;
-
- backend_changed(&be->backend_watch, dev->nodename);
return 0;
free_be:
diff -r 0a2cc72ee6e4 -r 2796d45c5835
linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c Mon Sep 19 14:36:15 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c Mon Sep 19 14:47:56 2005
@@ -172,6 +172,7 @@
be->dev = dev;
be->backend_watch.node = dev->nodename;
be->backend_watch.callback = backend_changed;
+ /* Registration implicitly fires backend_changed once */
err = register_xenbus_watch(&be->backend_watch);
if (err) {
be->backend_watch.node = NULL;
@@ -193,8 +194,6 @@
}
dev->data = be;
-
- backend_changed(&be->backend_watch, dev->nodename);
return 0;
free_be:
diff -r 0a2cc72ee6e4 -r 2796d45c5835
linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c Mon Sep 19 14:36:15 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c Mon Sep 19 14:47:56 2005
@@ -242,6 +242,7 @@
be->dev = dev;
be->backend_watch.node = dev->nodename;
be->backend_watch.callback = backend_changed;
+ /* Registration implicitly calls backend_changed. */
err = register_xenbus_watch(&be->backend_watch);
if (err) {
be->backend_watch.node = NULL;
@@ -263,8 +264,6 @@
}
dev->data = be;
-
- backend_changed(&be->backend_watch, dev->nodename);
return 0;
free_be:
diff -r 0a2cc72ee6e4 -r 2796d45c5835
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Mon Sep 19
14:36:15 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Mon Sep 19
14:47:56 2005
@@ -1284,10 +1284,6 @@
return err;
}
-
- /* Call once in case entries already there. */
- watch_for_status(&info->watch, info->watch.node);
-
return 0;
}
diff -r 0a2cc72ee6e4 -r 2796d45c5835
linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c Mon Sep 19 14:36:15 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c Mon Sep 19 14:47:56 2005
@@ -213,6 +213,7 @@
be->dev = dev;
be->backend_watch.node = dev->nodename;
+ /* Implicitly calls backend_changed() once. */
be->backend_watch.callback = backend_changed;
be->instance = -1;
err = register_xenbus_watch(&be->backend_watch);
@@ -236,8 +237,6 @@
}
dev->data = be;
-
- backend_changed(&be->backend_watch, dev->nodename);
return err;
free_be:
diff -r 0a2cc72ee6e4 -r 2796d45c5835
linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c Mon Sep 19
14:36:15 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c Mon Sep 19
14:47:56 2005
@@ -411,7 +411,6 @@
return err;
}
- watch_for_status(&info->watch, info->watch.node);
return 0;
}
diff -r 0a2cc72ee6e4 -r 2796d45c5835 tools/xenstore/testsuite/07watch.test
--- a/tools/xenstore/testsuite/07watch.test Mon Sep 19 14:36:15 2005
+++ b/tools/xenstore/testsuite/07watch.test Mon Sep 19 14:47:56 2005
@@ -168,10 +168,12 @@
# Watch event must have happened before we registered interest.
1 watch / token
2 write /test/subnode contents2
-1 watch / token2 0
+1 watchnoack / token2 0
expect 1:/test/subnode:token
1 waitwatch
1 ackwatch token
+expect 1:/:token2
+1 waitwatch
expect 1: waitwatch failed: Connection timed out
1 waitwatch
1 close
diff -r 0a2cc72ee6e4 -r 2796d45c5835
tools/xenstore/testsuite/14complexperms.test
--- a/tools/xenstore/testsuite/14complexperms.test Mon Sep 19 14:36:15 2005
+++ b/tools/xenstore/testsuite/14complexperms.test Mon Sep 19 14:47:56 2005
@@ -23,7 +23,8 @@
getperm /dir/file
expect *Permission denied
setperm /dir/file 0 NONE
-watch /dir/file token
+# We get no watch event when there's no permission. It's a corner case.
+watchnoack /dir/file token
1 write /dir/file contents
1 rm /dir/file
expect waitwatch failed: Connection timed out
@@ -63,7 +64,7 @@
getperm /dir/file
expect *Permission denied
setperm /dir/file 0 NONE
-watch /dir/file token
+watchnoack /dir/file token
1 write /dir/file contents
1 rm /dir/file
expect waitwatch failed: Connection timed out
diff -r 0a2cc72ee6e4 -r 2796d45c5835 tools/xenstore/xenstored_watch.c
--- a/tools/xenstore/xenstored_watch.c Mon Sep 19 14:36:15 2005
+++ b/tools/xenstore/xenstored_watch.c Mon Sep 19 14:47:56 2005
@@ -236,6 +236,9 @@
trace_create(watch, "watch");
talloc_set_destructor(watch, destroy_watch);
send_ack(conn, XS_WATCH);
+
+ /* We fire once up front: simplifies clients and restart. */
+ add_event(conn, watch, watch->node);
}
void do_watch_ack(struct connection *conn, const char *token)
diff -r 0a2cc72ee6e4 -r 2796d45c5835 tools/xenstore/xs_test.c
--- a/tools/xenstore/xs_test.c Mon Sep 19 14:36:15 2005
+++ b/tools/xenstore/xs_test.c Mon Sep 19 14:47:56 2005
@@ -200,6 +200,7 @@
" setperm <path> <id> <flags> ...\n"
" shutdown\n"
" watch <path> <token>\n"
+ " watchnoack <path> <token>\n"
" waitwatch\n"
" ackwatch <token>\n"
" unwatch <path> <token>\n"
@@ -480,10 +481,20 @@
failed(handle);
}
-static void do_watch(unsigned int handle, const char *node, const char *token)
+static void do_watch(unsigned int handle, const char *node, const char *token,
+ bool swallow_event)
{
if (!xs_watch(handles[handle], node, token))
failed(handle);
+
+ /* Convenient for testing... */
+ if (swallow_event) {
+ char **vec = xs_read_watch(handles[handle]);
+ if (!vec || !streq(vec[0], node) || !streq(vec[1], token))
+ failed(handle);
+ if (!xs_acknowledge_watch(handles[handle], token))
+ failed(handle);
+ }
}
static void set_timeout(void)
@@ -767,7 +778,9 @@
else if (streq(command, "shutdown"))
do_shutdown(handle);
else if (streq(command, "watch"))
- do_watch(handle, arg(line, 1), arg(line, 2));
+ do_watch(handle, arg(line, 1), arg(line, 2), true);
+ else if (streq(command, "watchnoack"))
+ do_watch(handle, arg(line, 1), arg(line, 2), false);
else if (streq(command, "waitwatch"))
do_waitwatch(handle);
else if (streq(command, "ackwatch"))
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|