From: Mikhail Pershin Date: Fri, 15 Feb 2019 09:14:30 +0000 (+0300) Subject: LU-11836 ldlm: don't convert wrong resource X-Git-Tag: 2.12.53~125 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=2bc71659db69335ba1c93dab44dc733dc0849d0c;p=fs%2Flustre-release.git 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 --- 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