Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 22006
b: refs/heads/master
c: 03e88ae
h: refs/heads/master
v: v3
  • Loading branch information
Greg Kroah-Hartman committed Mar 20, 2006
1 parent e3be443 commit e36caa7
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 57 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b87ba0a33a634c9a8e3609702122a04034a0688d
refs/heads/master: 03e88ae1b13dfdc8bbaa59b8198e1ca53aad12ac
1 change: 1 addition & 0 deletions trunk/include/linux/module.h
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,7 @@ struct module
/* Sysfs stuff. */
struct module_kobject mkobj;
struct module_param_attrs *param_attrs;
struct module_attribute *modinfo_attrs;
const char *version;
const char *srcversion;

Expand Down
77 changes: 31 additions & 46 deletions trunk/kernel/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -429,7 +429,6 @@ static inline void percpu_modcopy(void *pcpudst, const void *src,
}
#endif /* CONFIG_SMP */

#ifdef CONFIG_MODULE_UNLOAD
#define MODINFO_ATTR(field) \
static void setup_modinfo_##field(struct module *mod, const char *s) \
{ \
Expand Down Expand Up @@ -461,12 +460,7 @@ static struct module_attribute modinfo_##field = { \
MODINFO_ATTR(version);
MODINFO_ATTR(srcversion);

static struct module_attribute *modinfo_attrs[] = {
&modinfo_version,
&modinfo_srcversion,
NULL,
};

#ifdef CONFIG_MODULE_UNLOAD
/* Init the unload section of the module. */
static void module_unload_init(struct module *mod)
{
Expand Down Expand Up @@ -781,6 +775,15 @@ static inline void module_unload_init(struct module *mod)
}
#endif /* CONFIG_MODULE_UNLOAD */

static struct module_attribute *modinfo_attrs[] = {
&modinfo_version,
&modinfo_srcversion,
#ifdef CONFIG_MODULE_UNLOAD
&refcnt,
#endif
NULL,
};

#ifdef CONFIG_OBSOLETE_MODPARM
/* Bounds checking done below */
static int obsparm_copy_string(const char *val, struct kernel_param *kp)
Expand Down Expand Up @@ -1106,37 +1109,28 @@ static inline void remove_sect_attrs(struct module *mod)
}
#endif /* CONFIG_KALLSYMS */


#ifdef CONFIG_MODULE_UNLOAD
static inline int module_add_refcnt_attr(struct module *mod)
{
return sysfs_create_file(&mod->mkobj.kobj, &refcnt.attr);
}
static void module_remove_refcnt_attr(struct module *mod)
{
return sysfs_remove_file(&mod->mkobj.kobj, &refcnt.attr);
}
#else
static inline int module_add_refcnt_attr(struct module *mod)
{
return 0;
}
static void module_remove_refcnt_attr(struct module *mod)
{
}
#endif

#ifdef CONFIG_MODULE_UNLOAD
static int module_add_modinfo_attrs(struct module *mod)
{
struct module_attribute *attr;
struct module_attribute *temp_attr;
int error = 0;
int i;

mod->modinfo_attrs = kzalloc((sizeof(struct module_attribute) *
(ARRAY_SIZE(modinfo_attrs) + 1)),
GFP_KERNEL);
if (!mod->modinfo_attrs)
return -ENOMEM;

temp_attr = mod->modinfo_attrs;
for (i = 0; (attr = modinfo_attrs[i]) && !error; i++) {
if (!attr->test ||
(attr->test && attr->test(mod)))
error = sysfs_create_file(&mod->mkobj.kobj,&attr->attr);
(attr->test && attr->test(mod))) {
memcpy(temp_attr, attr, sizeof(*temp_attr));
temp_attr->attr.owner = mod;
error = sysfs_create_file(&mod->mkobj.kobj,&temp_attr->attr);
++temp_attr;
}
}
return error;
}
Expand All @@ -1146,12 +1140,16 @@ static void module_remove_modinfo_attrs(struct module *mod)
struct module_attribute *attr;
int i;

for (i = 0; (attr = modinfo_attrs[i]); i++) {
for (i = 0; (attr = &mod->modinfo_attrs[i]); i++) {
/* pick a field to test for end of list */
if (!attr->attr.name)
break;
sysfs_remove_file(&mod->mkobj.kobj,&attr->attr);
attr->free(mod);
if (attr->free)
attr->free(mod);
}
kfree(mod->modinfo_attrs);
}
#endif

static int mod_sysfs_setup(struct module *mod,
struct kernel_param *kparam,
Expand All @@ -1169,19 +1167,13 @@ static int mod_sysfs_setup(struct module *mod,
if (err)
goto out;

err = module_add_refcnt_attr(mod);
if (err)
goto out_unreg;

err = module_param_sysfs_setup(mod, kparam, num_params);
if (err)
goto out_unreg;

#ifdef CONFIG_MODULE_UNLOAD
err = module_add_modinfo_attrs(mod);
if (err)
goto out_unreg;
#endif

return 0;

Expand All @@ -1193,10 +1185,7 @@ static int mod_sysfs_setup(struct module *mod,

static void mod_kobject_remove(struct module *mod)
{
#ifdef CONFIG_MODULE_UNLOAD
module_remove_modinfo_attrs(mod);
#endif
module_remove_refcnt_attr(mod);
module_param_sysfs_remove(mod);

kobject_unregister(&mod->mkobj.kobj);
Expand Down Expand Up @@ -1474,7 +1463,6 @@ static char *get_modinfo(Elf_Shdr *sechdrs,
return NULL;
}

#ifdef CONFIG_MODULE_UNLOAD
static void setup_modinfo(struct module *mod, Elf_Shdr *sechdrs,
unsigned int infoindex)
{
Expand All @@ -1489,7 +1477,6 @@ static void setup_modinfo(struct module *mod, Elf_Shdr *sechdrs,
attr->attr.name));
}
}
#endif

#ifdef CONFIG_KALLSYMS
int is_exported(const char *name, const struct module *mod)
Expand Down Expand Up @@ -1803,10 +1790,8 @@ static struct module *load_module(void __user *umod,
if (strcmp(mod->name, "driverloader") == 0)
add_taint(TAINT_PROPRIETARY_MODULE);

#ifdef CONFIG_MODULE_UNLOAD
/* Set up MODINFO_ATTR fields */
setup_modinfo(mod, sechdrs, infoindex);
#endif

/* Fix up syms, so that st_value is a pointer to location. */
err = simplify_symbols(sechdrs, symindex, strtab, versindex, pcpuindex,
Expand Down
10 changes: 0 additions & 10 deletions trunk/kernel/params.c
Original file line number Diff line number Diff line change
Expand Up @@ -638,13 +638,8 @@ static ssize_t module_attr_show(struct kobject *kobj,
if (!attribute->show)
return -EIO;

if (!try_module_get(mk->mod))
return -ENODEV;

ret = attribute->show(attribute, mk->mod, buf);

module_put(mk->mod);

return ret;
}

Expand All @@ -662,13 +657,8 @@ static ssize_t module_attr_store(struct kobject *kobj,
if (!attribute->store)
return -EIO;

if (!try_module_get(mk->mod))
return -ENODEV;

ret = attribute->store(attribute, mk->mod, buf, len);

module_put(mk->mod);

return ret;
}

Expand Down

0 comments on commit e36caa7

Please sign in to comment.