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@suse.com>
Reviewed-by: Jason Andryuk <jason.andryuk@amd.com>
This commit is contained in:
Juergen Gross authored and Jan Beulich committed 2025-07-28 13:06:40 +02:00
1 parent 5234b61eab
commit a19e32fcfb
4 files changed
+50 -19

No files matched your search

+3 -3
View File
@@ -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>]" },
+15 -6
View File
@@ -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 {
+1
View File
@@ -26,6 +26,7 @@ struct live_update {
/* Start parameters. */
bool force;
unsigned int timeout;
unsigned int version;
time_t started_at;
};
+31 -10
View File
@@ -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);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.