diff options
-rw-r--r-- | docs/man/xl.conf.pod.5 | 8 | ||||
-rw-r--r-- | tools/examples/xl.conf | 5 | ||||
-rw-r--r-- | tools/libxl/libxl_create.c | 40 | ||||
-rw-r--r-- | tools/libxl/libxl_dm.c | 3 | ||||
-rw-r--r-- | tools/libxl/libxl_internal.c | 19 | ||||
-rw-r--r-- | tools/libxl/libxl_internal.h | 3 | ||||
-rw-r--r-- | tools/libxl/libxl_types.idl | 1 | ||||
-rw-r--r-- | tools/libxl/xl.c | 4 | ||||
-rw-r--r-- | tools/libxl/xl.h | 1 | ||||
-rw-r--r-- | tools/libxl/xl_cmdimpl.c | 1 |
10 files changed, 84 insertions, 1 deletions
diff --git a/docs/man/xl.conf.pod.5 b/docs/man/xl.conf.pod.5 index 149430c61e..23932bea63 100644 --- a/docs/man/xl.conf.pod.5 +++ b/docs/man/xl.conf.pod.5 @@ -55,6 +55,14 @@ default. Default: C<1> +=item B<run_hotplug_scripts=BOOLEAN> + +If disabled hotplug scripts will be called from udev, as it used to +be in the previous releases. With the default option, hotplug scripts +will be launched by xl directly. + +Default: C<1> + =item B<lockfile="PATH"> Sets the path to the lock file used by xl to serialise certain diff --git a/tools/examples/xl.conf b/tools/examples/xl.conf index ebf057c37a..28ab796ea3 100644 --- a/tools/examples/xl.conf +++ b/tools/examples/xl.conf @@ -15,3 +15,8 @@ # first block device to be used for temporary VM disk mounts #blkdev_start="xvda" + +# default option to run hotplug scripts from xl +# if disabled the old behaviour will be used, and hotplug scripts will be +# launched by udev. +#run_hotplug_scripts=1 diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 707e7dd728..b9dd547c6a 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -70,6 +70,8 @@ int libxl__domain_create_info_setdefault(libxl__gc *gc, libxl_defbool_setdefault(&c_info->oos, true); } + libxl_defbool_setdefault(&c_info->run_hotplug_scripts, true); + return 0; } @@ -384,7 +386,7 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_create_info *info, uint32_t *domid) { libxl_ctx *ctx = libxl__gc_owner(gc); - int flags, ret, rc; + int flags, ret, rc, nb_vm; char *uuid_string; char *dom_path, *vm_path, *libxl_path; struct xs_permissions roperm[2]; @@ -392,6 +394,7 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_create_info *info, struct xs_permissions noperm[1]; xs_transaction_t t = 0; xen_domain_handle_t handle; + libxl_vminfo *vm_list; assert(!libxl_domid_valid_guest(*domid)); @@ -505,6 +508,41 @@ retry_transaction: libxl__sprintf(gc, "%s/hvmloader/generation-id-address", dom_path), rwperm, ARRAY_SIZE(rwperm)); + vm_list = libxl_list_vm(ctx, &nb_vm); + if (!vm_list) { + LOG(ERROR, "cannot get number of running guests"); + rc = ERROR_FAIL; + goto out; + } + libxl_vminfo_list_free(vm_list, nb_vm); + int hotplug_setting = libxl__hotplug_settings(gc, t); + if (hotplug_setting < 0) { + LOG(ERROR, "unable to get current hotplug scripts execution setting"); + rc = ERROR_FAIL; + goto out; + } + if (libxl_defbool_val(info->run_hotplug_scripts) != hotplug_setting && + (nb_vm - 1)) { + LOG(ERROR, "cannot change hotplug execution option once set, " + "please shutdown all guests before changing it"); + rc = ERROR_FAIL; + goto out; + } + + if (libxl_defbool_val(info->run_hotplug_scripts)) { + rc = libxl__xs_write_checked(gc, t, DISABLE_UDEV_PATH, "1"); + if (rc) { + LOGE(ERROR, "unable to write %s = 1", DISABLE_UDEV_PATH); + goto out; + } + } else { + rc = libxl__xs_rm_checked(gc, t, DISABLE_UDEV_PATH); + if (rc) { + LOGE(ERROR, "unable to delete %s", DISABLE_UDEV_PATH); + goto out; + } + } + xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/uuid", vm_path), uuid_string, strlen(uuid_string)); xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/name", vm_path), info->name, strlen(info->name)); diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index 1b17ef516f..dec7c19661 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -785,6 +785,9 @@ void libxl__spawn_stub_dm(libxl__egc *egc, libxl__stub_dm_spawn_state *sdss) libxl__dm_vifs_from_hvm_guest_config(gc, guest_config, dm_config); + dm_config->c_info.run_hotplug_scripts = + guest_config->c_info.run_hotplug_scripts; + ret = libxl__domain_create_info_setdefault(gc, &dm_config->c_info); if (ret) goto out; ret = libxl__domain_build_info_setdefault(gc, &dm_config->b_info); diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c index 24099f59f6..211c8f5e2f 100644 --- a/tools/libxl/libxl_internal.c +++ b/tools/libxl/libxl_internal.c @@ -352,6 +352,25 @@ int libxl__device_model_version_running(libxl__gc *gc, uint32_t domid) return value; } +int libxl__hotplug_settings(libxl__gc *gc, xs_transaction_t t) +{ + int rc = 0; + char *val; + + val = libxl__xs_read(gc, t, DISABLE_UDEV_PATH); + if (!val && errno != ENOENT) { + LOGE(ERROR, "cannot read %s from xenstore", DISABLE_UDEV_PATH); + rc = ERROR_FAIL; + goto out; + } + if (!val) val = "0"; + + rc = !!atoi(val); + +out: + return rc; +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index e89f37c296..1ac681db55 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -91,6 +91,7 @@ #define STUBDOM_CONSOLE_SERIAL 3 #define STUBDOM_SPECIAL_CONSOLES 3 #define TAP_DEVICE_SUFFIX "-emu" +#define DISABLE_UDEV_PATH "libxl/disable_udev" #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) @@ -1510,6 +1511,8 @@ _hidden libxl__json_object *libxl__json_parse(libxl__gc *gc, const char *s); * default is qemu xen traditional */ _hidden int libxl__device_model_version_running(libxl__gc *gc, uint32_t domid); +/* Check how executes hotplug script currently */ +int libxl__hotplug_settings(libxl__gc *gc, xs_transaction_t t); /* * Calling context and GC for event-generating functions: diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index c1815c6c00..daa8c790ed 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -231,6 +231,7 @@ libxl_domain_create_info = Struct("domain_create_info",[ ("xsdata", libxl_key_value_list), ("platformdata", libxl_key_value_list), ("poolid", uint32), + ("run_hotplug_scripts",libxl_defbool), ], dir=DIR_IN) MemKB = UInt(64, init_val = "LIBXL_MEMKB_DEFAULT") diff --git a/tools/libxl/xl.c b/tools/libxl/xl.c index d6f2b3ead2..f31e836e87 100644 --- a/tools/libxl/xl.c +++ b/tools/libxl/xl.c @@ -39,6 +39,7 @@ int dryrun_only; int force_execution; int autoballoon = 1; char *blkdev_start; +int run_hotplug_scripts = 1; char *lockfile; char *default_vifscript = NULL; char *default_bridge = NULL; @@ -70,6 +71,9 @@ static void parse_global_config(const char *configfile, if (!xlu_cfg_get_long (config, "autoballoon", &l, 0)) autoballoon = l; + if (!xlu_cfg_get_long (config, "run_hotplug_scripts", &l, 0)) + run_hotplug_scripts = l; + if (!xlu_cfg_get_string (config, "lockfile", &buf, 0)) lockfile = strdup(buf); else { diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h index b0ba357d3c..0b2f848f90 100644 --- a/tools/libxl/xl.h +++ b/tools/libxl/xl.h @@ -140,6 +140,7 @@ int xl_child_pid(xlchildnum); /* returns 0 if child struct is not in use */ /* global options */ extern int autoballoon; +extern int run_hotplug_scripts; extern int dryrun_only; extern char *lockfile; extern char *default_vifscript; diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 72892f3dfd..a7dc3403d1 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -595,6 +595,7 @@ static void parse_config_data(const char *config_source, } } + libxl_defbool_set(&c_info->run_hotplug_scripts, run_hotplug_scripts); c_info->type = LIBXL_DOMAIN_TYPE_PV; if (!xlu_cfg_get_string (config, "builder", &buf, 0) && !strncmp(buf, "hvm", strlen(buf))) |