[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 2/4] libxl: set the backend type to Qdisk for CDROM devices on DM HVM guests
This is needed because the cd-{insert/eject} functions are not prepared to deal with blkback, which would be used by default if no backend was specified. Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> Acked-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/libxl/libxl.c | 24 +++++++++++++++++++----- tools/libxl/libxl_create.c | 2 +- tools/libxl/libxl_internal.h | 3 ++- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index d35fc33..9d785a4 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2301,7 +2301,8 @@ int libxl_devid_to_device_vtpm(libxl_ctx *ctx, /******************************************************************************/ -int libxl__device_disk_setdefault(libxl__gc *gc, libxl_device_disk *disk) +int libxl__device_disk_setdefault(libxl__gc *gc, libxl_device_disk *disk, + uint32_t domid) { int rc; @@ -2312,6 +2313,19 @@ int libxl__device_disk_setdefault(libxl__gc *gc, libxl_device_disk *disk) rc = libxl__resolve_domid(gc, disk->backend_domname, &disk->backend_domid); if (rc < 0) return rc; + /* Force Qdisk backend for CDROM devices of guests with a device model. */ + if (disk->is_cdrom != 0 && + libxl__domain_type(gc, domid) == LIBXL_DOMAIN_TYPE_HVM && + libxl__device_model_version_running(gc, domid) != + LIBXL_DEVICE_MODEL_VERSION_NONE) { + if (!(disk->backend == LIBXL_DISK_BACKEND_QDISK || + disk->backend == LIBXL_DISK_BACKEND_UNKNOWN)) { + LOG(ERROR, "Backend for CD devices on HVM guests must be Qdisk"); + return ERROR_FAIL; + } + disk->backend = LIBXL_DISK_BACKEND_QDISK; + } + rc = libxl__device_disk_set_backend(gc, disk); return rc; } @@ -2427,7 +2441,7 @@ static void device_disk_add(libxl__egc *egc, uint32_t domid, } } - rc = libxl__device_disk_setdefault(gc, disk); + rc = libxl__device_disk_setdefault(gc, disk, domid); if (rc) goto out; front = flexarray_make(gc, 16, 1); @@ -2869,7 +2883,7 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, disk_empty.vdev = libxl__strdup(NOGC, disk->vdev); disk_empty.pdev_path = libxl__strdup(NOGC, ""); disk_empty.is_cdrom = 1; - libxl__device_disk_setdefault(gc, &disk_empty); + libxl__device_disk_setdefault(gc, &disk_empty, domid); libxl_domain_type type = libxl__domain_type(gc, domid); if (type == LIBXL_DOMAIN_TYPE_INVALID) { @@ -2910,7 +2924,7 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, goto out; } - rc = libxl__device_disk_setdefault(gc, disk); + rc = libxl__device_disk_setdefault(gc, disk, domid); if (rc) goto out; if (!disk->pdev_path) { @@ -3173,7 +3187,7 @@ void libxl__device_disk_local_initiate_attach(libxl__egc *egc, disk->script = libxl__strdup(gc, in_disk->script); disk->vdev = NULL; - rc = libxl__device_disk_setdefault(gc, disk); + rc = libxl__device_disk_setdefault(gc, disk, LIBXL_TOOLSTACK_DOMID); if (rc) goto out; libxl__prepare_ao_device(ao, &dls->aodev); diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 24f168b..1a57907 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -923,7 +923,7 @@ static void initiate_domain_create(libxl__egc *egc, store_libxl_entry(gc, domid, &d_config->b_info); for (i = 0; i < d_config->num_disks; i++) { - ret = libxl__device_disk_setdefault(gc, &d_config->disks[i]); + ret = libxl__device_disk_setdefault(gc, &d_config->disks[i], domid); if (ret) { LOG(ERROR, "Unable to set disk defaults for disk %d", i); goto error_out; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 55896f8..47aca76 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1204,7 +1204,8 @@ _hidden int libxl__domain_create_info_setdefault(libxl__gc *gc, _hidden int libxl__domain_build_info_setdefault(libxl__gc *gc, libxl_domain_build_info *b_info); _hidden int libxl__device_disk_setdefault(libxl__gc *gc, - libxl_device_disk *disk); + libxl_device_disk *disk, + uint32_t domid); _hidden int libxl__device_nic_setdefault(libxl__gc *gc, libxl_device_nic *nic, uint32_t domid); _hidden int libxl__device_vtpm_setdefault(libxl__gc *gc, libxl_device_vtpm *vtpm); -- 2.6.4 (Apple Git-63) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |