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) | |||
649 | if (!of) | 649 | if (!of) |
650 | goto err_out; | 650 | goto err_out; |
651 | 651 | ||
652 | mutex_init(&of->mutex); | 652 | /* |
653 | * The following is done to give a different lockdep key to | ||
654 | * @of->mutex for files which implement mmap. This is a rather | ||
655 | * crude way to avoid false positive lockdep warning around | ||
656 | * mm->mmap_sem - mmap nests @of->mutex under mm->mmap_sem and | ||
657 | * reading /sys/block/sda/trace/act_mask grabs sr_mutex, under | ||
658 | * which mm->mmap_sem nests, while holding @of->mutex. As each | ||
659 | * open file has a separate mutex, it's okay as long as those don't | ||
660 | * happen on the same file. At this point, we can't easily give | ||
661 | * each file a separate locking class. Let's differentiate on | ||
662 | * whether the file is bin or not for now. | ||
663 | */ | ||
664 | if (sysfs_is_bin(attr_sd)) | ||
665 | mutex_init(&of->mutex); | ||
666 | else | ||
667 | mutex_init(&of->mutex); | ||
668 | |||
653 | of->sd = attr_sd; | 669 | of->sd = attr_sd; |
654 | of->file = file; | 670 | of->file = file; |
655 | 671 | ||