]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - kernel/module.c
sysfs: fix /sys/module/*/holders after sysfs logic change
[linux-2.6-omap-h63xx.git] / kernel / module.c
index 55142775c581b47242fde7571aefbf4402513fb0..0ae811785c59dba901eb52d6476113a6e44e4789 100644 (file)
@@ -47,8 +47,6 @@
 #include <asm/cacheflush.h>
 #include <linux/license.h>
 
-extern int module_sysfs_initialized;
-
 #if 0
 #define DEBUGP printk
 #else
@@ -1223,11 +1221,14 @@ int mod_sysfs_init(struct module *mod)
        err = kobject_set_name(&mod->mkobj.kobj, "%s", mod->name);
        if (err)
                goto out;
-       mod->mkobj.kobj.kset = &module_subsys;
+       mod->mkobj.kobj.kset = module_kset;
+       mod->mkobj.kobj.ktype = &module_ktype;
        mod->mkobj.mod = mod;
 
        kobject_init(&mod->mkobj.kobj);
 
+       /* delay uevent until full sysfs population */
+       err = kobject_add(&mod->mkobj.kobj);
 out:
        return err;
 }
@@ -1238,11 +1239,6 @@ int mod_sysfs_setup(struct module *mod,
 {
        int err;
 
-       /* delay uevent until full sysfs population */
-       err = kobject_add(&mod->mkobj.kobj);
-       if (err)
-               goto out;
-
        mod->holders_dir = kobject_create_and_add("holders", &mod->mkobj.kobj);
        if (!mod->holders_dir) {
                err = -ENOMEM;
@@ -1267,7 +1263,6 @@ out_unreg_holders:
 out_unreg:
        kobject_del(&mod->mkobj.kobj);
        kobject_put(&mod->mkobj.kobj);
-out:
        return err;
 }
 #endif
@@ -1884,10 +1879,10 @@ static struct module *load_module(void __user *umod,
        /* Now we've moved module, initialize linked lists, etc. */
        module_unload_init(mod);
 
-       /* Initialize kobject, so we can reference it. */
+       /* add kobject, so we can reference it. */
        err = mod_sysfs_init(mod);
        if (err)
-               goto cleanup;
+               goto free_unload;
 
        /* Set up license info based on the info section */
        set_license(mod, get_modinfo(sechdrs, infoindex, "license"));
@@ -2057,6 +2052,9 @@ static struct module *load_module(void __user *umod,
  arch_cleanup:
        module_arch_cleanup(mod);
  cleanup:
+       kobject_del(&mod->mkobj.kobj);
+       kobject_put(&mod->mkobj.kobj);
+ free_unload:
        module_unload_free(mod);
        module_free(mod, mod->module_init);
  free_core:
@@ -2502,93 +2500,6 @@ void print_modules(void)
        printk("\n");
 }
 
-#ifdef CONFIG_SYSFS
-static char *make_driver_name(struct device_driver *drv)
-{
-       char *driver_name;
-
-       driver_name = kmalloc(strlen(drv->name) + strlen(drv->bus->name) + 2,
-                             GFP_KERNEL);
-       if (!driver_name)
-               return NULL;
-
-       sprintf(driver_name, "%s:%s", drv->bus->name, drv->name);
-       return driver_name;
-}
-
-static void module_create_drivers_dir(struct module_kobject *mk)
-{
-       if (!mk || mk->drivers_dir)
-               return;
-
-       mk->drivers_dir = kobject_create_and_add("drivers", &mk->kobj);
-}
-
-void module_add_driver(struct module *mod, struct device_driver *drv)
-{
-       char *driver_name;
-       int no_warn;
-       struct module_kobject *mk = NULL;
-
-       if (!drv)
-               return;
-
-       if (mod)
-               mk = &mod->mkobj;
-       else if (drv->mod_name) {
-               struct kobject *mkobj;
-
-               /* Lookup built-in module entry in /sys/modules */
-               mkobj = kset_find_obj(&module_subsys, drv->mod_name);
-               if (mkobj) {
-                       mk = container_of(mkobj, struct module_kobject, kobj);
-                       /* remember our module structure */
-                       drv->mkobj = mk;
-                       /* kset_find_obj took a reference */
-                       kobject_put(mkobj);
-               }
-       }
-
-       if (!mk)
-               return;
-
-       /* Don't check return codes; these calls are idempotent */
-       no_warn = sysfs_create_link(&drv->kobj, &mk->kobj, "module");
-       driver_name = make_driver_name(drv);
-       if (driver_name) {
-               module_create_drivers_dir(mk);
-               no_warn = sysfs_create_link(mk->drivers_dir, &drv->kobj,
-                                           driver_name);
-               kfree(driver_name);
-       }
-}
-EXPORT_SYMBOL(module_add_driver);
-
-void module_remove_driver(struct device_driver *drv)
-{
-       struct module_kobject *mk = NULL;
-       char *driver_name;
-
-       if (!drv)
-               return;
-
-       sysfs_remove_link(&drv->kobj, "module");
-
-       if (drv->owner)
-               mk = &drv->owner->mkobj;
-       else if (drv->mkobj)
-               mk = drv->mkobj;
-       if (mk && mk->drivers_dir) {
-               driver_name = make_driver_name(drv);
-               if (driver_name) {
-                       sysfs_remove_link(mk->drivers_dir, driver_name);
-                       kfree(driver_name);
-               }
-       }
-}
-EXPORT_SYMBOL(module_remove_driver);
-#endif
-
 #ifdef CONFIG_MODVERSIONS
 /* Generate the signature for struct module here, too, for modversions. */
 void struct_module(struct module *mod) { return; }