X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_recovery.c;h=6279111fde7893861faea3ce621aa53f8dd14c50;hb=606da8cf53e033c73184b8e5532464534f8512e8;hp=bce00888e0236e4e24ded3dd49e40328d7e99806;hpb=08b2bc314e2eef39edebd87616ea3a372718b310;p=fs%2Flustre-release.git diff --git a/lustre/mdt/mdt_recovery.c b/lustre/mdt/mdt_recovery.c index bce0088..6279111 100644 --- a/lustre/mdt/mdt_recovery.c +++ b/lustre/mdt/mdt_recovery.c @@ -241,13 +241,17 @@ static int mdt_clients_data_init(const struct lu_env *env, unsigned long last_size) { struct lr_server_data *lsd = &mdt->mdt_lut.lut_lsd; - struct lsd_client_data *lcd = NULL; + struct lsd_client_data *lcd; struct obd_device *obd = mdt2obd_dev(mdt); loff_t off; int cl_idx; int rc = 0; ENTRY; + OBD_ALLOC_PTR(lcd); + if (!lcd) + RETURN(-ENOMEM); + /* When we do a clean MDS shutdown, we save the last_transno into * the header. If we find clients with higher last_transno values * then those clients may need recovery done. */ @@ -256,12 +260,7 @@ static int mdt_clients_data_init(const struct lu_env *env, off < last_size; cl_idx++) { __u64 last_transno; struct obd_export *exp; - - if (!lcd) { - OBD_ALLOC_PTR(lcd); - if (!lcd) - RETURN(-ENOMEM); - } + struct mdt_thread_info *mti; off = lsd->lsd_client_start + cl_idx * lsd->lsd_client_size; @@ -295,30 +294,29 @@ static int mdt_clients_data_init(const struct lu_env *env, if (IS_ERR(exp)) { if (PTR_ERR(exp) == -EALREADY) { /* export already exists, zero out this one */ - lcd->lcd_uuid[0] = '\0'; - } else { - GOTO(err_client, rc = PTR_ERR(exp)); + CERROR("Duplicate export %s!\n", lcd->lcd_uuid); + continue; } - } else { - struct mdt_thread_info *mti; - mti = lu_context_key_get(&env->le_ctx, &mdt_thread_key); - LASSERT(mti != NULL); - mti->mti_exp = exp; - exp->exp_target_data.ted_lcd = lcd; - rc = mdt_client_add(env, mdt, cl_idx); - /* can't fail existing */ - LASSERTF(rc == 0, "rc = %d\n", rc); - /* VBR: set export last committed version */ - exp->exp_last_committed = last_transno; - lcd = NULL; - cfs_spin_lock(&exp->exp_lock); - exp->exp_connecting = 0; - exp->exp_in_recovery = 0; - cfs_spin_unlock(&exp->exp_lock); - obd->obd_max_recoverable_clients++; - class_export_put(exp); + GOTO(err_client, rc = PTR_ERR(exp)); } + mti = lu_context_key_get(&env->le_ctx, &mdt_thread_key); + LASSERT(mti != NULL); + mti->mti_exp = exp; + /* copy on-disk lcd to the export */ + *exp->exp_target_data.ted_lcd = *lcd; + rc = mdt_client_add(env, mdt, cl_idx); + /* can't fail existing */ + LASSERTF(rc == 0, "rc = %d\n", rc); + /* VBR: set export last committed version */ + exp->exp_last_committed = last_transno; + cfs_spin_lock(&exp->exp_lock); + exp->exp_connecting = 0; + exp->exp_in_recovery = 0; + cfs_spin_unlock(&exp->exp_lock); + obd->obd_max_recoverable_clients++; + class_export_put(exp); + CDEBUG(D_OTHER, "client at idx %d has last_transno="LPU64"\n", cl_idx, last_transno); /* protect __u64 value update */ @@ -329,8 +327,7 @@ static int mdt_clients_data_init(const struct lu_env *env, } err_client: - if (lcd) - OBD_FREE_PTR(lcd); + OBD_FREE_PTR(lcd); RETURN(rc); } @@ -799,14 +796,13 @@ static int mdt_txn_start_cb(const struct lu_env *env, } /* Set new object versions */ -static void mdt_versions_set(struct mdt_thread_info *info) +static void mdt_version_set(struct mdt_thread_info *info) { - int i; - for (i = 0; i < PTLRPC_NUM_VERSIONS; i++) - if (info->mti_mos[i] != NULL) - mo_version_set(info->mti_env, - mdt_object_child(info->mti_mos[i]), - info->mti_transno); + if (info->mti_mos != NULL) { + mo_version_set(info->mti_env, mdt_object_child(info->mti_mos), + info->mti_transno); + info->mti_mos = NULL; + } } /* Update last_rcvd records with latests transaction data */ @@ -857,7 +853,7 @@ static int mdt_txn_stop_cb(const struct lu_env *env, /** VBR: set new versions */ if (txn->th_result == 0) - mdt_versions_set(mti); + mdt_version_set(mti); /* filling reply data */ CDEBUG(D_INODE, "transno = "LPU64", last_committed = "LPU64"\n",