From d285b41b86f0f4650a906fcdb0c74b9dc46a91ef Mon Sep 17 00:00:00 2001 From: Vladimir Saveliev Date: Fri, 28 Jul 2023 10:44:33 -0400 Subject: [PATCH] LU-16851 llite: use right predicate in ll_atomic_open Using d_unhashed() brings a race window with d_add() and d_drop() leading to dentry hash table corruption. If dentry which is in hash already is added to hash table, it gets looped to itself via next pointer: dentry 0xffff8fd34cc08840 ... d_hash = { next = 0xffff8fd34cc08848, pprev = 0x0 }, See for reference: commit 00699ad8571afd7fb8bc2c61f67c86c2428680ab Author: Al Viro Date: Tue Jul 5 09:44:53 2016 -0400 Use the right predicate in ->atomic_open() instances Keep using d_unhashed() if d_in_lookup() is not provided by kernel. HPE-bug-id: LUS-11560 Signed-off-by: Vladimir Saveliev Change-Id: I6c27f031d0d7e7d571752d6172a32406ad68e913 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/51147 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Neil Brown Reviewed-by: Andreas Dilger Reviewed-by: James Simmons Reviewed-by: Oleg Drokin --- lustre/llite/namei.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c index e7a5cef..763dca5 100644 --- a/lustre/llite/namei.c +++ b/lustre/llite/namei.c @@ -1185,7 +1185,11 @@ static int ll_atomic_open(struct inode *dir, struct dentry *dentry, /* Only negative dentries enter here */ LASSERT(dentry->d_inode == NULL); +#ifndef HAVE_D_IN_LOOKUP if (!d_unhashed(dentry)) { +#else + if (!d_in_lookup(dentry)) { +#endif /* A valid negative dentry that just passed revalidation, * there's little point to try and open it server-side, * even though there's a minuscule chance it might succeed. -- 1.8.3.1