Whamcloud - gitweb
LU-14082 ldlm: Use req_mode while lock cleanup 33/40433/4
authorYang Sheng <ys@whamcloud.com>
Wed, 28 Oct 2020 13:03:47 +0000 (21:03 +0800)
committerOleg Drokin <green@whamcloud.com>
Tue, 5 Jan 2021 08:27:03 +0000 (08:27 +0000)
For local lock, the decref cannot count exactly by
granted_mode if the lock has not been granted.
LustreError: (ldlm_lock.c:354:ldlm_lock_destroy_internal())
 ### lock still has references ns: ??
 lock: ffff88342aa07200/0x9b92ad3407bea22a
 lrc: 4/0,1 mode: --/PW res: ?? rrc=?? type: ???
 flags: 0x10106400000000 nid: local
 remote: 0x5248822d3123ac19 expref: -99
 pid: 14515 timeout: 0 lvb_type: 0
LustreError: (ldlm_lock.c:355:ldlm_lock_destroy_internal()) LBUG
Pid: 14562, comm: ll_imp_inval 3.10.0-693.21.1.el7.x86_64 #1 SMP
Call Trace:
[] save_stack_trace_tsk+0x22/0x40
[] libcfs_call_trace+0x8c/0xc0 [libcfs]
[] lbug_with_loc+0x4c/0xa0 [libcfs]
[] ldlm_lock_destroy_internal+0x269/0x2a0 [ptlrpc]
[] ldlm_lock_destroy_nolock+0x2b/0x110 [ptlrpc]
[] ldlm_flock_completion_ast+0x4f5/0x1080 [ptlrpc]
[] cleanup_resource+0x18e/0x370 [ptlrpc]
[] ldlm_resource_clean+0x53/0x60 [ptlrpc]
[] cfs_hash_for_each_relax+0x250/0x450 [libcfs]
[] cfs_hash_for_each_nolock+0x75/0x1c0 [libcfs]
[] ldlm_namespace_cleanup+0x30/0xc0 [ptlrpc]
[] mdc_import_event+0x1b6/0xa20 [mdc]
[] ptlrpc_invalidate_import+0x220/0x8f0 [ptlrpc]
[] ptlrpc_invalidate_import_thread+0x48/0x2b0 [ptlrpc]
[] kthread+0xd1/0xe0

Signed-off-by: Yang Sheng <ys@whamcloud.com>
Change-Id: Ic029b3fb82a3dedc507e2bada265322efae5b40c
Reviewed-on: https://review.whamcloud.com/40433
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/ldlm/ldlm_flock.c

index 92f7aa5..d5f740f 100644 (file)
@@ -763,7 +763,7 @@ granted:
                if (ldlm_is_test_lock(lock) || ldlm_is_flock_deadlock(lock))
                        mode = getlk->fl_type;
                else
                if (ldlm_is_test_lock(lock) || ldlm_is_flock_deadlock(lock))
                        mode = getlk->fl_type;
                else
-                       mode = lock->l_granted_mode;
+                       mode = lock->l_req_mode;
 
                if (ldlm_is_flock_deadlock(lock)) {
                        LDLM_DEBUG(lock, "client-side enqueue deadlock "
 
                if (ldlm_is_flock_deadlock(lock)) {
                        LDLM_DEBUG(lock, "client-side enqueue deadlock "