Skip to content

Commit 4a7fb63

Browse files
Andrew Mortongregkh
Andrew Morton
authored andcommitted
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 <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 35acfdd commit 4a7fb63

File tree

4 files changed

+66
-55
lines changed

4 files changed

+66
-55
lines changed

include/linux/device.h

+28-24
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <linux/kobject.h>
1616
#include <linux/klist.h>
1717
#include <linux/list.h>
18+
#include <linux/compiler.h>
1819
#include <linux/types.h>
1920
#include <linux/module.h>
2021
#include <linux/pm.h>
@@ -58,7 +59,7 @@ struct bus_type {
5859
int (*resume)(struct device * dev);
5960
};
6061

61-
extern int bus_register(struct bus_type * bus);
62+
extern int __must_check bus_register(struct bus_type * bus);
6263
extern void bus_unregister(struct bus_type * bus);
6364

6465
extern 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,
7071
struct device * bus_find_device(struct bus_type *bus, struct device *start,
7172
void *data, int (*match)(struct device *, void *));
7273

73-
int bus_for_each_drv(struct bus_type * bus, struct device_driver * start,
74-
void * data, int (*fn)(struct device_driver *, void *));
75-
74+
int __must_check bus_for_each_drv(struct bus_type *bus,
75+
struct device_driver *start, void *data,
76+
int (*fn)(struct device_driver *, void *));
7677

7778
/* driverfs interface for exporting bus attributes */
7879

@@ -85,7 +86,8 @@ struct bus_attribute {
8586
#define BUS_ATTR(_name,_mode,_show,_store) \
8687
struct bus_attribute bus_attr_##_name = __ATTR(_name,_mode,_show,_store)
8788

88-
extern int bus_create_file(struct bus_type *, struct bus_attribute *);
89+
extern int __must_check bus_create_file(struct bus_type *,
90+
struct bus_attribute *);
8991
extern void bus_remove_file(struct bus_type *, struct bus_attribute *);
9092

9193
struct device_driver {
@@ -107,14 +109,13 @@ struct device_driver {
107109
};
108110

109111

110-
extern int driver_register(struct device_driver * drv);
112+
extern int __must_check driver_register(struct device_driver * drv);
111113
extern void driver_unregister(struct device_driver * drv);
112114

113115
extern struct device_driver * get_driver(struct device_driver * drv);
114116
extern void put_driver(struct device_driver * drv);
115117
extern struct device_driver *driver_find(const char *name, struct bus_type *bus);
116118

117-
118119
/* driverfs interface for exporting driver attributes */
119120

120121
struct driver_attribute {
@@ -126,16 +127,17 @@ struct driver_attribute {
126127
#define DRIVER_ATTR(_name,_mode,_show,_store) \
127128
struct driver_attribute driver_attr_##_name = __ATTR(_name,_mode,_show,_store)
128129

129-
extern int driver_create_file(struct device_driver *, struct driver_attribute *);
130+
extern int __must_check driver_create_file(struct device_driver *,
131+
struct driver_attribute *);
130132
extern void driver_remove_file(struct device_driver *, struct driver_attribute *);
131133

132-
extern int driver_for_each_device(struct device_driver * drv, struct device * start,
133-
void * data, int (*fn)(struct device *, void *));
134+
extern int __must_check driver_for_each_device(struct device_driver * drv,
135+
struct device *start, void *data,
136+
int (*fn)(struct device *, void *));
134137
struct device * driver_find_device(struct device_driver *drv,
135138
struct device *start, void *data,
136139
int (*match)(struct device *, void *));
137140

138-
139141
/*
140142
* device classes
141143
*/
@@ -168,7 +170,7 @@ struct class {
168170
int (*resume)(struct device *);
169171
};
170172

171-
extern int class_register(struct class *);
173+
extern int __must_check class_register(struct class *);
172174
extern void class_unregister(struct class *);
173175

174176

@@ -181,7 +183,8 @@ struct class_attribute {
181183
#define CLASS_ATTR(_name,_mode,_show,_store) \
182184
struct class_attribute class_attr_##_name = __ATTR(_name,_mode,_show,_store)
183185

184-
extern int class_create_file(struct class *, const struct class_attribute *);
186+
extern int __must_check class_create_file(struct class *,
187+
const struct class_attribute *);
185188
extern void class_remove_file(struct class *, const struct class_attribute *);
186189

187190
struct class_device_attribute {
@@ -194,7 +197,7 @@ struct class_device_attribute {
194197
struct class_device_attribute class_device_attr_##_name = \
195198
__ATTR(_name,_mode,_show,_store)
196199

197-
extern int class_device_create_file(struct class_device *,
200+
extern int __must_check class_device_create_file(struct class_device *,
198201
const struct class_device_attribute *);
199202

200203
/**
@@ -254,10 +257,10 @@ class_set_devdata (struct class_device *dev, void *data)
254257
}
255258

256259

257-
extern int class_device_register(struct class_device *);
260+
extern int __must_check class_device_register(struct class_device *);
258261
extern void class_device_unregister(struct class_device *);
259262
extern void class_device_initialize(struct class_device *);
260-
extern int class_device_add(struct class_device *);
263+
extern int __must_check class_device_add(struct class_device *);
261264
extern void class_device_del(struct class_device *);
262265

263266
extern int class_device_rename(struct class_device *, char *);
@@ -267,7 +270,7 @@ extern void class_device_put(struct class_device *);
267270

268271
extern void class_device_remove_file(struct class_device *,
269272
const struct class_device_attribute *);
270-
extern int class_device_create_bin_file(struct class_device *,
273+
extern int __must_check class_device_create_bin_file(struct class_device *,
271274
struct bin_attribute *);
272275
extern void class_device_remove_bin_file(struct class_device *,
273276
struct bin_attribute *);
@@ -282,7 +285,7 @@ struct class_interface {
282285
void (*remove_dev) (struct device *, struct class_interface *);
283286
};
284287

285-
extern int class_interface_register(struct class_interface *);
288+
extern int __must_check class_interface_register(struct class_interface *);
286289
extern void class_interface_unregister(struct class_interface *);
287290

288291
extern struct class *class_create(struct module *owner, const char *name);
@@ -307,7 +310,8 @@ struct device_attribute {
307310
#define DEVICE_ATTR(_name,_mode,_show,_store) \
308311
struct device_attribute dev_attr_##_name = __ATTR(_name,_mode,_show,_store)
309312

310-
extern int device_create_file(struct device *device, struct device_attribute * entry);
313+
extern int __must_check device_create_file(struct device *device,
314+
struct device_attribute * entry);
311315
extern void device_remove_file(struct device * dev, struct device_attribute * attr);
312316
extern int __must_check device_create_bin_file(struct device *dev,
313317
struct bin_attribute *attr);
@@ -380,12 +384,12 @@ static inline int device_is_registered(struct device *dev)
380384
/*
381385
* High level routines for use by the bus drivers
382386
*/
383-
extern int device_register(struct device * dev);
387+
extern int __must_check device_register(struct device * dev);
384388
extern void device_unregister(struct device * dev);
385389
extern void device_initialize(struct device * dev);
386-
extern int device_add(struct device * dev);
390+
extern int __must_check device_add(struct device * dev);
387391
extern void device_del(struct device * dev);
388-
extern int device_for_each_child(struct device *, void *,
392+
extern int __must_check device_for_each_child(struct device *, void *,
389393
int (*fn)(struct device *, void *));
390394
extern int device_rename(struct device *dev, char *new_name);
391395

@@ -395,7 +399,7 @@ extern int device_rename(struct device *dev, char *new_name);
395399
*/
396400
extern void device_bind_driver(struct device * dev);
397401
extern void device_release_driver(struct device * dev);
398-
extern int device_attach(struct device * dev);
402+
extern int __must_check device_attach(struct device * dev);
399403
extern void driver_attach(struct device_driver * drv);
400404
extern void device_reprobe(struct device *dev);
401405

@@ -433,7 +437,7 @@ extern void device_shutdown(void);
433437

434438

435439
/* drivers/base/firmware.c */
436-
extern int firmware_register(struct subsystem *);
440+
extern int __must_check firmware_register(struct subsystem *);
437441
extern void firmware_unregister(struct subsystem *);
438442

439443
/* debugging and troubleshooting/diagnostic helpers. */

include/linux/kobject.h

+9-7
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <linux/types.h>
2121
#include <linux/list.h>
2222
#include <linux/sysfs.h>
23+
#include <linux/compiler.h>
2324
#include <linux/spinlock.h>
2425
#include <linux/rwsem.h>
2526
#include <linux/kref.h>
@@ -71,12 +72,12 @@ static inline const char * kobject_name(const struct kobject * kobj)
7172
extern void kobject_init(struct kobject *);
7273
extern void kobject_cleanup(struct kobject *);
7374

74-
extern int kobject_add(struct kobject *);
75+
extern int __must_check kobject_add(struct kobject *);
7576
extern void kobject_del(struct kobject *);
7677

77-
extern int kobject_rename(struct kobject *, const char *new_name);
78+
extern int __must_check kobject_rename(struct kobject *, const char *new_name);
7879

79-
extern int kobject_register(struct kobject *);
80+
extern int __must_check kobject_register(struct kobject *);
8081
extern void kobject_unregister(struct kobject *);
8182

8283
extern struct kobject * kobject_get(struct kobject *);
@@ -128,8 +129,8 @@ struct kset {
128129

129130

130131
extern void kset_init(struct kset * k);
131-
extern int kset_add(struct kset * k);
132-
extern int kset_register(struct kset * k);
132+
extern int __must_check kset_add(struct kset * k);
133+
extern int __must_check kset_register(struct kset * k);
133134
extern void kset_unregister(struct kset * k);
134135

135136
static inline struct kset * to_kset(struct kobject * kobj)
@@ -239,7 +240,7 @@ extern struct subsystem hypervisor_subsys;
239240
(obj)->subsys.kset.kobj.kset = &(_subsys).kset
240241

241242
extern void subsystem_init(struct subsystem *);
242-
extern int subsystem_register(struct subsystem *);
243+
extern int __must_check subsystem_register(struct subsystem *);
243244
extern void subsystem_unregister(struct subsystem *);
244245

245246
static inline struct subsystem * subsys_get(struct subsystem * s)
@@ -258,7 +259,8 @@ struct subsys_attribute {
258259
ssize_t (*store)(struct subsystem *, const char *, size_t);
259260
};
260261

261-
extern int subsys_create_file(struct subsystem * , struct subsys_attribute *);
262+
extern int __must_check subsys_create_file(struct subsystem * ,
263+
struct subsys_attribute *);
262264

263265
#if defined(CONFIG_HOTPLUG)
264266
void kobject_uevent(struct kobject *kobj, enum kobject_action action);

include/linux/pci.h

+18-16
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include <linux/types.h>
5050
#include <linux/ioport.h>
5151
#include <linux/list.h>
52+
#include <linux/compiler.h>
5253
#include <linux/errno.h>
5354
#include <linux/device.h>
5455

@@ -403,7 +404,7 @@ extern struct list_head pci_root_buses; /* list of all known PCI buses */
403404
extern struct list_head pci_devices; /* list of all devices */
404405

405406
void pcibios_fixup_bus(struct pci_bus *);
406-
int pcibios_enable_device(struct pci_dev *, int mask);
407+
int __must_check pcibios_enable_device(struct pci_dev *, int mask);
407408
char *pcibios_setup (char *str);
408409

409410
/* 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
490491
return pci_bus_write_config_dword (dev->bus, dev->devfn, where, val);
491492
}
492493

493-
int pci_enable_device(struct pci_dev *dev);
494-
int pci_enable_device_bars(struct pci_dev *dev, int mask);
494+
int __must_check pci_enable_device(struct pci_dev *dev);
495+
int __must_check pci_enable_device_bars(struct pci_dev *dev, int mask);
495496
void pci_disable_device(struct pci_dev *dev);
496497
void pci_set_master(struct pci_dev *dev);
497498
#define HAVE_PCI_SET_MWI
498-
int pci_set_mwi(struct pci_dev *dev);
499+
int __must_check pci_set_mwi(struct pci_dev *dev);
499500
void pci_clear_mwi(struct pci_dev *dev);
500501
void pci_intx(struct pci_dev *dev, int enable);
501502
int pci_set_dma_mask(struct pci_dev *dev, u64 mask);
502503
int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask);
503504
void pci_update_resource(struct pci_dev *dev, struct resource *res, int resno);
504-
int pci_assign_resource(struct pci_dev *dev, int i);
505-
int pci_assign_resource_fixed(struct pci_dev *dev, int i);
505+
int __must_check pci_assign_resource(struct pci_dev *dev, int i);
506+
int __must_check pci_assign_resource_fixed(struct pci_dev *dev, int i);
506507
void pci_restore_bars(struct pci_dev *dev);
507508

508509
/* ROM control related routines */
@@ -528,23 +529,24 @@ void pdev_sort_resources(struct pci_dev *, struct resource_list *);
528529
void pci_fixup_irqs(u8 (*)(struct pci_dev *, u8 *),
529530
int (*)(struct pci_dev *, u8, u8));
530531
#define HAVE_PCI_REQ_REGIONS 2
531-
int pci_request_regions(struct pci_dev *, const char *);
532+
int __must_check pci_request_regions(struct pci_dev *, const char *);
532533
void pci_release_regions(struct pci_dev *);
533-
int pci_request_region(struct pci_dev *, int, const char *);
534+
int __must_check pci_request_region(struct pci_dev *, int, const char *);
534535
void pci_release_region(struct pci_dev *, int);
535536

536537
/* drivers/pci/bus.c */
537-
int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
538-
resource_size_t size, resource_size_t align,
539-
resource_size_t min, unsigned int type_mask,
540-
void (*alignf)(void *, struct resource *,
541-
resource_size_t, resource_size_t),
542-
void *alignf_data);
538+
int __must_check pci_bus_alloc_resource(struct pci_bus *bus,
539+
struct resource *res, resource_size_t size,
540+
resource_size_t align, resource_size_t min,
541+
unsigned int type_mask,
542+
void (*alignf)(void *, struct resource *,
543+
resource_size_t, resource_size_t),
544+
void *alignf_data);
543545
void pci_enable_bridges(struct pci_bus *bus);
544546

545547
/* Proper probing supporting hot-pluggable devices */
546-
int __pci_register_driver(struct pci_driver *, struct module *);
547-
static inline int pci_register_driver(struct pci_driver *driver)
548+
int __must_check __pci_register_driver(struct pci_driver *, struct module *);
549+
static inline int __must_check pci_register_driver(struct pci_driver *driver)
548550
{
549551
return __pci_register_driver(driver, THIS_MODULE);
550552
}

include/linux/sysfs.h

+11-8
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#ifndef _SYSFS_H_
1111
#define _SYSFS_H_
1212

13+
#include <linux/compiler.h>
1314
#include <asm/atomic.h>
1415

1516
struct kobject;
@@ -86,37 +87,39 @@ struct sysfs_dirent {
8687

8788
#ifdef CONFIG_SYSFS
8889

89-
extern int
90+
extern int __must_check
9091
sysfs_create_dir(struct kobject *);
9192

9293
extern void
9394
sysfs_remove_dir(struct kobject *);
9495

95-
extern int
96+
extern int __must_check
9697
sysfs_rename_dir(struct kobject *, const char *new_name);
9798

98-
extern int
99+
extern int __must_check
99100
sysfs_create_file(struct kobject *, const struct attribute *);
100101

101-
extern int
102+
extern int __must_check
102103
sysfs_update_file(struct kobject *, const struct attribute *);
103104

104-
extern int
105+
extern int __must_check
105106
sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode);
106107

107108
extern void
108109
sysfs_remove_file(struct kobject *, const struct attribute *);
109110

110-
extern int
111+
extern int __must_check
111112
sysfs_create_link(struct kobject * kobj, struct kobject * target, const char * name);
112113

113114
extern void
114115
sysfs_remove_link(struct kobject *, const char * name);
115116

116-
int sysfs_create_bin_file(struct kobject * kobj, struct bin_attribute * attr);
117+
int __must_check sysfs_create_bin_file(struct kobject *kobj,
118+
struct bin_attribute *attr);
117119
void sysfs_remove_bin_file(struct kobject *kobj, struct bin_attribute *attr);
118120

119-
int sysfs_create_group(struct kobject *, const struct attribute_group *);
121+
int __must_check sysfs_create_group(struct kobject *,
122+
const struct attribute_group *);
120123
void sysfs_remove_group(struct kobject *, const struct attribute_group *);
121124
void sysfs_notify(struct kobject * k, char *dir, char *attr);
122125

0 commit comments

Comments
 (0)