@@ -1086,22 +1086,35 @@ static int mod_sysfs_setup(struct module *mod,
10861086 goto out ;
10871087 kobj_set_kset_s (& mod -> mkobj , module_subsys );
10881088 mod -> mkobj .mod = mod ;
1089- err = kobject_register (& mod -> mkobj .kobj );
1089+
1090+ /* delay uevent until full sysfs population */
1091+ kobject_init (& mod -> mkobj .kobj );
1092+ err = kobject_add (& mod -> mkobj .kobj );
10901093 if (err )
10911094 goto out ;
10921095
1096+ mod -> drivers_dir = kobject_add_dir (& mod -> mkobj .kobj , "drivers" );
1097+ if (!mod -> drivers_dir )
1098+ goto out_unreg ;
1099+
10931100 err = module_param_sysfs_setup (mod , kparam , num_params );
10941101 if (err )
1095- goto out_unreg ;
1102+ goto out_unreg_drivers ;
10961103
10971104 err = module_add_modinfo_attrs (mod );
10981105 if (err )
1099- goto out_unreg ;
1106+ goto out_unreg_param ;
11001107
1108+ kobject_uevent (& mod -> mkobj .kobj , KOBJ_ADD );
11011109 return 0 ;
11021110
1111+ out_unreg_drivers :
1112+ kobject_unregister (mod -> drivers_dir );
1113+ out_unreg_param :
1114+ module_param_sysfs_remove (mod );
11031115out_unreg :
1104- kobject_unregister (& mod -> mkobj .kobj );
1116+ kobject_del (& mod -> mkobj .kobj );
1117+ kobject_put (& mod -> mkobj .kobj );
11051118out :
11061119 return err ;
11071120}
@@ -1110,6 +1123,7 @@ static void mod_kobject_remove(struct module *mod)
11101123{
11111124 module_remove_modinfo_attrs (mod );
11121125 module_param_sysfs_remove (mod );
1126+ kobject_unregister (mod -> drivers_dir );
11131127
11141128 kobject_unregister (& mod -> mkobj .kobj );
11151129}
@@ -2275,11 +2289,14 @@ void print_modules(void)
22752289
22762290void module_add_driver (struct module * mod , struct device_driver * drv )
22772291{
2292+ int no_warn ;
2293+
22782294 if (!mod || !drv )
22792295 return ;
22802296
2281- /* Don't check return code; this call is idempotent */
2282- sysfs_create_link (& drv -> kobj , & mod -> mkobj .kobj , "module" );
2297+ /* Don't check return codes; these calls are idempotent */
2298+ no_warn = sysfs_create_link (& drv -> kobj , & mod -> mkobj .kobj , "module" );
2299+ no_warn = sysfs_create_link (mod -> drivers_dir , & drv -> kobj , drv -> name );
22832300}
22842301EXPORT_SYMBOL (module_add_driver );
22852302
@@ -2288,6 +2305,8 @@ void module_remove_driver(struct device_driver *drv)
22882305 if (!drv )
22892306 return ;
22902307 sysfs_remove_link (& drv -> kobj , "module" );
2308+ if (drv -> owner && drv -> owner -> drivers_dir )
2309+ sysfs_remove_link (drv -> owner -> drivers_dir , drv -> name );
22912310}
22922311EXPORT_SYMBOL (module_remove_driver );
22932312
0 commit comments