[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 13 of 29 RFC] libxl: add hotplug script calls for Linux
# HG changeset patch # User Roger Pau Monne <roger.pau@xxxxxxxxxxxxx> # Date 1328177591 -3600 # Node ID 98a4f01033786a2fc15b4130897c35f64a676e40 # Parent 6c2690921fba580dd7dd836da3be484dee049be0 libxl: add hotplug script calls for Linux This patchs adds the necessary logic to call hotplug scripts directly from libxl. Linux hotplug scritps read most parameters from the caller environment (since udev set this parameters automatically). In this implementation we fake udev parameters, so no changes are needed to the scripts itself. Currently, the following scripts are called: * block: used when disk backend is PHY. * blktap: used when disk backend is TAP. * vif-*: used when adding a network interface and can be manually set by the user. udev rules descrive more device types, currently the following scripts are NOT executed from libxl because I wasn't able to find any support for this device types in libxl: * vtpm * vif2 * vscsi * vif-setup with devices of type tap* This patch just adds the necessary code, but hotplug scripts are NOT called from libxl yet, following patches will disable udev rules and use this calls instead. Signed-off-by: Roger Pau Monne <roger.pau@xxxxxxxxxxxxx> diff -r 6c2690921fba -r 98a4f0103378 tools/libxl/libxl_linux.c --- a/tools/libxl/libxl_linux.c Thu Feb 02 11:10:24 2012 +0100 +++ b/tools/libxl/libxl_linux.c Thu Feb 02 11:13:11 2012 +0100 @@ -26,10 +26,172 @@ int libxl__try_phy_backend(mode_t st_mod return 1; } +/* Hotplug scripts helpers */ +#if 0 +static char **get_hotplug_env(libxl__gc *gc, libxl__device *dev) +{ + libxl_ctx *ctx = libxl__gc_owner(gc); + char *be_path = libxl__device_backend_path(gc, dev); + flexarray_t *f_env; + int nr = 0; + + f_env = flexarray_make(11, 1); + if (!f_env) { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, + "unable to create environment array"); + return NULL; + } + + flexarray_set(f_env, nr++, "script"); + flexarray_set(f_env, nr++, libxl__xs_read(gc, XBT_NULL, + libxl__sprintf(gc, "%s/%s", + be_path, + "script"))); + flexarray_set(f_env, nr++, "XENBUS_TYPE"); + flexarray_set(f_env, nr++, (char *) + libxl__device_kind_to_string(dev->backend_kind)); + flexarray_set(f_env, nr++, "XENBUS_PATH"); + flexarray_set(f_env, nr++, + libxl__sprintf(gc, "backend/%s/%u/%d", + libxl__device_kind_to_string(dev->backend_kind), + dev->domid, dev->devid)); + flexarray_set(f_env, nr++, "XENBUS_BASE_PATH"); + flexarray_set(f_env, nr++, "backend"); + if (dev->backend_kind == LIBXL__DEVICE_KIND_VIF) { + flexarray_set(f_env, nr++, "vif"); + flexarray_set(f_env, nr++, + libxl__sprintf(gc, "%s%u.%d", + libxl__device_kind_to_string(dev->backend_kind), + dev->domid, dev->devid)); + } + flexarray_set(f_env, nr++, NULL); + + return (char **) flexarray_contents(f_env); +} + /* Hotplug scripts caller functions */ +static int libxl__hotplug_nic(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, **env; + int status, nr = 0; + int rc = -1; + flexarray_t *f_args; + + 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; + } + + env = get_hotplug_env(gc, dev); + if (!env) + return -1; + + f_args = flexarray_make(4, 1); + if (!f_args) { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unable to create arguments array"); + return -1; + } + + flexarray_set(f_args, nr++, script); + flexarray_set(f_args, nr++, action == CONNECT ? "online" : "offline"); + flexarray_set(f_args, nr++, "type_if=vif"); + 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, env, what); + if (status) { + rc = -1; + goto out; + } + rc = 0; + +out: + free(env); + free(args); + return rc; +} + +static int libxl__hotplug_disk(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, **env; + int status, nr = 0; + int rc = -1; + flexarray_t *f_args; + + 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; + } + + env = get_hotplug_env(gc, dev); + if (!env) + return -1; + + f_args = flexarray_make(3, 1); + if (!f_args) { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unable to create arguments array"); + return -1; + } + + flexarray_set(f_args, nr++, script); + flexarray_set(f_args, nr++, action == CONNECT ? "add" : "remove"); + 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", + args[0], args[1]); + status = libxl__forkexec(gc, -1, -1, -1, args[0], args, env, what); + if (status) { + rc = -1; + goto out; + } + rc = 0; + +out: + free(env); + free(args); + return rc; +} +#endif /* 0 */ int libxl__device_hotplug(libxl__gc *gc, libxl__device *dev, libxl__hotplug_action action) { - return 0; + int rc = 0; +#if 0 + switch (dev->backend_kind) { + case LIBXL__DEVICE_KIND_VIF: + rc = libxl__hotplug_nic(gc, dev, action); + break; + case LIBXL__DEVICE_KIND_VBD: + rc = libxl__hotplug_disk(gc, dev, action); + break; + default: + rc = 0; + break; + } +#endif /* 0 */ + return rc; } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |