diff options
Diffstat (limited to 'fs/sysfs/file.c')
| -rw-r--r-- | fs/sysfs/file.c | 18 | 
1 files changed, 17 insertions, 1 deletions
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c index 79b5da2acbe1..35e7d08fe629 100644 --- a/fs/sysfs/file.c +++ b/fs/sysfs/file.c @@ -649,7 +649,23 @@ static int sysfs_open_file(struct inode *inode, struct file *file)  	if (!of)  		goto err_out; -	mutex_init(&of->mutex); +	/* +	 * The following is done to give a different lockdep key to +	 * @of->mutex for files which implement mmap.  This is a rather +	 * crude way to avoid false positive lockdep warning around +	 * mm->mmap_sem - mmap nests @of->mutex under mm->mmap_sem and +	 * reading /sys/block/sda/trace/act_mask grabs sr_mutex, under +	 * which mm->mmap_sem nests, while holding @of->mutex.  As each +	 * open file has a separate mutex, it's okay as long as those don't +	 * happen on the same file.  At this point, we can't easily give +	 * each file a separate locking class.  Let's differentiate on +	 * whether the file is bin or not for now. +	 */ +	if (sysfs_is_bin(attr_sd)) +		mutex_init(&of->mutex); +	else +		mutex_init(&of->mutex); +  	of->sd = attr_sd;  	of->file = file;  | 
