int request_sz;
ENTRY;
- cdt->cdt_thread.t_flags = SVC_RUNNING;
- wake_up(&cdt->cdt_thread.t_ctl_waitq);
+ cdt->cdt_flags = SVC_RUNNING;
+ wake_up(&cdt->cdt_waitq);
CDEBUG(D_HSM, "%s: coordinator thread starting, pid=%d\n",
mdt_obd_name(mdt), current_pid());
lwi = LWI_TIMEOUT(cfs_time_seconds(cdt->cdt_loop_period),
NULL, NULL);
- l_wait_event(cdt->cdt_thread.t_ctl_waitq,
- (cdt->cdt_thread.t_flags &
- (SVC_STOPPING|SVC_EVENT)),
+ l_wait_event(cdt->cdt_waitq,
+ cdt->cdt_flags & (SVC_STOPPING|SVC_EVENT),
&lwi);
CDEBUG(D_HSM, "coordinator resumes\n");
- if (cdt->cdt_thread.t_flags & SVC_STOPPING ||
+ if (cdt->cdt_flags & SVC_STOPPING ||
cdt->cdt_state == CDT_STOPPING) {
- cdt->cdt_thread.t_flags &= ~SVC_STOPPING;
+ cdt->cdt_flags &= ~SVC_STOPPING;
rc = 0;
break;
}
/* wake up before timeout, new work arrives */
- if (cdt->cdt_thread.t_flags & SVC_EVENT)
- cdt->cdt_thread.t_flags &= ~SVC_EVENT;
+ if (cdt->cdt_flags & SVC_EVENT)
+ cdt->cdt_flags &= ~SVC_EVENT;
/* if coordinator is suspended continue to wait */
if (cdt->cdt_state == CDT_DISABLE) {
* by mdt_stop_coordinator(), we have to ack
* and cdt cleaning will be done by event sender
*/
- cdt->cdt_thread.t_flags = SVC_STOPPED;
- wake_up(&cdt->cdt_thread.t_ctl_waitq);
+ cdt->cdt_flags = SVC_STOPPED;
+ wake_up(&cdt->cdt_waitq);
}
if (rc != 0)
RETURN(-ESRCH);
/* wake up coordinator */
- cdt->cdt_thread.t_flags = SVC_EVENT;
- wake_up(&cdt->cdt_thread.t_ctl_waitq);
+ cdt->cdt_flags = SVC_EVENT;
+ wake_up(&cdt->cdt_waitq);
RETURN(0);
}
cdt->cdt_state = CDT_STOPPED;
- init_waitqueue_head(&cdt->cdt_thread.t_ctl_waitq);
+ init_waitqueue_head(&cdt->cdt_waitq);
mutex_init(&cdt->cdt_llog_lock);
init_rwsem(&cdt->cdt_agent_lock);
init_rwsem(&cdt->cdt_request_lock);
" for registered restore: %d\n",
mdt_obd_name(mdt), rc);
+ if (mdt->mdt_bottom->dd_rdonly)
+ RETURN(0);
+
task = kthread_run(mdt_coordinator, cdt_mti, "hsm_cdtr");
if (IS_ERR(task)) {
rc = PTR_ERR(task);
rc = 0;
}
- wait_event(cdt->cdt_thread.t_ctl_waitq,
- (cdt->cdt_thread.t_flags & SVC_RUNNING));
+ wait_event(cdt->cdt_waitq,
+ (cdt->cdt_flags & SVC_RUNNING));
cdt->cdt_state = CDT_RUNNING;
mdt->mdt_opts.mo_coordinator = 1;
struct mdt_thread_info *cdt_mti;
ENTRY;
+ if (mdt->mdt_opts.mo_coordinator == 0)
+ RETURN(0);
+
if (cdt->cdt_state == CDT_STOPPED) {
CERROR("%s: Coordinator already stopped\n",
mdt_obd_name(mdt));
if (cdt->cdt_state != CDT_STOPPING) {
/* stop coordinator thread before cleaning */
- cdt->cdt_thread.t_flags = SVC_STOPPING;
- wake_up(&cdt->cdt_thread.t_ctl_waitq);
- wait_event(cdt->cdt_thread.t_ctl_waitq,
- cdt->cdt_thread.t_flags & SVC_STOPPED);
+ cdt->cdt_flags = SVC_STOPPING;
+ wake_up(&cdt->cdt_waitq);
+ wait_event(cdt->cdt_waitq,
+ cdt->cdt_flags & SVC_STOPPED);
}
cdt->cdt_state = CDT_STOPPED;
*/
static int hsm_cancel_all_actions(struct mdt_device *mdt)
{
+ struct lu_env env;
+ struct lu_context session;
struct mdt_thread_info *mti;
struct coordinator *cdt = &mdt->mdt_coordinator;
struct cdt_agent_req *car;
enum cdt_states save_state;
ENTRY;
- /* retrieve coordinator context */
- mti = lu_context_key_get(&cdt->cdt_env.le_ctx, &mdt_thread_key);
+ rc = lu_env_init(&env, LCT_MD_THREAD);
+ if (rc < 0)
+ RETURN(rc);
+
+ /* for mdt_ucred(), lu_ucred stored in lu_ucred_key */
+ rc = lu_context_init(&session, LCT_SERVER_SESSION);
+ if (rc < 0)
+ GOTO(out_env, rc);
+
+ lu_context_enter(&session);
+ env.le_ses = &session;
+
+ mti = lu_context_key_get(&env.le_ctx, &mdt_thread_key);
+ LASSERT(mti != NULL);
+
+ mti->mti_env = &env;
+ mti->mti_mdt = mdt;
+
+ hsm_init_ucred(mdt_ucred(mti));
/* disable coordinator */
save_state = cdt->cdt_state;
if (hal == NULL) {
mdt_cdt_put_request(car);
up_read(&cdt->cdt_request_lock);
- GOTO(out, rc = -ENOMEM);
+ GOTO(out_cdt_state, rc = -ENOMEM);
}
}
rc = cdt_llog_process(mti->mti_env, mti->mti_mdt,
mdt_cancel_all_cb, &hcad);
-out:
+out_cdt_state:
/* enable coordinator */
cdt->cdt_state = save_state;
+ lu_context_exit(&session);
+ lu_context_fini(&session);
+out_env:
+ lu_env_fini(&env);
RETURN(rc);
}