[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 27/31] libxl_qmp: Implement libxl__qmp_insert_cdrom_ev
This function is a reimplementation of libxl__qmp_insert_cdrom() but to be use with libxl__ev_qmp. It also open the cdrom in libxl and send the FD via QMP, so QEMU doesn't need access permition on the cdrom file. libxl_cdrom_insert() will need to be reorganize to be able to use that new function, this is done in the next few patches. Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> --- tools/libxl/libxl_internal.h | 4 ++ tools/libxl/libxl_qmp.c | 102 +++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 16533f651e..371b27e866 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1870,6 +1870,10 @@ _hidden int libxl__qmp_restore(libxl__gc *gc, int domid, const char *filename); /* Set dirty bitmap logging status */ _hidden int libxl__qmp_set_global_dirty_log(libxl__gc *gc, int domid, bool enable); _hidden int libxl__qmp_insert_cdrom(libxl__gc *gc, int domid, const libxl_device_disk *disk); +int libxl__qmp_insert_cdrom_ev(libxl__gc *gc, int domid, + libxl__ev_qmp *ev, + libxl__ev_qmp_callback *callback, + const libxl_device_disk *disk); /* Add a virtual CPU */ _hidden int libxl__qmp_cpu_add(libxl__gc *gc, int domid, int index); /* Query the bitmap of CPUs */ diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c index f44b313a5e..6728e5ad9e 100644 --- a/tools/libxl/libxl_qmp.c +++ b/tools/libxl/libxl_qmp.c @@ -1361,6 +1361,108 @@ int libxl__qmp_initializations(libxl__gc *gc, uint32_t domid, return ret; } +/* + * Function using libxl__ev_qmp + */ + +/* libxl__qmp_insert_cdrom_ev */ + +struct cdrom_insert_ev_callback { + libxl__ev_qmp ev; + libxl__ev_qmp *callback_ev; + libxl__ev_qmp_callback *callback; + const libxl_device_disk *disk; +}; + +static void cdrom_insert_fd_cb(libxl__egc *egc, libxl__ev_qmp *ev, + const libxl__json_object *response, + libxl__qmp_error_class error) +{ + EGC_GC; + libxl__json_object *args = NULL; + const libxl__json_object *o; + struct cdrom_insert_ev_callback *cb = CONTAINER_OF(ev, *cb, ev); + const libxl_device_disk *disk = cb->disk; + int dev_number = libxl__device_disk_dev_number(disk->vdev, NULL, NULL); + int fdset; + int rc; + + o = libxl__json_map_get("fdset-id", response, JSON_INTEGER); + if (!o) { + rc = ERROR_FAIL; + goto out; + } + fdset = libxl__json_object_get_integer(o); + + QMP_PARAMETERS_SPRINTF(&args, "device", "ide-%i", dev_number); + QMP_PARAMETERS_SPRINTF(&args, "target", "/dev/fdset/%d", fdset); + qmp_parameters_add_string(gc, &args, "arg", + libxl__qemu_disk_format_string(disk->format)); + rc = libxl__ev_qmp_register(gc, cb->callback_ev, + cb->callback, + ev->domid, + "change", args); + if (rc) + goto out; +out: + libxl__ev_qmp_deregister(gc, ev); + if (!o || rc) { + cb->callback(egc, cb->callback_ev, NULL, + LIBXL__QMP_ERROR_CLASS_LIBXL_ERROR); + } + free(cb); +} + + +int libxl__qmp_insert_cdrom_ev(libxl__gc *gc, int domid, libxl__ev_qmp *ev, + libxl__ev_qmp_callback *callback, + const libxl_device_disk *disk) +{ + libxl__json_object *args = NULL; + int dev_number = libxl__device_disk_dev_number(disk->vdev, NULL, NULL); + int rc; + libxl__carefd *cdrom_efd = NULL; + struct cdrom_insert_ev_callback *cb = NULL; + + if (disk->format == LIBXL_DISK_FORMAT_EMPTY) { + QMP_PARAMETERS_SPRINTF(&args, "device", "ide-%i", dev_number); + rc = libxl__ev_qmp_register(gc, ev, callback, domid, + "eject", args); + } else { + libxl__carefd_begin(); + cdrom_efd = libxl__carefd_opened(CTX, open(disk->pdev_path, O_RDONLY)); + if (!cdrom_efd) { + LOGED(ERROR, domid, + "Failed to open cdrom file %s", disk->pdev_path); + rc = ERROR_FAIL; + goto out; + } + + cb = libxl__malloc(NOGC, sizeof (*cb)); + libxl__ev_qmp_init(&cb->ev); + cb->callback = callback; + cb->callback_ev = ev; + cb->disk = disk; + + /* This free form parameter is not use by QEMU or libxl. */ + QMP_PARAMETERS_SPRINTF(&args, "opaque", "%s:%s", + libxl_disk_format_to_string(disk->format), + disk->pdev_path); + cb->ev.efd = cdrom_efd; + rc = libxl__ev_qmp_register(gc, &cb->ev, cdrom_insert_fd_cb, domid, + "add-fd", args); + if (rc) + goto out; + } +out: + if (rc) { + free(cb); + libxl__carefd_close(cdrom_efd); + } + return rc; +} + + /* ------------ Implementation of libxl__ev_qmp ---------------- */ typedef struct libxl__qmp_rx_buf libxl__qmp_rx_buf; -- 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 |