diff options
author | Amir Goldstein <amir73il@gmail.com> | 2024-04-05 17:56:35 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2024-04-17 12:23:40 +0300 |
commit | bb43c568f74f843b3e8547d125d82a6ec6a1a61e (patch) | |
tree | a8a262fbf454dc0a2064fb91a244068f220d43c9 | |
parent | bbb2d4c71e86874762ed3e0133d53c2b8e206f20 (diff) | |
download | linux-bb43c568f74f843b3e8547d125d82a6ec6a1a61e.tar.xz |
kernfs: annotate different lockdep class for of->mutex of writable files
commit 16b52bbee4823b01ab7fe3919373c981a38f3797 upstream.
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: 0fedefd4c4e3 ("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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | fs/kernfs/file.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c index ffa4565c275a..b7f943f33366 100644 --- a/fs/kernfs/file.c +++ b/fs/kernfs/file.c @@ -634,11 +634,18 @@ static int kernfs_fop_open(struct inode *inode, struct file *file) * each file a separate locking class. Let's differentiate on * 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. */ if (has_mmap) mutex_init(&of->mutex); + else if (file->f_mode & FMODE_WRITE) + mutex_init(&of->mutex); else mutex_init(&of->mutex); |