[lustre-devel] [PATCH 227/622] lustre: ldlm: don't convert wrong resource

James Simmons jsimmons at infradead.org
Thu Feb 27 13:11:35 PST 2020


From: Mikhail Pershin <mpershin at whamcloud.com>

During enqueue the returned lock may have different resource
and local client lock replaces resource too. But there is
a valid race with bl_ast and reply from server, so BL AST
may come earlier and find client lock with old resource.
In that case ldlm_handle_bl_callback() should proceed with
normal cancel and don't use cancel_bits for lock convert.

WC-bug-id: https://jira.whamcloud.com/browse/LU-11836
Lustre-commit: 2bc71659db69 ("LU-11836 ldlm: don't convert wrong resource")
Signed-off-by: Mikhail Pershin <mpershin at whamcloud.com>
Reviewed-on: https://review.whamcloud.com/34264
Reviewed-by: Andreas Dilger <adilger at whamcloud.com>
Reviewed-by: Oleg Drokin <green at whamcloud.com>
Signed-off-by: James Simmons <jsimmons at infradead.org>
---
 fs/lustre/ldlm/ldlm_lockd.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/fs/lustre/ldlm/ldlm_lockd.c b/fs/lustre/ldlm/ldlm_lockd.c
index 6905ee5..2985e37 100644
--- a/fs/lustre/ldlm/ldlm_lockd.c
+++ b/fs/lustre/ldlm/ldlm_lockd.c
@@ -131,8 +131,14 @@ void ldlm_handle_bl_callback(struct ldlm_namespace *ns,
 		 * NOTE: ld can be NULL or can be not NULL but zeroed if
 		 * passed from ldlm_bl_thread_blwi(), check below used bits
 		 * in ld to make sure it is valid description.
+		 *
+		 * If server may replace lock resource keeping the same cookie,
+		 * never use cancel bits from different resource, full cancel
+		 * is to be used.
 		 */
-		if (ld && ld->l_policy_data.l_inodebits.bits)
+		if (ld && ld->l_policy_data.l_inodebits.bits &&
+		    ldlm_res_eq(&ld->l_resource.lr_name,
+				&lock->l_resource->lr_name))
 			lock->l_policy_data.l_inodebits.cancel_bits =
 				ld->l_policy_data.l_inodebits.cancel_bits;
 		/* if there is no valid ld and lock is cbpending already
-- 
1.8.3.1



More information about the lustre-devel mailing list