From 22275d7c60eebd7f1554f398aa6ac9c977e14183 Mon Sep 17 00:00:00 2001 From: nikita Date: Thu, 28 Sep 2006 13:53:22 +0000 Subject: [PATCH] lu: add LCT_SESSION context tag for per-request data --- lustre/include/lu_object.h | 19 +++++++++++++++++-- lustre/include/lustre_net.h | 5 ++++- lustre/obdclass/lu_object.c | 5 ++--- lustre/ptlrpc/service.c | 31 +++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 6 deletions(-) diff --git a/lustre/include/lu_object.h b/lustre/include/lu_object.h index 8e77057..769d0d1 100644 --- a/lustre/include/lu_object.h +++ b/lustre/include/lu_object.h @@ -344,7 +344,6 @@ enum lu_object_flags { */ /* valid flags */ enum la_valid { - /*mapped ATTR flag*/ LA_ATIME = 1 << 0, LA_MTIME = 1 << 1, LA_CTIME = 1 << 2, @@ -908,10 +907,26 @@ struct lu_context { */ enum lu_context_tag { + /* + * Thread on md server + */ LCT_MD_THREAD = 1 << 0, + /* + * Thread on dt server + */ LCT_DT_THREAD = 1 << 1, + /* + * Context for transaction handle + */ LCT_TX_HANDLE = 1 << 2, - LCT_CL_THREAD = 1 << 3 + /* + * Thread on client + */ + LCT_CL_THREAD = 1 << 3, + /* + * Per-request session on server + */ + LCT_SESSION = 1 << 4 }; /* diff --git a/lustre/include/lustre_net.h b/lustre/include/lustre_net.h index 3c65717..cd94a41 100644 --- a/lustre/include/lustre_net.h +++ b/lustre/include/lustre_net.h @@ -41,6 +41,7 @@ #include #include #include +#include /* MD flags we _always_ use */ #define PTLRPC_MD_OPTIONS 0 @@ -308,6 +309,8 @@ struct ptlrpc_request_pool { void (*prp_populate)(struct ptlrpc_request_pool *, int); }; +struct lu_context; + struct ptlrpc_request { int rq_type; /* one of PTL_RPC_MSG_* */ struct list_head rq_list; @@ -427,6 +430,7 @@ struct ptlrpc_request { void *rq_ptlrpcd_data; struct ptlrpc_request_pool *rq_pool; /* Pool if request from preallocated list */ + struct lu_context rq_session; }; static inline const char * @@ -523,7 +527,6 @@ struct ptlrpc_bulk_desc { #endif }; -struct lu_context; struct ptlrpc_thread { struct list_head t_link; /* active threads for service, from svc->srv_threads */ diff --git a/lustre/obdclass/lu_object.c b/lustre/obdclass/lu_object.c index 2f5789c..0d1a793 100644 --- a/lustre/obdclass/lu_object.c +++ b/lustre/obdclass/lu_object.c @@ -65,7 +65,7 @@ void lu_object_put(const struct lu_context *ctxt, struct lu_object *o) * When last reference is released, iterate over object * layers, and notify them that object is no longer busy. */ - list_for_each_entry(o, &top->loh_layers, lo_linkage) { + list_for_each_entry_reverse(o, &top->loh_layers, lo_linkage) { if (o->lo_ops->loo_object_release != NULL) o->lo_ops->loo_object_release(ctxt, o); } @@ -854,8 +854,7 @@ int lu_context_init(struct lu_context *ctx, __u32 tags) { memset(ctx, 0, sizeof *ctx); ctx->lc_tags = tags; - keys_init(ctx); - return 0; + return keys_init(ctx); } EXPORT_SYMBOL(lu_context_init); diff --git a/lustre/ptlrpc/service.c b/lustre/ptlrpc/service.c index 928f988..6dda606 100644 --- a/lustre/ptlrpc/service.c +++ b/lustre/ptlrpc/service.c @@ -520,6 +520,26 @@ static void ptlrpc_update_export_timer(struct obd_export *exp, long extra_delay) EXIT; } +#ifndef __KERNEL__ +int lu_context_init(struct lu_context *ctx, __u32 tags) +{ + return 0; +} + +void lu_context_fini(struct lu_context *ctx) +{ +} + +void lu_context_enter(struct lu_context *ctx) +{ +} + +void lu_context_exit(struct lu_context *ctx) +{ +} + +#endif + static int ptlrpc_server_handle_request(struct ptlrpc_service *svc, struct ptlrpc_thread *thread) @@ -604,6 +624,14 @@ ptlrpc_server_handle_request(struct ptlrpc_service *svc, goto out; } + rc = lu_context_init(&request->rq_session, LCT_SESSION); + if (rc) { + CERROR("Failure to initialize session: %d\n", rc); + goto out; + } + request->rq_session.lc_thread = thread; + lu_context_enter(&request->rq_session); + CDEBUG(D_NET, "got req "LPD64"\n", request->rq_xid); request->rq_svc_thread = thread; @@ -676,6 +704,9 @@ put_conn: class_export_put(request->rq_export); out: + lu_context_exit(&request->rq_session); + lu_context_fini(&request->rq_session); + do_gettimeofday(&work_end); timediff = cfs_timeval_sub(&work_end, &work_start, NULL); -- 1.8.3.1