It seems there is no need to take d_lock when accessing dentry->d_flags & DCACHE_ENCRYPTED_WITH_KEY in fscrypt_d_revalidate. It only needs to be serialized for updating. Signed-off-by: Gao Xiang <gaoxiang25@xxxxxxxxxx> --- Change log v2: - Fix negative dentry (NULL d_inode) issue as Eric pointed out; - Fix to use '__lockref_is_dead()' as Eric pointed out before; [original message] Hi, At glance, I have no idea why fscrypt_d_revalidate disables RCU-lookup. Therefore I made patches to raise a question and do some test (eg. fsstress w/ and w/o drop_caches) and it seems to work. Thanks, Gao Xiang fs/crypto/crypto.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/fs/crypto/crypto.c b/fs/crypto/crypto.c index 0f46cf550907..b38c574f70ac 100644 --- a/fs/crypto/crypto.c +++ b/fs/crypto/crypto.c @@ -329,9 +329,8 @@ static int fscrypt_d_revalidate(struct dentry *dentry, unsigned int flags) return 0; } - spin_lock(&dentry->d_lock); - cached_with_key = dentry->d_flags & DCACHE_ENCRYPTED_WITH_KEY; - spin_unlock(&dentry->d_lock); + cached_with_key = READ_ONCE(dentry->d_flags) & + DCACHE_ENCRYPTED_WITH_KEY; dir_has_key = (d_inode(dir)->i_crypt_info != NULL); dput(dir); -- 2.14.4