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 |
