[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC 2/4] libxl: Have QEMU save its state to a file descriptor
In case QEMU have restricted access to the system, open the file for it, and QEMU will save its state to this file descritor. Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> --- tools/libxl/libxl_qmp.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c index 5bf5236240..7b69d6a4de 100644 --- a/tools/libxl/libxl_qmp.c +++ b/tools/libxl/libxl_qmp.c @@ -952,25 +952,61 @@ int libxl__qmp_system_wakeup(libxl__gc *gc, int domid) return qmp_run_command(gc, domid, "system_wakeup", NULL, NULL, NULL); } +/* Find out which fdset have been allocated */ +static int qmp_fdset_add_fd_callback(libxl__qmp_handler *qmp, + const libxl__json_object *ret, + void *opaque) +{ + const libxl__json_object *o; + int fdset; + + o = libxl__json_map_get("fdset-id", ret, JSON_INTEGER); + if (!o) + return 1; + + fdset = libxl__json_object_get_integer(o); + *(int*)opaque = fdset; + return 0; +} + int libxl__qmp_save(libxl__gc *gc, int domid, const char *filename, bool live) { libxl__json_object *args = NULL; libxl__qmp_handler *qmp = NULL; int rc; + int state_fd; + int new_fdset; qmp = libxl__qmp_initialize(gc, domid); if (!qmp) return ERROR_FAIL; - qmp_parameters_add_string(gc, &args, "filename", (char *)filename); + state_fd = open(filename, O_WRONLY | O_CREAT, 0600); + if (state_fd < 0) { + LOGED(ERROR, domid, + "Failed to open file %s for QEMU", filename); + goto out; + } + + qmp->fd_to_send = state_fd; + + rc = qmp_synchronous_send(qmp, "add-fd", NULL, + qmp_fdset_add_fd_callback, &new_fdset, + qmp->timeout); + if (rc) + goto out; /* live parameter was added to QEMU 2.11. It signal QEMU that the save * operation is for a live migration rather that for taking a snapshot. */ if (qmp_qemu_check_version(qmp, 2, 11, 0)) qmp_parameters_add_bool(gc, &args, "live", live); + QMP_PARAMETERS_SPRINTF(&args, "filename", "/dev/fdset/%d", new_fdset); rc = qmp_synchronous_send(qmp, "xen-save-devices-state", args, NULL, NULL, qmp->timeout); +out: + if (state_fd >= 0) + close(state_fd); libxl__qmp_close(qmp); return rc; } -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |