mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
kernfs: annotate different lockdep class for of->mutex of writable files
The writable file /sys/power/resume may call vfs lookup helpers for
arbitrary paths and readonly files can be read by overlayfs from vfs
helpers when sysfs is a lower layer of overalyfs.
To avoid a lockdep warning of circular dependency between overlayfs
inode lock and kernfs of->mutex, use a different lockdep class for
writable and readonly kernfs files.
Reported-by: syzbot+9a5b0ced8b1bfb238b56@syzkaller.appspotmail.com
Fixes: 0fedefd4c4
("kernfs: sysfs: support custom llseek method for sysfs entries")
Suggested-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
fec50db703
commit
16b52bbee4
@ -636,11 +636,18 @@ static int kernfs_fop_open(struct inode *inode, struct file *file)
|
|||||||
* each file a separate locking class. Let's differentiate on
|
* each file a separate locking class. Let's differentiate on
|
||||||
* whether the file has mmap or not for now.
|
* whether the file has mmap or not for now.
|
||||||
*
|
*
|
||||||
* Both paths of the branch look the same. They're supposed to
|
* For similar reasons, writable and readonly files are given different
|
||||||
|
* lockdep key, because the writable file /sys/power/resume may call vfs
|
||||||
|
* lookup helpers for arbitrary paths and readonly files can be read by
|
||||||
|
* overlayfs from vfs helpers when sysfs is a lower layer of overalyfs.
|
||||||
|
*
|
||||||
|
* All three cases look the same. They're supposed to
|
||||||
* look that way and give @of->mutex different static lockdep keys.
|
* look that way and give @of->mutex different static lockdep keys.
|
||||||
*/
|
*/
|
||||||
if (has_mmap)
|
if (has_mmap)
|
||||||
mutex_init(&of->mutex);
|
mutex_init(&of->mutex);
|
||||||
|
else if (file->f_mode & FMODE_WRITE)
|
||||||
|
mutex_init(&of->mutex);
|
||||||
else
|
else
|
||||||
mutex_init(&of->mutex);
|
mutex_init(&of->mutex);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user