modprobe: post-remove module deps with 0 refcnt
authorDave Reisner <dreisner@archlinux.org>
Mon, 30 Jan 2012 22:16:50 +0000 (17:16 -0500)
committerLucas De Marchi <lucas.demarchi@profusion.mobi>
Tue, 31 Jan 2012 16:08:57 +0000 (14:08 -0200)
This commit looks shockingly similar to 0e9bd2d1 because SOMEONE decided
to remove it in a872bba in a glorious frenzy of refactoring.

tools/kmod-modprobe.c

index af64b72..764b8bf 100644 (file)
@@ -339,6 +339,7 @@ end:
 static int rmmod_do_remove_module(struct kmod_module *mod)
 {
        const char *modname = kmod_module_get_name(mod);
+       struct kmod_list *deps, *itr;
        int flags = 0, err;
 
        SHOW("rmmod %s\n", kmod_module_get_name(mod));
@@ -357,6 +358,17 @@ static int rmmod_do_remove_module(struct kmod_module *mod)
                        LOG("Module %s is not in kernel.\n", modname);
        }
 
+       deps = kmod_module_get_dependencies(mod);
+       if (deps != NULL) {
+               kmod_list_foreach(itr, deps) {
+                       struct kmod_module *dep = kmod_module_get_module(itr);
+                       if (kmod_module_get_refcnt(dep) == 0)
+                               rmmod_do_remove_module(dep);
+                       kmod_module_unref(dep);
+               }
+               kmod_module_unref_list(deps);
+       }
+
        return err;
 }