On Thu, 2011-06-02 at 23:35 +0100, Marek Marczykowski wrote:
> # HG changeset patch
> # User Marek Marczykowski <marmarek@xxxxxxxxxxxx>
> # Date 1306963204 -7200
> # Node ID 1e3bf3cb3944402e01c57c400a02fe4293153458
> # Parent 10bdf8aa5b8a1cb2178f2b9cbcc9ce2fd5644403
> libxl: "script:" prefix in block device description to setup vbd by hotplug
> scripts
>
> Implements old behaviour of block-attach - only write parameters to xenstore
> and left all work for hotplug scripts. Allows to directly reuse xen block
> scripts (and maybe some custom ones). Example use:
>
> xl block-attach vm "script:nbd 1.1.1.1 9999" xvdg w
>
> Signed-off-by: Marek Marczykowski <marmarek@xxxxxxxxxxxx>
I didn't review this one, I think it probably interacts badly with (or
more likely is obsoleted by) Ian Jackson's recent disk parsing cleanup
series.
Ian.
>
> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
> --- a/tools/libxl/libxl.c
> +++ b/tools/libxl/libxl.c
> @@ -896,6 +896,13 @@
> }
> }
>
> + if (disk->backend == DISK_BACKEND_SCRIPT) {
> + delimiter = strchr(file_name, ':');
> + if (!delimiter)
> + return ERROR_INVAL;
> + return 0;
> + }
> +
> if ( stat(file_name, &stat_buf) != 0 ) {
> LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "failed to stat %s",
> file_name);
> return ERROR_INVAL;
> @@ -965,6 +972,24 @@
>
> device.backend_kind = DEVICE_VBD;
> break;
> + case DISK_BACKEND_SCRIPT:
> + {
> + char *delimiter;
> + backend_type = libxl__strdup(&gc,
> disk->pdev_path);
> + delimiter = strchr(backend_type, ':');
> + if (!delimiter) {
> + rc = ERROR_FAIL;
> + goto out_free;
> + }
> + *delimiter = '\0';
> + flexarray_append(back, "params");
> + flexarray_append(back, delimiter+1);
> + flexarray_append(back, "scripted");
> + flexarray_append(back, "1");
> +
> + device.backend_kind = DEVICE_VBD;
> + }
> + break;
> case DISK_BACKEND_TAP:
> if (libxl__blktap_enabled(&gc) && disk->format !=
> DISK_FORMAT_EMPTY) {
> const char *dev = libxl__blktap_devpath(&gc,
> @@ -1060,7 +1085,7 @@
> device.backend_domid = disk->backend_domid;
> device.backend_devid = devid;
> device.backend_kind =
> - (disk->backend == DISK_BACKEND_PHY) ? DEVICE_VBD : DEVICE_TAP;
> + (disk->backend == DISK_BACKEND_PHY || disk->backend ==
> DISK_BACKEND_SCRIPT) ? DEVICE_VBD : DEVICE_TAP;
> device.domid = disk->domid;
> device.devid = devid;
> device.kind = DEVICE_VBD;
> diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
> --- a/tools/libxl/libxl.h
> +++ b/tools/libxl/libxl.h
> @@ -185,6 +185,7 @@
> DISK_BACKEND_PHY,
> DISK_BACKEND_TAP,
> DISK_BACKEND_QDISK,
> + DISK_BACKEND_SCRIPT,
> } libxl_disk_backend;
>
> typedef enum {
> diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
> --- a/tools/libxl/libxl_device.c
> +++ b/tools/libxl/libxl_device.c
> @@ -139,6 +139,7 @@
> case DISK_BACKEND_QDISK: return "qdisk";
> case DISK_BACKEND_TAP: return "tap";
> case DISK_BACKEND_PHY: return "phy";
> + case DISK_BACKEND_SCRIPT: return "script";
> default: return NULL;
> }
> }
> diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
> --- a/tools/libxl/libxl_utils.c
> +++ b/tools/libxl/libxl_utils.c
> @@ -282,6 +282,8 @@
>
> if (!strcmp(s, "phy")) {
> *backend = DISK_BACKEND_PHY;
> + } else if (!strcmp(s, "script")) {
> + *backend = DISK_BACKEND_SCRIPT;
> } else if (!strcmp(s, "file")) {
> *backend = DISK_BACKEND_TAP;
> } else if (!strcmp(s, "tap")) {
> @@ -553,8 +555,13 @@
> disk->domid = domid;
> be_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc,
> "%s/backend", diskpath));
> disk->pdev_path = strdup(libxl__xs_read(&gc, XBT_NULL,
> libxl__sprintf(&gc, "%s/params", be_path)));
> - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/type",
> be_path));
> - libxl_string_to_backend(ctx, val, &(disk->backend));
> + val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/scripted",
> be_path));
> + if (val && atoi(val))
> + disk->backend = DISK_BACKEND_SCRIPT;
> + else {
> + val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/type",
> be_path));
> + libxl_string_to_backend(ctx, val, &(disk->backend));
> + }
> disk->vdev = strdup(libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc,
> "%s/dev", be_path)));
> val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/removable",
> be_path));
> disk->unpluggable = !strcmp(val, "1");
> diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
> --- a/tools/libxl/xl_cmdimpl.c
> +++ b/tools/libxl/xl_cmdimpl.c
> @@ -481,6 +481,10 @@
> state = DSTATE_PHYSPATH;
> disk->format = DISK_FORMAT_RAW;
> disk->backend = DISK_BACKEND_PHY;
> + }else if ( !strcmp(tok, "script") ) {
> + state = DSTATE_PHYSPATH;
> + disk->format = DISK_FORMAT_RAW;
> + disk->backend = DISK_BACKEND_SCRIPT;
> }else if ( !strcmp(tok, "file") ) {
> state = DSTATE_PHYSPATH;
> disk->format = DISK_FORMAT_RAW;
> @@ -4435,6 +4439,8 @@
> tok = strtok(argv[optind+1], ":");
> if (!strcmp(tok, "phy")) {
> disk.backend = DISK_BACKEND_PHY;
> + } else if (!strcmp(tok, "script")) {
> + disk.backend = DISK_BACKEND_SCRIPT;
> } else if (!strcmp(tok, "file")) {
> disk.backend = DISK_BACKEND_TAP;
> } else if (!strcmp(tok, "tap")) {
>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|