Whamcloud - gitweb
LU-8301 lfsck: handle ROOT fid properly 69/20869/4
authorFan Yong <fan.yong@intel.com>
Fri, 13 May 2016 15:51:33 +0000 (23:51 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Mon, 26 Sep 2016 15:19:01 +0000 (15:19 +0000)
It is found that the lfsck_find_mdt_idx_by_fid() will return
failure for "ROOT" object. That is incorrect. In fact "ROOT"
is always on the MDT0.

Test-Paramenters: trivial testlist=sanity-scrub,sanity-lfsck

Signed-off-by: Fan Yong <fan.yong@intel.com>
Change-Id: I4a1b796ffc574f8f11611d1b329ce79ad2135eb7
Reviewed-on: http://review.whamcloud.com/20869
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/lfsck/lfsck_lib.c
lustre/lfsck/lfsck_namespace.c

index 634b451..e3be947 100644 (file)
@@ -531,6 +531,14 @@ int lfsck_find_mdt_idx_by_fid(const struct lu_env *env,
        struct lu_seq_range     *range  = &lfsck_env_info(env)->lti_range;
        int                      rc;
 
        struct lu_seq_range     *range  = &lfsck_env_info(env)->lti_range;
        int                      rc;
 
+       if (unlikely(fid_seq(fid) == FID_SEQ_LOCAL_FILE)) {
+               /* "ROOT" is always on the MDT0. */
+               if (lu_fid_eq(fid, &lfsck->li_global_root_fid))
+                       return 0;
+
+               return lfsck_dev_idx(lfsck);
+       }
+
        fld_range_set_mdt(range);
        rc = fld_server_lookup(env, ss->ss_server_fld, fid_seq(fid), range);
        if (rc == 0)
        fld_range_set_mdt(range);
        rc = fld_server_lookup(env, ss->ss_server_fld, fid_seq(fid), range);
        if (rc == 0)
index 6781598..cbac028 100644 (file)
@@ -5544,7 +5544,8 @@ out:
                        break;
                }
 
                        break;
                }
 
-               if (count == 1 && S_ISREG(lfsck_object_type(obj)))
+               if (obj != NULL && count == 1 &&
+                   S_ISREG(lfsck_object_type(obj)))
                        dt_attr_get(env, obj, la);
        }
 
                        dt_attr_get(env, obj, la);
        }
 
@@ -5566,15 +5567,14 @@ trace:
                if (!(bk->lb_param & LPF_FAILOUT))
                        rc = 0;
        } else {
                if (!(bk->lb_param & LPF_FAILOUT))
                        rc = 0;
        } else {
-               if (log)
-                       CDEBUG(D_LFSCK, "%s: namespace LFSCK assistant "
-                              "repaired the entry: "DFID", parent "DFID
-                              ", name %.*s\n", lfsck_lfsck2name(lfsck),
-                              PFID(&lnr->lnr_fid), PFID(pfid),
-                              lnr->lnr_namelen, lnr->lnr_name);
-
                if (repaired) {
                        ns->ln_items_repaired++;
                if (repaired) {
                        ns->ln_items_repaired++;
+                       if (log)
+                               CDEBUG(D_LFSCK, "%s: namespace LFSCK assistant "
+                                      "repaired the entry: "DFID", parent "DFID
+                                      ", name %.*s\n", lfsck_lfsck2name(lfsck),
+                                      PFID(&lnr->lnr_fid), PFID(pfid),
+                                      lnr->lnr_namelen, lnr->lnr_name);
 
                        switch (type) {
                        case LNIT_DANGLING:
 
                        switch (type) {
                        case LNIT_DANGLING:
@@ -5601,8 +5601,17 @@ trace:
                        ns->ln_name_hash_repaired++;
 
                        /* Not count repeatedly. */
                        ns->ln_name_hash_repaired++;
 
                        /* Not count repeatedly. */
-                       if (!repaired)
+                       if (!repaired) {
                                ns->ln_items_repaired++;
                                ns->ln_items_repaired++;
+                               if (log)
+                                       CDEBUG(D_LFSCK, "%s: namespace LFSCK "
+                                              "assistant repaired the entry: "
+                                              DFID", parent "DFID
+                                              ", name %.*s\n",
+                                              lfsck_lfsck2name(lfsck),
+                                              PFID(&lnr->lnr_fid), PFID(pfid),
+                                              lnr->lnr_namelen, lnr->lnr_name);
+                       }
 
                        if (bk->lb_param & LPF_DRYRUN &&
                            lfsck_pos_is_zero(&ns->ln_pos_first_inconsistent))
 
                        if (bk->lb_param & LPF_DRYRUN &&
                            lfsck_pos_is_zero(&ns->ln_pos_first_inconsistent))