Whamcloud - gitweb
LU-14119 lfsck: replace dt_lookup() with dt_lookup_dir() 65/43265/2
authorLai Siyao <lai.siyao@whamcloud.com>
Wed, 13 Jan 2021 09:16:55 +0000 (17:16 +0800)
committerOleg Drokin <green@whamcloud.com>
Sun, 16 May 2021 22:07:29 +0000 (22:07 +0000)
Lfsck code calls dt_lookup() to lookup sub file under directory in
many places, but this function needs to to initialize directory with
dt_try_as_dir() first, while it's missing in several places, since
the overhead is trivial, call dt_lookup_dir() instead.

Lustre-change: https://review.whamcloud.com/41218
Lustre-commit: d525ad4bd0d5d851405e4249859a1c77378f0ee3

Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com>
Change-Id: I40bd8d51edece50353af1729cf867572a0abea78
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Signed-off-by: Minh Diep <mdiep@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/43265
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
lustre/lfsck/lfsck_engine.c
lustre/lfsck/lfsck_layout.c
lustre/lfsck/lfsck_lib.c
lustre/lfsck/lfsck_namespace.c
lustre/lfsck/lfsck_striped_dir.c

index d4905e1..d8ac5d8 100644 (file)
@@ -93,17 +93,6 @@ static void lfsck_di_dir_put(const struct lu_env *env, struct lfsck_instance *lf
        iops->put(env, di);
 }
 
-static int lfsck_parent_fid(const struct lu_env *env, struct dt_object *obj,
-                           struct lu_fid *fid)
-{
-       if (unlikely(!S_ISDIR(lfsck_object_type(obj)) ||
-                    !dt_try_as_dir(env, obj)))
-               return -ENOTDIR;
-
-       return dt_lookup(env, obj, (struct dt_rec *)fid,
-                        (const struct dt_key *)"..");
-}
-
 /**
  * Check whether needs to scan the directory or not.
  *
@@ -203,7 +192,7 @@ static int lfsck_needs_scan_dir(const struct lu_env *env,
                if (rc < 0 && rc != -ENODATA)
                        GOTO(out, rc);
 
-               rc = lfsck_parent_fid(env, obj, fid);
+               rc = dt_lookup_dir(env, obj, dotdot, fid);
                if (depth > 0)
                        lfsck_object_put(env, obj);
 
index 5a3e000..76ec6c7 100644 (file)
@@ -2366,8 +2366,7 @@ again:
        do {
                snprintf(name, NAME_MAX, DFID"%s-%s-%d", PFID(pfid), infix,
                         type, idx++);
-               rc = dt_lookup(env, lfsck->li_lpf_obj, (struct dt_rec *)tfid,
-                              (const struct dt_key *)name);
+               rc = dt_lookup_dir(env, lfsck->li_lpf_obj, name, tfid);
                if (rc != 0 && rc != -ENOENT)
                        GOTO(log, rc);
        } while (rc == 0);
@@ -2379,8 +2378,7 @@ again:
 
        /* Re-check whether the name conflict with othrs after taken
         * the ldlm lock. */
-       rc = dt_lookup(env, lfsck->li_lpf_obj, (struct dt_rec *)tfid,
-                      (const struct dt_key *)name);
+       rc = dt_lookup_dir(env, lfsck->li_lpf_obj, name, tfid);
        if (unlikely(rc == 0)) {
                lfsck_unlock(llh);
                goto again;
index 5f5860f..2c776a1 100644 (file)
@@ -1025,8 +1025,7 @@ static int lfsck_create_lpf(const struct lu_env *env,
                 * created the .lustre/lost+found/MDTxxxx but failed to update
                 * the lfsck_bookmark::lb_lpf_fid successfully. So need lookup
                 * it from MDT0 firstly. */
-               rc = dt_lookup(env, parent, (struct dt_rec *)cfid,
-                              (const struct dt_key *)name);
+               rc = dt_lookup_dir(env, parent, name, cfid);
                if (rc != 0 && rc != -ENOENT)
                        GOTO(unlock, rc);
 
@@ -1234,8 +1233,7 @@ static int lfsck_verify_lpf_pairs(const struct lu_env *env,
        ENTRY;
 
        fid_zero(fid);
-       rc = dt_lookup(env, child, (struct dt_rec *)fid,
-                      (const struct dt_key *)dotdot);
+       rc = dt_lookup_dir(env, child, dotdot, fid);
        if (rc != 0)
                GOTO(linkea, rc);
 
@@ -1320,8 +1318,7 @@ linkea:
                GOTO(out_done, rc = 1);
        }
 
-       rc = dt_lookup(env, parent2, (struct dt_rec *)fid,
-                      (const struct dt_key *)name2);
+       rc = dt_lookup_dir(env, parent2, name2, fid);
        dt_read_unlock(env, child);
        lfsck_ibits_unlock(&lh, LCK_PR);
        if (rc != 0 && rc != -ENOENT)
@@ -1435,8 +1432,7 @@ int lfsck_verify_lpf(const struct lu_env *env, struct lfsck_instance *lfsck)
 
        /* child2 */
        snprintf(name, 8, "MDT%04x", node);
-       rc = dt_lookup(env, parent, (struct dt_rec *)cfid,
-                      (const struct dt_key *)name);
+       rc = dt_lookup_dir(env, parent, name, cfid);
        if (rc == -ENOENT) {
                rc = 0;
                goto find_child1;
@@ -3716,9 +3712,6 @@ int lfsck_register(const struct lu_env *env, struct dt_device *key,
        if (IS_ERR(root))
                GOTO(out, rc = PTR_ERR(root));
 
-       if (unlikely(!dt_try_as_dir(env, root)))
-               GOTO(out, rc = -ENOTDIR);
-
        lfsck->li_local_root_fid = *fid;
        if (master) {
                lfsck->li_master = 1;
@@ -3726,9 +3719,8 @@ int lfsck_register(const struct lu_env *env, struct dt_device *key,
                        struct lu_fid *pfid = &lfsck_env_info(env)->lti_fid2;
                        const struct lu_name *cname;
 
-                       rc = dt_lookup(env, root,
-                               (struct dt_rec *)(&lfsck->li_global_root_fid),
-                               (const struct dt_key *)"ROOT");
+                       rc = dt_lookup_dir(env, root, "ROOT",
+                                          &lfsck->li_global_root_fid);
                        if (rc != 0)
                                GOTO(out, rc);
 
@@ -3736,11 +3728,7 @@ int lfsck_register(const struct lu_env *env, struct dt_device *key,
                        if (IS_ERR(obj))
                                GOTO(out, rc = PTR_ERR(obj));
 
-                       if (unlikely(!dt_try_as_dir(env, obj)))
-                               GOTO(out, rc = -ENOTDIR);
-
-                       rc = dt_lookup(env, obj, (struct dt_rec *)fid,
-                               (const struct dt_key *)dotlustre);
+                       rc = dt_lookup_dir(env, obj, dotlustre, fid);
                        if (rc != 0)
                                GOTO(out, rc);
 
@@ -3760,8 +3748,7 @@ int lfsck_register(const struct lu_env *env, struct dt_device *key,
                                GOTO(out, rc = -ENOTDIR);
 
                        *pfid = *fid;
-                       rc = dt_lookup(env, obj, (struct dt_rec *)fid,
-                                      (const struct dt_key *)lostfound);
+                       rc = dt_lookup_dir(env, obj, lostfound, fid);
                        if (rc != 0)
                                GOTO(out, rc);
 
index d20b8cf..a7103ac 100644 (file)
@@ -596,8 +596,7 @@ int lfsck_namespace_check_exist(const struct lu_env *env,
        if (unlikely(lfsck_is_dead_obj(obj)))
                RETURN(LFSCK_NAMEENTRY_DEAD);
 
-       rc = dt_lookup(env, dir, (struct dt_rec *)fid,
-                      (const struct dt_key *)name);
+       rc = dt_lookup_dir(env, dir, name, fid);
        if (rc == -ENOENT)
                RETURN(LFSCK_NAMEENTRY_REMOVED);
 
@@ -946,8 +945,7 @@ again:
        do {
                namelen = snprintf(info->lti_key, NAME_MAX, DFID"%s-%s-%d",
                                   PFID(cfid), infix, type, idx++);
-               rc = dt_lookup(env, parent, (struct dt_rec *)&tfid,
-                              (const struct dt_key *)info->lti_key);
+               rc = dt_lookup_dir(env, parent, info->lti_key, &tfid);
                if (rc != 0 && rc != -ENOENT)
                        GOTO(log, rc);
 
@@ -962,8 +960,7 @@ again:
 
        /* Re-check whether the name conflict with othrs after taken
         * the ldlm lock. */
-       rc = dt_lookup(env, parent, (struct dt_rec *)&tfid,
-                      (const struct dt_key *)info->lti_key);
+       rc = dt_lookup_dir(env, parent, info->lti_key, &tfid);
        if (rc == 0) {
                if (!lu_fid_eq(cfid, &tfid)) {
                        exist = false;
@@ -1313,9 +1310,7 @@ static int lfsck_namespace_create_orphan_dir(const struct lu_env *env,
                        GOTO(log, rc = idx);
 
                snprintf(name, 8, "MDT%04x", idx);
-               rc = dt_lookup(env, lfsck->li_lpf_root_obj,
-                              (struct dt_rec *)&tfid,
-                              (const struct dt_key *)name);
+               rc = dt_lookup_dir(env, lfsck->li_lpf_root_obj, name, &tfid);
                if (rc != 0)
                        GOTO(log, rc = (rc == -ENOENT ? -ENXIO : rc));
 
@@ -1342,8 +1337,7 @@ again:
        do {
                namelen = snprintf(name, 31, DFID"-P-%d",
                                   PFID(cfid), idx++);
-               rc = dt_lookup(env, parent, (struct dt_rec *)&tfid,
-                              (const struct dt_key *)name);
+               rc = dt_lookup_dir(env, parent, name, &tfid);
                if (rc != 0 && rc != -ENOENT)
                        GOTO(log, rc);
        } while (rc == 0);
@@ -1355,8 +1349,7 @@ again:
 
        /* Re-check whether the name conflict with othrs after taken
         * the ldlm lock. */
-       rc = dt_lookup(env, parent, (struct dt_rec *)&tfid,
-                      (const struct dt_key *)name);
+       rc = dt_lookup_dir(env, parent, name, &tfid);
        if (unlikely(rc == 0)) {
                lfsck_unlock(llh);
                goto again;
@@ -1828,8 +1821,7 @@ static int lfsck_namespace_replace_cond(const struct lu_env *env,
                goto replace;
        }
 
-       rc = dt_lookup(env, parent, (struct dt_rec *)&tfid,
-                      (const struct dt_key *)name);
+       rc = dt_lookup_dir(env, parent, name, &tfid);
        if (rc == -ENOENT) {
                exist = false;
                goto replace;
@@ -2115,8 +2107,7 @@ int lfsck_namespace_repair_dirent(const struct lu_env *env,
 
 
        dt_write_lock(env, parent, 0);
-       rc = dt_lookup(env, dt_object_child(parent), (struct dt_rec *)&tfid,
-                      (const struct dt_key *)name);
+       rc = dt_lookup_dir(env, dt_object_child(parent), name, &tfid);
        /* Someone has removed the bad name entry by race. */
        if (rc == -ENOENT)
                GOTO(unlock2, rc = 0);
@@ -2514,8 +2505,7 @@ lost_parent:
                GOTO(out, rc);
        }
 
-       rc = dt_lookup(env, parent, (struct dt_rec *)&tfid,
-                      (const struct dt_key *)cname->ln_name);
+       rc = dt_lookup_dir(env, parent, cname->ln_name, &tfid);
        if (rc == -ENOENT) {
                /* If the LFSCK is marked as LF_INCOMPLETE, then means some MDT
                 * has ever tried to verify some remote MDT-object that resides
@@ -2766,8 +2756,7 @@ again:
                        continue;
                }
 
-               rc = dt_lookup(env, parent, (struct dt_rec *)&tfid,
-                              (const struct dt_key *)cname->ln_name);
+               rc = dt_lookup_dir(env, parent, cname->ln_name, &tfid);
                *pfid2 = *lfsck_dto2fid(parent);
                if (rc == -ENOENT) {
                        lfsck_object_put(env, parent);
@@ -3129,8 +3118,7 @@ lock:
                GOTO(out, rc = 0);
        }
 
-       rc = dt_lookup(env, child, (struct dt_rec *)pfid,
-                      (const struct dt_key *)dotdot);
+       rc = dt_lookup_dir(env, child, dotdot, pfid);
        if (rc != 0) {
                if (rc != -ENOENT && rc != -ENODATA && rc != -EINVAL) {
                        dt_read_unlock(env, child);
@@ -3730,8 +3718,7 @@ lost_parent:
                        continue;
                }
 
-               rc = dt_lookup(env, parent, (struct dt_rec *)cfid,
-                              (const struct dt_key *)cname->ln_name);
+               rc = dt_lookup_dir(env, parent, cname->ln_name, cfid);
                if (rc != 0 && rc != -ENOENT) {
                        lfsck_object_put(env, parent);
 
index 33c57d7..6f5233c 100644 (file)
@@ -1500,8 +1500,7 @@ int lfsck_namespace_repair_bad_name_hash(const struct lu_env *env,
        int                              rc     = 0;
        ENTRY;
 
-       rc = dt_lookup(env, shard, (struct dt_rec *)pfid,
-                      (const struct dt_key *)dotdot);
+       rc = dt_lookup_dir(env, shard, dotdot, pfid);
        if (rc != 0 || !fid_is_sane(pfid))
                GOTO(log, rc);
 
@@ -1710,8 +1709,7 @@ int lfsck_namespace_verify_stripe_slave(const struct lu_env *env,
                GOTO(out, rc);
        }
 
-       rc = dt_lookup(env, obj, (struct dt_rec *)pfid,
-                      (const struct dt_key *)dotdot);
+       rc = dt_lookup_dir(env, obj, dotdot, pfid);
        if (rc != 0 || !fid_is_sane(pfid)) {
                rc = lfsck_namespace_trace_update(env, com, cfid,
                                        LNTF_UNCERTAIN_LMV, true);
@@ -1791,8 +1789,7 @@ int lfsck_namespace_verify_stripe_slave(const struct lu_env *env,
                GOTO(out, rc);
        }
 
-       rc = dt_lookup(env, parent, (struct dt_rec *)&tfid,
-                      (const struct dt_key *)name2);
+       rc = dt_lookup_dir(env, parent, name2, &tfid);
        if (rc != 0 || !lu_fid_eq(cfid, &tfid))
                rc = lfsck_namespace_trace_update(env, com, cfid,
                                                  LNTF_UNCERTAIN_LMV, true);