From ede8d928d6c47551371512c80dfa4f159260e7e2 Mon Sep 17 00:00:00 2001 From: Andriy Skulysh Date: Wed, 3 Apr 2024 13:34:32 +0300 Subject: [PATCH] LU-17871 ldlm: FLOCK ownlocks may be not set Conflict checking loop should continue until ownlocks is set. Ownlocks variable is essential for lock merges. Change-Id: Ied526581dd7d4f100c95f2fe582d117a87a8a584 Fixes: b07a57027e (LU-15402 ldlm: speedup RD flock enqueue) HPE-bug-id: LUS-12243 Signed-off-by: Andriy Skulysh Reviewed-by: Vitaly Fertman Reviewed-by: Alexander Boyko Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/55184 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Sergey Cheremencev Reviewed-by: Oleg Drokin --- lustre/ldlm/ldlm_flock.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lustre/ldlm/ldlm_flock.c b/lustre/ldlm/ldlm_flock.c index 659dd4a..14a182b 100644 --- a/lustre/ldlm/ldlm_flock.c +++ b/lustre/ldlm/ldlm_flock.c @@ -377,6 +377,7 @@ reprocess: #ifdef HAVE_SERVER_SUPPORT else { int reprocess_failed = 0; + int pr_matched = 0; lockmode_verify(mode); @@ -385,8 +386,11 @@ reprocess: */ list_for_each_entry(lock, &res->lr_granted, l_res_link) { if (ldlm_same_flock_owner(lock, req)) { - if (!ownlocks) + if (!ownlocks) { ownlocks = lock; + if (pr_matched) + break; + } continue; } @@ -397,7 +401,10 @@ reprocess: lock->l_policy_data.l_flock.end >= req->l_policy_data.l_flock.end) { /* there can't be granted WR lock */ - break; + if (ownlocks) + break; + pr_matched = 1; + continue; } /* locks are compatible, overlap doesn't matter */ if (lockmode_compat(lock->l_granted_mode, mode)) -- 1.8.3.1