Whamcloud - gitweb
LU-9764 lfsck: reset LFSCK trace file if fail to load it 97/27997/2
authorFan Yong <fan.yong@intel.com>
Wed, 12 Jul 2017 04:50:41 +0000 (12:50 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 14 Jun 2018 03:56:03 +0000 (03:56 +0000)
If the on-disk LFSCK trace file is corrupted, then LFSCK
may get failure when load it. Under such case, the LFSCK
should reset (recreate) the traces files by force.

Signed-off-by: Fan Yong <fan.yong@intel.com>
Change-Id: I0237a88ff23cdec680303ac3976a53c1632598fe
Reviewed-on: https://review.whamcloud.com/27997
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
lustre/lfsck/lfsck_layout.c
lustre/lfsck/lfsck_lib.c
lustre/lfsck/lfsck_namespace.c

index 18e0d47..d7c938d 100644 (file)
@@ -6714,14 +6714,17 @@ int lfsck_layout_setup(const struct lu_env *env, struct lfsck_instance *lfsck)
 
        com->lc_obj = obj;
        rc = lfsck_layout_load(env, com);
-       if (rc > 0)
+       if (rc > 0) {
                rc = lfsck_layout_reset(env, com, true);
-       else if (rc == -ENOENT)
+       } else if (rc == -ENOENT) {
                rc = lfsck_layout_init(env, com);
-       else if (lfsck->li_master)
+       } else if (lfsck->li_master) {
                rc = lfsck_load_sub_trace_files(env, com,
                                &dt_lfsck_layout_dangling_features,
                                LFSCK_LAYOUT, false);
+               if (rc)
+                       rc = lfsck_layout_reset(env, com, true);
+       }
 
        if (rc != 0)
                GOTO(out, rc);
index d7bde61..e9e2249 100644 (file)
@@ -2705,10 +2705,14 @@ unlink:
                RETURN(PTR_ERR(obj));
 
        rc = obj->do_ops->do_index_try(env, obj, ft);
-       if (rc)
+       if (rc) {
                lfsck_object_put(env, obj);
-       else
+               CDEBUG(D_LFSCK, "%s: LFSCK fail to load "
+                      "sub trace file %s: rc = %d\n",
+                      lfsck_lfsck2name(com->lc_lfsck), name, rc);
+       } else {
                *child = obj;
+       }
 
        RETURN(rc);
 }
index d490fd4..3a0cdd0 100644 (file)
@@ -6831,13 +6831,16 @@ int lfsck_namespace_setup(const struct lu_env *env,
 
        com->lc_obj = obj;
        rc = lfsck_namespace_load(env, com);
-       if (rc == -ENODATA)
+       if (rc == -ENODATA) {
                rc = lfsck_namespace_init(env, com);
-       else if (rc < 0)
+       } else if (rc < 0) {
                rc = lfsck_namespace_reset(env, com, true);
-       else
+       } else {
                rc = lfsck_load_sub_trace_files(env, com,
                        &dt_lfsck_namespace_features, LFSCK_NAMESPACE, false);
+               if (rc)
+                       rc = lfsck_namespace_reset(env, com, true);
+       }
        if (rc != 0)
                GOTO(out, rc);