X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flfsck%2Flfsck_layout.c;h=88ec0e6e18e4df723119e610a5aa092a009f1224;hb=12e311012ae337276dc3e7da3e7ad8d85d11e764;hp=f59dca754205ad31e50b22c46be5cb74c2567f2f;hpb=4f046691023175db492ef784d6577da428ec5e1b;p=fs%2Flustre-release.git diff --git a/lustre/lfsck/lfsck_layout.c b/lustre/lfsck/lfsck_layout.c index f59dca7..88ec0e6 100644 --- a/lustre/lfsck/lfsck_layout.c +++ b/lustre/lfsck/lfsck_layout.c @@ -1358,8 +1358,7 @@ again: break; ltd->ltd_layout_gen = llmd->llmd_touch_gen; - list_del(<d->ltd_layout_phase_list); - list_add_tail(<d->ltd_layout_phase_list, head); + list_move_tail(<d->ltd_layout_phase_list, head); atomic_inc(<d->ltd_ref); laia->laia_ltd = ltd; spin_unlock(<ds->ltd_lock); @@ -1567,9 +1566,8 @@ again: break; ltd->ltd_layout_gen = llmd->llmd_touch_gen; - list_del_init(<d->ltd_layout_phase_list); - list_add_tail(<d->ltd_layout_phase_list, - &llmd->llmd_mdt_phase1_list); + list_move_tail(<d->ltd_layout_phase_list, + &llmd->llmd_mdt_phase1_list); atomic_inc(<d->ltd_ref); laia->laia_ltd = ltd; spin_unlock(<ds->ltd_lock); @@ -1979,6 +1977,7 @@ static int lfsck_layout_recreate_parent(const struct lu_env *env, __u32 ea_off) { struct lfsck_thread_info *info = lfsck_env_info(env); + struct dt_insert_rec *dtrec = &info->lti_dt_rec; char *name = info->lti_key; struct lu_attr *la = &info->lti_la; struct dt_object_format *dof = &info->lti_dof; @@ -2108,8 +2107,10 @@ static int lfsck_layout_recreate_parent(const struct lu_env *env, GOTO(stop, rc); /* 4a. Insert the MDT-object to .lustre/lost+found/MDTxxxx/ */ + dtrec->rec_fid = pfid; + dtrec->rec_type = S_IFREG; rc = dt_declare_insert(env, lfsck->li_lpf_obj, - (const struct dt_rec *)pfid, + (const struct dt_rec *)dtrec, (const struct dt_key *)name, th); if (rc != 0) GOTO(stop, rc); @@ -2147,8 +2148,7 @@ static int lfsck_layout_recreate_parent(const struct lu_env *env, GOTO(stop, rc); /* 4b. Insert the MDT-object to .lustre/lost+found/MDTxxxx/ */ - rc = dt_insert(env, lfsck->li_lpf_obj, - (const struct dt_rec *)pfid, + rc = dt_insert(env, lfsck->li_lpf_obj, (const struct dt_rec *)dtrec, (const struct dt_key *)name, th, BYPASS_CAPA, 1); if (rc != 0) GOTO(stop, rc); @@ -2470,6 +2470,7 @@ static int lfsck_layout_recreate_lovea(const struct lu_env *env, struct lfsck_bookmark *bk = &lfsck->li_bookmark_ram; struct thandle *handle = NULL; size_t buflen = buf->lb_len; + size_t lovea_size; struct lov_mds_md_v1 *lmm; struct lov_ost_data_v1 *objs; struct lustre_handle lh = { 0 }; @@ -2508,8 +2509,9 @@ again: if (rc < 0) GOTO(unlock_layout, rc); - if (buf->lb_len < rc) { - lu_buf_realloc(buf, rc); + lovea_size = rc; + if (buf->lb_len < lovea_size) { + lu_buf_realloc(buf, lovea_size); buflen = buf->lb_len; if (buf->lb_buf == NULL) GOTO(unlock_layout, rc = -ENOMEM); @@ -2539,11 +2541,12 @@ again: LASSERT(rc != 0); goto again; } else if (rc == -ENODATA || rc == 0) { - rc = lov_mds_md_size(ea_off + 1, LOV_MAGIC_V1); + lovea_size = lov_mds_md_size(ea_off + 1, LOV_MAGIC_V1); /* If the declared is not big enough, re-try. */ - if (buf->lb_len < rc) + if (buf->lb_len < lovea_size) { + rc = lovea_size; goto again; - + } fl = LU_XATTR_CREATE; } else if (rc < 0) { GOTO(unlock_parent, rc); @@ -2551,15 +2554,16 @@ again: goto again; } else { fl = LU_XATTR_REPLACE; + lovea_size = rc; } if (fl == LU_XATTR_CREATE) { if (bk->lb_param & LPF_DRYRUN) GOTO(unlock_parent, rc = 1); - LASSERT(buf->lb_len >= rc); + LASSERT(buf->lb_len >= lovea_size); - buf->lb_len = rc; + buf->lb_len = lovea_size; rc = lfsck_layout_extend_lovea(env, lfsck, handle, parent, cfid, buf, fl, ost_idx, ea_off, false); @@ -2574,9 +2578,9 @@ again: if (bk->lb_param & LPF_DRYRUN) GOTO(unlock_parent, rc = 1); - LASSERT(buf->lb_len >= rc); + LASSERT(buf->lb_len >= lovea_size); - buf->lb_len = rc; + buf->lb_len = lovea_size; memset(lmm, 0, buf->lb_len); rc = lfsck_layout_extend_lovea(env, lfsck, handle, parent, cfid, buf, fl, ost_idx, ea_off, true); @@ -2610,12 +2614,13 @@ again: if (bk->lb_param & LPF_DRYRUN) GOTO(unlock_parent, rc = 1); - rc = lov_mds_md_size(ea_off + 1, magic); + lovea_size = lov_mds_md_size(ea_off + 1, magic); /* If the declared is not big enough, re-try. */ - if (buf->lb_len < rc) + if (buf->lb_len < lovea_size) { + rc = lovea_size; goto again; - - buf->lb_len = rc; + } + buf->lb_len = lovea_size; rc = lfsck_layout_extend_lovea(env, lfsck, handle, parent, cfid, buf, fl, ost_idx, ea_off, false); @@ -2624,7 +2629,7 @@ again: LASSERTF(rc > 0, "invalid rc = %d\n", rc); - buf->lb_len = rc; + buf->lb_len = lovea_size; for (i = 0; i < count; i++, objs++) { /* The MDT-object was created via lfsck_layout_recover_create() * by others before, and we fill the dummy layout EA. */ @@ -3800,6 +3805,9 @@ cleanup2: rc = rc1; } + /* flush all async updating before exit. */ + dt_sync(env, lfsck->li_next); + /* Under force exit case, some requests may be just freed without * verification, those objects should be re-handled when next run. * So not update the on-disk tracing file under such case. */ @@ -3966,9 +3974,8 @@ lfsck_layout_slave_query_master(const struct lu_env *env, break; llst->llst_gen = llsd->llsd_touch_gen; - list_del(&llst->llst_list); - list_add_tail(&llst->llst_list, - &llsd->llsd_master_list); + list_move_tail(&llst->llst_list, + &llsd->llsd_master_list); atomic_inc(&llst->llst_ref); spin_unlock(&llsd->llsd_lock); @@ -4045,9 +4052,8 @@ lfsck_layout_slave_notify_master(const struct lu_env *env, break; llst->llst_gen = llsd->llsd_touch_gen; - list_del(&llst->llst_list); - list_add_tail(&llst->llst_list, - &llsd->llsd_master_list); + list_move_tail(&llst->llst_list, + &llsd->llsd_master_list); atomic_inc(&llst->llst_ref); spin_unlock(&llsd->llsd_lock); @@ -4445,9 +4451,8 @@ static int lfsck_layout_prep(const struct lu_env *env, if (!lfsck->li_drop_dryrun || lo->ll_pos_first_inconsistent == 0) { lo->ll_status = LS_SCANNING_PHASE2; - list_del_init(&com->lc_link); - list_add_tail(&com->lc_link, - &lfsck->li_list_double_scan); + list_move_tail(&com->lc_link, + &lfsck->li_list_double_scan); pos->lp_oit_cookie = 0; } else { int i; @@ -5013,20 +5018,17 @@ static int lfsck_layout_master_post(const struct lu_env *env, lo->ll_status = LS_SCANNING_PHASE2; lo->ll_flags |= LF_SCANNED_ONCE; lo->ll_flags &= ~LF_UPGRADE; - list_del_init(&com->lc_link); - list_add_tail(&com->lc_link, &lfsck->li_list_double_scan); + list_move_tail(&com->lc_link, &lfsck->li_list_double_scan); } else if (result == 0) { lo->ll_status = lfsck->li_status; if (lo->ll_status == 0) lo->ll_status = LS_STOPPED; if (lo->ll_status != LS_PAUSED) { - list_del_init(&com->lc_link); - list_add_tail(&com->lc_link, &lfsck->li_list_idle); + list_move_tail(&com->lc_link, &lfsck->li_list_idle); } } else { lo->ll_status = LS_FAILED; - list_del_init(&com->lc_link); - list_add_tail(&com->lc_link, &lfsck->li_list_idle); + list_move_tail(&com->lc_link, &lfsck->li_list_idle); } spin_unlock(&lfsck->li_lock); @@ -5075,20 +5077,16 @@ static int lfsck_layout_slave_post(const struct lu_env *env, lo->ll_flags &= ~LF_CRASHED_LASTID; } lo->ll_flags &= ~LF_UPGRADE; - list_del_init(&com->lc_link); - list_add_tail(&com->lc_link, &lfsck->li_list_double_scan); + list_move_tail(&com->lc_link, &lfsck->li_list_double_scan); } else if (result == 0) { lo->ll_status = lfsck->li_status; if (lo->ll_status == 0) lo->ll_status = LS_STOPPED; - if (lo->ll_status != LS_PAUSED) { - list_del_init(&com->lc_link); - list_add_tail(&com->lc_link, &lfsck->li_list_idle); - } + if (lo->ll_status != LS_PAUSED) + list_move_tail(&com->lc_link, &lfsck->li_list_idle); } else { lo->ll_status = LS_FAILED; - list_del_init(&com->lc_link); - list_add_tail(&com->lc_link, &lfsck->li_list_idle); + list_move_tail(&com->lc_link, &lfsck->li_list_idle); } spin_unlock(&lfsck->li_lock);