Mailing List Archive

[PATCH 20 of 27 v3] libxl: convert disk handling to device API
# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1318941402 -3600
# Node ID c245f495b53be00648e2bae4911675142e72e9c8
# Parent 26ef64a0ff194c7df3a5f488c1232f6041c6fc02
libxl: convert disk handling to device API

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 26ef64a0ff19 -r c245f495b53b tools/libxl/libxl.c
--- a/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100
@@ -916,13 +916,58 @@ int libxl_vncviewer_exec(libxl_ctx *ctx,

/******************************************************************************/

+int libxl_device_disk_init(libxl_ctx *ctx, libxl_device_disk *disk)
+{
+ memset(disk, 0x00, sizeof(libxl_device_disk));
+ return 0;
+}
+
+static int libxl__device_from_disk(libxl__gc *gc, uint32_t domid,
+ libxl_device_disk *disk,
+ libxl__device *device)
+{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
+ int devid;
+
+ devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
+ if (devid==-1) {
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Invalid or unsupported"
+ " virtual disk identifier %s", disk->vdev);
+ return ERROR_INVAL;
+ }
+
+ device->backend_domid = disk->backend_domid;
+ device->backend_devid = devid;
+
+ switch (disk->backend) {
+ case LIBXL_DISK_BACKEND_PHY:
+ device->backend_kind = LIBXL__DEVICE_KIND_VBD;
+ break;
+ case LIBXL_DISK_BACKEND_TAP:
+ device->backend_kind = LIBXL__DEVICE_KIND_VBD;
+ break;
+ case LIBXL_DISK_BACKEND_QDISK:
+ device->backend_kind = LIBXL__DEVICE_KIND_QDISK;
+ break;
+ default:
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n",
+ disk->backend);
+ return ERROR_INVAL;
+ }
+
+ device->domid = domid;
+ device->devid = devid;
+ device->kind = LIBXL__DEVICE_KIND_VBD;
+
+ return 0;
+}
+
int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk)
{
libxl__gc gc = LIBXL_INIT_GC(ctx);
flexarray_t *front;
flexarray_t *back;
char *dev;
- int devid;
libxl__device device;
int major, minor, rc;

@@ -950,20 +995,13 @@ int libxl_device_disk_add(libxl_ctx *ctx
goto out_free;
}

- devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
- if (devid==-1) {
+ 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);
- rc = ERROR_INVAL;
goto out_free;
}

- device.backend_devid = devid;
- device.backend_domid = disk->backend_domid;
- device.devid = devid;
- device.domid = domid;
- device.kind = LIBXL__DEVICE_KIND_VBD;
-
switch (disk->backend) {
case LIBXL_DISK_BACKEND_PHY:
dev = disk->pdev_path;
@@ -975,7 +1013,7 @@ int libxl_device_disk_add(libxl_ctx *ctx
flexarray_append(back, "params");
flexarray_append(back, dev);

- device.backend_kind = LIBXL__DEVICE_KIND_VBD;
+ assert(device.backend_kind == LIBXL__DEVICE_KIND_VBD);
break;
case LIBXL_DISK_BACKEND_TAP:
dev = libxl__blktap_devpath(&gc, disk->pdev_path, disk->format);
@@ -994,7 +1032,7 @@ int libxl_device_disk_add(libxl_ctx *ctx
flexarray_append(back, "params");
flexarray_append(back, libxl__sprintf(&gc, "%s:%s",
libxl__device_disk_string_of_format(disk->format), disk->pdev_path));
- device.backend_kind = LIBXL__DEVICE_KIND_QDISK;
+ assert(device.backend_kind == LIBXL__DEVICE_KIND_QDISK);
break;
default:
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n", disk->backend);
@@ -1026,7 +1064,7 @@ int libxl_device_disk_add(libxl_ctx *ctx
flexarray_append(front, "state");
flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
flexarray_append(front, "virtual-device");
- flexarray_append(front, libxl__sprintf(&gc, "%d", devid));
+ flexarray_append(front, libxl__sprintf(&gc, "%d", device.devid));
flexarray_append(front, "device-type");
flexarray_append(front, disk->is_cdrom ? "cdrom" : "disk");

@@ -1044,45 +1082,37 @@ out:
return rc;
}

-int libxl_device_disk_del(libxl_ctx *ctx, uint32_t domid,
- libxl_device_disk *disk, int wait)
+int libxl_device_disk_remove(libxl_ctx *ctx, uint32_t domid,
+ libxl_device_disk *disk)
{
libxl__gc gc = LIBXL_INIT_GC(ctx);
libxl__device device;
- int devid, rc;
-
- devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
- device.backend_domid = disk->backend_domid;
- device.backend_devid = devid;
-
- switch (disk->backend) {
- case LIBXL_DISK_BACKEND_PHY:
- device.backend_kind = LIBXL__DEVICE_KIND_VBD;
- break;
- case LIBXL_DISK_BACKEND_TAP:
- device.backend_kind = LIBXL__DEVICE_KIND_VBD;
- break;
- case LIBXL_DISK_BACKEND_QDISK:
- 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;
- }
- device.domid = domid;
- device.devid = devid;
- device.kind = LIBXL__DEVICE_KIND_VBD;
- if (wait)
- rc = libxl__device_remove(&gc, &device, wait);
- else
- rc = libxl__device_destroy(&gc, &device);
-out_free:
+ int rc;
+
+ rc = libxl__device_from_disk(&gc, domid, disk, &device);
+ if (rc != 0) goto out;
+
+ rc = libxl__device_remove(&gc, &device, 1);
+out:
libxl__free_all(&gc);
return rc;
}

+int libxl_device_disk_destroy(libxl_ctx *ctx, uint32_t domid,
+ libxl_device_disk *disk)
+{
+ libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl__device device;
+ int rc;
+
+ rc = libxl__device_from_disk(&gc, domid, disk, &device);
+ if (rc != 0) goto out;
+
+ rc = libxl__device_destroy(&gc, &device);
+out:
+ libxl__free_all(&gc);
+ return rc;
+}
char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk)
{
libxl__gc gc = LIBXL_INIT_GC(ctx);
@@ -1626,7 +1656,7 @@ static void libxl__device_disk_from_xs_b
unsigned int len;
char *tmp;

- memset(disk, 0, sizeof(*disk));
+ libxl_device_disk_init(ctx, disk);

tmp = xs_read(ctx->xsh, XBT_NULL,
libxl__sprintf(gc, "%s/params", be_path), &len);
@@ -1670,7 +1700,8 @@ int libxl_devid_to_device_disk(libxl_ctx
char *dompath, *path;
int rc = ERROR_FAIL;

- memset(disk, 0, sizeof (libxl_device_disk));
+ libxl_device_disk_init(ctx, disk);
+
dompath = libxl__xs_get_dompath(&gc, domid);
if (!dompath) {
goto out;
@@ -1812,11 +1843,11 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u

ret = 0;

- libxl_device_disk_del(ctx, domid, disks + i, 1);
+ libxl_device_disk_remove(ctx, domid, disks + i);
libxl_device_disk_add(ctx, domid, disk);
stubdomid = libxl_get_stubdom_id(ctx, domid);
if (stubdomid) {
- libxl_device_disk_del(ctx, stubdomid, disks + i, 1);
+ libxl_device_disk_remove(ctx, stubdomid, disks + i);
libxl_device_disk_add(ctx, stubdomid, disk);
}
out:
diff -r 26ef64a0ff19 -r c245f495b53b tools/libxl/libxl.h
--- a/tools/libxl/libxl.h Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl.h Tue Oct 18 13:36:42 2011 +0100
@@ -438,15 +438,27 @@ libxl_vminfo * libxl_list_vm(libxl_ctx *
* This function does not interact with the guest and therefore
* cannot block on the guest.
*/
+
+/* Disks */
+int libxl_device_disk_init(libxl_ctx *ctx, libxl_device_disk *disk);
int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk);
-int libxl_device_disk_del(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, int wait);
+int libxl_device_disk_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk);
+int libxl_device_disk_destroy(libxl_ctx *ctx, uint32_t domid,
+ libxl_device_disk *disk);
+
libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num);
int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,
libxl_device_disk *disk, libxl_diskinfo *diskinfo);
+
+/*
+ * Insert a CD-ROM device. A device corresponding to disk must already
+ * be attached to the guest.
+ */
int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk);

/*
- * Make a disk available in this domain. Returns path to a device.
+ * 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);
int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk *disk);
diff -r 26ef64a0ff19 -r c245f495b53b tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c Tue Oct 18 13:36:42 2011 +0100
@@ -494,7 +494,7 @@ static void parse_disk_config_multistrin
{
int e;

- memset(disk, 0, sizeof(*disk));
+ libxl_device_disk_init(ctx, disk);

if (!*config) {
*config = xlu_cfg_init(stderr, "command line");
@@ -1893,6 +1893,8 @@ static void cd_insert(const char *dom, c
disk.backend_domid = 0;

libxl_cdrom_insert(ctx, domid, &disk);
+
+ libxl_device_disk_dispose(&disk);
free(buf);
}

@@ -4182,8 +4184,8 @@ int main_blockdetach(int argc, char **ar
fprintf(stderr, "Error: Device %s not connected.\n", argv[optind+1]);
return 1;
}
- if (libxl_device_disk_del(ctx, domid, &disk, 1)) {
- fprintf(stderr, "libxl_device_disk_del failed.\n");
+ if (libxl_device_disk_remove(ctx, domid, &disk)) {
+ fprintf(stderr, "libxl_device_disk_remove failed.\n");
}
return 0;
}
diff -r 26ef64a0ff19 -r c245f495b53b tools/ocaml/libs/xl/genwrap.py
--- a/tools/ocaml/libs/xl/genwrap.py Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/ocaml/libs/xl/genwrap.py Tue Oct 18 13:36:42 2011 +0100
@@ -16,6 +16,11 @@ builtins = {
"libxl_hwcap": ("int32 array", None, "Val_hwcap(&%(c)s)"),
}

+DEVICE_FUNCTIONS = [ ("add", ["t", "domid", "unit"]),
+ ("remove", ["t", "domid", "unit"]),
+ ("destroy", ["t", "domid", "unit"]),
+ ]
+
functions = { # ( name , [type1,type2,....] )
"device_vfb": [ ("add", ["t", "domid", "unit"]),
("clean_shutdown", ["domid", "unit"]),
@@ -27,9 +32,7 @@ functions = { # ( name , [type1,type2,..
],
"device_console": [ ("add", ["t", "domid", "unit"]),
],
- "device_disk": [ ("add", ["t", "domid", "unit"]),
- ("del", ["t", "domid", "unit"]),
- ],
+ "device_disk": DEVICE_FUNCTIONS,
"device_nic": [ ("add", ["t", "domid", "unit"]),
("del", ["t", "domid", "unit"]),
],
diff -r 26ef64a0ff19 -r c245f495b53b tools/ocaml/libs/xl/xenlight_stubs.c
--- a/tools/ocaml/libs/xl/xenlight_stubs.c Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c Tue Oct 18 13:36:42 2011 +0100
@@ -247,7 +247,7 @@ value stub_xl_device_disk_del(value info
device_disk_val(&gc, &lg, &c_info, info);

INIT_CTX();
- ret = libxl_device_disk_del(ctx, Int_val(domid), &c_info, 0);
+ ret = libxl_device_disk_remove(ctx, Int_val(domid), &c_info);
if (ret != 0)
failwith_xl("disk_del", &lg);
FREE_CTX();

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel