Whamcloud - gitweb
LU-8083 lfsck: repair symbol file nlink properly 74/19874/3
authorFan Yong <fan.yong@intel.com>
Wed, 13 Apr 2016 08:45:52 +0000 (16:45 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Mon, 15 Aug 2016 21:10:32 +0000 (21:10 +0000)
Miss to check symbolic link case in lfsck_namespace_repair_nlink.

Signed-off-by: Fan Yong <fan.yong@intel.com>
Change-Id: I420d558803672100292990f1ff4888c03888c39a
Reviewed-on: http://review.whamcloud.com/19874
Tested-by: Jenkins
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/lfsck/lfsck_namespace.c

index 84872cf..b808fdf 100644 (file)
@@ -2871,7 +2871,6 @@ static int lfsck_namespace_repair_nlink(const struct lu_env *env,
        ENTRY;
 
        LASSERT(!dt_object_remote(obj));
-       LASSERT(S_ISREG(lfsck_object_type(obj)));
 
        rc = lfsck_ibits_lock(env, lfsck, obj, &lh,
                              MDS_INODELOCK_UPDATE, LCK_PW);
@@ -3546,10 +3545,23 @@ out:
                        return rc;
 
                if (la->la_nlink != 0 && la->la_nlink != count) {
-                       rc = lfsck_namespace_repair_nlink(env, com, child, la);
-                       if (rc > 0) {
-                               ns->ln_objs_nlink_repaired++;
-                               rc = 0;
+                       if (unlikely(!S_ISREG(lfsck_object_type(child)) &&
+                                    !S_ISLNK(lfsck_object_type(child)))) {
+                               CDEBUG(D_LFSCK, "%s: namespace LFSCK finds "
+                                      "the object "DFID"'s nlink count %d "
+                                      "does not match linkEA count %d, "
+                                      "type %o, skip it.\n",
+                                      lfsck_lfsck2name(lfsck),
+                                      PFID(lfsck_dto2fid(child)),
+                                      la->la_nlink, count,
+                                      lfsck_object_type(child));
+                       } else {
+                               rc = lfsck_namespace_repair_nlink(env, com,
+                                                                 child, la);
+                               if (rc > 0) {
+                                       ns->ln_objs_nlink_repaired++;
+                                       rc = 0;
+                               }
                        }
                }
        }