From mboxrd@z Thu Jan 1 00:00:00 1970 From: Roger Pau Monne Subject: Re: [PATCH v6 05/11] libxl: introduce libxl__device_disk_add Date: Fri, 18 May 2012 15:56:31 +0100 Message-ID: <4FB6631F.9050004@citrix.com> References: <1337350125-30394-5-git-send-email-stefano.stabellini@eu.citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1337350125-30394-5-git-send-email-stefano.stabellini@eu.citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Stefano Stabellini Cc: "xen-devel@lists.xensource.com" , Ian Jackson , Ian Campbell List-Id: xen-devel@lists.xenproject.org Stefano Stabellini wrote: > Introduce libxl__device_disk_add that takes an additional > xs_transaction_t paramter. > Implement libxl_device_disk_add using libxl__device_disk_add. > > Signed-off-by: Stefano Stabellini > --- > tools/libxl/libxl.c | 113 +--------------------------------------- > tools/libxl/libxl_internal.c | 119 ++++++++++++++++++++++++++++++++++++++++++ > tools/libxl/libxl_internal.h | 2 + > 3 files changed, 122 insertions(+), 112 deletions(-) > > diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c > index 3f53da5..1bed2fe 100644 > --- a/tools/libxl/libxl.c > +++ b/tools/libxl/libxl.c > @@ -1284,118 +1284,7 @@ int libxl__device_disk_setdefault(libxl__gc *gc, libxl_device_disk *disk) > int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk) > { > GC_INIT(ctx); > - flexarray_t *front; > - flexarray_t *back; > - char *dev; > - libxl__device device; > - int major, minor, rc; > - > - rc = libxl__device_disk_setdefault(gc, disk); > - if (rc) goto out; > - > - front = flexarray_make(16, 1); > - if (!front) { > - rc = ERROR_NOMEM; > - goto out; > - } > - back = flexarray_make(16, 1); > - if (!back) { > - rc = ERROR_NOMEM; > - goto out_free; > - } > - > - if (disk->script) { > - LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "External block scripts" > - " not yet supported, sorry"); > - rc = ERROR_INVAL; > - goto out_free; > - } > - > - rc = libxl__device_from_disk(gc, domid, disk,&device); > - if (rc != 0) { > - LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Invalid or unsupported" > - " virtual disk identifier %s", disk->vdev); > - goto out_free; > - } > - > - switch (disk->backend) { > - case LIBXL_DISK_BACKEND_PHY: > - dev = disk->pdev_path; > - do_backend_phy: > - libxl__device_physdisk_major_minor(dev,&major,&minor); > - flexarray_append(back, "physical-device"); > - flexarray_append(back, libxl__sprintf(gc, "%x:%x", major, minor)); > - > - flexarray_append(back, "params"); > - flexarray_append(back, dev); > - > - assert(device.backend_kind == LIBXL__DEVICE_KIND_VBD); > - break; > - case LIBXL_DISK_BACKEND_TAP: > - dev = libxl__blktap_devpath(gc, disk->pdev_path, disk->format); > - if (!dev) { > - LOG(ERROR, "failed to get blktap devpath for %p\n", > - disk->pdev_path); > - rc = ERROR_FAIL; > - goto out_free; > - } > - flexarray_append(back, "tapdisk-params"); > - flexarray_append(back, libxl__sprintf(gc, "%s:%s", > - libxl__device_disk_string_of_format(disk->format), > - disk->pdev_path)); > - > - /* now create a phy device to export the device to the guest */ > - goto do_backend_phy; > - case LIBXL_DISK_BACKEND_QDISK: > - flexarray_append(back, "params"); > - flexarray_append(back, libxl__sprintf(gc, "%s:%s", > - libxl__device_disk_string_of_format(disk->format), disk->pdev_path)); > - assert(device.backend_kind == LIBXL__DEVICE_KIND_QDISK); > - break; > - default: > - LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n", disk->backend); > - rc = ERROR_INVAL; > - goto out_free; > - } > - > - flexarray_append(back, "frontend-id"); > - flexarray_append(back, libxl__sprintf(gc, "%d", domid)); > - flexarray_append(back, "online"); > - flexarray_append(back, "1"); > - flexarray_append(back, "removable"); > - flexarray_append(back, libxl__sprintf(gc, "%d", (disk->removable) ? 1 : 0)); > - flexarray_append(back, "bootable"); > - flexarray_append(back, libxl__sprintf(gc, "%d", 1)); > - flexarray_append(back, "state"); > - flexarray_append(back, libxl__sprintf(gc, "%d", 1)); > - flexarray_append(back, "dev"); > - flexarray_append(back, disk->vdev); > - flexarray_append(back, "type"); > - flexarray_append(back, libxl__device_disk_string_of_backend(disk->backend)); > - flexarray_append(back, "mode"); > - flexarray_append(back, disk->readwrite ? "w" : "r"); > - flexarray_append(back, "device-type"); > - flexarray_append(back, disk->is_cdrom ? "cdrom" : "disk"); > - > - flexarray_append(front, "backend-id"); > - flexarray_append(front, libxl__sprintf(gc, "%d", disk->backend_domid)); > - flexarray_append(front, "state"); > - flexarray_append(front, libxl__sprintf(gc, "%d", 1)); > - flexarray_append(front, "virtual-device"); > - flexarray_append(front, libxl__sprintf(gc, "%d", device.devid)); > - flexarray_append(front, "device-type"); > - flexarray_append(front, disk->is_cdrom ? "cdrom" : "disk"); > - > - libxl__device_generic_add(gc, XBT_NULL,&device, > - libxl__xs_kvs_of_flexarray(gc, back, back->count), > - libxl__xs_kvs_of_flexarray(gc, front, front->count)); > - > - rc = 0; > - > -out_free: > - flexarray_free(back); > - flexarray_free(front); > -out: > + int rc = libxl__device_disk_add(gc, domid, XBT_NULL, disk); > GC_FREE; > return rc; > } > diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c > index 276429c..70a8c4b 100644 > --- a/tools/libxl/libxl_internal.c > +++ b/tools/libxl/libxl_internal.c > @@ -323,6 +323,125 @@ out: > return rc; > } > > +int libxl__device_disk_add(libxl__gc *gc, uint32_t domid, > + xs_transaction_t t, libxl_device_disk *disk) As with the other patch, I think this should go to libxl_device. > +{ > + flexarray_t *front; > + flexarray_t *back; > + char *dev; > + libxl__device device; > + int major, minor, rc; > + libxl_ctx *ctx = gc->owner; > + > + rc = libxl__device_disk_setdefault(gc, disk); > + if (rc) goto out; > + > + front = flexarray_make(16, 1); > + if (!front) { > + rc = ERROR_NOMEM; > + goto out; > + } > + back = flexarray_make(16, 1); > + if (!back) { > + rc = ERROR_NOMEM; > + goto out_free; > + } > + > + if (disk->script) { > + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "External block scripts" > + " not yet supported, sorry"); > + rc = ERROR_INVAL; > + goto out_free; > + } > + > + rc = libxl__device_from_disk(gc, domid, disk,&device); > + if (rc != 0) { > + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Invalid or unsupported" > + " virtual disk identifier %s", disk->vdev); > + goto out_free; > + } > + > + switch (disk->backend) { > + case LIBXL_DISK_BACKEND_PHY: > + dev = disk->pdev_path; > + do_backend_phy: > + libxl__device_physdisk_major_minor(dev,&major,&minor); > + flexarray_append(back, "physical-device"); > + flexarray_append(back, libxl__sprintf(gc, "%x:%x", major, minor)); > + > + flexarray_append(back, "params"); > + flexarray_append(back, dev); > + > + assert(device.backend_kind == LIBXL__DEVICE_KIND_VBD); > + break; > + case LIBXL_DISK_BACKEND_TAP: > + dev = libxl__blktap_devpath(gc, disk->pdev_path, disk->format); > + if (!dev) { > + LOG(ERROR, "failed to get blktap devpath for %p\n", > + disk->pdev_path); > + rc = ERROR_FAIL; > + goto out_free; > + } > + flexarray_append(back, "tapdisk-params"); > + flexarray_append(back, libxl__sprintf(gc, "%s:%s", > + libxl__device_disk_string_of_format(disk->format), > + disk->pdev_path)); > + > + /* now create a phy device to export the device to the guest */ > + goto do_backend_phy; > + case LIBXL_DISK_BACKEND_QDISK: > + flexarray_append(back, "params"); > + flexarray_append(back, libxl__sprintf(gc, "%s:%s", > + libxl__device_disk_string_of_format(disk->format), disk->pdev_path)); > + assert(device.backend_kind == LIBXL__DEVICE_KIND_QDISK); > + break; > + default: > + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n", disk->backend); > + rc = ERROR_INVAL; > + goto out_free; > + } > + > + flexarray_append(back, "frontend-id"); > + flexarray_append(back, libxl__sprintf(gc, "%d", domid)); > + flexarray_append(back, "online"); > + flexarray_append(back, "1"); > + flexarray_append(back, "removable"); > + flexarray_append(back, libxl__sprintf(gc, "%d", (disk->removable) ? 1 : 0)); > + flexarray_append(back, "bootable"); > + flexarray_append(back, libxl__sprintf(gc, "%d", 1)); > + flexarray_append(back, "state"); > + flexarray_append(back, libxl__sprintf(gc, "%d", 1)); > + flexarray_append(back, "dev"); > + flexarray_append(back, disk->vdev); > + flexarray_append(back, "type"); > + flexarray_append(back, libxl__device_disk_string_of_backend(disk->backend)); > + flexarray_append(back, "mode"); > + flexarray_append(back, disk->readwrite ? "w" : "r"); > + flexarray_append(back, "device-type"); > + flexarray_append(back, disk->is_cdrom ? "cdrom" : "disk"); > + > + flexarray_append(front, "backend-id"); > + flexarray_append(front, libxl__sprintf(gc, "%d", disk->backend_domid)); > + flexarray_append(front, "state"); > + flexarray_append(front, libxl__sprintf(gc, "%d", 1)); > + flexarray_append(front, "virtual-device"); > + flexarray_append(front, libxl__sprintf(gc, "%d", device.devid)); > + 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)); > + > + rc = 0; > + > +out_free: > + flexarray_free(back); > + flexarray_free(front); > +out: > + return rc; > +} > + > char * libxl__device_disk_local_attach(libxl__gc *gc, > const libxl_device_disk *in_disk, > libxl_device_disk *disk) > diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h > index 3578414..98f9762 100644 > --- a/tools/libxl/libxl_internal.h > +++ b/tools/libxl/libxl_internal.h > @@ -1236,6 +1236,8 @@ _hidden void libxl__device_destroy_tapdisk(libxl__gc *gc, char *be_path); > _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); > > /* > * Make a disk available in this (the control) domain. Returns path to > -- > 1.7.2.5 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel