kernfs: annotate different lockdep class for of->mutex of writable files
authorAmir Goldstein <amir73il@gmail.com>
Fri, 5 Apr 2024 14:56:35 +0000 (17:56 +0300)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 14 Apr 2024 10:55:46 +0000 (06:55 -0400)
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>
fs/kernfs/file.c

index e9df2f87072c687073abe9625e66886934497a02..8502ef68459b9842d090a4ac338591778d1b3b24 100644 (file)
@@ -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);