[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 10 of 10] libxl: "script:" prefix in block device description to setup vbd by hotplug scripts



# 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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.