mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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>
This commit is contained in:
1 parent
dcbc297aea
commit
1f9d04fb02
5 files changed
+22
-1
No files matched your search
@@ -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>|
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) */
|
||||
|
||||
@@ -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"
|
||||
|
||||