}
-static int mdt_finish_open(struct mdt_thread_info *info,
- struct mdt_object *p, struct mdt_object *o,
- __u64 flags, int created, struct ldlm_reply *rep)
+int mdt_finish_open(struct mdt_thread_info *info,
+ struct mdt_object *p, struct mdt_object *o,
+ __u64 flags, int created, struct ldlm_reply *rep)
{
struct ptlrpc_request *req = mdt_info_req(info);
struct obd_export *exp = req->rq_export;
LASSERT(ergo(rc < 0, lustre_msg_get_transno(req->rq_repmsg) == 0));
}
-static int mdt_open_by_fid(struct mdt_thread_info* info,
- struct ldlm_reply *rep)
+int mdt_open_by_fid(struct mdt_thread_info* info,
+ struct ldlm_reply *rep)
{
const struct lu_env *env = info->mti_env;
__u32 flags = info->mti_spec.sp_cr_flags;
RETURN(rc);
}
-static int mdt_open_anon_by_fid(struct mdt_thread_info *info,
- struct ldlm_reply *rep,
- struct mdt_lock_handle *lhc)
+int mdt_open_anon_by_fid(struct mdt_thread_info *info,
+ struct ldlm_reply *rep,
+ struct mdt_lock_handle *lhc)
{
const struct lu_env *env = info->mti_env;
struct mdt_device *mdt = info->mti_mdt;
}
/* Cross-ref request. Currently it can only be a pure open (w/o create) */
-static int mdt_cross_open(struct mdt_thread_info* info,
- const struct lu_fid *fid,
- struct ldlm_reply *rep, __u32 flags)
+int mdt_cross_open(struct mdt_thread_info* info,
+ const struct lu_fid *fid,
+ struct ldlm_reply *rep, __u32 flags)
{
struct md_attr *ma = &info->mti_attr;
struct mdt_object *o;
#ifdef WITH_GROUP_INFO
cfs_group_info_t *ginfo = NULL;
#endif
- struct lu_env env;
+ struct lu_env *env;
int counter = 0, rc = 0;
ENTRY;
goto out;
}
- rc = lu_context_init(&env.le_ctx,
+ OBD_ALLOC_PTR(env);
+ if (env == NULL) {
+ rc = -ENOMEM;
+ goto out_srv_fini;
+ }
+
+ rc = lu_context_init(&env->le_ctx,
svc->srv_ctx_tags|LCT_REMEMBER|LCT_NOREF);
if (rc)
goto out_srv_fini;
- thread->t_env = &env;
- env.le_ctx.lc_thread = thread;
- env.le_ctx.lc_cookie = 0x6;
+ thread->t_env = env;
+ env->le_ctx.lc_thread = thread;
+ env->le_ctx.lc_cookie = 0x6;
/* Alloc reply state structure for this one */
OBD_ALLOC_LARGE(rs, svc->srv_max_reply_size);
ptlrpc_at_check_timed(svc);
if (ptlrpc_server_request_pending(svc, 0)) {
- lu_context_enter(&env.le_ctx);
+ lu_context_enter(&env->le_ctx);
ptlrpc_server_handle_request(svc, thread);
- lu_context_exit(&env.le_ctx);
+ lu_context_exit(&env->le_ctx);
}
if (ptlrpc_rqbd_pending(svc) &&
if (svc->srv_done != NULL)
svc->srv_done(thread);
- lu_context_fini(&env.le_ctx);
+ if (env != NULL) {
+ lu_context_fini(&env->le_ctx);
+ OBD_FREE_PTR(env);
+ }
out:
CDEBUG(D_RPCTRACE, "service thread [ %p : %u ] %d exiting: rc %d\n",
thread, thread->t_pid, thread->t_id, rc);