Whamcloud - gitweb
LU-9171 osc: GPF while doing ELC with no_wait_policy 00/25700/4
authorAndriy Skulysh <andriy.skulysh@seagate.com>
Wed, 1 Mar 2017 18:34:11 +0000 (20:34 +0200)
committerOleg Drokin <oleg.drokin@intel.com>
Wed, 19 Apr 2017 04:46:32 +0000 (04:46 +0000)
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 <andriy.skulysh@seagate.com>
Reviewed-on: https://review.whamcloud.com/25700
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/osc/osc_lock.c

index f0f5d00..474a5e5 100644 (file)
@@ -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;
 }