diff options
-rw-r--r-- | fs/sysfs/sysfs.h | 7 | ||||
-rw-r--r-- | include/linux/sysfs.h | 18 |
2 files changed, 23 insertions, 2 deletions
diff --git a/fs/sysfs/sysfs.h b/fs/sysfs/sysfs.h index 7db6884f4206..37e0e086233c 100644 --- a/fs/sysfs/sysfs.h +++ b/fs/sysfs/sysfs.h | |||
@@ -92,9 +92,12 @@ static inline unsigned int sysfs_type(struct sysfs_dirent *sd) | |||
92 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 92 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
93 | #define sysfs_dirent_init_lockdep(sd) \ | 93 | #define sysfs_dirent_init_lockdep(sd) \ |
94 | do { \ | 94 | do { \ |
95 | static struct lock_class_key __key; \ | 95 | struct attribute *attr = sd->s_attr.attr; \ |
96 | struct lock_class_key *key = attr->key; \ | ||
97 | if (!key) \ | ||
98 | key = &attr->skey; \ | ||
96 | \ | 99 | \ |
97 | lockdep_init_map(&sd->dep_map, "s_active", &__key, 0); \ | 100 | lockdep_init_map(&sd->dep_map, "s_active", key, 0); \ |
98 | } while(0) | 101 | } while(0) |
99 | #else | 102 | #else |
100 | #define sysfs_dirent_init_lockdep(sd) do {} while(0) | 103 | #define sysfs_dirent_init_lockdep(sd) do {} while(0) |
diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h index 3e8526582146..006c359e63c0 100644 --- a/include/linux/sysfs.h +++ b/include/linux/sysfs.h | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/compiler.h> | 15 | #include <linux/compiler.h> |
16 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
17 | #include <linux/list.h> | 17 | #include <linux/list.h> |
18 | #include <linux/lockdep.h> | ||
18 | #include <asm/atomic.h> | 19 | #include <asm/atomic.h> |
19 | 20 | ||
20 | struct kobject; | 21 | struct kobject; |
@@ -29,8 +30,23 @@ struct attribute { | |||
29 | const char *name; | 30 | const char *name; |
30 | struct module *owner; | 31 | struct module *owner; |
31 | mode_t mode; | 32 | mode_t mode; |
33 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
34 | struct lock_class_key *key; | ||
35 | struct lock_class_key skey; | ||
36 | #endif | ||
32 | }; | 37 | }; |
33 | 38 | ||
39 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
40 | #define sysfs_attr_init(attr) \ | ||
41 | do { \ | ||
42 | static struct lock_class_key __key; \ | ||
43 | \ | ||
44 | (attr)->key = &__key; \ | ||
45 | } while(0) | ||
46 | #else | ||
47 | #define sysfs_attr_init(attr) do {} while(0) | ||
48 | #endif | ||
49 | |||
34 | struct attribute_group { | 50 | struct attribute_group { |
35 | const char *name; | 51 | const char *name; |
36 | mode_t (*is_visible)(struct kobject *, | 52 | mode_t (*is_visible)(struct kobject *, |
@@ -74,6 +90,8 @@ struct bin_attribute { | |||
74 | struct vm_area_struct *vma); | 90 | struct vm_area_struct *vma); |
75 | }; | 91 | }; |
76 | 92 | ||
93 | #define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&bin_attr->attr) | ||
94 | |||
77 | struct sysfs_ops { | 95 | struct sysfs_ops { |
78 | ssize_t (*show)(struct kobject *, struct attribute *,char *); | 96 | ssize_t (*show)(struct kobject *, struct attribute *,char *); |
79 | ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t); | 97 | ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t); |