changeset:   23839:42a45baf037d
user:        Olaf Hering <olaf@aepfle.de>
date:        Thu Sep 15 11:08:05 2011 +0100
files:       docs/misc/xenstore.txt tools/xenstore/xenstored_core.c tools/xenstore/xenstored_domain.c tools/xenstore/xenstored_domain.h xen/include/public/io/xs_wire.h
description:
xenstored: allow guest to shutdown all its watches/transactions

During kexec all old watches have to be removed, otherwise the new
kernel will receive unexpected events. Allow a guest to reset itself
and cleanup all of its watches and transactions.

Add a new XS_RESET_WATCHES command to do the reset on behalf of the
guest.

(Changes by iwj: specify the argument to be a single nul byte.  Permit
read-only clients to use the new command.)

Signed-off-by: Olaf Hering <olaf@aepfle.de>
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>


---
 docs/misc/xenstore.txt            |    3 +++
 tools/xenstore/xenstored_core.c   |    5 +++++
 tools/xenstore/xenstored_domain.c |    9 +++++++++
 tools/xenstore/xenstored_domain.h |    3 +++
 xen/include/public/io/xs_wire.h   |    3 ++-
 5 files changed, 22 insertions(+), 1 deletion(-)

Index: xen-4.1.2-testing/docs/misc/xenstore.txt
===================================================================
--- xen-4.1.2-testing.orig/docs/misc/xenstore.txt
+++ xen-4.1.2-testing/docs/misc/xenstore.txt
@@ -217,6 +217,9 @@ WATCH_EVENT					<epath>|<token>|
 
 UNWATCH			<wpath>|<token>|?
 
+RESET_WATCHES		|
+	Reset all watches and transactions of the caller.
+
 ---------- Transactions ----------
 
 TRANSACTION_START	|			<transid>|
Index: xen-4.1.2-testing/tools/xenstore/xenstored_core.c
===================================================================
--- xen-4.1.2-testing.orig/tools/xenstore/xenstored_core.c
+++ xen-4.1.2-testing/tools/xenstore/xenstored_core.c
@@ -120,6 +120,7 @@ static char *sockmsg_string(enum xsd_soc
 	case XS_IS_DOMAIN_INTRODUCED: return "XS_IS_DOMAIN_INTRODUCED";
 	case XS_RESUME: return "RESUME";
 	case XS_SET_TARGET: return "SET_TARGET";
+	case XS_RESET_WATCHES: return "RESET_WATCHES";
 	default:
 		return "**UNKNOWN**";
 	}
@@ -1242,6 +1243,10 @@ static void process_message(struct conne
 		do_set_target(conn, in);
 		break;
 
+	case XS_RESET_WATCHES:
+		do_reset_watches(conn);
+		break;
+
 	default:
 		eprintf("Client unknown operation %i", in->hdr.msg.type);
 		send_error(conn, ENOSYS);
Index: xen-4.1.2-testing/tools/xenstore/xenstored_domain.c
===================================================================
--- xen-4.1.2-testing.orig/tools/xenstore/xenstored_domain.c
+++ xen-4.1.2-testing/tools/xenstore/xenstored_domain.c
@@ -537,6 +537,15 @@ void do_is_domain_introduced(struct conn
 	send_reply(conn, XS_IS_DOMAIN_INTRODUCED, result ? "T" : "F", 2);
 }
 
+/* Allow guest to reset all watches */
+void do_reset_watches(struct connection *conn)
+{
+	conn_delete_all_watches(conn);
+	conn_delete_all_transactions(conn);
+
+	send_ack(conn, XS_RESET_WATCHES);
+}
+
 static int close_xc_handle(void *_handle)
 {
 	xc_interface_close(*(xc_interface**)_handle);
Index: xen-4.1.2-testing/tools/xenstore/xenstored_domain.h
===================================================================
--- xen-4.1.2-testing.orig/tools/xenstore/xenstored_domain.h
+++ xen-4.1.2-testing/tools/xenstore/xenstored_domain.h
@@ -40,6 +40,9 @@ void do_set_target(struct connection *co
 /* domid */
 void do_get_domain_path(struct connection *conn, const char *domid_str);
 
+/* Allow guest to reset all watches */
+void do_reset_watches(struct connection *conn);
+
 void domain_init(void);
 
 /* Returns the implicit path of a connection (only domains have this) */
Index: xen-4.1.2-testing/xen/include/public/io/xs_wire.h
===================================================================
--- xen-4.1.2-testing.orig/xen/include/public/io/xs_wire.h
+++ xen-4.1.2-testing/xen/include/public/io/xs_wire.h
@@ -48,7 +48,8 @@ enum xsd_sockmsg_type
     XS_IS_DOMAIN_INTRODUCED,
     XS_RESUME,
     XS_SET_TARGET,
-    XS_RESTRICT
+    XS_RESTRICT,
+    XS_RESET_WATCHES
 };
 
 #define XS_WRITE_NONE "NONE"