Mailing List Archive

[PATCH 07 of 15 v5] libxl: execute hotplug scripts directly from libxl
# HG changeset patch
# User Roger Pau Monne <roger.pau@entel.upc.edu>
# Date 1317386335 -7200
# Node ID 1cdbc9b053598abd01cdd039118c07609deeff1a
# Parent 7b68b9415745c8bff5d0148bbf3953f6f083e655
libxl: execute hotplug scripts directly from libxl.

Added the necessary handlers to execute hotplug scripts when necessary
from libxl. Split NetBSD and Linux hotplug calls into two separate
files, because parameters for hotplug scripts are different. Linux
has empty functions, since the calling of hotplug scripts is still
done using udev.

Hotplug scripts in NetBSD are in charge of adding the virtual DomU
network interface to the desired bridge and also mount the vnd device
to use virtual images as block devices. The following scripts are
currently implemented:

* block: executed when a vbd is used, is in charge mounting the
virtual image to the vnd device and setting the state of xenstore
to 4 (connected). When using a physical partition, the script only
sets the state to 4.

* vif-bridge: adds the virtual DomU interface to the desired bridge.

* vif-ip: configures the physical network interface assigned to the
DomU.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 7b68b9415745 -r 1cdbc9b05359 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c Wed Dec 14 13:08:10 2011 +0100
+++ b/tools/libxl/libxl.c Fri Sep 30 14:38:55 2011 +0200
@@ -1023,6 +1023,11 @@ int libxl_device_disk_add(libxl_ctx *ctx
flexarray_append(back, "params");
flexarray_append(back, dev);

+ flexarray_append(back, "script");
+ flexarray_append(back, libxl__sprintf(gc, "%s/%s",
+ libxl_xen_script_dir_path(),
+ "block"));
+
assert(device.backend_kind == LIBXL__DEVICE_KIND_VBD);
break;
case LIBXL_DISK_BACKEND_TAP:
@@ -1099,6 +1104,16 @@ int libxl_device_disk_add(libxl_ctx *ctx
goto out_free;
}
}
+
+ /* Call hotplug scripts to attach device */
+ if (libxl__device_hotplug(gc, &device, CONNECT) < 0) {
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+ "unable to execute hotplug script for disk: %s\n",
+ disk->pdev_path);
+ rc = -1;
+ goto out_free;
+ }
+
rc = 0;

out_free:
@@ -1561,6 +1576,16 @@ int libxl_device_nic_add(libxl_ctx *ctx,
goto out_free;
}
}
+
+ /* Call hotplug scripts to attach device */
+ if (libxl__device_hotplug(gc, &device, CONNECT) < 0) {
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+ "unable to execute hotplug script for nic: %s\n",
+ nic->ifname);
+ rc = -1;
+ goto out_free;
+ }
+
rc = 0;

out_free:
diff -r 7b68b9415745 -r 1cdbc9b05359 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c Wed Dec 14 13:08:10 2011 +0100
+++ b/tools/libxl/libxl_device.c Fri Sep 30 14:38:55 2011 +0200
@@ -448,6 +448,7 @@ int libxl__device_remove(libxl__gc *gc,
if (!state)
goto out;
if (atoi(state) != 4) {
+ libxl__device_hotplug(gc, dev, DISCONNECT);
libxl__device_destroy_tapdisk(gc, be_path);
xs_rm(ctx->xsh, XBT_NULL, be_path);
goto out;
@@ -492,6 +493,12 @@ int libxl__device_destroy(libxl__gc *gc,
char *be_path = libxl__device_backend_path(gc, dev);
char *fe_path = libxl__device_frontend_path(gc, dev);

+ /*
+ * Run hotplug scripts, which will probably not be able to
+ * execute successfully since the device may still be plugged
+ */
+ libxl__device_hotplug(gc, dev, DISCONNECT);
+
xs_rm(ctx->xsh, XBT_NULL, be_path);
xs_rm(ctx->xsh, XBT_NULL, fe_path);

diff -r 7b68b9415745 -r 1cdbc9b05359 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h Wed Dec 14 13:08:10 2011 +0100
+++ b/tools/libxl/libxl_internal.h Fri Sep 30 14:38:55 2011 +0200
@@ -308,6 +308,25 @@ _hidden int libxl__wait_for_device_state
*/
_hidden int libxl__try_phy_backend(mode_t st_mode);

+/* hotplug functions */
+
+/* Action to pass to hotplug caller functions */
+typedef enum {
+ CONNECT = 1,
+ DISCONNECT = 2
+} libxl__hotplug_action;
+
+/*
+ * libxl__device_hotplug - generic function to execute hotplug scripts
+ * gc: allocation pool
+ * dev: reference to the device that executes the hotplug scripts
+ * action: action to execute
+ *
+ * Returns 0 on success, and < 0 on error.
+ */
+_hidden int libxl__device_hotplug(libxl__gc *gc, libxl__device *dev,
+ libxl__hotplug_action action);
+
/* from libxl_pci */

_hidden int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting);
diff -r 7b68b9415745 -r 1cdbc9b05359 tools/libxl/libxl_linux.c
--- a/tools/libxl/libxl_linux.c Wed Dec 14 13:08:10 2011 +0100
+++ b/tools/libxl/libxl_linux.c Fri Sep 30 14:38:55 2011 +0200
@@ -25,3 +25,11 @@ int libxl__try_phy_backend(mode_t st_mod

return 1;
}
+
+/* Hotplug scripts caller functions */
+
+int libxl_device_hotplug(libxl__gc *gc, libxl__device *dev,
+ libxl__hotplug_action action)
+{
+ return 0;
+}
diff -r 7b68b9415745 -r 1cdbc9b05359 tools/libxl/libxl_netbsd.c
--- a/tools/libxl/libxl_netbsd.c Wed Dec 14 13:08:10 2011 +0100
+++ b/tools/libxl/libxl_netbsd.c Fri Sep 30 14:38:55 2011 +0200
@@ -14,6 +14,7 @@
*/

#include <sys/stat.h>
+#include <sys/wait.h>

#include "libxl_internal.h"

@@ -24,3 +25,56 @@ int libxl__try_phy_backend(mode_t st_mod

return 0;
}
+
+/* Hotplug scripts call function */
+
+int libxl__device_hotplug(libxl__gc *gc, libxl__device *dev,
+ libxl__hotplug_action action)
+{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
+ char *be_path = libxl__device_backend_path(gc, dev);
+ char *script, *what;
+ char **args;
+ int status, nr = 0;
+ int rc = -1;
+ flexarray_t *f_args;
+
+ if (dev->kind != LIBXL__DEVICE_KIND_VIF &&
+ dev->kind != LIBXL__DEVICE_KIND_VBD)
+ return 0;
+
+ script = libxl__xs_read(gc, XBT_NULL,
+ libxl__sprintf(gc, "%s/%s", be_path, "script"));
+ if (!script) {
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to read script from %s",
+ be_path);
+ return -1;
+ }
+
+ f_args = flexarray_make(4, 1);
+ if (!f_args)
+ return -1;
+
+ flexarray_set(f_args, nr++, script);
+ flexarray_set(f_args, nr++, be_path);
+ flexarray_set(f_args, nr++, libxl__sprintf(gc, "%d", action));
+ flexarray_set(f_args, nr++, NULL);
+
+ args = (char **) flexarray_contents(f_args);
+
+ what = libxl__sprintf(gc, "%s %s", args[0],
+ action == CONNECT ? "connect" : "disconnect");
+ LIBXL__LOG(ctx, LIBXL__LOG_DEBUG,
+ "Calling hotplug script: %s %s %s",
+ args[0], args[1], args[2]);
+ status = libxl__forkexec(gc, -1, -1, -1, args[0], args, what);
+ if (status) {
+ rc = -1;
+ goto out;
+ }
+ rc = 0;
+
+out:
+ free(args);
+ return rc;
+}

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