diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/ksysfs.c | 82 | ||||
-rw-r--r-- | kernel/module.c | 128 | ||||
-rw-r--r-- | kernel/params.c | 44 | ||||
-rw-r--r-- | kernel/power/disk.c | 20 | ||||
-rw-r--r-- | kernel/power/main.c | 23 | ||||
-rw-r--r-- | kernel/power/power.h | 4 | ||||
-rw-r--r-- | kernel/rtmutex-tester.c | 2 | ||||
-rw-r--r-- | kernel/time/clocksource.c | 2 | ||||
-rw-r--r-- | kernel/time/timekeeping.c | 2 | ||||
-rw-r--r-- | kernel/user.c | 107 |
10 files changed, 163 insertions, 251 deletions
diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c index 65daa5373ca6..e53bc30e9ba5 100644 --- a/kernel/ksysfs.c +++ b/kernel/ksysfs.c | |||
@@ -17,30 +17,34 @@ | |||
17 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
18 | 18 | ||
19 | #define KERNEL_ATTR_RO(_name) \ | 19 | #define KERNEL_ATTR_RO(_name) \ |
20 | static struct subsys_attribute _name##_attr = __ATTR_RO(_name) | 20 | static struct kobj_attribute _name##_attr = __ATTR_RO(_name) |
21 | 21 | ||
22 | #define KERNEL_ATTR_RW(_name) \ | 22 | #define KERNEL_ATTR_RW(_name) \ |
23 | static struct subsys_attribute _name##_attr = \ | 23 | static struct kobj_attribute _name##_attr = \ |
24 | __ATTR(_name, 0644, _name##_show, _name##_store) | 24 | __ATTR(_name, 0644, _name##_show, _name##_store) |
25 | 25 | ||
26 | #if defined(CONFIG_HOTPLUG) && defined(CONFIG_NET) | 26 | #if defined(CONFIG_HOTPLUG) && defined(CONFIG_NET) |
27 | /* current uevent sequence number */ | 27 | /* current uevent sequence number */ |
28 | static ssize_t uevent_seqnum_show(struct kset *kset, char *page) | 28 | static ssize_t uevent_seqnum_show(struct kobject *kobj, |
29 | struct kobj_attribute *attr, char *buf) | ||
29 | { | 30 | { |
30 | return sprintf(page, "%llu\n", (unsigned long long)uevent_seqnum); | 31 | return sprintf(buf, "%llu\n", (unsigned long long)uevent_seqnum); |
31 | } | 32 | } |
32 | KERNEL_ATTR_RO(uevent_seqnum); | 33 | KERNEL_ATTR_RO(uevent_seqnum); |
33 | 34 | ||
34 | /* uevent helper program, used during early boo */ | 35 | /* uevent helper program, used during early boo */ |
35 | static ssize_t uevent_helper_show(struct kset *kset, char *page) | 36 | static ssize_t uevent_helper_show(struct kobject *kobj, |
37 | struct kobj_attribute *attr, char *buf) | ||
36 | { | 38 | { |
37 | return sprintf(page, "%s\n", uevent_helper); | 39 | return sprintf(buf, "%s\n", uevent_helper); |
38 | } | 40 | } |
39 | static ssize_t uevent_helper_store(struct kset *kset, const char *page, size_t count) | 41 | static ssize_t uevent_helper_store(struct kobject *kobj, |
42 | struct kobj_attribute *attr, | ||
43 | const char *buf, size_t count) | ||
40 | { | 44 | { |
41 | if (count+1 > UEVENT_HELPER_PATH_LEN) | 45 | if (count+1 > UEVENT_HELPER_PATH_LEN) |
42 | return -ENOENT; | 46 | return -ENOENT; |
43 | memcpy(uevent_helper, page, count); | 47 | memcpy(uevent_helper, buf, count); |
44 | uevent_helper[count] = '\0'; | 48 | uevent_helper[count] = '\0'; |
45 | if (count && uevent_helper[count-1] == '\n') | 49 | if (count && uevent_helper[count-1] == '\n') |
46 | uevent_helper[count-1] = '\0'; | 50 | uevent_helper[count-1] = '\0'; |
@@ -50,21 +54,24 @@ KERNEL_ATTR_RW(uevent_helper); | |||
50 | #endif | 54 | #endif |
51 | 55 | ||
52 | #ifdef CONFIG_KEXEC | 56 | #ifdef CONFIG_KEXEC |
53 | static ssize_t kexec_loaded_show(struct kset *kset, char *page) | 57 | static ssize_t kexec_loaded_show(struct kobject *kobj, |
58 | struct kobj_attribute *attr, char *buf) | ||
54 | { | 59 | { |
55 | return sprintf(page, "%d\n", !!kexec_image); | 60 | return sprintf(buf, "%d\n", !!kexec_image); |
56 | } | 61 | } |
57 | KERNEL_ATTR_RO(kexec_loaded); | 62 | KERNEL_ATTR_RO(kexec_loaded); |
58 | 63 | ||
59 | static ssize_t kexec_crash_loaded_show(struct kset *kset, char *page) | 64 | static ssize_t kexec_crash_loaded_show(struct kobject *kobj, |
65 | struct kobj_attribute *attr, char *buf) | ||
60 | { | 66 | { |
61 | return sprintf(page, "%d\n", !!kexec_crash_image); | 67 | return sprintf(buf, "%d\n", !!kexec_crash_image); |
62 | } | 68 | } |
63 | KERNEL_ATTR_RO(kexec_crash_loaded); | 69 | KERNEL_ATTR_RO(kexec_crash_loaded); |
64 | 70 | ||
65 | static ssize_t vmcoreinfo_show(struct kset *kset, char *page) | 71 | static ssize_t vmcoreinfo_show(struct kobject *kobj, |
72 | struct kobj_attribute *attr, char *buf) | ||
66 | { | 73 | { |
67 | return sprintf(page, "%lx %x\n", | 74 | return sprintf(buf, "%lx %x\n", |
68 | paddr_vmcoreinfo_note(), | 75 | paddr_vmcoreinfo_note(), |
69 | (unsigned int)vmcoreinfo_max_size); | 76 | (unsigned int)vmcoreinfo_max_size); |
70 | } | 77 | } |
@@ -94,8 +101,8 @@ static struct bin_attribute notes_attr = { | |||
94 | .read = ¬es_read, | 101 | .read = ¬es_read, |
95 | }; | 102 | }; |
96 | 103 | ||
97 | decl_subsys(kernel, NULL, NULL); | 104 | struct kobject *kernel_kobj; |
98 | EXPORT_SYMBOL_GPL(kernel_subsys); | 105 | EXPORT_SYMBOL_GPL(kernel_kobj); |
99 | 106 | ||
100 | static struct attribute * kernel_attrs[] = { | 107 | static struct attribute * kernel_attrs[] = { |
101 | #if defined(CONFIG_HOTPLUG) && defined(CONFIG_NET) | 108 | #if defined(CONFIG_HOTPLUG) && defined(CONFIG_NET) |
@@ -116,24 +123,39 @@ static struct attribute_group kernel_attr_group = { | |||
116 | 123 | ||
117 | static int __init ksysfs_init(void) | 124 | static int __init ksysfs_init(void) |
118 | { | 125 | { |
119 | int error = subsystem_register(&kernel_subsys); | 126 | int error; |
120 | if (!error) | ||
121 | error = sysfs_create_group(&kernel_subsys.kobj, | ||
122 | &kernel_attr_group); | ||
123 | 127 | ||
124 | if (!error && notes_size > 0) { | 128 | kernel_kobj = kobject_create_and_add("kernel", NULL); |
125 | notes_attr.size = notes_size; | 129 | if (!kernel_kobj) { |
126 | error = sysfs_create_bin_file(&kernel_subsys.kobj, | 130 | error = -ENOMEM; |
127 | ¬es_attr); | 131 | goto exit; |
128 | } | 132 | } |
133 | error = sysfs_create_group(kernel_kobj, &kernel_attr_group); | ||
134 | if (error) | ||
135 | goto kset_exit; | ||
129 | 136 | ||
130 | /* | 137 | if (notes_size > 0) { |
131 | * Create "/sys/kernel/uids" directory and corresponding root user's | 138 | notes_attr.size = notes_size; |
132 | * directory under it. | 139 | error = sysfs_create_bin_file(kernel_kobj, ¬es_attr); |
133 | */ | 140 | if (error) |
134 | if (!error) | 141 | goto group_exit; |
135 | error = uids_kobject_init(); | 142 | } |
136 | 143 | ||
144 | /* create the /sys/kernel/uids/ directory */ | ||
145 | error = uids_sysfs_init(); | ||
146 | if (error) | ||
147 | goto notes_exit; | ||
148 | |||
149 | return 0; | ||
150 | |||
151 | notes_exit: | ||
152 | if (notes_size > 0) | ||
153 | sysfs_remove_bin_file(kernel_kobj, ¬es_attr); | ||
154 | group_exit: | ||
155 | sysfs_remove_group(kernel_kobj, &kernel_attr_group); | ||
156 | kset_exit: | ||
157 | kobject_put(kernel_kobj); | ||
158 | exit: | ||
137 | return error; | 159 | return error; |
138 | } | 160 | } |
139 | 161 | ||
diff --git a/kernel/module.c b/kernel/module.c index c2e3e2e98801..dcb8a2cbf75e 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -47,8 +47,6 @@ | |||
47 | #include <asm/cacheflush.h> | 47 | #include <asm/cacheflush.h> |
48 | #include <linux/license.h> | 48 | #include <linux/license.h> |
49 | 49 | ||
50 | extern int module_sysfs_initialized; | ||
51 | |||
52 | #if 0 | 50 | #if 0 |
53 | #define DEBUGP printk | 51 | #define DEBUGP printk |
54 | #else | 52 | #else |
@@ -1122,7 +1120,7 @@ static void add_notes_attrs(struct module *mod, unsigned int nsect, | |||
1122 | ++loaded; | 1120 | ++loaded; |
1123 | } | 1121 | } |
1124 | 1122 | ||
1125 | notes_attrs->dir = kobject_add_dir(&mod->mkobj.kobj, "notes"); | 1123 | notes_attrs->dir = kobject_create_and_add("notes", &mod->mkobj.kobj); |
1126 | if (!notes_attrs->dir) | 1124 | if (!notes_attrs->dir) |
1127 | goto out; | 1125 | goto out; |
1128 | 1126 | ||
@@ -1219,15 +1217,16 @@ int mod_sysfs_init(struct module *mod) | |||
1219 | err = -EINVAL; | 1217 | err = -EINVAL; |
1220 | goto out; | 1218 | goto out; |
1221 | } | 1219 | } |
1222 | memset(&mod->mkobj.kobj, 0, sizeof(mod->mkobj.kobj)); | ||
1223 | err = kobject_set_name(&mod->mkobj.kobj, "%s", mod->name); | ||
1224 | if (err) | ||
1225 | goto out; | ||
1226 | kobj_set_kset_s(&mod->mkobj, module_subsys); | ||
1227 | mod->mkobj.mod = mod; | 1220 | mod->mkobj.mod = mod; |
1228 | 1221 | ||
1229 | kobject_init(&mod->mkobj.kobj); | 1222 | memset(&mod->mkobj.kobj, 0, sizeof(mod->mkobj.kobj)); |
1223 | mod->mkobj.kobj.kset = module_kset; | ||
1224 | err = kobject_init_and_add(&mod->mkobj.kobj, &module_ktype, NULL, | ||
1225 | "%s", mod->name); | ||
1226 | if (err) | ||
1227 | kobject_put(&mod->mkobj.kobj); | ||
1230 | 1228 | ||
1229 | /* delay uevent until full sysfs population */ | ||
1231 | out: | 1230 | out: |
1232 | return err; | 1231 | return err; |
1233 | } | 1232 | } |
@@ -1238,12 +1237,7 @@ int mod_sysfs_setup(struct module *mod, | |||
1238 | { | 1237 | { |
1239 | int err; | 1238 | int err; |
1240 | 1239 | ||
1241 | /* delay uevent until full sysfs population */ | 1240 | mod->holders_dir = kobject_create_and_add("holders", &mod->mkobj.kobj); |
1242 | err = kobject_add(&mod->mkobj.kobj); | ||
1243 | if (err) | ||
1244 | goto out; | ||
1245 | |||
1246 | mod->holders_dir = kobject_add_dir(&mod->mkobj.kobj, "holders"); | ||
1247 | if (!mod->holders_dir) { | 1241 | if (!mod->holders_dir) { |
1248 | err = -ENOMEM; | 1242 | err = -ENOMEM; |
1249 | goto out_unreg; | 1243 | goto out_unreg; |
@@ -1263,11 +1257,9 @@ int mod_sysfs_setup(struct module *mod, | |||
1263 | out_unreg_param: | 1257 | out_unreg_param: |
1264 | module_param_sysfs_remove(mod); | 1258 | module_param_sysfs_remove(mod); |
1265 | out_unreg_holders: | 1259 | out_unreg_holders: |
1266 | kobject_unregister(mod->holders_dir); | 1260 | kobject_put(mod->holders_dir); |
1267 | out_unreg: | 1261 | out_unreg: |
1268 | kobject_del(&mod->mkobj.kobj); | ||
1269 | kobject_put(&mod->mkobj.kobj); | 1262 | kobject_put(&mod->mkobj.kobj); |
1270 | out: | ||
1271 | return err; | 1263 | return err; |
1272 | } | 1264 | } |
1273 | #endif | 1265 | #endif |
@@ -1276,9 +1268,9 @@ static void mod_kobject_remove(struct module *mod) | |||
1276 | { | 1268 | { |
1277 | module_remove_modinfo_attrs(mod); | 1269 | module_remove_modinfo_attrs(mod); |
1278 | module_param_sysfs_remove(mod); | 1270 | module_param_sysfs_remove(mod); |
1279 | kobject_unregister(mod->mkobj.drivers_dir); | 1271 | kobject_put(mod->mkobj.drivers_dir); |
1280 | kobject_unregister(mod->holders_dir); | 1272 | kobject_put(mod->holders_dir); |
1281 | kobject_unregister(&mod->mkobj.kobj); | 1273 | kobject_put(&mod->mkobj.kobj); |
1282 | } | 1274 | } |
1283 | 1275 | ||
1284 | /* | 1276 | /* |
@@ -1884,10 +1876,10 @@ static struct module *load_module(void __user *umod, | |||
1884 | /* Now we've moved module, initialize linked lists, etc. */ | 1876 | /* Now we've moved module, initialize linked lists, etc. */ |
1885 | module_unload_init(mod); | 1877 | module_unload_init(mod); |
1886 | 1878 | ||
1887 | /* Initialize kobject, so we can reference it. */ | 1879 | /* add kobject, so we can reference it. */ |
1888 | err = mod_sysfs_init(mod); | 1880 | err = mod_sysfs_init(mod); |
1889 | if (err) | 1881 | if (err) |
1890 | goto cleanup; | 1882 | goto free_unload; |
1891 | 1883 | ||
1892 | /* Set up license info based on the info section */ | 1884 | /* Set up license info based on the info section */ |
1893 | set_license(mod, get_modinfo(sechdrs, infoindex, "license")); | 1885 | set_license(mod, get_modinfo(sechdrs, infoindex, "license")); |
@@ -2057,6 +2049,9 @@ static struct module *load_module(void __user *umod, | |||
2057 | arch_cleanup: | 2049 | arch_cleanup: |
2058 | module_arch_cleanup(mod); | 2050 | module_arch_cleanup(mod); |
2059 | cleanup: | 2051 | cleanup: |
2052 | kobject_del(&mod->mkobj.kobj); | ||
2053 | kobject_put(&mod->mkobj.kobj); | ||
2054 | free_unload: | ||
2060 | module_unload_free(mod); | 2055 | module_unload_free(mod); |
2061 | module_free(mod, mod->module_init); | 2056 | module_free(mod, mod->module_init); |
2062 | free_core: | 2057 | free_core: |
@@ -2502,93 +2497,6 @@ void print_modules(void) | |||
2502 | printk("\n"); | 2497 | printk("\n"); |
2503 | } | 2498 | } |
2504 | 2499 | ||
2505 | #ifdef CONFIG_SYSFS | ||
2506 | static char *make_driver_name(struct device_driver *drv) | ||
2507 | { | ||
2508 | char *driver_name; | ||
2509 | |||
2510 | driver_name = kmalloc(strlen(drv->name) + strlen(drv->bus->name) + 2, | ||
2511 | GFP_KERNEL); | ||
2512 | if (!driver_name) | ||
2513 | return NULL; | ||
2514 | |||
2515 | sprintf(driver_name, "%s:%s", drv->bus->name, drv->name); | ||
2516 | return driver_name; | ||
2517 | } | ||
2518 | |||
2519 | static void module_create_drivers_dir(struct module_kobject *mk) | ||
2520 | { | ||
2521 | if (!mk || mk->drivers_dir) | ||
2522 | return; | ||
2523 | |||
2524 | mk->drivers_dir = kobject_add_dir(&mk->kobj, "drivers"); | ||
2525 | } | ||
2526 | |||
2527 | void module_add_driver(struct module *mod, struct device_driver *drv) | ||
2528 | { | ||
2529 | char *driver_name; | ||
2530 | int no_warn; | ||
2531 | struct module_kobject *mk = NULL; | ||
2532 | |||
2533 | if (!drv) | ||
2534 | return; | ||
2535 | |||
2536 | if (mod) | ||
2537 | mk = &mod->mkobj; | ||
2538 | else if (drv->mod_name) { | ||
2539 | struct kobject *mkobj; | ||
2540 | |||
2541 | /* Lookup built-in module entry in /sys/modules */ | ||
2542 | mkobj = kset_find_obj(&module_subsys, drv->mod_name); | ||
2543 | if (mkobj) { | ||
2544 | mk = container_of(mkobj, struct module_kobject, kobj); | ||
2545 | /* remember our module structure */ | ||
2546 | drv->mkobj = mk; | ||
2547 | /* kset_find_obj took a reference */ | ||
2548 | kobject_put(mkobj); | ||
2549 | } | ||
2550 | } | ||
2551 | |||
2552 | if (!mk) | ||
2553 | return; | ||
2554 | |||
2555 | /* Don't check return codes; these calls are idempotent */ | ||
2556 | no_warn = sysfs_create_link(&drv->kobj, &mk->kobj, "module"); | ||
2557 | driver_name = make_driver_name(drv); | ||
2558 | if (driver_name) { | ||
2559 | module_create_drivers_dir(mk); | ||
2560 | no_warn = sysfs_create_link(mk->drivers_dir, &drv->kobj, | ||
2561 | driver_name); | ||
2562 | kfree(driver_name); | ||
2563 | } | ||
2564 | } | ||
2565 | EXPORT_SYMBOL(module_add_driver); | ||
2566 | |||
2567 | void module_remove_driver(struct device_driver *drv) | ||
2568 | { | ||
2569 | struct module_kobject *mk = NULL; | ||
2570 | char *driver_name; | ||
2571 | |||
2572 | if (!drv) | ||
2573 | return; | ||
2574 | |||
2575 | sysfs_remove_link(&drv->kobj, "module"); | ||
2576 | |||
2577 | if (drv->owner) | ||
2578 | mk = &drv->owner->mkobj; | ||
2579 | else if (drv->mkobj) | ||
2580 | mk = drv->mkobj; | ||
2581 | if (mk && mk->drivers_dir) { | ||
2582 | driver_name = make_driver_name(drv); | ||
2583 | if (driver_name) { | ||
2584 | sysfs_remove_link(mk->drivers_dir, driver_name); | ||
2585 | kfree(driver_name); | ||
2586 | } | ||
2587 | } | ||
2588 | } | ||
2589 | EXPORT_SYMBOL(module_remove_driver); | ||
2590 | #endif | ||
2591 | |||
2592 | #ifdef CONFIG_MODVERSIONS | 2500 | #ifdef CONFIG_MODVERSIONS |
2593 | /* Generate the signature for struct module here, too, for modversions. */ | 2501 | /* Generate the signature for struct module here, too, for modversions. */ |
2594 | void struct_module(struct module *mod) { return; } | 2502 | void struct_module(struct module *mod) { return; } |
diff --git a/kernel/params.c b/kernel/params.c index 7686417ee00e..b4da9505f4d2 100644 --- a/kernel/params.c +++ b/kernel/params.c | |||
@@ -560,11 +560,10 @@ static void __init kernel_param_sysfs_setup(const char *name, | |||
560 | BUG_ON(!mk); | 560 | BUG_ON(!mk); |
561 | 561 | ||
562 | mk->mod = THIS_MODULE; | 562 | mk->mod = THIS_MODULE; |
563 | kobj_set_kset_s(mk, module_subsys); | 563 | mk->kobj.kset = module_kset; |
564 | kobject_set_name(&mk->kobj, name); | 564 | ret = kobject_init_and_add(&mk->kobj, &module_ktype, NULL, "%s", name); |
565 | kobject_init(&mk->kobj); | ||
566 | ret = kobject_add(&mk->kobj); | ||
567 | if (ret) { | 565 | if (ret) { |
566 | kobject_put(&mk->kobj); | ||
568 | printk(KERN_ERR "Module '%s' failed to be added to sysfs, " | 567 | printk(KERN_ERR "Module '%s' failed to be added to sysfs, " |
569 | "error number %d\n", name, ret); | 568 | "error number %d\n", name, ret); |
570 | printk(KERN_ERR "The system will be unstable now.\n"); | 569 | printk(KERN_ERR "The system will be unstable now.\n"); |
@@ -679,8 +678,6 @@ static struct sysfs_ops module_sysfs_ops = { | |||
679 | .store = module_attr_store, | 678 | .store = module_attr_store, |
680 | }; | 679 | }; |
681 | 680 | ||
682 | static struct kobj_type module_ktype; | ||
683 | |||
684 | static int uevent_filter(struct kset *kset, struct kobject *kobj) | 681 | static int uevent_filter(struct kset *kset, struct kobject *kobj) |
685 | { | 682 | { |
686 | struct kobj_type *ktype = get_ktype(kobj); | 683 | struct kobj_type *ktype = get_ktype(kobj); |
@@ -694,21 +691,11 @@ static struct kset_uevent_ops module_uevent_ops = { | |||
694 | .filter = uevent_filter, | 691 | .filter = uevent_filter, |
695 | }; | 692 | }; |
696 | 693 | ||
697 | decl_subsys(module, &module_ktype, &module_uevent_ops); | 694 | struct kset *module_kset; |
698 | int module_sysfs_initialized; | 695 | int module_sysfs_initialized; |
699 | 696 | ||
700 | static void module_release(struct kobject *kobj) | 697 | struct kobj_type module_ktype = { |
701 | { | ||
702 | /* | ||
703 | * Stupid empty release function to allow the memory for the kobject to | ||
704 | * be properly cleaned up. This will not need to be present for 2.6.25 | ||
705 | * with the upcoming kobject core rework. | ||
706 | */ | ||
707 | } | ||
708 | |||
709 | static struct kobj_type module_ktype = { | ||
710 | .sysfs_ops = &module_sysfs_ops, | 698 | .sysfs_ops = &module_sysfs_ops, |
711 | .release = module_release, | ||
712 | }; | 699 | }; |
713 | 700 | ||
714 | /* | 701 | /* |
@@ -716,13 +703,11 @@ static struct kobj_type module_ktype = { | |||
716 | */ | 703 | */ |
717 | static int __init param_sysfs_init(void) | 704 | static int __init param_sysfs_init(void) |
718 | { | 705 | { |
719 | int ret; | 706 | module_kset = kset_create_and_add("module", &module_uevent_ops, NULL); |
720 | 707 | if (!module_kset) { | |
721 | ret = subsystem_register(&module_subsys); | 708 | printk(KERN_WARNING "%s (%d): error creating kset\n", |
722 | if (ret < 0) { | 709 | __FILE__, __LINE__); |
723 | printk(KERN_WARNING "%s (%d): subsystem_register error: %d\n", | 710 | return -ENOMEM; |
724 | __FILE__, __LINE__, ret); | ||
725 | return ret; | ||
726 | } | 711 | } |
727 | module_sysfs_initialized = 1; | 712 | module_sysfs_initialized = 1; |
728 | 713 | ||
@@ -732,14 +717,7 @@ static int __init param_sysfs_init(void) | |||
732 | } | 717 | } |
733 | subsys_initcall(param_sysfs_init); | 718 | subsys_initcall(param_sysfs_init); |
734 | 719 | ||
735 | #else | 720 | #endif /* CONFIG_SYSFS */ |
736 | #if 0 | ||
737 | static struct sysfs_ops module_sysfs_ops = { | ||
738 | .show = NULL, | ||
739 | .store = NULL, | ||
740 | }; | ||
741 | #endif | ||
742 | #endif | ||
743 | 721 | ||
744 | EXPORT_SYMBOL(param_set_byte); | 722 | EXPORT_SYMBOL(param_set_byte); |
745 | EXPORT_SYMBOL(param_get_byte); | 723 | EXPORT_SYMBOL(param_get_byte); |
diff --git a/kernel/power/disk.c b/kernel/power/disk.c index 05b64790fe83..b138b431e271 100644 --- a/kernel/power/disk.c +++ b/kernel/power/disk.c | |||
@@ -567,7 +567,8 @@ static const char * const hibernation_modes[] = { | |||
567 | * supports it (as determined by having hibernation_ops). | 567 | * supports it (as determined by having hibernation_ops). |
568 | */ | 568 | */ |
569 | 569 | ||
570 | static ssize_t disk_show(struct kset *kset, char *buf) | 570 | static ssize_t disk_show(struct kobject *kobj, struct kobj_attribute *attr, |
571 | char *buf) | ||
571 | { | 572 | { |
572 | int i; | 573 | int i; |
573 | char *start = buf; | 574 | char *start = buf; |
@@ -597,7 +598,8 @@ static ssize_t disk_show(struct kset *kset, char *buf) | |||
597 | } | 598 | } |
598 | 599 | ||
599 | 600 | ||
600 | static ssize_t disk_store(struct kset *kset, const char *buf, size_t n) | 601 | static ssize_t disk_store(struct kobject *kobj, struct kobj_attribute *attr, |
602 | const char *buf, size_t n) | ||
601 | { | 603 | { |
602 | int error = 0; | 604 | int error = 0; |
603 | int i; | 605 | int i; |
@@ -642,13 +644,15 @@ static ssize_t disk_store(struct kset *kset, const char *buf, size_t n) | |||
642 | 644 | ||
643 | power_attr(disk); | 645 | power_attr(disk); |
644 | 646 | ||
645 | static ssize_t resume_show(struct kset *kset, char *buf) | 647 | static ssize_t resume_show(struct kobject *kobj, struct kobj_attribute *attr, |
648 | char *buf) | ||
646 | { | 649 | { |
647 | return sprintf(buf,"%d:%d\n", MAJOR(swsusp_resume_device), | 650 | return sprintf(buf,"%d:%d\n", MAJOR(swsusp_resume_device), |
648 | MINOR(swsusp_resume_device)); | 651 | MINOR(swsusp_resume_device)); |
649 | } | 652 | } |
650 | 653 | ||
651 | static ssize_t resume_store(struct kset *kset, const char *buf, size_t n) | 654 | static ssize_t resume_store(struct kobject *kobj, struct kobj_attribute *attr, |
655 | const char *buf, size_t n) | ||
652 | { | 656 | { |
653 | unsigned int maj, min; | 657 | unsigned int maj, min; |
654 | dev_t res; | 658 | dev_t res; |
@@ -674,12 +678,14 @@ static ssize_t resume_store(struct kset *kset, const char *buf, size_t n) | |||
674 | 678 | ||
675 | power_attr(resume); | 679 | power_attr(resume); |
676 | 680 | ||
677 | static ssize_t image_size_show(struct kset *kset, char *buf) | 681 | static ssize_t image_size_show(struct kobject *kobj, struct kobj_attribute *attr, |
682 | char *buf) | ||
678 | { | 683 | { |
679 | return sprintf(buf, "%lu\n", image_size); | 684 | return sprintf(buf, "%lu\n", image_size); |
680 | } | 685 | } |
681 | 686 | ||
682 | static ssize_t image_size_store(struct kset *kset, const char *buf, size_t n) | 687 | static ssize_t image_size_store(struct kobject *kobj, struct kobj_attribute *attr, |
688 | const char *buf, size_t n) | ||
683 | { | 689 | { |
684 | unsigned long size; | 690 | unsigned long size; |
685 | 691 | ||
@@ -708,7 +714,7 @@ static struct attribute_group attr_group = { | |||
708 | 714 | ||
709 | static int __init pm_disk_init(void) | 715 | static int __init pm_disk_init(void) |
710 | { | 716 | { |
711 | return sysfs_create_group(&power_subsys.kobj, &attr_group); | 717 | return sysfs_create_group(power_kobj, &attr_group); |
712 | } | 718 | } |
713 | 719 | ||
714 | core_initcall(pm_disk_init); | 720 | core_initcall(pm_disk_init); |
diff --git a/kernel/power/main.c b/kernel/power/main.c index f71c9504a5c5..efc08360e627 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c | |||
@@ -276,8 +276,7 @@ EXPORT_SYMBOL(pm_suspend); | |||
276 | 276 | ||
277 | #endif /* CONFIG_SUSPEND */ | 277 | #endif /* CONFIG_SUSPEND */ |
278 | 278 | ||
279 | decl_subsys(power,NULL,NULL); | 279 | struct kobject *power_kobj; |
280 | |||
281 | 280 | ||
282 | /** | 281 | /** |
283 | * state - control system power state. | 282 | * state - control system power state. |
@@ -290,7 +289,8 @@ decl_subsys(power,NULL,NULL); | |||
290 | * proper enumerated value, and initiates a suspend transition. | 289 | * proper enumerated value, and initiates a suspend transition. |
291 | */ | 290 | */ |
292 | 291 | ||
293 | static ssize_t state_show(struct kset *kset, char *buf) | 292 | static ssize_t state_show(struct kobject *kobj, struct kobj_attribute *attr, |
293 | char *buf) | ||
294 | { | 294 | { |
295 | char *s = buf; | 295 | char *s = buf; |
296 | #ifdef CONFIG_SUSPEND | 296 | #ifdef CONFIG_SUSPEND |
@@ -311,7 +311,8 @@ static ssize_t state_show(struct kset *kset, char *buf) | |||
311 | return (s - buf); | 311 | return (s - buf); |
312 | } | 312 | } |
313 | 313 | ||
314 | static ssize_t state_store(struct kset *kset, const char *buf, size_t n) | 314 | static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr, |
315 | const char *buf, size_t n) | ||
315 | { | 316 | { |
316 | #ifdef CONFIG_SUSPEND | 317 | #ifdef CONFIG_SUSPEND |
317 | suspend_state_t state = PM_SUSPEND_STANDBY; | 318 | suspend_state_t state = PM_SUSPEND_STANDBY; |
@@ -348,13 +349,15 @@ power_attr(state); | |||
348 | #ifdef CONFIG_PM_TRACE | 349 | #ifdef CONFIG_PM_TRACE |
349 | int pm_trace_enabled; | 350 | int pm_trace_enabled; |
350 | 351 | ||
351 | static ssize_t pm_trace_show(struct kset *kset, char *buf) | 352 | static ssize_t pm_trace_show(struct kobject *kobj, struct kobj_attribute *attr, |
353 | char *buf) | ||
352 | { | 354 | { |
353 | return sprintf(buf, "%d\n", pm_trace_enabled); | 355 | return sprintf(buf, "%d\n", pm_trace_enabled); |
354 | } | 356 | } |
355 | 357 | ||
356 | static ssize_t | 358 | static ssize_t |
357 | pm_trace_store(struct kset *kset, const char *buf, size_t n) | 359 | pm_trace_store(struct kobject *kobj, struct kobj_attribute *attr, |
360 | const char *buf, size_t n) | ||
358 | { | 361 | { |
359 | int val; | 362 | int val; |
360 | 363 | ||
@@ -386,10 +389,10 @@ static struct attribute_group attr_group = { | |||
386 | 389 | ||
387 | static int __init pm_init(void) | 390 | static int __init pm_init(void) |
388 | { | 391 | { |
389 | int error = subsystem_register(&power_subsys); | 392 | power_kobj = kobject_create_and_add("power", NULL); |
390 | if (!error) | 393 | if (!power_kobj) |
391 | error = sysfs_create_group(&power_subsys.kobj,&attr_group); | 394 | return -ENOMEM; |
392 | return error; | 395 | return sysfs_create_group(power_kobj, &attr_group); |
393 | } | 396 | } |
394 | 397 | ||
395 | core_initcall(pm_init); | 398 | core_initcall(pm_init); |
diff --git a/kernel/power/power.h b/kernel/power/power.h index 195dc4611764..2093c3a9a994 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h | |||
@@ -54,7 +54,7 @@ extern int pfn_is_nosave(unsigned long); | |||
54 | extern struct mutex pm_mutex; | 54 | extern struct mutex pm_mutex; |
55 | 55 | ||
56 | #define power_attr(_name) \ | 56 | #define power_attr(_name) \ |
57 | static struct subsys_attribute _name##_attr = { \ | 57 | static struct kobj_attribute _name##_attr = { \ |
58 | .attr = { \ | 58 | .attr = { \ |
59 | .name = __stringify(_name), \ | 59 | .name = __stringify(_name), \ |
60 | .mode = 0644, \ | 60 | .mode = 0644, \ |
@@ -63,8 +63,6 @@ static struct subsys_attribute _name##_attr = { \ | |||
63 | .store = _name##_store, \ | 63 | .store = _name##_store, \ |
64 | } | 64 | } |
65 | 65 | ||
66 | extern struct kset power_subsys; | ||
67 | |||
68 | /* Preferred image size in bytes (default 500 MB) */ | 66 | /* Preferred image size in bytes (default 500 MB) */ |
69 | extern unsigned long image_size; | 67 | extern unsigned long image_size; |
70 | extern int in_suspend; | 68 | extern int in_suspend; |
diff --git a/kernel/rtmutex-tester.c b/kernel/rtmutex-tester.c index e3055ba69159..092e4c620af9 100644 --- a/kernel/rtmutex-tester.c +++ b/kernel/rtmutex-tester.c | |||
@@ -394,7 +394,7 @@ static SYSDEV_ATTR(status, 0600, sysfs_test_status, NULL); | |||
394 | static SYSDEV_ATTR(command, 0600, NULL, sysfs_test_command); | 394 | static SYSDEV_ATTR(command, 0600, NULL, sysfs_test_command); |
395 | 395 | ||
396 | static struct sysdev_class rttest_sysclass = { | 396 | static struct sysdev_class rttest_sysclass = { |
397 | set_kset_name("rttest"), | 397 | .name = "rttest", |
398 | }; | 398 | }; |
399 | 399 | ||
400 | static int init_test_thread(int id) | 400 | static int init_test_thread(int id) |
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index c8a9d13874df..8d6125ad2cf0 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c | |||
@@ -441,7 +441,7 @@ static SYSDEV_ATTR(available_clocksource, 0600, | |||
441 | sysfs_show_available_clocksources, NULL); | 441 | sysfs_show_available_clocksources, NULL); |
442 | 442 | ||
443 | static struct sysdev_class clocksource_sysclass = { | 443 | static struct sysdev_class clocksource_sysclass = { |
444 | set_kset_name("clocksource"), | 444 | .name = "clocksource", |
445 | }; | 445 | }; |
446 | 446 | ||
447 | static struct sys_device device_clocksource = { | 447 | static struct sys_device device_clocksource = { |
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index e5e466b27598..ab46ae8c062b 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
@@ -335,9 +335,9 @@ static int timekeeping_suspend(struct sys_device *dev, pm_message_t state) | |||
335 | 335 | ||
336 | /* sysfs resume/suspend bits for timekeeping */ | 336 | /* sysfs resume/suspend bits for timekeeping */ |
337 | static struct sysdev_class timekeeping_sysclass = { | 337 | static struct sysdev_class timekeeping_sysclass = { |
338 | .name = "timekeeping", | ||
338 | .resume = timekeeping_resume, | 339 | .resume = timekeeping_resume, |
339 | .suspend = timekeeping_suspend, | 340 | .suspend = timekeeping_suspend, |
340 | set_kset_name("timekeeping"), | ||
341 | }; | 341 | }; |
342 | 342 | ||
343 | static struct sys_device device_timer = { | 343 | static struct sys_device device_timer = { |
diff --git a/kernel/user.c b/kernel/user.c index 8320a87f3e5a..ab4fd706993b 100644 --- a/kernel/user.c +++ b/kernel/user.c | |||
@@ -115,7 +115,7 @@ static void sched_switch_user(struct task_struct *p) { } | |||
115 | 115 | ||
116 | #if defined(CONFIG_FAIR_USER_SCHED) && defined(CONFIG_SYSFS) | 116 | #if defined(CONFIG_FAIR_USER_SCHED) && defined(CONFIG_SYSFS) |
117 | 117 | ||
118 | static struct kobject uids_kobject; /* represents /sys/kernel/uids directory */ | 118 | static struct kset *uids_kset; /* represents the /sys/kernel/uids/ directory */ |
119 | static DEFINE_MUTEX(uids_mutex); | 119 | static DEFINE_MUTEX(uids_mutex); |
120 | 120 | ||
121 | static inline void uids_mutex_lock(void) | 121 | static inline void uids_mutex_lock(void) |
@@ -128,86 +128,83 @@ static inline void uids_mutex_unlock(void) | |||
128 | mutex_unlock(&uids_mutex); | 128 | mutex_unlock(&uids_mutex); |
129 | } | 129 | } |
130 | 130 | ||
131 | /* return cpu shares held by the user */ | 131 | /* uid directory attributes */ |
132 | static ssize_t cpu_shares_show(struct kset *kset, char *buffer) | 132 | static ssize_t cpu_shares_show(struct kobject *kobj, |
133 | struct kobj_attribute *attr, | ||
134 | char *buf) | ||
133 | { | 135 | { |
134 | struct user_struct *up = container_of(kset, struct user_struct, kset); | 136 | struct user_struct *up = container_of(kobj, struct user_struct, kobj); |
135 | 137 | ||
136 | return sprintf(buffer, "%lu\n", sched_group_shares(up->tg)); | 138 | return sprintf(buf, "%lu\n", sched_group_shares(up->tg)); |
137 | } | 139 | } |
138 | 140 | ||
139 | /* modify cpu shares held by the user */ | 141 | static ssize_t cpu_shares_store(struct kobject *kobj, |
140 | static ssize_t cpu_shares_store(struct kset *kset, const char *buffer, | 142 | struct kobj_attribute *attr, |
141 | size_t size) | 143 | const char *buf, size_t size) |
142 | { | 144 | { |
143 | struct user_struct *up = container_of(kset, struct user_struct, kset); | 145 | struct user_struct *up = container_of(kobj, struct user_struct, kobj); |
144 | unsigned long shares; | 146 | unsigned long shares; |
145 | int rc; | 147 | int rc; |
146 | 148 | ||
147 | sscanf(buffer, "%lu", &shares); | 149 | sscanf(buf, "%lu", &shares); |
148 | 150 | ||
149 | rc = sched_group_set_shares(up->tg, shares); | 151 | rc = sched_group_set_shares(up->tg, shares); |
150 | 152 | ||
151 | return (rc ? rc : size); | 153 | return (rc ? rc : size); |
152 | } | 154 | } |
153 | 155 | ||
154 | static void user_attr_init(struct subsys_attribute *sa, char *name, int mode) | 156 | static struct kobj_attribute cpu_share_attr = |
157 | __ATTR(cpu_share, 0644, cpu_shares_show, cpu_shares_store); | ||
158 | |||
159 | /* default attributes per uid directory */ | ||
160 | static struct attribute *uids_attributes[] = { | ||
161 | &cpu_share_attr.attr, | ||
162 | NULL | ||
163 | }; | ||
164 | |||
165 | /* the lifetime of user_struct is not managed by the core (now) */ | ||
166 | static void uids_release(struct kobject *kobj) | ||
155 | { | 167 | { |
156 | sa->attr.name = name; | 168 | return; |
157 | sa->attr.mode = mode; | ||
158 | sa->show = cpu_shares_show; | ||
159 | sa->store = cpu_shares_store; | ||
160 | } | 169 | } |
161 | 170 | ||
162 | /* Create "/sys/kernel/uids/<uid>" directory and | 171 | static struct kobj_type uids_ktype = { |
163 | * "/sys/kernel/uids/<uid>/cpu_share" file for this user. | 172 | .sysfs_ops = &kobj_sysfs_ops, |
164 | */ | 173 | .default_attrs = uids_attributes, |
165 | static int user_kobject_create(struct user_struct *up) | 174 | .release = uids_release, |
175 | }; | ||
176 | |||
177 | /* create /sys/kernel/uids/<uid>/cpu_share file for this user */ | ||
178 | static int uids_user_create(struct user_struct *up) | ||
166 | { | 179 | { |
167 | struct kset *kset = &up->kset; | 180 | struct kobject *kobj = &up->kobj; |
168 | struct kobject *kobj = &kset->kobj; | ||
169 | int error; | 181 | int error; |
170 | 182 | ||
171 | memset(kset, 0, sizeof(struct kset)); | 183 | memset(kobj, 0, sizeof(struct kobject)); |
172 | kobj->parent = &uids_kobject; /* create under /sys/kernel/uids dir */ | 184 | kobj->kset = uids_kset; |
173 | kobject_set_name(kobj, "%d", up->uid); | 185 | error = kobject_init_and_add(kobj, &uids_ktype, NULL, "%d", up->uid); |
174 | kset_init(kset); | 186 | if (error) { |
175 | user_attr_init(&up->user_attr, "cpu_share", 0644); | 187 | kobject_put(kobj); |
176 | |||
177 | error = kobject_add(kobj); | ||
178 | if (error) | ||
179 | goto done; | 188 | goto done; |
180 | 189 | } | |
181 | error = sysfs_create_file(kobj, &up->user_attr.attr); | ||
182 | if (error) | ||
183 | kobject_del(kobj); | ||
184 | 190 | ||
185 | kobject_uevent(kobj, KOBJ_ADD); | 191 | kobject_uevent(kobj, KOBJ_ADD); |
186 | |||
187 | done: | 192 | done: |
188 | return error; | 193 | return error; |
189 | } | 194 | } |
190 | 195 | ||
191 | /* create these in sysfs filesystem: | 196 | /* create these entries in sysfs: |
192 | * "/sys/kernel/uids" directory | 197 | * "/sys/kernel/uids" directory |
193 | * "/sys/kernel/uids/0" directory (for root user) | 198 | * "/sys/kernel/uids/0" directory (for root user) |
194 | * "/sys/kernel/uids/0/cpu_share" file (for root user) | 199 | * "/sys/kernel/uids/0/cpu_share" file (for root user) |
195 | */ | 200 | */ |
196 | int __init uids_kobject_init(void) | 201 | int __init uids_sysfs_init(void) |
197 | { | 202 | { |
198 | int error; | 203 | uids_kset = kset_create_and_add("uids", NULL, kernel_kobj); |
204 | if (!uids_kset) | ||
205 | return -ENOMEM; | ||
199 | 206 | ||
200 | /* create under /sys/kernel dir */ | 207 | return uids_user_create(&root_user); |
201 | uids_kobject.parent = &kernel_subsys.kobj; | ||
202 | uids_kobject.kset = &kernel_subsys; | ||
203 | kobject_set_name(&uids_kobject, "uids"); | ||
204 | kobject_init(&uids_kobject); | ||
205 | |||
206 | error = kobject_add(&uids_kobject); | ||
207 | if (!error) | ||
208 | error = user_kobject_create(&root_user); | ||
209 | |||
210 | return error; | ||
211 | } | 208 | } |
212 | 209 | ||
213 | /* work function to remove sysfs directory for a user and free up | 210 | /* work function to remove sysfs directory for a user and free up |
@@ -216,7 +213,6 @@ int __init uids_kobject_init(void) | |||
216 | static void remove_user_sysfs_dir(struct work_struct *w) | 213 | static void remove_user_sysfs_dir(struct work_struct *w) |
217 | { | 214 | { |
218 | struct user_struct *up = container_of(w, struct user_struct, work); | 215 | struct user_struct *up = container_of(w, struct user_struct, work); |
219 | struct kobject *kobj = &up->kset.kobj; | ||
220 | unsigned long flags; | 216 | unsigned long flags; |
221 | int remove_user = 0; | 217 | int remove_user = 0; |
222 | 218 | ||
@@ -238,9 +234,9 @@ static void remove_user_sysfs_dir(struct work_struct *w) | |||
238 | if (!remove_user) | 234 | if (!remove_user) |
239 | goto done; | 235 | goto done; |
240 | 236 | ||
241 | sysfs_remove_file(kobj, &up->user_attr.attr); | 237 | kobject_uevent(&up->kobj, KOBJ_REMOVE); |
242 | kobject_uevent(kobj, KOBJ_REMOVE); | 238 | kobject_del(&up->kobj); |
243 | kobject_del(kobj); | 239 | kobject_put(&up->kobj); |
244 | 240 | ||
245 | sched_destroy_user(up); | 241 | sched_destroy_user(up); |
246 | key_put(up->uid_keyring); | 242 | key_put(up->uid_keyring); |
@@ -267,7 +263,8 @@ static inline void free_user(struct user_struct *up, unsigned long flags) | |||
267 | 263 | ||
268 | #else /* CONFIG_FAIR_USER_SCHED && CONFIG_SYSFS */ | 264 | #else /* CONFIG_FAIR_USER_SCHED && CONFIG_SYSFS */ |
269 | 265 | ||
270 | static inline int user_kobject_create(struct user_struct *up) { return 0; } | 266 | int uids_sysfs_init(void) { return 0; } |
267 | static inline int uids_user_create(struct user_struct *up) { return 0; } | ||
271 | static inline void uids_mutex_lock(void) { } | 268 | static inline void uids_mutex_lock(void) { } |
272 | static inline void uids_mutex_unlock(void) { } | 269 | static inline void uids_mutex_unlock(void) { } |
273 | 270 | ||
@@ -324,7 +321,7 @@ struct user_struct * alloc_uid(struct user_namespace *ns, uid_t uid) | |||
324 | struct hlist_head *hashent = uidhashentry(ns, uid); | 321 | struct hlist_head *hashent = uidhashentry(ns, uid); |
325 | struct user_struct *up; | 322 | struct user_struct *up; |
326 | 323 | ||
327 | /* Make uid_hash_find() + user_kobject_create() + uid_hash_insert() | 324 | /* Make uid_hash_find() + uids_user_create() + uid_hash_insert() |
328 | * atomic. | 325 | * atomic. |
329 | */ | 326 | */ |
330 | uids_mutex_lock(); | 327 | uids_mutex_lock(); |
@@ -370,7 +367,7 @@ struct user_struct * alloc_uid(struct user_namespace *ns, uid_t uid) | |||
370 | return NULL; | 367 | return NULL; |
371 | } | 368 | } |
372 | 369 | ||
373 | if (user_kobject_create(new)) { | 370 | if (uids_user_create(new)) { |
374 | sched_destroy_user(new); | 371 | sched_destroy_user(new); |
375 | key_put(new->uid_keyring); | 372 | key_put(new->uid_keyring); |
376 | key_put(new->session_keyring); | 373 | key_put(new->session_keyring); |