From 607bdaa887bb9a786fabca0fdc6a1cdf9164964b Mon Sep 17 00:00:00 2001 From: Jinshan Xiong Date: Wed, 5 Feb 2014 22:49:23 -0800 Subject: [PATCH] LU-4381 lov: to not hold sub locks at initialization Otherwise, it will cause deadlock because it essentially holds some sub locks and then to request others in an arbitrary order. Lustre-commit: c6ab1fcc056778b18f685ec591ce27907e887617 Lustre-change: http://review.whamcloud.com/9152 Signed-off-by: Jinshan Xiong Signed-off-by: Bob Glossman Reviewed-by: Lai Siyao Reviewed-by: Bobi Jam Reviewed-by: Oleg Drokin Change-Id: I9bdfa2339c83396efa5d16763a5329d06e232ddd Reviewed-on: http://review.whamcloud.com/9994 Tested-by: Jenkins Tested-by: Maloo --- lustre/lov/lov_lock.c | 36 +----------------------------------- 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/lustre/lov/lov_lock.c b/lustre/lov/lov_lock.c index 1e5a516..916a415 100644 --- a/lustre/lov/lov_lock.c +++ b/lustre/lov/lov_lock.c @@ -356,41 +356,7 @@ static int lov_lock_sub_init(const struct lu_env *env, } } LASSERT(nr == lck->lls_nr); - /* - * Then, create sub-locks. Once at least one sub-lock was created, - * top-lock can be reached by other threads. - */ - for (i = 0; i < lck->lls_nr; ++i) { - struct cl_lock *sublock; - struct lov_lock_link *link; - if (lck->lls_sub[i].sub_lock == NULL) { - sublock = lov_sublock_alloc(env, io, lck, i, &link); - if (IS_ERR(sublock)) { - result = PTR_ERR(sublock); - break; - } - cl_lock_get_trust(sublock); - cl_lock_mutex_get(env, sublock); - cl_lock_mutex_get(env, parent); - /* - * recheck under mutex that sub-lock wasn't created - * concurrently, and that top-lock is still alive. - */ - if (lck->lls_sub[i].sub_lock == NULL && - parent->cll_state < CLS_FREEING) { - lov_sublock_adopt(env, lck, sublock, i, link); - cl_lock_mutex_put(env, parent); - } else { - OBD_SLAB_FREE_PTR(link, lov_lock_link_kmem); - cl_lock_mutex_put(env, parent); - cl_lock_unhold(env, sublock, - "lov-parent", parent); - } - cl_lock_mutex_put(env, sublock); - cl_lock_put(env, sublock); - } - } /* * Some sub-locks can be missing at this point. This is not a problem, * because enqueue will create them anyway. Main duty of this function @@ -550,7 +516,7 @@ static int lov_lock_enqueue_one(const struct lu_env *env, struct lov_lock *lck, static int lov_sublock_fill(const struct lu_env *env, struct cl_lock *parent, struct cl_io *io, struct lov_lock *lck, int idx) { - struct lov_lock_link *link; + struct lov_lock_link *link = NULL; struct cl_lock *sublock; int result; -- 1.8.3.1