# 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>
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
|