X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftarget%2Ftgt_main.c;h=919103945229578ab7a303efbe8e24c24a0f4b2e;hp=bcf2b2fb8b1c1aabeae74064e63d2ddea1c28d35;hb=c394068ee148595711c661651368b91373bcc78a;hpb=f56079ddb2382f5f74f4dac5dc75abe2434e389a diff --git a/lustre/target/tgt_main.c b/lustre/target/tgt_main.c index bcf2b2f..9191039 100644 --- a/lustre/target/tgt_main.c +++ b/lustre/target/tgt_main.c @@ -69,6 +69,9 @@ int tgt_init(const struct lu_env *env, struct lu_target *lut, lut->lut_mds_capa = 1; lut->lut_oss_capa = 1; + spin_lock_init(&lut->lut_flags_lock); + lut->lut_sync_lock_cancel = NEVER_SYNC_ON_CANCEL; + /* last_rcvd initialization is needed by replayable targets only */ if (!obd->obd_replayable) RETURN(0); @@ -87,16 +90,36 @@ int tgt_init(const struct lu_env *env, struct lu_target *lut, lu_local_obj_fid(&fid, LAST_RECV_OID); o = dt_find_or_create(env, lut->lut_bottom, &fid, &dof, &attr); - if (!IS_ERR(o)) { - lut->lut_last_rcvd = o; - } else { - OBD_FREE(lut->lut_client_bitmap, LR_MAX_CLIENTS >> 3); - lut->lut_client_bitmap = NULL; + if (IS_ERR(o)) { rc = PTR_ERR(o); - CERROR("cannot open %s: rc = %d\n", LAST_RCVD, rc); + CERROR("%s: cannot open LAST_RCVD: rc = %d\n", tgt_name(lut), + rc); + GOTO(out_bitmap, rc); } - RETURN(rc); + lut->lut_last_rcvd = o; + rc = tgt_server_data_init(env, lut); + if (rc < 0) + GOTO(out_obj, rc); + + /* prepare transactions callbacks */ + lut->lut_txn_cb.dtc_txn_start = tgt_txn_start_cb; + lut->lut_txn_cb.dtc_txn_stop = tgt_txn_stop_cb; + lut->lut_txn_cb.dtc_txn_commit = NULL; + lut->lut_txn_cb.dtc_cookie = lut; + lut->lut_txn_cb.dtc_tag = LCT_DT_THREAD | LCT_MD_THREAD; + CFS_INIT_LIST_HEAD(&lut->lut_txn_cb.dtc_linkage); + + dt_txn_callback_add(lut->lut_bottom, &lut->lut_txn_cb); + + RETURN(0); +out_obj: + lu_object_put(env, &lut->lut_last_rcvd->do_lu); + lut->lut_last_rcvd = NULL; +out_bitmap: + OBD_FREE(lut->lut_client_bitmap, LR_MAX_CLIENTS >> 3); + lut->lut_client_bitmap = NULL; + return rc; } EXPORT_SYMBOL(tgt_init); @@ -111,6 +134,7 @@ void tgt_fini(const struct lu_env *env, struct lu_target *lut) lut->lut_client_bitmap = NULL; } if (lut->lut_last_rcvd) { + dt_txn_callback_del(lut->lut_bottom, &lut->lut_txn_cb); lu_object_put(env, &lut->lut_last_rcvd->do_lu); lut->lut_last_rcvd = NULL; } @@ -119,10 +143,42 @@ void tgt_fini(const struct lu_env *env, struct lu_target *lut) EXPORT_SYMBOL(tgt_fini); /* context key constructor/destructor: tg_key_init, tg_key_fini */ -LU_KEY_INIT_FINI(tgt, struct tgt_thread_info); +LU_KEY_INIT(tgt, struct tgt_thread_info); + +static void tgt_key_fini(const struct lu_context *ctx, + struct lu_context_key *key, void *data) +{ + struct tgt_thread_info *info = data; + struct thandle_exec_args *args = &info->tti_tea; + int i; + + for (i = 0; i < args->ta_alloc_args; i++) { + if (args->ta_args[i] != NULL) + OBD_FREE_PTR(args->ta_args[i]); + } + + if (args->ta_args != NULL) + OBD_FREE(args->ta_args, sizeof(args->ta_args[0]) * + args->ta_alloc_args); + OBD_FREE_PTR(info); +} + +static void tgt_key_exit(const struct lu_context *ctx, + struct lu_context_key *key, void *data) +{ + struct tgt_thread_info *tti = data; + + tti->tti_has_trans = 0; + tti->tti_mult_trans = 0; +} /* context key: tg_thread_key */ -LU_CONTEXT_KEY_DEFINE(tgt, LCT_MD_THREAD | LCT_DT_THREAD); +struct lu_context_key tgt_thread_key = { + .lct_tags = LCT_MD_THREAD | LCT_DT_THREAD, + .lct_init = tgt_key_init, + .lct_fini = tgt_key_fini, + .lct_exit = tgt_key_exit, +}; EXPORT_SYMBOL(tgt_thread_key); LU_KEY_INIT_GENERIC(tgt); @@ -140,10 +196,21 @@ EXPORT_SYMBOL(tgt_session_key); LU_KEY_INIT_GENERIC(tgt_ses); +/* + * this page is allocated statically when module is initializing + * it is used to simulate data corruptions, see ost_checksum_bulk() + * for details. as the original pages provided by the layers below + * can be remain in the internal cache, we do not want to modify + * them. + */ +struct page *tgt_page_to_corrupt; + int tgt_mod_init(void) { ENTRY; + tgt_page_to_corrupt = alloc_page(GFP_IOFS); + tgt_key_init_generic(&tgt_thread_key, NULL); lu_context_key_register_many(&tgt_thread_key, NULL); @@ -155,6 +222,9 @@ int tgt_mod_init(void) void tgt_mod_exit(void) { + if (tgt_page_to_corrupt != NULL) + page_cache_release(tgt_page_to_corrupt); + lu_context_key_degister(&tgt_thread_key); lu_context_key_degister(&tgt_session_key); }