|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] tools/xenstored: support specification of migration stream version
commit a19e32fcfb682f18a77cb0c209644b0a204a32ee
Author: Juergen Gross <jgross@xxxxxxxx>
AuthorDate: Mon Jul 28 13:06:40 2025 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Mon Jul 28 13:06:40 2025 +0200
tools/xenstored: support specification of migration stream version
In order to prepare xenstored supporting migration stream versions
other than 1, add a parameter to the live update command allowing to
specify the version of the migration stream.
This will allow going back from xenstored using version 2 per default
to a xenstored only accepting version 1.
For now only version 1 is supported.
Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
Reviewed-by: Jason Andryuk <jason.andryuk@xxxxxxx>
---
tools/xenstored/control.c | 6 +++---
tools/xenstored/lu.c | 21 +++++++++++++------
tools/xenstored/lu.h | 1 +
tools/xs-clients/xenstore_control.c | 41 ++++++++++++++++++++++++++++---------
4 files changed, 50 insertions(+), 19 deletions(-)
diff --git a/tools/xenstored/control.c b/tools/xenstored/control.c
index 9561289179..953c01b735 100644
--- a/tools/xenstored/control.c
+++ b/tools/xenstored/control.c
@@ -289,7 +289,7 @@ static struct cmd_s cmds[] = {
* Mini-OS: -b <binary-size>
* -d <size> <data-bytes> (multiple of those)
* 2. New command-line (optional): -c <cmdline>
- * 3. Start of update: -s [-F] [-t <timeout>]
+ * 3. Start of update: -s [-F] [-t <timeout>] [-v <version>]
* Any sub-operation needs to respond with the string "OK" in case
* of success, any other response indicates failure.
* A started live-update sequence can be aborted via "-a" (not
@@ -297,8 +297,8 @@ static struct cmd_s cmds[] = {
* sub-operation).
*/
{ "live-update", do_control_lu,
- "[-c <cmdline>] [-F] [-t <timeout>] <file>\n"
- " Default timeout is 60 seconds.", 5 },
+ "[-c <cmdline>] [-F] [-t <timeout>] [-v <version>] <file>\n"
+ " Default timeout is 60 seconds, default version is 1.", 7 },
#endif
{ "logfile", do_control_logfile, "<file>" },
{ "memreport", do_control_memreport, "[<file>]" },
diff --git a/tools/xenstored/lu.c b/tools/xenstored/lu.c
index 4fccbbc195..330820a8a2 100644
--- a/tools/xenstored/lu.c
+++ b/tools/xenstored/lu.c
@@ -283,7 +283,7 @@ static const char *lu_dump_state(const void *ctx, struct
connection *conn)
return "Dump state open error";
memcpy(pre.ident, XS_STATE_IDENT, sizeof(pre.ident));
- pre.version = htobe32(XS_STATE_VERSION);
+ pre.version = htobe32(lu_status->version);
pre.flags = XS_STATE_FLAGS;
if (fwrite(&pre, sizeof(pre), 1, fp) != 1) {
ret = "Dump write error";
@@ -412,13 +412,16 @@ static bool do_lu_start(struct delayed_request *req)
}
static const char *lu_start(const void *ctx, struct connection *conn,
- bool force, unsigned int to)
+ bool force, unsigned int to, unsigned int vers)
{
syslog(LOG_INFO, "live-update: start, force=%d, to=%u\n", force, to);
if (!lu_status || lu_status->conn != conn)
return "Not in live-update session.";
+ if (!vers || vers > XS_STATE_VERSION)
+ return "Migration stream version not supported.";
+
#ifdef __MINIOS__
if (lu_status->kernel_size != lu_status->kernel_off)
return "Kernel not complete.";
@@ -426,6 +429,7 @@ static const char *lu_start(const void *ctx, struct
connection *conn,
lu_status->force = force;
lu_status->timeout = to;
+ lu_status->version = vers;
lu_status->started_at = time(NULL);
lu_status->in = conn->in;
@@ -441,6 +445,7 @@ int do_control_lu(const void *ctx, struct connection *conn,
const char **vec,
unsigned int i;
bool force = false;
unsigned int to = 0;
+ unsigned int vers = XS_STATE_VERSION;
if (num < 1)
return EINVAL;
@@ -457,15 +462,19 @@ int do_control_lu(const void *ctx, struct connection
*conn, const char **vec,
return EINVAL;
} else if (!strcmp(vec[0], "-s")) {
for (i = 1; i < num; i++) {
- if (!strcmp(vec[i], "-F"))
+ if (!strcmp(vec[i], "-F")) {
force = true;
- else if (!strcmp(vec[i], "-t") && i < num - 1) {
+ } else if (!strcmp(vec[i], "-t") && i < num - 1) {
i++;
to = atoi(vec[i]);
- } else
+ } else if (!strcmp(vec[i], "-v") && i < num - 1) {
+ i++;
+ vers = atoi(vec[i]);
+ } else {
return EINVAL;
+ }
}
- ret = lu_start(ctx, conn, force, to);
+ ret = lu_start(ctx, conn, force, to, vers);
if (!ret)
return errno;
} else {
diff --git a/tools/xenstored/lu.h b/tools/xenstored/lu.h
index dacc9b6e42..512b8a6db2 100644
--- a/tools/xenstored/lu.h
+++ b/tools/xenstored/lu.h
@@ -26,6 +26,7 @@ struct live_update {
/* Start parameters. */
bool force;
unsigned int timeout;
+ unsigned int version;
time_t started_at;
};
diff --git a/tools/xs-clients/xenstore_control.c
b/tools/xs-clients/xenstore_control.c
index 548363ee70..4b523931ce 100644
--- a/tools/xs-clients/xenstore_control.c
+++ b/tools/xs-clients/xenstore_control.c
@@ -26,7 +26,8 @@ static int add_to_buf(char **buf, const char *val, int len)
return len + vallen;
}
-static int live_update_start(struct xs_handle *xsh, bool force, unsigned int
to)
+static int live_update_start(struct xs_handle *xsh, bool force, unsigned int
to,
+ unsigned int vers)
{
int len = 0;
char *buf = NULL, *ret;
@@ -40,6 +41,15 @@ static int live_update_start(struct xs_handle *xsh, bool
force, unsigned int to)
free(ret);
if (force)
len = add_to_buf(&buf, "-F", len);
+ if (vers) {
+ if (asprintf(&ret, "%u", vers) < 0) {
+ free(buf);
+ return 1;
+ }
+ len = add_to_buf(&buf, "-v", len);
+ len = add_to_buf(&buf, ret, len);
+ free(ret);
+ }
if (len < 0)
return 1;
@@ -197,7 +207,8 @@ static int send_kernel_blob(struct xs_handle *xsh, const
char *binary)
* 3. start update (includes flags)
*/
static int live_update_stubdom(struct xs_handle *xsh, const char *binary,
- const char *cmdline, bool force, unsigned int
to)
+ const char *cmdline, bool force, unsigned int
to,
+ unsigned int vers)
{
int rc;
@@ -211,7 +222,7 @@ static int live_update_stubdom(struct xs_handle *xsh, const
char *binary,
goto abort;
}
- rc = live_update_start(xsh, force, to);
+ rc = live_update_start(xsh, force, to, vers);
if (rc)
goto abort;
@@ -231,7 +242,8 @@ static int live_update_stubdom(struct xs_handle *xsh, const
char *binary,
* 3. start update (includes flags)
*/
static int live_update_daemon(struct xs_handle *xsh, const char *binary,
- const char *cmdline, bool force, unsigned int to)
+ const char *cmdline, bool force, unsigned int to,
+ unsigned int vers)
{
int len = 0, rc;
char *buf = NULL, *ret;
@@ -256,7 +268,7 @@ static int live_update_daemon(struct xs_handle *xsh, const
char *binary,
goto abort;
}
- rc = live_update_start(xsh, force, to);
+ rc = live_update_start(xsh, force, to, vers);
if (rc)
goto abort;
@@ -270,7 +282,7 @@ static int live_update_daemon(struct xs_handle *xsh, const
char *binary,
static int live_update(struct xs_handle *xsh, int argc, char **argv)
{
int rc = 0;
- unsigned int i, to = 60;
+ unsigned int i, to = 60, vers = 0;
char *binary = NULL, *cmdline = NULL, *val;
bool force = false;
@@ -291,10 +303,19 @@ static int live_update(struct xs_handle *xsh, int argc,
char **argv)
goto out;
}
to = atoi(argv[i]);
- } else if (!strcmp(argv[i], "-F"))
+ } else if (!strcmp(argv[i], "-F")) {
force = true;
- else
+ } else if (!strcmp(argv[i], "-v")) {
+ i++;
+ if (i == argc) {
+ fprintf(stderr, "Missing version value\n");
+ rc = 2;
+ goto out;
+ }
+ vers = atoi(argv[i]);
+ } else {
binary = argv[i];
+ }
}
if (!binary) {
@@ -305,9 +326,9 @@ static int live_update(struct xs_handle *xsh, int argc,
char **argv)
val = xs_read(xsh, XBT_NULL, "/tool/xenstored/domid", &i);
if (val)
- rc = live_update_stubdom(xsh, binary, cmdline, force, to);
+ rc = live_update_stubdom(xsh, binary, cmdline, force, to, vers);
else
- rc = live_update_daemon(xsh, binary, cmdline, force, to);
+ rc = live_update_daemon(xsh, binary, cmdline, force, to, vers);
free(val);
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |