]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
kernfs: Move dput() outside of the RCU section.
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Fri, 21 Feb 2025 08:42:32 +0000 (09:42 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Feb 2025 10:55:15 +0000 (11:55 +0100)
Al Viro pointed out that dput() might sleep and must not be invoked
within an RCU section.

Keep only find_next_ancestor() winthin the RCU section.
Correct the wording in the comment.

Fixes: 6ef5b6fae3040 ("kernfs: Drop kernfs_rwsem while invoking lookup_positive_unlocked().")
Reported-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Link: https://lore.kernel.org/r/20250221084232.xksA_IQ4@linutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/kernfs/mount.c

index f1cea282aae325daef8500ec07168a08aba9d347..5124e196c2bfd8862be0ee7dfae1eda06a95bbc6 100644 (file)
@@ -222,17 +222,17 @@ struct dentry *kernfs_node_dentry(struct kernfs_node *kn,
        root = kernfs_root(kn);
        /*
         * As long as kn is valid, its parent can not vanish. This is cgroup's
-        * kn so it not have its parent replaced. Therefore it is safe to use
+        * kn so it can't have its parent replaced. Therefore it is safe to use
         * the ancestor node outside of the RCU or locked section.
         */
        if (WARN_ON_ONCE(!(root->flags & KERNFS_ROOT_INVARIANT_PARENT)))
                return ERR_PTR(-EINVAL);
        scoped_guard(rcu) {
                knparent = find_next_ancestor(kn, NULL);
-               if (WARN_ON(!knparent)) {
-                       dput(dentry);
-                       return ERR_PTR(-EINVAL);
-               }
+       }
+       if (WARN_ON(!knparent)) {
+               dput(dentry);
+               return ERR_PTR(-EINVAL);
        }
 
        do {