summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2026-05-04 07:32:43 +0300
committerAl Viro <viro@zeniv.linux.org.uk>2026-06-05 07:34:55 +0300
commit87e801e1678342fc23b1eb92c0eecedf5dca79cb (patch)
tree4623115c5a98f7e823d1eca47751a48b69995588
parent1a967a7ec70ff951716e84739f79b6e167ac1e0b (diff)
downloadlinux-87e801e1678342fc23b1eb92c0eecedf5dca79cb.tar.xz
find_acceptable_alias(): skip NORCU aliases with zero refcount
similar to d_find_any_alias() situation Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/exportfs/expfs.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c
index fbd45e7ae706..eafd99507afe 100644
--- a/fs/exportfs/expfs.c
+++ b/fs/exportfs/expfs.c
@@ -53,10 +53,10 @@ find_acceptable_alias(struct dentry *result,
inode = result->d_inode;
spin_lock(&inode->i_lock);
for_each_alias(dentry, inode) {
- dget(dentry);
+ if (!dget_alias_ilocked(dentry))
+ continue;
spin_unlock(&inode->i_lock);
- if (toput)
- dput(toput);
+ dput(toput);
if (dentry != result && acceptable(context, dentry)) {
dput(result);
return dentry;
@@ -66,8 +66,7 @@ find_acceptable_alias(struct dentry *result,
}
spin_unlock(&inode->i_lock);
- if (toput)
- dput(toput);
+ dput(toput);
return NULL;
}