kernfs: Move dput() outside of the RCU section.
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: 6ef5b6fae3 ("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>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
e965efc4aa
commit
c5020c5be9
+5
-5
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user