diff options
Diffstat (limited to 'fs/sysfs/inode.c')
-rw-r--r-- | fs/sysfs/inode.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c index 5e0e31cc46f5..9889e54e1f13 100644 --- a/fs/sysfs/inode.c +++ b/fs/sysfs/inode.c | |||
@@ -109,6 +109,17 @@ static inline void set_inode_attr(struct inode * inode, struct iattr * iattr) | |||
109 | inode->i_ctime = iattr->ia_ctime; | 109 | inode->i_ctime = iattr->ia_ctime; |
110 | } | 110 | } |
111 | 111 | ||
112 | |||
113 | /* | ||
114 | * sysfs has a different i_mutex lock order behavior for i_mutex than other | ||
115 | * filesystems; sysfs i_mutex is called in many places with subsystem locks | ||
116 | * held. At the same time, many of the VFS locking rules do not apply to | ||
117 | * sysfs at all (cross directory rename for example). To untangle this mess | ||
118 | * (which gives false positives in lockdep), we're giving sysfs inodes their | ||
119 | * own class for i_mutex. | ||
120 | */ | ||
121 | static struct lock_class_key sysfs_inode_imutex_key; | ||
122 | |||
112 | struct inode * sysfs_new_inode(mode_t mode, struct sysfs_dirent * sd) | 123 | struct inode * sysfs_new_inode(mode_t mode, struct sysfs_dirent * sd) |
113 | { | 124 | { |
114 | struct inode * inode = new_inode(sysfs_sb); | 125 | struct inode * inode = new_inode(sysfs_sb); |
@@ -118,6 +129,7 @@ struct inode * sysfs_new_inode(mode_t mode, struct sysfs_dirent * sd) | |||
118 | inode->i_mapping->a_ops = &sysfs_aops; | 129 | inode->i_mapping->a_ops = &sysfs_aops; |
119 | inode->i_mapping->backing_dev_info = &sysfs_backing_dev_info; | 130 | inode->i_mapping->backing_dev_info = &sysfs_backing_dev_info; |
120 | inode->i_op = &sysfs_inode_operations; | 131 | inode->i_op = &sysfs_inode_operations; |
132 | lockdep_set_class(&inode->i_mutex, &sysfs_inode_imutex_key); | ||
121 | 133 | ||
122 | if (sd->s_iattr) { | 134 | if (sd->s_iattr) { |
123 | /* sysfs_dirent has non-default attributes | 135 | /* sysfs_dirent has non-default attributes |