[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/6] libxl: libxl_device_disk_local_attach return a new libxl_device_disk
The caller passes an additional pre-allocated libxl_device_disk struct to libxl_device_disk_local_attach, that it is going to fill it with informations about the new locally attached disk. The new libxl_device_disk should be passed to libxl_device_disk_local_detach afterwards. This patch is just about adding the new parameter and updating the caller. Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> --- tools/libxl/libxl.c | 46 ++++++++++++++++++++++++++-------------- tools/libxl/libxl.h | 3 +- tools/libxl/libxl_bootloader.c | 9 +++++-- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 5344366..d33fbdf 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -1644,63 +1644,77 @@ out: return ret; } -char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk) +char * libxl_device_disk_local_attach(libxl_ctx *ctx, const libxl_device_disk *disk, + libxl_device_disk **new_disk) { GC_INIT(ctx); char *dev = NULL; char *ret = NULL; int rc; - - rc = libxl__device_disk_setdefault(gc, disk); + libxl_device_disk *tmpdisk = (libxl_device_disk *) + malloc(sizeof(libxl_device_disk)); + if (tmpdisk == NULL) goto out; + + *new_disk = tmpdisk; + memcpy(tmpdisk, disk, sizeof(libxl_device_disk)); + if (tmpdisk->pdev_path != NULL) + tmpdisk->pdev_path = strdup(tmpdisk->pdev_path); + if (tmpdisk->script != NULL) + tmpdisk->script = strdup(tmpdisk->script); + tmpdisk->vdev = NULL; + + rc = libxl__device_disk_setdefault(gc, tmpdisk); if (rc) goto out; - switch (disk->backend) { + switch (tmpdisk->backend) { case LIBXL_DISK_BACKEND_PHY: LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "locally attaching PHY disk %s", - disk->pdev_path); - dev = disk->pdev_path; + tmpdisk->pdev_path); + dev = tmpdisk->pdev_path; break; case LIBXL_DISK_BACKEND_TAP: - switch (disk->format) { + switch (tmpdisk->format) { case LIBXL_DISK_FORMAT_RAW: /* optimise away the early tapdisk attach in this case */ LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "locally attaching" " tap disk %s directly (ie without using blktap)", - disk->pdev_path); - dev = disk->pdev_path; + tmpdisk->pdev_path); + dev = tmpdisk->pdev_path; break; case LIBXL_DISK_FORMAT_VHD: - dev = libxl__blktap_devpath(gc, disk->pdev_path, - disk->format); + dev = libxl__blktap_devpath(gc, tmpdisk->pdev_path, + tmpdisk->format); break; case LIBXL_DISK_FORMAT_QCOW: case LIBXL_DISK_FORMAT_QCOW2: abort(); /* prevented by libxl__device_disk_set_backend */ default: LIBXL__LOG(ctx, LIBXL__LOG_ERROR, - "unrecognized disk format: %d", disk->format); + "unrecognized disk format: %d", tmpdisk->format); break; } break; case LIBXL_DISK_BACKEND_QDISK: - if (disk->format != LIBXL_DISK_FORMAT_RAW) { + if (tmpdisk->format != LIBXL_DISK_FORMAT_RAW) { LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot locally" " attach a qdisk image if the format is not raw"); break; } LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "locally attaching qdisk %s\n", disk->pdev_path); - dev = disk->pdev_path; + dev = tmpdisk->pdev_path; break; default: LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend " - "type: %d", disk->backend); + "type: %d", tmpdisk->backend); break; } out: - if (dev != NULL) + if (dev != NULL) { ret = strdup(dev); + tmpdisk->vdev = strdup(tmpdisk->vdev); + } GC_FREE; return ret; } diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 6b69030..d297b04 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -540,7 +540,8 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk); * Make a disk available in this (the control) domain. Returns path to * a device. */ -char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk); +char * libxl_device_disk_local_attach(libxl_ctx *ctx, const libxl_device_disk *disk, + libxl_device_disk **new_disk); int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk *disk); /* Network Interfaces */ diff --git a/tools/libxl/libxl_bootloader.c b/tools/libxl/libxl_bootloader.c index 2774062..0abc31f 100644 --- a/tools/libxl/libxl_bootloader.c +++ b/tools/libxl/libxl_bootloader.c @@ -330,6 +330,7 @@ int libxl_run_bootloader(libxl_ctx *ctx, char *fifo = NULL; char *diskpath = NULL; char **args = NULL; + libxl_device_disk *tmpdisk = NULL; char tempdir_template[] = "/var/run/libxl/bl.XXXXXX"; char *tempdir; @@ -386,7 +387,7 @@ int libxl_run_bootloader(libxl_ctx *ctx, goto out_close; } - diskpath = libxl_device_disk_local_attach(ctx, disk); + diskpath = libxl_device_disk_local_attach(ctx, disk, &tmpdisk); if (!diskpath) { goto out_close; } @@ -452,9 +453,11 @@ int libxl_run_bootloader(libxl_ctx *ctx, rc = 0; out_close: - if (diskpath) { - libxl_device_disk_local_detach(ctx, disk); + if (diskpath) free(diskpath); + if (tmpdisk) { + libxl_device_disk_local_detach(ctx, tmpdisk); + free(tmpdisk); } if (fifo_fd > -1) close(fifo_fd); -- 1.7.2.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |