aboutsummaryrefslogtreecommitdiffstats
path: root/queue-6.8/kernfs-annotate-different-lockdep-class-for-of-mutex-of-writable-files.patch
diff options
context:
space:
mode:
Diffstat (limited to 'queue-6.8/kernfs-annotate-different-lockdep-class-for-of-mutex-of-writable-files.patch')
-rw-r--r--queue-6.8/kernfs-annotate-different-lockdep-class-for-of-mutex-of-writable-files.patch49
1 files changed, 49 insertions, 0 deletions
diff --git a/queue-6.8/kernfs-annotate-different-lockdep-class-for-of-mutex-of-writable-files.patch b/queue-6.8/kernfs-annotate-different-lockdep-class-for-of-mutex-of-writable-files.patch
new file mode 100644
index 0000000000..c1b25aad23
--- /dev/null
+++ b/queue-6.8/kernfs-annotate-different-lockdep-class-for-of-mutex-of-writable-files.patch
@@ -0,0 +1,49 @@
+From 16b52bbee4823b01ab7fe3919373c981a38f3797 Mon Sep 17 00:00:00 2001
+From: Amir Goldstein <amir73il@gmail.com>
+Date: Fri, 5 Apr 2024 17:56:35 +0300
+Subject: kernfs: annotate different lockdep class for of->mutex of writable files
+
+From: Amir Goldstein <amir73il@gmail.com>
+
+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>
+---
+ fs/kernfs/file.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+--- a/fs/kernfs/file.c
++++ b/fs/kernfs/file.c
+@@ -634,11 +634,18 @@ static int kernfs_fop_open(struct inode
+ * 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);
+