Whamcloud - gitweb
LU-9334 lfsck: object leak in lfsck_load_one_trace_file 03/26703/2
authorFan Yong <fan.yong@intel.com>
Tue, 29 Nov 2016 13:18:08 +0000 (21:18 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Wed, 26 Apr 2017 03:36:33 +0000 (03:36 +0000)
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 <fan.yong@intel.com>
Change-Id: Ic3c7db9239e0d10a5cf6fc2254a4c414f4cd007f
Reviewed-on: https://review.whamcloud.com/26703
Tested-by: Jenkins
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
lustre/lfsck/lfsck_lib.c

index f1b9349..5144c9e 100644 (file)
@@ -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);