From 2bc71659db69335ba1c93dab44dc733dc0849d0c Mon Sep 17 00:00:00 2001 From: Mikhail Pershin Date: Fri, 15 Feb 2019 12:14:30 +0300 Subject: [PATCH] LU-11836 ldlm: don't convert wrong resource 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. Signed-off-by: Mikhail Pershin Change-Id: Ib7fd98ce73821b1e3207e7f2bfba0e0acfdc2380 Reviewed-on: https://review.whamcloud.com/34264 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- lustre/ldlm/ldlm_lockd.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lustre/ldlm/ldlm_lockd.c b/lustre/ldlm/ldlm_lockd.c index dd293e2..4df7ec8 100644 --- a/lustre/ldlm/ldlm_lockd.c +++ b/lustre/ldlm/ldlm_lockd.c @@ -1738,8 +1738,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