1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * module.c - module sysfs fun for drivers 4 * 5 * This file is released under the GPLv2 6 * 7 */ 8 #include <linux/device.h> 9 #include <linux/module.h> 10 #include <linux/errno.h> 11 #include <linux/slab.h> 12 #include <linux/string.h> 13 #include "base.h" 14 15 static char *make_driver_name(struct device_driver *drv) 16 { 17 char *driver_name; 18 19 driver_name = kasprintf(GFP_KERNEL, "%s:%s", drv->bus->name, drv->name); 20 if (!driver_name) 21 return NULL; 22 23 return driver_name; 24 } 25 26 static void module_create_drivers_dir(struct module_kobject *mk) 27 { 28 static DEFINE_MUTEX(drivers_dir_mutex); 29 30 mutex_lock(&drivers_dir_mutex); 31 if (mk && !mk->drivers_dir) 32 mk->drivers_dir = kobject_create_and_add("drivers", &mk->kobj); 33 mutex_unlock(&drivers_dir_mutex); 34 } 35 36 void module_add_driver(struct module *mod, struct device_driver *drv) 37 { 38 char *driver_name; 39 int no_warn; 40 struct module_kobject *mk = NULL; 41 42 if (!drv) 43 return; 44 45 if (mod) 46 mk = &mod->mkobj; 47 else if (drv->mod_name) { 48 struct kobject *mkobj; 49 50 /* Lookup built-in module entry in /sys/modules */ 51 mkobj = kset_find_obj(module_kset, drv->mod_name); 52 if (mkobj) { 53 mk = container_of(mkobj, struct module_kobject, kobj); 54 /* remember our module structure */ 55 drv->p->mkobj = mk; 56 /* kset_find_obj took a reference */ 57 kobject_put(mkobj); 58 } 59 } 60 61 if (!mk) 62 return; 63 64 /* Don't check return codes; these calls are idempotent */ 65 no_warn = sysfs_create_link(&drv->p->kobj, &mk->kobj, "module"); 66 driver_name = make_driver_name(drv); 67 if (driver_name) { 68 module_create_drivers_dir(mk); 69 no_warn = sysfs_create_link(mk->drivers_dir, &drv->p->kobj, 70 driver_name); 71 kfree(driver_name); 72 } 73 } 74 75 void module_remove_driver(struct device_driver *drv) 76 { 77 struct module_kobject *mk = NULL; 78 char *driver_name; 79 80 if (!drv) 81 return; 82 83 sysfs_remove_link(&drv->p->kobj, "module"); 84 85 if (drv->owner) 86 mk = &drv->owner->mkobj; 87 else if (drv->p->mkobj) 88 mk = drv->p->mkobj; 89 if (mk && mk->drivers_dir) { 90 driver_name = make_driver_name(drv); 91 if (driver_name) { 92 sysfs_remove_link(mk->drivers_dir, driver_name); 93 kfree(driver_name); 94 } 95 } 96 } 97