aboutsummaryrefslogtreecommitdiff
path: root/util/module.c
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2016-09-22 12:16:51 +0100
committerPeter Maydell <peter.maydell@linaro.org>2016-09-22 12:16:51 +0100
commitffd455ae41772d92a7c52f58eed3fb89f04b6a60 (patch)
tree11bb6115fe6d2ca723c274ace27a48f264434048 /util/module.c
parentb98bbea2d94dc5902acaa3a5dd7f9057cc82cdb1 (diff)
parent819cec0114eeca80444a21f2e3526ef62d729385 (diff)
Merge remote-tracking branch 'remotes/maxreitz/tags/pull-block-2016-09-20' into staging
Block patches for 2.8 # gpg: Signature made Tue 20 Sep 2016 21:29:53 BST # gpg: using RSA key 0xF407DB0061D5CF40 # gpg: Good signature from "Max Reitz <mreitz@redhat.com>" # Primary key fingerprint: 91BE B60A 30DB 3E88 57D1 1829 F407 DB00 61D5 CF40 * remotes/maxreitz/tags/pull-block-2016-09-20: iotest 055: refactor and speed up commit: get the overlay node before manipulating the backing chain blockdev: Modularize nfs block driver blockdev: Add dynamic module loading for block drivers blockdev: Add dynamic generation of module_block.h blockdev: prepare iSCSI block driver for dynamic loading qemu-img: add skip option to dd qemu-img: add the 'dd' subcommand Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'util/module.c')
-rw-r--r--util/module.c38
1 files changed, 11 insertions, 27 deletions
diff --git a/util/module.c b/util/module.c
index 86e3f7aba0..a5f7fbd941 100644
--- a/util/module.c
+++ b/util/module.c
@@ -87,14 +87,11 @@ void register_dso_module_init(void (*fn)(void), module_init_type type)
QTAILQ_INSERT_TAIL(&dso_init_list, e, node);
}
-static void module_load(module_init_type type);
-
void module_call_init(module_init_type type)
{
ModuleTypeList *l;
ModuleEntry *e;
- module_load(type);
l = find_type(type);
QTAILQ_FOREACH(e, l, node) {
@@ -145,6 +142,7 @@ static int module_load_file(const char *fname)
ret = -EINVAL;
} else {
QTAILQ_FOREACH(e, &dso_init_list, node) {
+ e->init();
register_module_init(e->init, e->type);
}
ret = 0;
@@ -159,14 +157,10 @@ out:
}
#endif
-static void module_load(module_init_type type)
+void module_load_one(const char *prefix, const char *lib_name)
{
#ifdef CONFIG_MODULES
char *fname = NULL;
- const char **mp;
- static const char *block_modules[] = {
- CONFIG_BLOCK_MODULES
- };
char *exec_dir;
char *dirs[3];
int i = 0;
@@ -177,15 +171,6 @@ static void module_load(module_init_type type)
return;
}
- switch (type) {
- case MODULE_INIT_BLOCK:
- mp = block_modules;
- break;
- default:
- /* no other types have dynamic modules for now*/
- return;
- }
-
exec_dir = qemu_get_exec_dir();
dirs[i++] = g_strdup_printf("%s", CONFIG_QEMU_MODDIR);
dirs[i++] = g_strdup_printf("%s/..", exec_dir ? : "");
@@ -194,16 +179,15 @@ static void module_load(module_init_type type)
g_free(exec_dir);
exec_dir = NULL;
- for ( ; *mp; mp++) {
- for (i = 0; i < ARRAY_SIZE(dirs); i++) {
- fname = g_strdup_printf("%s/%s%s", dirs[i], *mp, HOST_DSOSUF);
- ret = module_load_file(fname);
- g_free(fname);
- fname = NULL;
- /* Try loading until loaded a module file */
- if (!ret) {
- break;
- }
+ for (i = 0; i < ARRAY_SIZE(dirs); i++) {
+ fname = g_strdup_printf("%s/%s%s%s",
+ dirs[i], prefix, lib_name, HOST_DSOSUF);
+ ret = module_load_file(fname);
+ g_free(fname);
+ fname = NULL;
+ /* Try loading until loaded a module file */
+ if (!ret) {
+ break;
}
}