From 068d1a3fbd94d4f8cab3d897b6b6ef7c385b4fc1 Mon Sep 17 00:00:00 2001 From: tappro Date: Sat, 23 Feb 2008 13:34:55 +0000 Subject: [PATCH] b=14908 i=yury,nikita Proper usage of lu_context, additional health-checks --- lustre/include/lu_object.h | 9 +++++++++ lustre/ldlm/ldlm_lib.c | 6 ++++-- lustre/obdclass/lu_object.c | 8 ++++++++ lustre/osd/osd_handler.c | 10 +++++++--- lustre/ptlrpc/service.c | 2 +- 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/lustre/include/lu_object.h b/lustre/include/lu_object.h index e472e0d..2ad1d8e 100644 --- a/lustre/include/lu_object.h +++ b/lustre/include/lu_object.h @@ -846,6 +846,14 @@ enum lu_xattr_flags { LU_XATTR_CREATE = (1 << 1) }; +/* For lu_context health-checks */ +enum lu_context_state { + LCS_INITIALIZED = 1, + LCS_ENTERED, + LCS_LEFT, + LCS_FINALIZED +}; + /* * lu_context. Execution context for lu_object methods. Currently associated * with thread. @@ -886,6 +894,7 @@ struct lu_context { * detail. */ void **lc_value; + enum lc_state; }; /* diff --git a/lustre/ldlm/ldlm_lib.c b/lustre/ldlm/ldlm_lib.c index 7081ba5..c41b8c9 100644 --- a/lustre/ldlm/ldlm_lib.c +++ b/lustre/ldlm/ldlm_lib.c @@ -1424,7 +1424,10 @@ static int handle_recovery_req(struct ptlrpc_thread *thread, req->rq_svc_thread = thread; req->rq_svc_thread->t_env->le_ses = &req->rq_session; + /* thread context */ + lu_context_enter(&thread->t_env->le_ctx); (void)handler(req); + lu_context_exit(&thread->t_env->le_ctx); lu_context_exit(&req->rq_session); lu_context_fini(&req->rq_session); @@ -1499,7 +1502,6 @@ static int target_recovery_thread(void *arg) DEBUG_REQ(D_HA, req, "processing t"LPD64" from %s", lustre_msg_get_transno(req->rq_reqmsg), libcfs_nid2str(req->rq_peer.nid)); - handle_recovery_req(thread, req, trd->trd_recovery_handler); obd->obd_replayed_requests++; @@ -1570,7 +1572,7 @@ static int target_recovery_thread(void *arg) target_finish_recovery(obd); - lu_env_fini(&env); + lu_context_fini(&env.le_ctx); trd->trd_processing_task = 0; complete(&trd->trd_finishing); RETURN(rc); diff --git a/lustre/obdclass/lu_object.c b/lustre/obdclass/lu_object.c index 8629ee9..c7747e8 100644 --- a/lustre/obdclass/lu_object.c +++ b/lustre/obdclass/lu_object.c @@ -867,6 +867,7 @@ EXPORT_SYMBOL(lu_context_key_degister); void *lu_context_key_get(const struct lu_context *ctx, struct lu_context_key *key) { + LASSERT(ctx->lc_state == LCS_ENTERED); LASSERT(0 <= key->lct_index && key->lct_index < ARRAY_SIZE(lu_keys)); return ctx->lc_value[key->lct_index]; } @@ -934,6 +935,7 @@ static int keys_init(struct lu_context *ctx) int lu_context_init(struct lu_context *ctx, __u32 tags) { memset(ctx, 0, sizeof *ctx); + ctx->lc_state = LCS_INITIALIZED; ctx->lc_tags = tags; return keys_init(ctx); } @@ -944,6 +946,8 @@ EXPORT_SYMBOL(lu_context_init); */ void lu_context_fini(struct lu_context *ctx) { + LASSERT(ctx->lc_state == LCS_INITIALIZED || ctx->lc_state == LCS_LEFT); + ctx->lc_state = LCS_FINALIZED; keys_fini(ctx); } EXPORT_SYMBOL(lu_context_fini); @@ -953,6 +957,8 @@ EXPORT_SYMBOL(lu_context_fini); */ void lu_context_enter(struct lu_context *ctx) { + LASSERT(ctx->lc_state == LCS_INITIALIZED || ctx->lc_state == LCS_LEFT); + ctx->lc_state = LCS_ENTERED; } EXPORT_SYMBOL(lu_context_enter); @@ -963,6 +969,8 @@ void lu_context_exit(struct lu_context *ctx) { int i; + LASSERT(ctx->lc_state == LCS_ENTERED); + ctx->lc_state = LCS_LEFT; if (ctx->lc_value != NULL) { for (i = 0; i < ARRAY_SIZE(lu_keys); ++i) { if (ctx->lc_value[i] != NULL) { diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c index 7324e27..fedddcd 100644 --- a/lustre/osd/osd_handler.c +++ b/lustre/osd/osd_handler.c @@ -621,11 +621,14 @@ static void osd_trans_commit_cb(struct journal_callback *jcb, int error) if (error) { CERROR("transaction @0x%p commit error: %d\n", th, error); } else { + struct lu_env *env = &osd_dt_dev(dev)->od_env_for_commit; /* * This od_env_for_commit is only for commit usage. see * "struct dt_device" */ - dt_txn_hook_commit(&osd_dt_dev(dev)->od_env_for_commit, th); + lu_context_enter(&env->le_ctx); + dt_txn_hook_commit(env, th); + lu_context_exit(&env->le_ctx); } lu_device_put(&dev->dd_lu_dev); @@ -2247,7 +2250,8 @@ static void osd_key_exit(const struct lu_context *ctx, static int osd_device_init(const struct lu_env *env, struct lu_device *d, const char *name, struct lu_device *next) { - return lu_env_init(&osd_dev(d)->od_env_for_commit, NULL, LCT_MD_THREAD); + return lu_context_init(&osd_dev(d)->od_env_for_commit.le_ctx, + LCT_MD_THREAD); } static int osd_shutdown(const struct lu_env *env, struct osd_device *o) @@ -2317,7 +2321,7 @@ static struct lu_device *osd_device_fini(const struct lu_env *env, osd_dev(d)->od_mount->lmi_mnt); osd_dev(d)->od_mount = NULL; - lu_env_fini(&osd_dev(d)->od_env_for_commit); + lu_context_fini(&osd_dev(d)->od_env_for_commit.le_ctx); RETURN(NULL); } diff --git a/lustre/ptlrpc/service.c b/lustre/ptlrpc/service.c index d4091c9..64bfdcf 100644 --- a/lustre/ptlrpc/service.c +++ b/lustre/ptlrpc/service.c @@ -1105,7 +1105,7 @@ out_srv_fini: if (svc->srv_done != NULL) svc->srv_done(thread); - lu_env_fini(&env); + lu_context_fini(&env.le_ctx); out: CDEBUG(D_NET, "service thread %d exiting: rc %d\n", thread->t_id, rc); -- 1.8.3.1