tools/xenstored: switch stubdom live update to use file for state

With the introduction of 9pfs for Xenstore-stubdom it is now possible
to use a file for saving the state when doing live update.

This allows to move some environment specific actions back to the
common source file lu.c.

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
This commit is contained in:
Juergen Gross authored and Jan Beulich committed 2024-08-14 08:46:54 +02:00
1 parent c36efb7fce
commit e4d19a2dad
4 files changed
+75 -140

No files matched your search

+74 -1
View File
@@ -11,6 +11,8 @@
#include <stdlib.h>
#include <syslog.h>
#include <time.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include "talloc.h"
#include "core.h"
@@ -19,11 +21,18 @@
#include "watch.h"
#ifndef NO_LIVE_UPDATE
struct lu_dump_state {
void *buf;
unsigned int size;
int fd;
char *filename;
};
struct live_update *lu_status;
static int lu_destroy(void *data)
{
lu_destroy_arch(data);
lu_status = NULL;
return 0;
@@ -70,6 +79,48 @@ bool lu_is_pending(void)
return lu_status != NULL;
}
static void lu_get_dump_state(struct lu_dump_state *state)
{
struct stat statbuf;
state->size = 0;
state->filename = talloc_asprintf(NULL, "%s/state_dump",
xenstore_rundir());
if (!state->filename)
barf("Allocation failure");
state->fd = open(state->filename, O_RDONLY);
if (state->fd < 0)
return;
if (fstat(state->fd, &statbuf) != 0)
goto out_close;
state->size = statbuf.st_size;
state->buf = mmap(NULL, state->size, PROT_READ, MAP_PRIVATE,
state->fd, 0);
if (state->buf == MAP_FAILED) {
state->size = 0;
goto out_close;
}
return;
out_close:
close(state->fd);
}
static void lu_close_dump_state(struct lu_dump_state *state)
{
assert(state->filename != NULL);
munmap(state->buf, state->size);
close(state->fd);
unlink(state->filename);
talloc_free(state->filename);
}
void lu_read_state(void)
{
struct lu_dump_state state = {};
@@ -197,6 +248,28 @@ static const char *lu_reject_reason(const void *ctx)
return ret ? (const char *)ret : "Overlapping transactions";
}
static FILE *lu_dump_open(const void *ctx)
{
char *filename;
int fd;
filename = talloc_asprintf(ctx, "%s/state_dump",
xenstore_rundir());
if (!filename)
return NULL;
fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
if (fd < 0)
return NULL;
return fdopen(fd, "w");
}
static void lu_dump_close(FILE *fp)
{
fclose(fp);
}
static const char *lu_dump_state(const void *ctx, struct connection *conn)
{
FILE *fp;
+1 -18
View File
@@ -18,12 +18,9 @@ struct live_update {
unsigned int kernel_size;
unsigned int kernel_off;
void *dump_state;
unsigned long dump_size;
#else
char *filename;
#endif
char *filename;
char *cmdline;
/* Start parameters. */
@@ -32,15 +29,6 @@ struct live_update {
time_t started_at;
};
struct lu_dump_state {
void *buf;
unsigned int size;
#ifndef __MINIOS__
int fd;
char *filename;
#endif
};
extern struct live_update *lu_status;
struct connection *lu_get_connection(void);
@@ -54,15 +42,10 @@ int do_control_lu(const void *ctx, struct connection *conn, const char **vec,
int num);
/* Live update private interfaces. */
void lu_get_dump_state(struct lu_dump_state *state);
void lu_close_dump_state(struct lu_dump_state *state);
FILE *lu_dump_open(const void *ctx);
void lu_dump_close(FILE *fp);
char *lu_exec(const void *ctx, int argc, char **argv);
const char *lu_arch(const void *ctx, struct connection *conn, const char **vec,
int num);
const char *lu_begin(struct connection *conn);
void lu_destroy_arch(void *data);
#else
static inline struct connection *lu_get_connection(void)
{
-72
View File
@@ -5,82 +5,14 @@
* Copyright (C) 2022 Juergen Gross, SUSE LLC
*/
#include <assert.h>
#include <stdio.h>
#include <syslog.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <xen-tools/xenstore-common.h>
#include "talloc.h"
#include "core.h"
#include "lu.h"
#ifndef NO_LIVE_UPDATE
void lu_get_dump_state(struct lu_dump_state *state)
{
struct stat statbuf;
state->size = 0;
state->filename = talloc_asprintf(NULL, "%s/state_dump",
xenstore_rundir());
if (!state->filename)
barf("Allocation failure");
state->fd = open(state->filename, O_RDONLY);
if (state->fd < 0)
return;
if (fstat(state->fd, &statbuf) != 0)
goto out_close;
state->size = statbuf.st_size;
state->buf = mmap(NULL, state->size, PROT_READ, MAP_PRIVATE,
state->fd, 0);
if (state->buf == MAP_FAILED) {
state->size = 0;
goto out_close;
}
return;
out_close:
close(state->fd);
}
void lu_close_dump_state(struct lu_dump_state *state)
{
assert(state->filename != NULL);
munmap(state->buf, state->size);
close(state->fd);
unlink(state->filename);
talloc_free(state->filename);
}
FILE *lu_dump_open(const void *ctx)
{
char *filename;
int fd;
filename = talloc_asprintf(ctx, "%s/state_dump",
xenstore_rundir());
if (!filename)
return NULL;
fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
if (fd < 0)
return NULL;
return fdopen(fd, "w");
}
void lu_dump_close(FILE *fp)
{
fclose(fp);
}
char *lu_exec(const void *ctx, int argc, char **argv)
{
argv[0] = lu_status->filename;
@@ -89,10 +21,6 @@ char *lu_exec(const void *ctx, int argc, char **argv)
return "Error activating new binary.";
}
void lu_destroy_arch(void *data)
{
}
static const char *lu_binary(const void *ctx, struct connection *conn,
const char *filename)
{
-49
View File
@@ -5,67 +5,18 @@
* Copyright (C) 2022 Juergen Gross, SUSE LLC
*/
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <syslog.h>
#include <sys/mman.h>
#include <xenctrl.h>
#include <xen-tools/common-macros.h>
#include "talloc.h"
#include "lu.h"
/* Mini-OS only knows about MAP_ANON. */
#ifndef MAP_ANONYMOUS
#define MAP_ANONYMOUS MAP_ANON
#endif
#ifndef NO_LIVE_UPDATE
void lu_get_dump_state(struct lu_dump_state *state)
{
}
void lu_close_dump_state(struct lu_dump_state *state)
{
}
FILE *lu_dump_open(const void *ctx)
{
lu_status->dump_size = ROUNDUP(talloc_total_size(NULL) * 2,
XC_PAGE_SHIFT);
lu_status->dump_state = mmap(NULL, lu_status->dump_size,
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (lu_status->dump_state == MAP_FAILED)
return NULL;
return fmemopen(lu_status->dump_state, lu_status->dump_size, "w");
}
void lu_dump_close(FILE *fp)
{
size_t size;
size = ftell(fp);
size = ROUNDUP(size, XC_PAGE_SHIFT);
munmap(lu_status->dump_state + size, lu_status->dump_size - size);
lu_status->dump_size = size;
fclose(fp);
}
char *lu_exec(const void *ctx, int argc, char **argv)
{
return "NYI";
}
void lu_destroy_arch(void *data)
{
if (lu_status->dump_state)
munmap(lu_status->dump_state, lu_status->dump_size);
}
static const char *lu_binary_alloc(const void *ctx, struct connection *conn,
unsigned long size)
{
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.