From: Fan Yong Date: Tue, 29 Nov 2016 13:18:08 +0000 (+0800) Subject: LU-9334 lfsck: object leak in lfsck_load_one_trace_file X-Git-Tag: 2.9.57~70 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=1b136613440bd81e284a12df97618f92c9729d71 LU-9334 lfsck: object leak in lfsck_load_one_trace_file In lfsck_load_one_trace_file(), if we successfully load or create the object via local_index_find_or_create(), but the subsequent do_index_try() failed, then we need to release such object, otherwise it will be left there. Signed-off-by: Fan Yong Change-Id: Ic3c7db9239e0d10a5cf6fc2254a4c414f4cd007f Reviewed-on: https://review.whamcloud.com/26703 Tested-by: Jenkins Reviewed-by: Andreas Dilger Reviewed-by: Lai Siyao Tested-by: Maloo --- diff --git a/lustre/lfsck/lfsck_lib.c b/lustre/lfsck/lfsck_lib.c index f1b9349..5144c9e 100644 --- a/lustre/lfsck/lfsck_lib.c +++ b/lustre/lfsck/lfsck_lib.c @@ -2675,14 +2675,18 @@ unlink: /* The old index is not empty, remove it firstly. */ rc = local_object_unlink(env, lfsck->li_bottom, parent, name); - CDEBUG(D_LFSCK, "%s: unlink lfsck sub trace file %s: rc = %d\n", + CERROR("%s: unlink lfsck sub trace file %s: rc = %d\n", lfsck_lfsck2name(com->lc_lfsck), name, rc); if (rc) RETURN(rc); - lfsck_object_put(env, *child); - *child = NULL; + if (*child) { + lfsck_object_put(env, *child); + *child = NULL; + } + } else if (reset) { + goto unlink; } obj = local_index_find_or_create(env, lfsck->li_los, parent, name, @@ -2691,7 +2695,9 @@ unlink: RETURN(PTR_ERR(obj)); rc = obj->do_ops->do_index_try(env, obj, ft); - if (rc == 0) + if (rc) + lfsck_object_put(env, obj); + else *child = obj; RETURN(rc);