Whamcloud - gitweb
LU-1137 ldlm: fix for the flock handling for 1.8 clients
authorAlexey Lyashkov <alexey_yashkov@xyratex.com>
Fri, 24 Feb 2012 10:47:37 +0000 (02:47 -0800)
committerOleg Drokin <green@whamcloud.com>
Thu, 5 Apr 2012 20:48:32 +0000 (16:48 -0400)
The current fix intended to fix the issue with incorrect flock
owner field filling. This issue observed when 1.8 clients
(and with lesser version) doesn't fill the owner field correctly.
With this patch this filling integrated on the 2.x server side.

Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Andriy Skulysh <andriy_skulysh@xyratex.com>
Signed-off-by: Alexey Lyashkov <alexey_lyashkov@xyratex.com>
Signed-off-by: Iurii Golovach <iurii_golovach@xyratex.com>
Xyratex-bug-id: MRP-413
Change-Id: I88ba40eb9cb74d07b90862801669028c5dc94e08
Reviewed-on: http://review.whamcloud.com/2193
Reviewed-by: Andriy Skulysh <Andriy_Skulysh@xyratex.com>
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
lustre/include/lustre_dlm.h
lustre/ldlm/ldlm_flock.c
lustre/ldlm/ldlm_internal.h
lustre/ldlm/ldlm_lock.c
lustre/ldlm/ldlm_lockd.c
lustre/ldlm/ldlm_request.c

index 9b82298..b1f778d 100644 (file)
@@ -602,7 +602,7 @@ struct ldlm_flock {
         __u64 end;
         __u64 owner;
         __u64 blocking_owner;
-        void *blocking_export;
+        struct obd_export *blocking_export;
         __u32 pid;
 };
 
@@ -615,7 +615,7 @@ typedef union {
 void ldlm_convert_policy_to_wire(ldlm_type_t type,
                                  const ldlm_policy_data_t *lpolicy,
                                  ldlm_wire_policy_data_t *wpolicy);
-void ldlm_convert_policy_to_local(ldlm_type_t type,
+void ldlm_convert_policy_to_local(struct obd_export *exp, ldlm_type_t type,
                                   const ldlm_wire_policy_data_t *wpolicy,
                                   ldlm_policy_data_t *lpolicy);
 
index 8bc8134..1303e8f 100644 (file)
@@ -664,18 +664,28 @@ int ldlm_flock_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
         RETURN(0);
 }
 
-void ldlm_flock_policy_wire_to_local(const ldlm_wire_policy_data_t *wpolicy,
-                                     ldlm_policy_data_t *lpolicy)
+void ldlm_flock_policy_wire18_to_local(const ldlm_wire_policy_data_t *wpolicy,
+                                       ldlm_policy_data_t *lpolicy)
 {
         memset(lpolicy, 0, sizeof(*lpolicy));
         lpolicy->l_flock.start = wpolicy->l_flock.lfw_start;
         lpolicy->l_flock.end = wpolicy->l_flock.lfw_end;
         lpolicy->l_flock.pid = wpolicy->l_flock.lfw_pid;
-        lpolicy->l_flock.owner = wpolicy->l_flock.lfw_owner;
         /* Compat code, old clients had no idea about owner field and
-         * relied solely on pid for ownership. Introduced in 2.1, April 2011 */
-        if (!lpolicy->l_flock.owner)
-                lpolicy->l_flock.owner = wpolicy->l_flock.lfw_pid;
+         * relied solely on pid for ownership. Introduced in LU-104, 2.1,
+         * April 2011 */
+        lpolicy->l_flock.owner = wpolicy->l_flock.lfw_pid;
+}
+
+
+void ldlm_flock_policy_wire21_to_local(const ldlm_wire_policy_data_t *wpolicy,
+                                       ldlm_policy_data_t *lpolicy)
+{
+        memset(lpolicy, 0, sizeof(*lpolicy));
+        lpolicy->l_flock.start = wpolicy->l_flock.lfw_start;
+        lpolicy->l_flock.end = wpolicy->l_flock.lfw_end;
+        lpolicy->l_flock.pid = wpolicy->l_flock.lfw_pid;
+        lpolicy->l_flock.owner = wpolicy->l_flock.lfw_owner;
 }
 
 void ldlm_flock_policy_local_to_wire(const ldlm_policy_data_t *lpolicy,
index ea2c165..de95520 100644 (file)
@@ -288,7 +288,10 @@ void ldlm_extent_policy_wire_to_local(const ldlm_wire_policy_data_t *wpolicy,
                                      ldlm_policy_data_t *lpolicy);
 void ldlm_extent_policy_local_to_wire(const ldlm_policy_data_t *lpolicy,
                                      ldlm_wire_policy_data_t *wpolicy);
-void ldlm_flock_policy_wire_to_local(const ldlm_wire_policy_data_t *wpolicy,
+void ldlm_flock_policy_wire18_to_local(const ldlm_wire_policy_data_t *wpolicy,
                                      ldlm_policy_data_t *lpolicy);
+void ldlm_flock_policy_wire21_to_local(const ldlm_wire_policy_data_t *wpolicy,
+                                     ldlm_policy_data_t *lpolicy);
+
 void ldlm_flock_policy_local_to_wire(const ldlm_policy_data_t *lpolicy,
                                      ldlm_wire_policy_data_t *wpolicy);
index 723bf9c..b0cf30d 100644 (file)
@@ -73,10 +73,17 @@ char *ldlm_typename[] = {
         [LDLM_IBITS] "IBT",
 };
 
-static ldlm_policy_wire_to_local_t ldlm_policy_wire_to_local[] = {
+static ldlm_policy_wire_to_local_t ldlm_policy_wire18_to_local[] = {
         [LDLM_PLAIN - LDLM_MIN_TYPE] ldlm_plain_policy_wire_to_local,
         [LDLM_EXTENT - LDLM_MIN_TYPE] ldlm_extent_policy_wire_to_local,
-        [LDLM_FLOCK - LDLM_MIN_TYPE] ldlm_flock_policy_wire_to_local,
+        [LDLM_FLOCK - LDLM_MIN_TYPE] ldlm_flock_policy_wire18_to_local,
+        [LDLM_IBITS - LDLM_MIN_TYPE] ldlm_ibits_policy_wire_to_local,
+};
+
+static ldlm_policy_wire_to_local_t ldlm_policy_wire21_to_local[] = {
+        [LDLM_PLAIN - LDLM_MIN_TYPE] ldlm_plain_policy_wire_to_local,
+        [LDLM_EXTENT - LDLM_MIN_TYPE] ldlm_extent_policy_wire_to_local,
+        [LDLM_FLOCK - LDLM_MIN_TYPE] ldlm_flock_policy_wire21_to_local,
         [LDLM_IBITS - LDLM_MIN_TYPE] ldlm_ibits_policy_wire_to_local,
 };
 
@@ -104,13 +111,19 @@ void ldlm_convert_policy_to_wire(ldlm_type_t type,
 /**
  * Converts lock policy from on the wire lock_desc format to local format
  */
-void ldlm_convert_policy_to_local(ldlm_type_t type,
+void ldlm_convert_policy_to_local(struct obd_export *exp, ldlm_type_t type,
                                   const ldlm_wire_policy_data_t *wpolicy,
                                   ldlm_policy_data_t *lpolicy)
 {
         ldlm_policy_wire_to_local_t convert;
+        int new_client;
 
-        convert = ldlm_policy_wire_to_local[type - LDLM_MIN_TYPE];
+        /** some badnes for 2.0.0 clients, but 2.0.0 isn't supported */
+        new_client = (exp->exp_connect_flags & OBD_CONNECT_FULL20) != 0;
+        if (new_client)
+               convert = ldlm_policy_wire21_to_local[type - LDLM_MIN_TYPE];
+        else
+               convert = ldlm_policy_wire18_to_local[type - LDLM_MIN_TYPE];
 
         convert(wpolicy, lpolicy);
 }
index b47657e..34cbf16 100644 (file)
@@ -1197,7 +1197,7 @@ existing_lock:
         }
 
         if (dlm_req->lock_desc.l_resource.lr_type != LDLM_PLAIN)
-                ldlm_convert_policy_to_local(
+                ldlm_convert_policy_to_local(req->rq_export,
                                           dlm_req->lock_desc.l_resource.lr_type,
                                           &dlm_req->lock_desc.l_policy_data,
                                           &lock->l_policy_data);
@@ -1572,7 +1572,7 @@ static void ldlm_handle_cp_callback(struct ptlrpc_request *req,
         }
 
         if (lock->l_resource->lr_type != LDLM_PLAIN) {
-                ldlm_convert_policy_to_local(
+                ldlm_convert_policy_to_local(req->rq_export,
                                           dlm_req->lock_desc.l_resource.lr_type,
                                           &dlm_req->lock_desc.l_policy_data,
                                           &lock->l_policy_data);
index 152b2e3..053c6ed 100644 (file)
@@ -590,7 +590,7 @@ int ldlm_cli_enqueue_fini(struct obd_export *exp, struct ptlrpc_request *req,
                         if (!(type == LDLM_IBITS && !(exp->exp_connect_flags &
                                                     OBD_CONNECT_IBITS)))
                                 /* We assume lock type cannot change on server*/
-                                ldlm_convert_policy_to_local(
+                                ldlm_convert_policy_to_local(exp,
                                                 lock->l_resource->lr_type,
                                                 &reply->lock_desc.l_policy_data,
                                                 &lock->l_policy_data);