Whamcloud - gitweb
LU-11836 ldlm: don't convert wrong resource 64/34264/4
authorMikhail Pershin <mpershin@whamcloud.com>
Fri, 15 Feb 2019 09:14:30 +0000 (12:14 +0300)
committerOleg Drokin <green@whamcloud.com>
Fri, 15 Mar 2019 23:45:57 +0000 (23:45 +0000)
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 <mpershin@whamcloud.com>
Change-Id: Ib7fd98ce73821b1e3207e7f2bfba0e0acfdc2380
Reviewed-on: https://review.whamcloud.com/34264
Tested-by: Jenkins
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/ldlm/ldlm_lockd.c

index dd293e2..4df7ec8 100644 (file)
@@ -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