From e0850b31ccd5597b564d4385a424bfa6be6f2f3e Mon Sep 17 00:00:00 2001 From: Andriy Skulysh Date: Wed, 1 Mar 2017 20:34:11 +0200 Subject: [PATCH] LU-9171 osc: GPF while doing ELC with no_wait_policy osc_ldlm_weigh_ast() uses osc_object from ldlm_lock without taking a reference. It should take a reference like osc_ldlm_glimpse_ast()/ osc_dlm_blocking_ast0() does. Change-Id: I33a817e4c08c2955f5395b13ffe8cd11f3bdf691 Seagate-bug-id: MRP-4179 Signed-off-by: Andriy Skulysh Reviewed-on: https://review.whamcloud.com/25700 Reviewed-by: Jinshan Xiong Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Bobi Jam Reviewed-by: Oleg Drokin --- lustre/osc/osc_lock.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lustre/osc/osc_lock.c b/lustre/osc/osc_lock.c index f0f5d00..474a5e5 100644 --- a/lustre/osc/osc_lock.c +++ b/lustre/osc/osc_lock.c @@ -710,7 +710,12 @@ unsigned long osc_ldlm_weigh_ast(struct ldlm_lock *dlmlock) RETURN(1); LASSERT(dlmlock->l_resource->lr_type == LDLM_EXTENT); + lock_res_and_lock(dlmlock); obj = dlmlock->l_ast_data; + if (obj) + cl_object_get(osc2cl(obj)); + unlock_res_and_lock(dlmlock); + if (obj == NULL) GOTO(out, weight = 1); @@ -732,6 +737,9 @@ unsigned long osc_ldlm_weigh_ast(struct ldlm_lock *dlmlock) EXIT; out: + if (obj) + cl_object_put(env, osc2cl(obj)); + cl_env_put(env, &refcheck); return weight; } -- 1.8.3.1