X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Flfsck%2Flfsck_striped_dir.c;h=6b3f69d4323abf1fb56775974a3cde25a6c18d21;hp=d0bbd4e978899fd60baf84e689723b12dd415284;hb=4950f42fb6286f4cf5e6092593acabde76a8f093;hpb=b5ff160e58b070c03290598914554a9ffecbea2e diff --git a/lustre/lfsck/lfsck_striped_dir.c b/lustre/lfsck/lfsck_striped_dir.c index d0bbd4e..6b3f69d 100644 --- a/lustre/lfsck/lfsck_striped_dir.c +++ b/lustre/lfsck/lfsck_striped_dir.c @@ -387,7 +387,8 @@ static int lfsck_replace_lmv(const struct lu_env *env, struct lmv_mds_md_v1 *lmv, __u32 index, __u32 flags) { - int rc; + struct lfsck_lmv *llmv = lnr->lnr_lmv; + int rc; rc = lfsck_remove_dirent(env, com, lnr->lnr_obj, &lslr->lslr_fid, index); @@ -396,26 +397,17 @@ static int lfsck_replace_lmv(const struct lu_env *env, lslr->lslr_fid = lnr->lnr_fid; lslr->lslr_flags = flags; - if (lmv != NULL) { - struct lfsck_lmv *llmv = lnr->lnr_lmv; - - lslr->lslr_stripe_count = lmv->lmv_stripe_count; - lslr->lslr_index = lmv->lmv_master_mdt_index; - lslr->lslr_hash_type = lmv->lmv_hash_type; - - if (flags == LSLF_NONE && - llmv->ll_hash_type == LMV_HASH_TYPE_UNKNOWN && + lslr->lslr_stripe_count = lmv->lmv_stripe_count; + lslr->lslr_index = lmv->lmv_master_mdt_index; + lslr->lslr_hash_type = lmv->lmv_hash_type; + if (flags == LSLF_NONE) { + if (llmv->ll_hash_type == LMV_HASH_TYPE_UNKNOWN && lmv_is_known_hash_type(lmv->lmv_hash_type)) llmv->ll_hash_type = lmv->lmv_hash_type; - if (flags == LSLF_NONE && - lslr->lslr_stripe_count <= LFSCK_LMV_MAX_STRIPES && + if (lslr->lslr_stripe_count <= LFSCK_LMV_MAX_STRIPES && llmv->ll_max_stripe_count < lslr->lslr_stripe_count) llmv->ll_max_stripe_count = lslr->lslr_stripe_count; - } else { - lslr->lslr_stripe_count = 0; - lslr->lslr_index = 0; - lslr->lslr_hash_type = 0; } return 0; @@ -535,26 +527,22 @@ static int lfsck_record_lmv(const struct lu_env *env, if (fid_is_zero(&lslr->lslr_fid)) { lslr->lslr_fid = *fid; - if (lmv != NULL) { - lslr->lslr_stripe_count = lmv->lmv_stripe_count; - lslr->lslr_index = lmv->lmv_master_mdt_index; - lslr->lslr_hash_type = lmv->lmv_hash_type; - - if (flags == LSLF_NONE && - llmv->ll_hash_type == LMV_HASH_TYPE_UNKNOWN && + lslr->lslr_stripe_count = lmv->lmv_stripe_count; + lslr->lslr_index = lmv->lmv_master_mdt_index; + lslr->lslr_hash_type = lmv->lmv_hash_type; + lslr->lslr_flags = flags; + llmv->ll_stripes_filled++; + if (flags == LSLF_NONE) { + if (llmv->ll_hash_type == LMV_HASH_TYPE_UNKNOWN && lmv_is_known_hash_type(lmv->lmv_hash_type)) llmv->ll_hash_type = lmv->lmv_hash_type; - if (flags == LSLF_NONE && - lslr->lslr_stripe_count <= LFSCK_LMV_MAX_STRIPES && + if (lslr->lslr_stripe_count <= LFSCK_LMV_MAX_STRIPES && llmv->ll_max_stripe_count < lslr->lslr_stripe_count) llmv->ll_max_stripe_count = lslr->lslr_stripe_count; } - lslr->lslr_flags = flags; - llmv->ll_stripes_filled++; - if (llmv->ll_max_filled_off < index) llmv->ll_max_filled_off = index; @@ -773,25 +761,18 @@ none: lslr->lslr_fid = *fid; lslr->lslr_flags = flags; - if (lmv != NULL) { - lslr->lslr_stripe_count = lmv->lmv_stripe_count; - lslr->lslr_index = lmv->lmv_master_mdt_index; - lslr->lslr_hash_type = lmv->lmv_hash_type; - - if (flags == LSLF_NONE && - llmv->ll_hash_type == LMV_HASH_TYPE_UNKNOWN && + lslr->lslr_stripe_count = lmv->lmv_stripe_count; + lslr->lslr_index = lmv->lmv_master_mdt_index; + lslr->lslr_hash_type = lmv->lmv_hash_type; + if (flags == LSLF_NONE) { + if (llmv->ll_hash_type == LMV_HASH_TYPE_UNKNOWN && lmv_is_known_hash_type(lmv->lmv_hash_type)) llmv->ll_hash_type = lmv->lmv_hash_type; - if (flags == LSLF_NONE && - lslr->lslr_stripe_count <= LFSCK_LMV_MAX_STRIPES && + if (lslr->lslr_stripe_count <= LFSCK_LMV_MAX_STRIPES && llmv->ll_max_stripe_count < lslr->lslr_stripe_count) llmv->ll_max_stripe_count = lslr->lslr_stripe_count; - } else { - lslr->lslr_stripe_count = 0; - lslr->lslr_index = 0; - lslr->lslr_hash_type = 0; } break; @@ -1747,6 +1728,9 @@ int lfsck_namespace_verify_stripe_slave(const struct lu_env *env, GOTO(out, rc); } + if (unlikely(!dt_try_as_dir(env, parent))) + GOTO(out, rc = -ENOTDIR); + rc = lfsck_read_stripe_lmv(env, parent, plmv); if (rc != 0) { int rc1; @@ -1954,8 +1938,11 @@ int lfsck_namespace_striped_dir_rescan(const struct lu_env *env, cname = lfsck_name_get_const(env, info->lti_tmpbuf, len); memcpy(lnr->lnr_name, info->lti_tmpbuf, len); - obj = lfsck_object_find_bottom(env, lfsck, cfid); + obj = lfsck_object_find_bottom_nowait(env, lfsck, cfid); if (IS_ERR(obj)) { + if (lfsck_is_dead_obj(dir)) + RETURN(0); + rc1 = PTR_ERR(obj); goto next; } @@ -2260,9 +2247,13 @@ int lfsck_namespace_handle_striped_master(const struct lu_env *env, dev = ltd->ltd_tgt; } - obj = lfsck_object_find_by_dev(env, dev, &lnr->lnr_fid); - if (IS_ERR(obj)) + obj = lfsck_object_find_by_dev_nowait(env, dev, &lnr->lnr_fid); + if (IS_ERR(obj)) { + if (lfsck_is_dead_obj(dir)) + RETURN(0); + GOTO(fail_lmv, rc = PTR_ERR(obj)); + } if (!dt_object_exists(obj)) { stripe = lfsck_shard_name_to_index(env, lnr->lnr_name, @@ -2275,9 +2266,12 @@ int lfsck_namespace_handle_striped_master(const struct lu_env *env, dangling: rc = lfsck_namespace_check_exist(env, dir, obj, lnr->lnr_name); - if (rc == 0) - rc = lfsck_record_lmv(env, com, lnr, NULL, stripe, + if (rc == 0) { + memset(lmv, 0, sizeof(*lmv)); + lmv->lmv_magic = LMV_MAGIC; + rc = lfsck_record_lmv(env, com, lnr, lmv, stripe, LSLF_DANGLING, LSLF_NONE, &depth); + } GOTO(out, rc); }