From: Jinshan Xiong Date: Wed, 30 Jan 2013 00:35:49 +0000 (-0800) Subject: LU-2683 lov: release all locks in closure to release sublock X-Git-Tag: 2.3.62~12 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=2448de6c51ceccea6a308d73d7960f236e0c0847 LU-2683 lov: release all locks in closure to release sublock We used to only release current parent lock, this may cause deadlock if the sublock is shared. See stacktrace of LU-2683 and LU-874 for details. Signed-off-by: Jinshan Xiong Change-Id: Ibe5fc364ef22a279f23bb24ad1311a1ad09be369 Reviewed-on: http://review.whamcloud.com/5208 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Bobi Jam Reviewed-by: Niu Yawei Reviewed-by: Prakash Surya Reviewed-by: Oleg Drokin --- diff --git a/lustre/lov/lov_lock.c b/lustre/lov/lov_lock.c index 1241f5f..de55b2d 100644 --- a/lustre/lov/lov_lock.c +++ b/lustre/lov/lov_lock.c @@ -652,8 +652,19 @@ static int lov_lock_enqueue(const struct lu_env *env, sublock); break; case CLS_CACHED: + cl_lock_get(sublock); + /* take recursive mutex of sublock */ + cl_lock_mutex_get(env, sublock); + /* need to release all locks in closure + * otherwise it may deadlock. LU-2683.*/ + lov_sublock_unlock(env, sub, closure, + subenv); + /* sublock and parent are held. */ rc = lov_sublock_release(env, lck, i, 1, rc); + cl_lock_mutex_put(env, sublock); + cl_lock_put(env, sublock); + break; default: lov_sublock_unlock(env, sub, closure, subenv);