*/
/* valid flags */
enum la_valid {
- /*mapped ATTR flag*/
LA_ATIME = 1 << 0,
LA_MTIME = 1 << 1,
LA_CTIME = 1 << 2,
*/
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
};
/*
#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
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;
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 *
#endif
};
-struct lu_context;
struct ptlrpc_thread {
struct list_head t_link; /* active threads for service, from svc->srv_threads */
* 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);
}
{
memset(ctx, 0, sizeof *ctx);
ctx->lc_tags = tags;
- keys_init(ctx);
- return 0;
+ return keys_init(ctx);
}
EXPORT_SYMBOL(lu_context_init);
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)
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;
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);