LASSERT(llmv->ll_lslr != NULL);
- OBD_FREE_LARGE(llmv->ll_lslr,
- sizeof(*llmv->ll_lslr) *
- llmv->ll_stripes_allocated);
+ OBD_FREE_PTR_ARRAY_LARGE(llmv->ll_lslr,
+ llmv->ll_stripes_allocated);
OBD_FREE_PTR(llu);
} else {
if (llmv->ll_lslr != NULL)
- OBD_FREE_LARGE(llmv->ll_lslr,
- sizeof(*llmv->ll_lslr) *
+ OBD_FREE_PTR_ARRAY_LARGE(
+ llmv->ll_lslr,
llmv->ll_stripes_allocated);
OBD_FREE_PTR(llmv);
int new_stripes = index + 1;
size_t old_size = sizeof(*lslr) * llmv->ll_stripes_allocated;
- OBD_ALLOC_LARGE(new_lslr, sizeof(*new_lslr) * new_stripes);
+ OBD_ALLOC_PTR_ARRAY_LARGE(new_lslr, new_stripes);
if (new_lslr == NULL) {
llmv->ll_failed = 1;
return idx;
}
+static inline bool lfsck_name_hash_match(struct lmv_mds_md_v1 *lmv,
+ const char *name, int namelen)
+{
+ int idx;
+
+ idx = lmv_name_to_stripe_index_old(lmv, name, namelen);
+ if (idx == lmv->lmv_master_mdt_index)
+ return true;
+
+ if (!lmv_hash_is_layout_changing(lmv->lmv_hash_type))
+ return false;
+
+ idx = lmv_name_to_stripe_index(lmv, name, namelen);
+ return (idx == lmv->lmv_master_mdt_index);
+}
+
bool lfsck_is_valid_slave_name_entry(const struct lu_env *env,
struct lfsck_lmv *llmv,
const char *name, int namelen)
{
- struct lmv_mds_md_v1 *lmv;
- int idx;
-
if (llmv == NULL || !llmv->ll_lmv_slave || !llmv->ll_lmv_verified)
return true;
- lmv = &llmv->ll_lmv;
- idx = lmv_name_to_stripe_index(lmv->lmv_hash_type,
- lmv->lmv_stripe_count,
- name, namelen);
- if (unlikely(idx != lmv->lmv_master_mdt_index))
- return false;
-
- return true;
+ return lfsck_name_hash_match(&llmv->ll_lmv, name, namelen);
}
/**
struct dt_object *child,
const struct lu_name *cname)
{
- struct lmv_mds_md_v1 *lmv = &lfsck_env_info(env)->lti_lmv;
- int idx;
- int rc;
+ struct lmv_mds_md_v1 *lmv = &lfsck_env_info(env)->lti_lmv;
+ int rc;
rc = lfsck_read_stripe_lmv(env, lfsck, parent, lmv);
if (rc != 0)
if (!lfsck_is_valid_slave_lmv(lmv))
return 0;
- idx = lmv_name_to_stripe_index(lmv->lmv_hash_type,
- lmv->lmv_stripe_count,
- cname->ln_name,
- cname->ln_namelen);
- if (unlikely(idx != lmv->lmv_master_mdt_index))
+ if (!lfsck_name_hash_match(lmv, cname->ln_name,
+ cname->ln_namelen))
return 1;
} else if (lfsck_shard_name_to_index(env, cname->ln_name,
cname->ln_namelen, lfsck_object_type(child),
else
count = lmv4->lmv_stripe_count;
- OBD_ALLOC_LARGE(lslr, sizeof(struct lfsck_slave_lmv_rec) * count);
+ OBD_ALLOC_PTR_ARRAY_LARGE(lslr, count);
if (lslr == NULL) {
OBD_FREE_PTR(llu);
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);
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);
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);
continue;
lnr->lnr_fid = *cfid;
- lnr->lnr_namelen = snprintf(lnr->lnr_name,
- lnr->lnr_size - sizeof(*lnr),
- DFID":%u", PFID(cfid), i);
+ lnr->lnr_namelen = scnprintf(lnr->lnr_name,
+ lnr->lnr_size - sizeof(*lnr),
+ DFID":%u", PFID(cfid), i);
cname = lfsck_name_get_const(env, lnr->lnr_name,
lnr->lnr_namelen);
obj = lfsck_object_find_bottom(env, lfsck, cfid);
if (repair_linkea) {
struct lustre_handle lh = { 0 };
- rc1 = linkea_links_new(&ldata, &info->lti_big_buf,
- cname, lfsck_dto2fid(dir));
- if (rc1 != 0)
- goto next;
-
if (dir == NULL) {
dir = lfsck_assistant_object_load(env, lfsck,
lso);
}
}
+ rc1 = linkea_links_new(&ldata, &info->lti_big_buf,
+ cname, lfsck_dto2fid(dir));
+ if (rc1 != 0)
+ goto next;
+
rc1 = lfsck_ibits_lock(env, lfsck, obj, &lh,
MDS_INODELOCK_UPDATE |
MDS_INODELOCK_XATTR, LCK_EX);
}
next:
- CDEBUG(D_LFSCK, "%s: namespace LFSCK repair the shard "
- "%d "DFID" of the striped directory "DFID" with "
- "dangling %s/%s, rename %s/%s, llinkea %s/%s, "
- "repair_lmvea %s/%s: rc = %d\n", lfsck_lfsck2name(lfsck),
- i, PFID(cfid), PFID(pfid),
- create ? "yes" : "no", create_repaired ? "yes" : "no",
- rename ? "yes" : "no", rename_repaired ? "yes" : "no",
- repair_linkea ? "yes" : "no",
- linkea_repaired ? "yes" : "no",
- repair_lmvea ? "yes" : "no",
- lmvea_repaired ? "yes" : "no", rc1);
+ if (create || rename || repair_linkea || repair_lmvea) {
+ CDEBUG(D_LFSCK, "%s: namespace LFSCK repair the shard "
+ "%d "DFID" of the striped directory "DFID" with "
+ "dangling %s/%s, rename %s/%s, llinkea %s/%s, "
+ "repair_lmvea %s/%s: rc = %d\n",
+ lfsck_lfsck2name(lfsck),
+ i, PFID(cfid), PFID(pfid),
+ create ? "yes" : "no",
+ create_repaired ? "yes" : "no",
+ rename ? "yes" : "no",
+ rename_repaired ? "yes" : "no",
+ repair_linkea ? "yes" : "no",
+ linkea_repaired ? "yes" : "no",
+ repair_lmvea ? "yes" : "no",
+ lmvea_repaired ? "yes" : "no", rc1);
+ }
if (obj != NULL && !IS_ERR(obj)) {
lfsck_object_put(env, obj);