Whamcloud - gitweb
LU-1274 osc: Do not grab mutex of cl_lock for glimpse
authorJinshan Xiong <jinshan.xiong@whamcloud.com>
Fri, 30 Mar 2012 19:57:34 +0000 (12:57 -0700)
committerOleg Drokin <green@whamcloud.com>
Fri, 1 Jun 2012 13:14:25 +0000 (09:14 -0400)
Otherwise this will cause client eviction if that lock is being
flushed and OST happens to be slow to finish the IO.

Signed-off-by: Jinshan Xiong <jinshan.xiong@whamcloud.com>
Change-Id: I8cbd9c38a317f4afaf3b0e237efe55e4c0f991c2
Reviewed-on: http://review.whamcloud.com/2426
Tested-by: Hudson
Reviewed-by: Johann Lombardi <johann@whamcloud.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Niu Yawei <niu@whamcloud.com>
lustre/osc/osc_lock.c

index 7e7b2de..2767c30 100644 (file)
@@ -857,8 +857,7 @@ static int osc_ldlm_glimpse_ast(struct ldlm_lock *dlmlock, void *data)
 
         env = cl_env_nested_get(&nest);
         if (!IS_ERR(env)) {
-                /*
-                 * osc_ast_data_get() has to go after environment is
+                /* osc_ast_data_get() has to go after environment is
                  * allocated, because osc_ast_data() acquires a
                  * reference to a lock, and it can only be released in
                  * environment.
@@ -866,7 +865,12 @@ static int osc_ldlm_glimpse_ast(struct ldlm_lock *dlmlock, void *data)
                 olck = osc_ast_data_get(dlmlock);
                 if (olck != NULL) {
                         lock = olck->ols_cl.cls_lock;
-                        cl_lock_mutex_get(env, lock);
+                        /* Do not grab the mutex of cl_lock for glimpse.
+                         * See LU-1274 for details.
+                         * BTW, it's okay for cl_lock to be cancelled during
+                         * this period because server can handle this race.
+                         * See ldlm_server_glimpse_ast() for details.
+                         * cl_lock_mutex_get(env, lock); */
                         cap = &req->rq_pill;
                         req_capsule_extend(cap, &RQF_LDLM_GL_CALLBACK);
                         req_capsule_set_size(cap, &RMF_DLM_LVB, RCL_SERVER,
@@ -877,7 +881,6 @@ static int osc_ldlm_glimpse_ast(struct ldlm_lock *dlmlock, void *data)
                                 obj = lock->cll_descr.cld_obj;
                                 result = cl_object_glimpse(env, obj, lvb);
                         }
-                        cl_lock_mutex_put(env, lock);
                         osc_ast_data_put(env, olck);
                 } else {
                         /*