Whamcloud - gitweb
lu: add LCT_SESSION context tag for per-request data
authornikita <nikita>
Thu, 28 Sep 2006 13:53:22 +0000 (13:53 +0000)
committernikita <nikita>
Thu, 28 Sep 2006 13:53:22 +0000 (13:53 +0000)
lustre/include/lu_object.h
lustre/include/lustre_net.h
lustre/obdclass/lu_object.c
lustre/ptlrpc/service.c

index 8e77057..769d0d1 100644 (file)
@@ -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
 };
 
 /*
index 3c65717..cd94a41 100644 (file)
@@ -41,6 +41,7 @@
 #include <lustre_sec.h>
 #include <lustre_import.h>
 #include <lprocfs_status.h>
+#include <lu_object.h>
 
 /* 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 */
index 2f5789c..0d1a793 100644 (file)
@@ -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);
 
index 928f988..6dda606 100644 (file)
@@ -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);