From: Juergen Gross <jgross@suse.com>
To: xen-devel@lists.xenproject.org
Cc: Juergen Gross <jgross@suse.com>, Ian Jackson <iwj@xenproject.org>,
Wei Liu <wl@xen.org>, Paul Durrant <paul@xen.org>
Subject: [PATCH v12 25/27] tools/xenstore: add read watch state for live update
Date: Fri, 15 Jan 2021 09:29:58 +0100 [thread overview]
Message-ID: <20210115083000.14186-26-jgross@suse.com> (raw)
In-Reply-To: <20210115083000.14186-1-jgross@suse.com>
Add reading the watch state records for live update.
This requires factoring out some of the add watch functionality into a
dedicated function.
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Paul Durrant <paul@xen.org>
---
V4:
- add comment (Julien Grall)
V6:
- correct check_watch_path() (setting errno)
---
tools/xenstore/xenstored_control.c | 2 +
tools/xenstore/xenstored_watch.c | 114 +++++++++++++++++++++--------
tools/xenstore/xenstored_watch.h | 2 +
3 files changed, 88 insertions(+), 30 deletions(-)
diff --git a/tools/xenstore/xenstored_control.c b/tools/xenstore/xenstored_control.c
index 287417de6b..b8195eed41 100644
--- a/tools/xenstore/xenstored_control.c
+++ b/tools/xenstore/xenstored_control.c
@@ -35,6 +35,7 @@ Interactive commands for Xen Store Daemon.
#include "xenstored_core.h"
#include "xenstored_control.h"
#include "xenstored_domain.h"
+#include "xenstored_watch.h"
/* Mini-OS only knows about MAP_ANON. */
#ifndef MAP_ANONYMOUS
@@ -542,6 +543,7 @@ void lu_read_state(void)
read_state_connection(ctx, head + 1);
break;
case XS_STATE_TYPE_WATCH:
+ read_state_watch(ctx, head + 1);
break;
case XS_STATE_TYPE_TA:
xprintf("live-update: ignore transaction record\n");
diff --git a/tools/xenstore/xenstored_watch.c b/tools/xenstore/xenstored_watch.c
index 9248f08bd9..db89e0141f 100644
--- a/tools/xenstore/xenstored_watch.c
+++ b/tools/xenstore/xenstored_watch.c
@@ -205,6 +205,62 @@ static int destroy_watch(void *_watch)
return 0;
}
+static int check_watch_path(struct connection *conn, const void *ctx,
+ char **path, bool *relative)
+{
+ /* Check if valid event. */
+ if (strstarts(*path, "@")) {
+ *relative = false;
+ if (strlen(*path) > XENSTORE_REL_PATH_MAX)
+ goto inval;
+ } else {
+ *relative = !strstarts(*path, "/");
+ *path = canonicalize(conn, ctx, *path);
+ if (!*path)
+ return errno;
+ if (!is_valid_nodename(*path))
+ goto inval;
+ }
+
+ return 0;
+
+ inval:
+ errno = EINVAL;
+ return errno;
+}
+
+static struct watch *add_watch(struct connection *conn, char *path, char *token,
+ bool relative)
+{
+ struct watch *watch;
+
+ watch = talloc(conn, struct watch);
+ if (!watch)
+ goto nomem;
+ watch->node = talloc_strdup(watch, path);
+ watch->token = talloc_strdup(watch, token);
+ if (!watch->node || !watch->token)
+ goto nomem;
+
+ if (relative)
+ watch->relative_path = get_implicit_path(conn);
+ else
+ watch->relative_path = NULL;
+
+ INIT_LIST_HEAD(&watch->events);
+
+ domain_watch_inc(conn);
+ list_add_tail(&watch->list, &conn->watches);
+ talloc_set_destructor(watch, destroy_watch);
+
+ return watch;
+
+ nomem:
+ talloc_free(watch);
+ errno = ENOMEM;
+ return NULL;
+}
+
int do_watch(struct connection *conn, struct buffered_data *in)
{
struct watch *watch;
@@ -214,19 +270,9 @@ int do_watch(struct connection *conn, struct buffered_data *in)
if (get_strings(in, vec, ARRAY_SIZE(vec)) != ARRAY_SIZE(vec))
return EINVAL;
- if (strstarts(vec[0], "@")) {
- relative = false;
- if (strlen(vec[0]) > XENSTORE_REL_PATH_MAX)
- return EINVAL;
- /* check if valid event */
- } else {
- relative = !strstarts(vec[0], "/");
- vec[0] = canonicalize(conn, in, vec[0]);
- if (!vec[0])
- return ENOMEM;
- if (!is_valid_nodename(vec[0]))
- return EINVAL;
- }
+ errno = check_watch_path(conn, in, &(vec[0]), &relative);
+ if (errno)
+ return errno;
/* Check for duplicates. */
list_for_each_entry(watch, &conn->watches, list) {
@@ -238,26 +284,11 @@ int do_watch(struct connection *conn, struct buffered_data *in)
if (domain_watch(conn) > quota_nb_watch_per_domain)
return E2BIG;
- watch = talloc(conn, struct watch);
+ watch = add_watch(conn, vec[0], vec[1], relative);
if (!watch)
- return ENOMEM;
- watch->node = talloc_strdup(watch, vec[0]);
- watch->token = talloc_strdup(watch, vec[1]);
- if (!watch->node || !watch->token) {
- talloc_free(watch);
- return ENOMEM;
- }
- if (relative)
- watch->relative_path = get_implicit_path(conn);
- else
- watch->relative_path = NULL;
+ return errno;
- INIT_LIST_HEAD(&watch->events);
-
- domain_watch_inc(conn);
- list_add_tail(&watch->list, &conn->watches);
trace_create(watch, "watch");
- talloc_set_destructor(watch, destroy_watch);
send_ack(conn, XS_WATCH);
/* We fire once up front: simplifies clients and restart. */
@@ -338,6 +369,29 @@ const char *dump_state_watches(FILE *fp, struct connection *conn,
return ret;
}
+void read_state_watch(const void *ctx, const void *state)
+{
+ const struct xs_state_watch *sw = state;
+ struct connection *conn;
+ char *path, *token;
+ bool relative;
+
+ conn = get_connection_by_id(sw->conn_id);
+ if (!conn)
+ barf("connection not found for read watch");
+
+ path = (char *)sw->data;
+ token = path + sw->path_length;
+
+ /* Don't check success, we want the relative information only. */
+ check_watch_path(conn, ctx, &path, &relative);
+ if (!path)
+ barf("allocation error for read watch");
+
+ if (!add_watch(conn, path, token, relative))
+ barf("error adding watch");
+}
+
/*
* Local variables:
* mode: C
diff --git a/tools/xenstore/xenstored_watch.h b/tools/xenstore/xenstored_watch.h
index 3d81645f45..0e693f0839 100644
--- a/tools/xenstore/xenstored_watch.h
+++ b/tools/xenstore/xenstored_watch.h
@@ -33,4 +33,6 @@ void conn_delete_all_watches(struct connection *conn);
const char *dump_state_watches(FILE *fp, struct connection *conn,
unsigned int conn_id);
+void read_state_watch(const void *ctx, const void *state);
+
#endif /* _XENSTORED_WATCH_H */
--
2.26.2
next prev parent reply other threads:[~2021-01-15 8:39 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-15 8:29 [PATCH v12 00/27] tools/xenstore: support live update for xenstored Juergen Gross
2021-01-15 8:29 ` [PATCH v12 01/27] tools/libxenevtchn: switch to standard xen coding style Juergen Gross
2021-01-15 8:29 ` [PATCH v12 02/27] tools/libxenevtchn: rename open_flags to flags Juergen Gross
2021-01-15 8:29 ` [PATCH v12 03/27] tools/libxenevtchn: check xenevtchn_open() flags for not supported bits Juergen Gross
2021-01-15 8:29 ` [PATCH v12 04/27] tools/libxenevtchn: propagate xenevtchn_open() flags parameter Juergen Gross
2021-01-15 8:29 ` [PATCH v12 05/27] tools/libxenevtchn: add possibility to not close file descriptor on exec Juergen Gross
2021-01-15 8:29 ` [PATCH v12 06/27] tools/xenstore: refactor XS_CONTROL handling Juergen Gross
2021-01-15 8:29 ` [PATCH v12 07/27] tools/xenstore: add live update command to xenstore-control Juergen Gross
2021-01-15 8:29 ` [PATCH v12 08/27] tools/xenstore: add basic live-update command parsing Juergen Gross
2021-01-15 8:29 ` [PATCH v12 09/27] tools/xenstore: introduce live update status block Juergen Gross
2021-01-15 8:29 ` [PATCH v12 10/27] tools/xenstore: save new binary for live update Juergen Gross
2021-01-15 8:29 ` [PATCH v12 11/27] tools/xenstore: add command line handling " Juergen Gross
2021-01-15 8:29 ` [PATCH v12 12/27] tools/xenstore: add support for delaying execution of a xenstore request Juergen Gross
2021-01-15 8:29 ` [PATCH v12 13/27] tools/xenstore: add the basic framework for doing the live update Juergen Gross
2021-01-15 8:29 ` [PATCH v12 14/27] tools/xenstore: allow live update only with no transaction active Juergen Gross
2021-01-15 8:29 ` [PATCH v12 15/27] docs: update the xenstore migration stream documentation Juergen Gross
2021-01-15 8:29 ` [PATCH v12 16/27] tools/xenstore: add include file for state structure definitions Juergen Gross
2021-01-15 8:29 ` [PATCH v12 17/27] tools/xenstore: dump the xenstore state for live update Juergen Gross
2021-01-15 8:29 ` [PATCH v12 18/27] tools/xenstore: handle CLOEXEC flag for local files and pipes Juergen Gross
2021-01-15 8:29 ` [PATCH v12 19/27] tools/xenstore: split off domain introduction from do_introduce() Juergen Gross
2021-01-15 8:29 ` [PATCH v12 20/27] tools/xenstore: evaluate the live update flag when starting Juergen Gross
2021-01-15 8:29 ` [PATCH v12 21/27] tools/xenstore: read internal state when doing live upgrade Juergen Gross
2021-01-15 8:29 ` [PATCH v12 22/27] tools/xenstore: add reading global state for live update Juergen Gross
2021-01-15 8:29 ` [PATCH v12 23/27] tools/xenstore: add read connection " Juergen Gross
2021-01-15 8:29 ` [PATCH v12 24/27] tools/xenstore: add read node " Juergen Gross
2021-01-15 8:29 ` Juergen Gross [this message]
2021-01-15 8:29 ` [PATCH v12 26/27] tools/xenstore: handle dying domains in " Juergen Gross
2021-01-15 8:30 ` [PATCH v12 27/27] tools/xenstore: activate new binary for " Juergen Gross
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210115083000.14186-26-jgross@suse.com \
--to=jgross@suse.com \
--cc=iwj@xenproject.org \
--cc=paul@xen.org \
--cc=wl@xen.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).