]> xenbits.xensource.com Git - xen.git/commitdiff
xenstored: allow guest to shutdown all its watches/transactions
authorOlaf Hering <olaf@aepfle.de>
Thu, 15 Sep 2011 10:08:05 +0000 (11:08 +0100)
committerOlaf Hering <olaf@aepfle.de>
Thu, 15 Sep 2011 10:08:05 +0000 (11:08 +0100)
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
tools/xenstore/xenstored_core.c
tools/xenstore/xenstored_domain.c
tools/xenstore/xenstored_domain.h
xen/include/public/io/xs_wire.h

index f46cf4f52570913bf9bdba0067edc9e0541a69a7..9f3087d2eab2f605b6928b2d184ef8b4cc4aa197 100644 (file)
@@ -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 3b1955a5c08fcfb3f89632e470ce06dae2b02e6f..5d308cad86f63cf7f4707261235860af8efc6061 100644 (file)
@@ -120,6 +120,7 @@ static char *sockmsg_string(enum xsd_sockmsg_type type)
        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 connection *conn, struct buffered_data *in)
                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 654185d4bb5b2212b391020d3bd52ccd76d3c33e..443af8250a0d5bcdca4cd1dfdb26cf3e8162d0af 100644 (file)
@@ -537,6 +537,15 @@ void do_is_domain_introduced(struct connection *conn, const char *domid_str)
        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 6a1e8be09b05d4fb7573042b1e0fa44769343d0d..9e2afaea5e2bef0658a7b14319c74f8c7ed1a2a3 100644 (file)
@@ -40,6 +40,9 @@ void do_set_target(struct connection *conn, struct buffered_data *in);
 /* 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 e1debceb63bf950a157a8a8c9125aed6936775bf..7e454c4b994c169a1e438aa5336590d65744d132 100644 (file)
@@ -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"