From 49f4bd032446a9f7c594b5b2ca130e2a45714262 Mon Sep 17 00:00:00 2001 From: Andriy Skulysh Date: Wed, 22 Mar 2017 12:21:15 +0200 Subject: [PATCH] LU-9241 llite: ASSERTION( de->d_op == &ll_d_ops ) failed The assertion can be checked while dentry isn't fully initialized in HAVE_DCACHE_LOCK case. Reorder assignments to make assertion always true. Later ll_dentry_data bitfields modification should be protected by a spinlock. Change-Id: I4a1ea42b9fe1c9398539a1a241b8a191dba5903c Seagate-bug-id: MRP-4257 Signed-off-by: Andriy Skulysh Signed-off-by: Lai Siyao Reviewed-on: https://review.whamcloud.com/26109 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Niu Yawei Reviewed-by: Bobi Jam Reviewed-by: Oleg Drokin --- lustre/llite/dcache.c | 5 +++-- lustre/llite/llite_nfs.c | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lustre/llite/dcache.c b/lustre/llite/dcache.c index a8fb890..6b2fdf3 100644 --- a/lustre/llite/dcache.c +++ b/lustre/llite/dcache.c @@ -170,12 +170,13 @@ int ll_d_init(struct dentry *de) if (likely(lld != NULL)) { spin_lock(&de->d_lock); if (likely(de->d_fsdata == NULL)) { - de->d_fsdata = lld; - __d_lustre_invalidate(de); #ifdef HAVE_DCACHE_LOCK /* kernel >= 2.6.38 d_op is set in d_alloc() */ de->d_op = &ll_d_ops; + smp_mb(); #endif + de->d_fsdata = lld; + __d_lustre_invalidate(de); } else { OBD_FREE_PTR(lld); } diff --git a/lustre/llite/llite_nfs.c b/lustre/llite/llite_nfs.c index 9b15396..c24f7f6 100644 --- a/lustre/llite/llite_nfs.c +++ b/lustre/llite/llite_nfs.c @@ -148,7 +148,9 @@ ll_iget_for_nfs(struct super_block *sb, struct lu_fid *fid, struct lu_fid *paren * we came from NFS and so opencache needs to be * enabled for this one */ + spin_lock(&result->d_lock); ldd->lld_nfs_dentry = 1; + spin_unlock(&result->d_lock); } } -- 1.8.3.1