|
[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 |