From d525ad4bd0d5d851405e4249859a1c77378f0ee3 Mon Sep 17 00:00:00 2001 From: Lai Siyao Date: Wed, 13 Jan 2021 17:16:55 +0800 Subject: [PATCH] LU-14119 lfsck: replace dt_lookup() with dt_lookup_dir() 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. Signed-off-by: Lai Siyao Change-Id: I40bd8d51edece50353af1729cf867572a0abea78 Reviewed-on: https://review.whamcloud.com/41218 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Alex Zhuravlev Reviewed-by: Oleg Drokin --- lustre/lfsck/lfsck_engine.c | 13 +------------ lustre/lfsck/lfsck_layout.c | 6 ++---- lustre/lfsck/lfsck_lib.c | 29 ++++++++--------------------- lustre/lfsck/lfsck_namespace.c | 37 ++++++++++++------------------------- lustre/lfsck/lfsck_striped_dir.c | 9 +++------ 5 files changed, 26 insertions(+), 68 deletions(-) diff --git a/lustre/lfsck/lfsck_engine.c b/lustre/lfsck/lfsck_engine.c index 2ae4ad8..f9c65b8 100644 --- a/lustre/lfsck/lfsck_engine.c +++ b/lustre/lfsck/lfsck_engine.c @@ -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. * @@ -217,7 +206,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); diff --git a/lustre/lfsck/lfsck_layout.c b/lustre/lfsck/lfsck_layout.c index 8f81d8f..95b764d 100644 --- a/lustre/lfsck/lfsck_layout.c +++ b/lustre/lfsck/lfsck_layout.c @@ -2386,8 +2386,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); @@ -2399,8 +2398,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; diff --git a/lustre/lfsck/lfsck_lib.c b/lustre/lfsck/lfsck_lib.c index 01ea411..93ca2a2 100644 --- a/lustre/lfsck/lfsck_lib.c +++ b/lustre/lfsck/lfsck_lib.c @@ -1056,8 +1056,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); @@ -1265,8 +1264,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); @@ -1351,8 +1349,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) @@ -1469,8 +1466,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; @@ -3712,9 +3708,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; @@ -3722,9 +3715,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); @@ -3732,11 +3724,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); @@ -3756,8 +3744,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); diff --git a/lustre/lfsck/lfsck_namespace.c b/lustre/lfsck/lfsck_namespace.c index a227bb0..ff660c4 100644 --- a/lustre/lfsck/lfsck_namespace.c +++ b/lustre/lfsck/lfsck_namespace.c @@ -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; @@ -1474,9 +1471,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)); @@ -1503,8 +1498,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); @@ -1516,8 +1510,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; @@ -1989,8 +1982,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; @@ -2276,8 +2268,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); @@ -2675,8 +2666,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 @@ -2916,8 +2906,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); @@ -3276,8 +3265,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); @@ -3867,8 +3855,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); diff --git a/lustre/lfsck/lfsck_striped_dir.c b/lustre/lfsck/lfsck_striped_dir.c index 5d73261..2980277 100644 --- a/lustre/lfsck/lfsck_striped_dir.c +++ b/lustre/lfsck/lfsck_striped_dir.c @@ -1552,8 +1552,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); @@ -1762,8 +1761,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); @@ -1843,8 +1841,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); -- 1.8.3.1