module: return success on module load

Let the caller know of load success.

Note that this also changes slightly the behaviour of the function to
try loading on subsequent calls if the previous ones failed.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Marc-André Lureau 2019-07-22 17:13:23 +04:00 committed by Paolo Bonzini
parent 90629122d2
commit 81d8ccb1be
2 changed files with 12 additions and 4 deletions

View File

@ -65,6 +65,6 @@ void register_module_init(void (*fn)(void), module_init_type type);
void register_dso_module_init(void (*fn)(void), module_init_type type); void register_dso_module_init(void (*fn)(void), module_init_type type);
void module_call_init(module_init_type type); void module_call_init(module_init_type type);
void module_load_one(const char *prefix, const char *lib_name); bool module_load_one(const char *prefix, const char *lib_name);
#endif #endif

View File

@ -156,8 +156,10 @@ out:
} }
#endif #endif
void module_load_one(const char *prefix, const char *lib_name) bool module_load_one(const char *prefix, const char *lib_name)
{ {
bool success = false;
#ifdef CONFIG_MODULES #ifdef CONFIG_MODULES
char *fname = NULL; char *fname = NULL;
char *exec_dir; char *exec_dir;
@ -170,7 +172,7 @@ void module_load_one(const char *prefix, const char *lib_name)
if (!g_module_supported()) { if (!g_module_supported()) {
fprintf(stderr, "Module is not supported by system.\n"); fprintf(stderr, "Module is not supported by system.\n");
return; return false;
} }
if (!loaded_modules) { if (!loaded_modules) {
@ -181,7 +183,7 @@ void module_load_one(const char *prefix, const char *lib_name)
if (!g_hash_table_add(loaded_modules, module_name)) { if (!g_hash_table_add(loaded_modules, module_name)) {
g_free(module_name); g_free(module_name);
return; return true;
} }
exec_dir = qemu_get_exec_dir(); exec_dir = qemu_get_exec_dir();
@ -205,13 +207,19 @@ void module_load_one(const char *prefix, const char *lib_name)
fname = NULL; fname = NULL;
/* Try loading until loaded a module file */ /* Try loading until loaded a module file */
if (!ret) { if (!ret) {
success = true;
break; break;
} }
} }
if (!success) {
g_hash_table_remove(loaded_modules, module_name);
}
for (i = 0; i < n_dirs; i++) { for (i = 0; i < n_dirs; i++) {
g_free(dirs[i]); g_free(dirs[i]);
} }
#endif #endif
return success;
} }