Commit 16b52bbe authored by Amir Goldstein's avatar Amir Goldstein Committed by Al Viro
Browse files

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: default avatar <syzbot+9a5b0ced8b1bfb238b56@syzkaller.appspotmail.com>
Fixes: 0fedefd4 ("kernfs: sysfs: support custom llseek method for sysfs entries")
Suggested-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent fec50db7
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -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
	 * 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);