aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2006-08-15 01:43:17 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2006-09-26 00:08:39 -0400
commit4a7fb6363f2d1a6c09a10253937f672f3c7929e1 (patch)
tree46e70fc8baca37ffd901c472ce7ce13338fb4ece
parent35acfdd7253025e8441883fd8f879f5240844f95 (diff)
add __must_check to device management code
We're getting a lot of crashes in the sysfs/kobject/device/bus/class code and they're very hard to diagnose. I'm suspecting that in some cases this is because drivers aren't checking return values and aren't handling errors correctly. So the code blithely blunders on and crashes later in very obscure ways. There's just no reason to ignore errors which can and do occur. So the patch sprinkles __must_check all over these APIs. Causes 1,513 new warnings. Heh. Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--include/linux/device.h52
-rw-r--r--include/linux/kobject.h16
-rw-r--r--include/linux/pci.h34
-rw-r--r--include/linux/sysfs.h19
4 files changed, 66 insertions, 55 deletions
diff --git a/include/linux/device.h b/include/linux/device.h
index 7d447d7271c5..ad4db72f5733 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -15,6 +15,7 @@
15#include <linux/kobject.h> 15#include <linux/kobject.h>
16#include <linux/klist.h> 16#include <linux/klist.h>
17#include <linux/list.h> 17#include <linux/list.h>
18#include <linux/compiler.h>
18#include <linux/types.h> 19#include <linux/types.h>
19#include <linux/module.h> 20#include <linux/module.h>
20#include <linux/pm.h> 21#include <linux/pm.h>
@@ -58,7 +59,7 @@ struct bus_type {
58 int (*resume)(struct device * dev); 59 int (*resume)(struct device * dev);
59}; 60};
60 61
61extern int bus_register(struct bus_type * bus); 62extern int __must_check bus_register(struct bus_type * bus);
62extern void bus_unregister(struct bus_type * bus); 63extern void bus_unregister(struct bus_type * bus);
63 64
64extern void bus_rescan_devices(struct bus_type * bus); 65extern void bus_rescan_devices(struct bus_type * bus);
@@ -70,9 +71,9 @@ int bus_for_each_dev(struct bus_type * bus, struct device * start, void * data,
70struct device * bus_find_device(struct bus_type *bus, struct device *start, 71struct device * bus_find_device(struct bus_type *bus, struct device *start,
71 void *data, int (*match)(struct device *, void *)); 72 void *data, int (*match)(struct device *, void *));
72 73
73int bus_for_each_drv(struct bus_type * bus, struct device_driver * start, 74int __must_check bus_for_each_drv(struct bus_type *bus,
74 void * data, int (*fn)(struct device_driver *, void *)); 75 struct device_driver *start, void *data,
75 76 int (*fn)(struct device_driver *, void *));
76 77
77/* driverfs interface for exporting bus attributes */ 78/* driverfs interface for exporting bus attributes */
78 79
@@ -85,7 +86,8 @@ struct bus_attribute {
85#define BUS_ATTR(_name,_mode,_show,_store) \ 86#define BUS_ATTR(_name,_mode,_show,_store) \
86struct bus_attribute bus_attr_##_name = __ATTR(_name,_mode,_show,_store) 87struct bus_attribute bus_attr_##_name = __ATTR(_name,_mode,_show,_store)
87 88
88extern int bus_create_file(struct bus_type *, struct bus_attribute *); 89extern int __must_check bus_create_file(struct bus_type *,
90 struct bus_attribute *);
89extern void bus_remove_file(struct bus_type *, struct bus_attribute *); 91extern void bus_remove_file(struct bus_type *, struct bus_attribute *);
90 92
91struct device_driver { 93struct device_driver {
@@ -107,14 +109,13 @@ struct device_driver {
107}; 109};
108 110
109 111
110extern int driver_register(struct device_driver * drv); 112extern int __must_check driver_register(struct device_driver * drv);
111extern void driver_unregister(struct device_driver * drv); 113extern void driver_unregister(struct device_driver * drv);
112 114
113extern struct device_driver * get_driver(struct device_driver * drv); 115extern struct device_driver * get_driver(struct device_driver * drv);
114extern void put_driver(struct device_driver * drv); 116extern void put_driver(struct device_driver * drv);
115extern struct device_driver *driver_find(const char *name, struct bus_type *bus); 117extern struct device_driver *driver_find(const char *name, struct bus_type *bus);
116 118
117
118/* driverfs interface for exporting driver attributes */ 119/* driverfs interface for exporting driver attributes */
119 120
120struct driver_attribute { 121struct driver_attribute {
@@ -126,16 +127,17 @@ struct driver_attribute {
126#define DRIVER_ATTR(_name,_mode,_show,_store) \ 127#define DRIVER_ATTR(_name,_mode,_show,_store) \
127struct driver_attribute driver_attr_##_name = __ATTR(_name,_mode,_show,_store) 128struct driver_attribute driver_attr_##_name = __ATTR(_name,_mode,_show,_store)
128 129
129extern int driver_create_file(struct device_driver *, struct driver_attribute *); 130extern int __must_check driver_create_file(struct device_driver *,
131 struct driver_attribute *);
130extern void driver_remove_file(struct device_driver *, struct driver_attribute *); 132extern void driver_remove_file(struct device_driver *, struct driver_attribute *);
131 133
132extern int driver_for_each_device(struct device_driver * drv, struct device * start, 134extern int __must_check driver_for_each_device(struct device_driver * drv,
133 void * data, int (*fn)(struct device *, void *)); 135 struct device *start, void *data,
136 int (*fn)(struct device *, void *));
134struct device * driver_find_device(struct device_driver *drv, 137struct device * driver_find_device(struct device_driver *drv,
135 struct device *start, void *data, 138 struct device *start, void *data,
136 int (*match)(struct device *, void *)); 139 int (*match)(struct device *, void *));
137 140
138
139/* 141/*
140 * device classes 142 * device classes
141 */ 143 */
@@ -168,7 +170,7 @@ struct class {
168 int (*resume)(struct device *); 170 int (*resume)(struct device *);
169}; 171};
170 172
171extern int class_register(struct class *); 173extern int __must_check class_register(struct class *);
172extern void class_unregister(struct class *); 174extern void class_unregister(struct class *);
173 175
174 176
@@ -181,7 +183,8 @@ struct class_attribute {
181#define CLASS_ATTR(_name,_mode,_show,_store) \ 183#define CLASS_ATTR(_name,_mode,_show,_store) \
182struct class_attribute class_attr_##_name = __ATTR(_name,_mode,_show,_store) 184struct class_attribute class_attr_##_name = __ATTR(_name,_mode,_show,_store)
183 185
184extern int class_create_file(struct class *, const struct class_attribute *); 186extern int __must_check class_create_file(struct class *,
187 const struct class_attribute *);
185extern void class_remove_file(struct class *, const struct class_attribute *); 188extern void class_remove_file(struct class *, const struct class_attribute *);
186 189
187struct class_device_attribute { 190struct class_device_attribute {
@@ -194,7 +197,7 @@ struct class_device_attribute {
194struct class_device_attribute class_device_attr_##_name = \ 197struct class_device_attribute class_device_attr_##_name = \
195 __ATTR(_name,_mode,_show,_store) 198 __ATTR(_name,_mode,_show,_store)
196 199
197extern int class_device_create_file(struct class_device *, 200extern int __must_check class_device_create_file(struct class_device *,
198 const struct class_device_attribute *); 201 const struct class_device_attribute *);
199 202
200/** 203/**
@@ -254,10 +257,10 @@ class_set_devdata (struct class_device *dev, void *data)
254} 257}
255 258
256 259
257extern int class_device_register(struct class_device *); 260extern int __must_check class_device_register(struct class_device *);
258extern void class_device_unregister(struct class_device *); 261extern void class_device_unregister(struct class_device *);
259extern void class_device_initialize(struct class_device *); 262extern void class_device_initialize(struct class_device *);
260extern int class_device_add(struct class_device *); 263extern int __must_check class_device_add(struct class_device *);
261extern void class_device_del(struct class_device *); 264extern void class_device_del(struct class_device *);
262 265
263extern int class_device_rename(struct class_device *, char *); 266extern int class_device_rename(struct class_device *, char *);
@@ -267,7 +270,7 @@ extern void class_device_put(struct class_device *);
267 270
268extern void class_device_remove_file(struct class_device *, 271extern void class_device_remove_file(struct class_device *,
269 const struct class_device_attribute *); 272 const struct class_device_attribute *);
270extern int class_device_create_bin_file(struct class_device *, 273extern int __must_check class_device_create_bin_file(struct class_device *,
271 struct bin_attribute *); 274 struct bin_attribute *);
272extern void class_device_remove_bin_file(struct class_device *, 275extern void class_device_remove_bin_file(struct class_device *,
273 struct bin_attribute *); 276 struct bin_attribute *);
@@ -282,7 +285,7 @@ struct class_interface {
282 void (*remove_dev) (struct device *, struct class_interface *); 285 void (*remove_dev) (struct device *, struct class_interface *);
283}; 286};
284 287
285extern int class_interface_register(struct class_interface *); 288extern int __must_check class_interface_register(struct class_interface *);
286extern void class_interface_unregister(struct class_interface *); 289extern void class_interface_unregister(struct class_interface *);
287 290
288extern struct class *class_create(struct module *owner, const char *name); 291extern struct class *class_create(struct module *owner, const char *name);
@@ -307,7 +310,8 @@ struct device_attribute {
307#define DEVICE_ATTR(_name,_mode,_show,_store) \ 310#define DEVICE_ATTR(_name,_mode,_show,_store) \
308struct device_attribute dev_attr_##_name = __ATTR(_name,_mode,_show,_store) 311struct device_attribute dev_attr_##_name = __ATTR(_name,_mode,_show,_store)
309 312
310extern int device_create_file(struct device *device, struct device_attribute * entry); 313extern int __must_check device_create_file(struct device *device,
314 struct device_attribute * entry);
311extern void device_remove_file(struct device * dev, struct device_attribute * attr); 315extern void device_remove_file(struct device * dev, struct device_attribute * attr);
312extern int __must_check device_create_bin_file(struct device *dev, 316extern int __must_check device_create_bin_file(struct device *dev,
313 struct bin_attribute *attr); 317 struct bin_attribute *attr);
@@ -380,12 +384,12 @@ static inline int device_is_registered(struct device *dev)
380/* 384/*
381 * High level routines for use by the bus drivers 385 * High level routines for use by the bus drivers
382 */ 386 */
383extern int device_register(struct device * dev); 387extern int __must_check device_register(struct device * dev);
384extern void device_unregister(struct device * dev); 388extern void device_unregister(struct device * dev);
385extern void device_initialize(struct device * dev); 389extern void device_initialize(struct device * dev);
386extern int device_add(struct device * dev); 390extern int __must_check device_add(struct device * dev);
387extern void device_del(struct device * dev); 391extern void device_del(struct device * dev);
388extern int device_for_each_child(struct device *, void *, 392extern int __must_check device_for_each_child(struct device *, void *,
389 int (*fn)(struct device *, void *)); 393 int (*fn)(struct device *, void *));
390extern int device_rename(struct device *dev, char *new_name); 394extern int device_rename(struct device *dev, char *new_name);
391 395
@@ -395,7 +399,7 @@ extern int device_rename(struct device *dev, char *new_name);
395 */ 399 */
396extern void device_bind_driver(struct device * dev); 400extern void device_bind_driver(struct device * dev);
397extern void device_release_driver(struct device * dev); 401extern void device_release_driver(struct device * dev);
398extern int device_attach(struct device * dev); 402extern int __must_check device_attach(struct device * dev);
399extern void driver_attach(struct device_driver * drv); 403extern void driver_attach(struct device_driver * drv);
400extern void device_reprobe(struct device *dev); 404extern void device_reprobe(struct device *dev);
401 405
@@ -433,7 +437,7 @@ extern void device_shutdown(void);
433 437
434 438
435/* drivers/base/firmware.c */ 439/* drivers/base/firmware.c */
436extern int firmware_register(struct subsystem *); 440extern int __must_check firmware_register(struct subsystem *);
437extern void firmware_unregister(struct subsystem *); 441extern void firmware_unregister(struct subsystem *);
438 442
439/* debugging and troubleshooting/diagnostic helpers. */ 443/* debugging and troubleshooting/diagnostic helpers. */
diff --git a/include/linux/kobject.h b/include/linux/kobject.h
index 2d229327959e..bcd9cd173c2c 100644
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -20,6 +20,7 @@
20#include <linux/types.h> 20#include <linux/types.h>
21#include <linux/list.h> 21#include <linux/list.h>
22#include <linux/sysfs.h> 22#include <linux/sysfs.h>
23#include <linux/compiler.h>
23#include <linux/spinlock.h> 24#include <linux/spinlock.h>
24#include <linux/rwsem.h> 25#include <linux/rwsem.h>
25#include <linux/kref.h> 26#include <linux/kref.h>
@@ -71,12 +72,12 @@ static inline const char * kobject_name(const struct kobject * kobj)
71extern void kobject_init(struct kobject *); 72extern void kobject_init(struct kobject *);
72extern void kobject_cleanup(struct kobject *); 73extern void kobject_cleanup(struct kobject *);
73 74
74extern int kobject_add(struct kobject *); 75extern int __must_check kobject_add(struct kobject *);
75extern void kobject_del(struct kobject *); 76extern void kobject_del(struct kobject *);
76 77
77extern int kobject_rename(struct kobject *, const char *new_name); 78extern int __must_check kobject_rename(struct kobject *, const char *new_name);
78 79
79extern int kobject_register(struct kobject *); 80extern int __must_check kobject_register(struct kobject *);
80extern void kobject_unregister(struct kobject *); 81extern void kobject_unregister(struct kobject *);
81 82
82extern struct kobject * kobject_get(struct kobject *); 83extern struct kobject * kobject_get(struct kobject *);
@@ -128,8 +129,8 @@ struct kset {
128 129
129 130
130extern void kset_init(struct kset * k); 131extern void kset_init(struct kset * k);
131extern int kset_add(struct kset * k); 132extern int __must_check kset_add(struct kset * k);
132extern int kset_register(struct kset * k); 133extern int __must_check kset_register(struct kset * k);
133extern void kset_unregister(struct kset * k); 134extern void kset_unregister(struct kset * k);
134 135
135static inline struct kset * to_kset(struct kobject * kobj) 136static inline struct kset * to_kset(struct kobject * kobj)
@@ -239,7 +240,7 @@ extern struct subsystem hypervisor_subsys;
239 (obj)->subsys.kset.kobj.kset = &(_subsys).kset 240 (obj)->subsys.kset.kobj.kset = &(_subsys).kset
240 241
241extern void subsystem_init(struct subsystem *); 242extern void subsystem_init(struct subsystem *);
242extern int subsystem_register(struct subsystem *); 243extern int __must_check subsystem_register(struct subsystem *);
243extern void subsystem_unregister(struct subsystem *); 244extern void subsystem_unregister(struct subsystem *);
244 245
245static inline struct subsystem * subsys_get(struct subsystem * s) 246static inline struct subsystem * subsys_get(struct subsystem * s)
@@ -258,7 +259,8 @@ struct subsys_attribute {
258 ssize_t (*store)(struct subsystem *, const char *, size_t); 259 ssize_t (*store)(struct subsystem *, const char *, size_t);
259}; 260};
260 261
261extern int subsys_create_file(struct subsystem * , struct subsys_attribute *); 262extern int __must_check subsys_create_file(struct subsystem * ,
263 struct subsys_attribute *);
262 264
263#if defined(CONFIG_HOTPLUG) 265#if defined(CONFIG_HOTPLUG)
264void kobject_uevent(struct kobject *kobj, enum kobject_action action); 266void kobject_uevent(struct kobject *kobj, enum kobject_action action);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 9514bbfe96e2..3ec72551ac31 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -49,6 +49,7 @@
49#include <linux/types.h> 49#include <linux/types.h>
50#include <linux/ioport.h> 50#include <linux/ioport.h>
51#include <linux/list.h> 51#include <linux/list.h>
52#include <linux/compiler.h>
52#include <linux/errno.h> 53#include <linux/errno.h>
53#include <linux/device.h> 54#include <linux/device.h>
54 55
@@ -403,7 +404,7 @@ extern struct list_head pci_root_buses; /* list of all known PCI buses */
403extern struct list_head pci_devices; /* list of all devices */ 404extern struct list_head pci_devices; /* list of all devices */
404 405
405void pcibios_fixup_bus(struct pci_bus *); 406void pcibios_fixup_bus(struct pci_bus *);
406int pcibios_enable_device(struct pci_dev *, int mask); 407int __must_check pcibios_enable_device(struct pci_dev *, int mask);
407char *pcibios_setup (char *str); 408char *pcibios_setup (char *str);
408 409
409/* Used only when drivers/pci/setup.c is used */ 410/* Used only when drivers/pci/setup.c is used */
@@ -490,19 +491,19 @@ static inline int pci_write_config_dword(struct pci_dev *dev, int where, u32 val
490 return pci_bus_write_config_dword (dev->bus, dev->devfn, where, val); 491 return pci_bus_write_config_dword (dev->bus, dev->devfn, where, val);
491} 492}
492 493
493int pci_enable_device(struct pci_dev *dev); 494int __must_check pci_enable_device(struct pci_dev *dev);
494int pci_enable_device_bars(struct pci_dev *dev, int mask); 495int __must_check pci_enable_device_bars(struct pci_dev *dev, int mask);
495void pci_disable_device(struct pci_dev *dev); 496void pci_disable_device(struct pci_dev *dev);
496void pci_set_master(struct pci_dev *dev); 497void pci_set_master(struct pci_dev *dev);
497#define HAVE_PCI_SET_MWI 498#define HAVE_PCI_SET_MWI
498int pci_set_mwi(struct pci_dev *dev); 499int __must_check pci_set_mwi(struct pci_dev *dev);
499void pci_clear_mwi(struct pci_dev *dev); 500void pci_clear_mwi(struct pci_dev *dev);
500void pci_intx(struct pci_dev *dev, int enable); 501void pci_intx(struct pci_dev *dev, int enable);
501int pci_set_dma_mask(struct pci_dev *dev, u64 mask); 502int pci_set_dma_mask(struct pci_dev *dev, u64 mask);
502int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask); 503int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask);
503void pci_update_resource(struct pci_dev *dev, struct resource *res, int resno); 504void pci_update_resource(struct pci_dev *dev, struct resource *res, int resno);
504int pci_assign_resource(struct pci_dev *dev, int i); 505int __must_check pci_assign_resource(struct pci_dev *dev, int i);
505int pci_assign_resource_fixed(struct pci_dev *dev, int i); 506int __must_check pci_assign_resource_fixed(struct pci_dev *dev, int i);
506void pci_restore_bars(struct pci_dev *dev); 507void pci_restore_bars(struct pci_dev *dev);
507 508
508/* ROM control related routines */ 509/* ROM control related routines */
@@ -528,23 +529,24 @@ void pdev_sort_resources(struct pci_dev *, struct resource_list *);
528void pci_fixup_irqs(u8 (*)(struct pci_dev *, u8 *), 529void pci_fixup_irqs(u8 (*)(struct pci_dev *, u8 *),
529 int (*)(struct pci_dev *, u8, u8)); 530 int (*)(struct pci_dev *, u8, u8));
530#define HAVE_PCI_REQ_REGIONS 2 531#define HAVE_PCI_REQ_REGIONS 2
531int pci_request_regions(struct pci_dev *, const char *); 532int __must_check pci_request_regions(struct pci_dev *, const char *);
532void pci_release_regions(struct pci_dev *); 533void pci_release_regions(struct pci_dev *);
533int pci_request_region(struct pci_dev *, int, const char *); 534int __must_check pci_request_region(struct pci_dev *, int, const char *);
534void pci_release_region(struct pci_dev *, int); 535void pci_release_region(struct pci_dev *, int);
535 536
536/* drivers/pci/bus.c */ 537/* drivers/pci/bus.c */
537int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, 538int __must_check pci_bus_alloc_resource(struct pci_bus *bus,
538 resource_size_t size, resource_size_t align, 539 struct resource *res, resource_size_t size,
539 resource_size_t min, unsigned int type_mask, 540 resource_size_t align, resource_size_t min,
540 void (*alignf)(void *, struct resource *, 541 unsigned int type_mask,
541 resource_size_t, resource_size_t), 542 void (*alignf)(void *, struct resource *,
542 void *alignf_data); 543 resource_size_t, resource_size_t),
544 void *alignf_data);
543void pci_enable_bridges(struct pci_bus *bus); 545void pci_enable_bridges(struct pci_bus *bus);
544 546
545/* Proper probing supporting hot-pluggable devices */ 547/* Proper probing supporting hot-pluggable devices */
546int __pci_register_driver(struct pci_driver *, struct module *); 548int __must_check __pci_register_driver(struct pci_driver *, struct module *);
547static inline int pci_register_driver(struct pci_driver *driver) 549static inline int __must_check pci_register_driver(struct pci_driver *driver)
548{ 550{
549 return __pci_register_driver(driver, THIS_MODULE); 551 return __pci_register_driver(driver, THIS_MODULE);
550} 552}
diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h
index 95f6db54d8d2..02ad790921fd 100644
--- a/include/linux/sysfs.h
+++ b/include/linux/sysfs.h
@@ -10,6 +10,7 @@
10#ifndef _SYSFS_H_ 10#ifndef _SYSFS_H_
11#define _SYSFS_H_ 11#define _SYSFS_H_
12 12
13#include <linux/compiler.h>
13#include <asm/atomic.h> 14#include <asm/atomic.h>
14 15
15struct kobject; 16struct kobject;
@@ -86,37 +87,39 @@ struct sysfs_dirent {
86 87
87#ifdef CONFIG_SYSFS 88#ifdef CONFIG_SYSFS
88 89
89extern int 90extern int __must_check
90sysfs_create_dir(struct kobject *); 91sysfs_create_dir(struct kobject *);
91 92
92extern void 93extern void
93sysfs_remove_dir(struct kobject *); 94sysfs_remove_dir(struct kobject *);
94 95
95extern int 96extern int __must_check
96sysfs_rename_dir(struct kobject *, const char *new_name); 97sysfs_rename_dir(struct kobject *, const char *new_name);
97 98
98extern int 99extern int __must_check
99sysfs_create_file(struct kobject *, const struct attribute *); 100sysfs_create_file(struct kobject *, const struct attribute *);
100 101
101extern int 102extern int __must_check
102sysfs_update_file(struct kobject *, const struct attribute *); 103sysfs_update_file(struct kobject *, const struct attribute *);
103 104
104extern int 105extern int __must_check
105sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode); 106sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode);
106 107
107extern void 108extern void
108sysfs_remove_file(struct kobject *, const struct attribute *); 109sysfs_remove_file(struct kobject *, const struct attribute *);
109 110
110extern int 111extern int __must_check
111sysfs_create_link(struct kobject * kobj, struct kobject * target, const char * name); 112sysfs_create_link(struct kobject * kobj, struct kobject * target, const char * name);
112 113
113extern void 114extern void
114sysfs_remove_link(struct kobject *, const char * name); 115sysfs_remove_link(struct kobject *, const char * name);
115 116
116int sysfs_create_bin_file(struct kobject * kobj, struct bin_attribute * attr); 117int __must_check sysfs_create_bin_file(struct kobject *kobj,
118 struct bin_attribute *attr);
117void sysfs_remove_bin_file(struct kobject *kobj, struct bin_attribute *attr); 119void sysfs_remove_bin_file(struct kobject *kobj, struct bin_attribute *attr);
118 120
119int sysfs_create_group(struct kobject *, const struct attribute_group *); 121int __must_check sysfs_create_group(struct kobject *,
122 const struct attribute_group *);
120void sysfs_remove_group(struct kobject *, const struct attribute_group *); 123void sysfs_remove_group(struct kobject *, const struct attribute_group *);
121void sysfs_notify(struct kobject * k, char *dir, char *attr); 124void sysfs_notify(struct kobject * k, char *dir, char *attr);
122 125