[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v7 05/15] libxl: refactor disk addition to take a helper
Change libxl__device_disk_add to no longer take a xs transaction and instead pass a helper for the local attach case that's used to get the free vdev. Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Signed-off-by: Roger Pau Monne <roger.pau@xxxxxxxxxx> --- tools/libxl/libxl.c | 80 ++++++++++++++++++++++++++--------------- tools/libxl/libxl_internal.h | 2 +- 2 files changed, 52 insertions(+), 30 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 7e6d5c9..10176f0 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -1733,15 +1733,23 @@ int libxl__device_from_disk(libxl__gc *gc, uint32_t domid, return 0; } -int libxl__device_disk_add(libxl__gc *gc, uint32_t domid, - xs_transaction_t t, libxl_device_disk *disk) +/* Specific function called directly only by local disk attach, + * all other users should instead use the regular + * libxl__device_disk_add wrapper + */ +static int device_disk_add(libxl__gc *gc, uint32_t domid, + libxl_device_disk *disk, + char *(*fn)(libxl__gc *, const char *, + xs_transaction_t), + const char *blkdev_start) { flexarray_t *front; flexarray_t *back; char *dev; libxl__device device; - int major, minor, rc; + int major, minor, rc, xs_ret; libxl_ctx *ctx = gc->owner; + xs_transaction_t t = XBT_NULL; rc = libxl__device_disk_setdefault(gc, disk); if (rc) goto out; @@ -1839,9 +1847,33 @@ int libxl__device_disk_add(libxl__gc *gc, uint32_t domid, flexarray_append(front, "device-type"); flexarray_append(front, disk->is_cdrom ? "cdrom" : "disk"); - libxl__device_generic_add(gc, t, &device, - libxl__xs_kvs_of_flexarray(gc, back, back->count), - libxl__xs_kvs_of_flexarray(gc, front, front->count)); + do { + t = xs_transaction_start(ctx->xsh); + if (t == XBT_NULL) { + LOG(ERROR, "failed to start a xenstore transaction"); + rc = ERROR_FAIL; + goto out_free; + } + if (fn) { + assert(blkdev_start); + disk->vdev = fn(gc, blkdev_start, t); + if (disk->vdev == NULL) { + LOG(ERROR, "libxl__alloc_vdev failed"); + rc = ERROR_FAIL; + goto out_free; + } + } + libxl__device_generic_add(gc, t, &device, + libxl__xs_kvs_of_flexarray(gc, back, back->count), + libxl__xs_kvs_of_flexarray(gc, front, front->count)); + xs_ret = xs_transaction_end(ctx->xsh, t, 0); + } while (xs_ret == 0 && errno == EAGAIN); + t = XBT_NULL; + if (xs_ret == 0) { + LOGE(ERROR, "xenstore transaction failed"); + rc = ERROR_FAIL; + goto out_free; + } rc = 0; @@ -1849,13 +1881,21 @@ out_free: flexarray_free(back); flexarray_free(front); out: + if (t != XBT_NULL) + xs_transaction_end(ctx->xsh, t, 0); return rc; } +int libxl__device_disk_add(libxl__gc *gc, uint32_t domid, + libxl_device_disk *disk) +{ + return device_disk_add(gc, domid, disk, NULL, NULL); +} + int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk) { GC_INIT(ctx); - int rc = libxl__device_disk_add(gc, domid, XBT_NULL, disk); + int rc = libxl__device_disk_add(gc, domid, disk); GC_FREE; return rc; } @@ -2113,7 +2153,7 @@ char * libxl__device_disk_local_attach(libxl__gc *gc, libxl_ctx *ctx = gc->owner; char *dev = NULL, *be_path = NULL; char *ret = NULL; - int rc, xs_ret; + int rc; libxl__device device; xs_transaction_t t = XBT_NULL; @@ -2159,27 +2199,9 @@ char * libxl__device_disk_local_attach(libxl__gc *gc, break; case LIBXL_DISK_BACKEND_QDISK: if (disk->format != LIBXL_DISK_FORMAT_RAW) { - do { - t = xs_transaction_start(ctx->xsh); - if (t == XBT_NULL) { - LOG(ERROR, "failed to start a xenstore transaction"); - goto out; - } - disk->vdev = libxl__alloc_vdev(gc, blkdev_start, t); - if (disk->vdev == NULL) { - LOG(ERROR, "libxl__alloc_vdev failed"); - goto out; - } - if (libxl__device_disk_add(gc, LIBXL_TOOLSTACK_DOMID, - t, disk)) { - LOG(ERROR, "libxl_device_disk_add failed"); - goto out; - } - xs_ret = xs_transaction_end(ctx->xsh, t, 0); - } while (xs_ret == 0 && errno == EAGAIN); - t = XBT_NULL; - if (xs_ret == 0) { - LOGE(ERROR, "xenstore transaction failed"); + if (device_disk_add(gc, LIBXL_TOOLSTACK_DOMID, disk, + libxl__alloc_vdev, blkdev_start)) { + LOG(ERROR, "libxl_device_disk_add failed"); goto out; } dev = GCSPRINTF("/dev/%s", disk->vdev); diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 7a75809..1befdc5 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1291,7 +1291,7 @@ _hidden int libxl__device_from_disk(libxl__gc *gc, uint32_t domid, libxl_device_disk *disk, libxl__device *device); _hidden int libxl__device_disk_add(libxl__gc *gc, uint32_t domid, - xs_transaction_t t, libxl_device_disk *disk); + libxl_device_disk *disk); /* * Make a disk available in this (the control) domain. Returns path to -- 1.7.7.5 (Apple Git-26) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |