einfo->ei_res_id = resid;
rc = dt_object_lock(env, obj, lh, einfo, policy);
+ /* for regular checks LFSCK doesn't use LDLM locking,
+ * so the state isn't coherent. here we just took LDLM
+ * lock for coherency and it's time to invalidate
+ * previous state */
+ if (rc == ELDLM_OK)
+ dt_invalidate(env, obj);
} else {
- rc = ldlm_cli_enqueue_local(lfsck->li_namespace, resid,
+ rc = ldlm_cli_enqueue_local(env, lfsck->li_namespace, resid,
LDLM_IBITS, policy, mode,
&flags, ldlm_blocking_ast,
ldlm_completion_ast, NULL, NULL,
}
/**
+ * Request the remote LOOKUP lock for the given object.
+ *
+ * If \a pobj is remote, the LOOKUP lock of \a obj is on the MDT where
+ * \a pobj is, acquire LOOKUP lock there.
+ *
+ * \param[in] env pointer to the thread context
+ * \param[in] lfsck pointer to the lfsck instance
+ * \param[in] pobj pointer to parent dt_object
+ * \param[in] obj pointer to the dt_object to be locked
+ * \param[out] lh pointer to the lock handle
+ * \param[in] mode the mode for the ldlm lock to be acquired
+ *
+ * \retval 0 for success
+ * \retval negative error number on failure
+ */
+int lfsck_remote_lookup_lock(const struct lu_env *env,
+ struct lfsck_instance *lfsck,
+ struct dt_object *pobj, struct dt_object *obj,
+ struct lustre_handle *lh, enum ldlm_mode mode)
+{
+ struct ldlm_res_id *resid = &lfsck_env_info(env)->lti_resid;
+
+ LASSERT(!lustre_handle_is_used(lh));
+
+ fid_build_reg_res_name(lfsck_dto2fid(obj), resid);
+ return __lfsck_ibits_lock(env, lfsck, pobj, resid, lh,
+ MDS_INODELOCK_LOOKUP, mode);
+}
+
+/**
* Release the the specified ibits lock.
*
* If the lock has been acquired before, release it
/* 3b. insert dot into child dir */
rec->rec_fid = cfid;
rc = dt_insert(env, child, (const struct dt_rec *)rec,
- (const struct dt_key *)dot, th, 1);
+ (const struct dt_key *)dot, th);
if (rc != 0)
GOTO(unlock, rc);
/* 4b. insert dotdot into child dir */
rec->rec_fid = &LU_LPF_FID;
rc = dt_insert(env, child, (const struct dt_rec *)rec,
- (const struct dt_key *)dotdot, th, 1);
+ (const struct dt_key *)dotdot, th);
if (rc != 0)
GOTO(unlock, rc);
/* 6b. insert name into parent dir */
rec->rec_fid = cfid;
rc = dt_insert(env, parent, (const struct dt_rec *)rec,
- (const struct dt_key *)name, th, 1);
+ (const struct dt_key *)name, th);
if (rc != 0)
GOTO(stop, rc);
rec->rec_type = S_IFDIR;
rec->rec_fid = cfid;
rc = dt_insert(env, child, (const struct dt_rec *)rec,
- (const struct dt_key *)dot, th, 1);
+ (const struct dt_key *)dot, th);
if (rc != 0)
GOTO(unlock, rc);
/* 4b. insert dotdot into child dir */
rec->rec_fid = &LU_LPF_FID;
rc = dt_insert(env, child, (const struct dt_rec *)rec,
- (const struct dt_key *)dotdot, th, 1);
+ (const struct dt_key *)dotdot, th);
if (rc != 0)
GOTO(unlock, rc);
/* 5b. insert name into parent dir */
rc = dt_insert(env, parent, (const struct dt_rec *)rec,
- (const struct dt_key *)name, th, 1);
+ (const struct dt_key *)name, th);
if (rc != 0)
GOTO(stop, rc);
bool dirty = false;
if (limit != LFSCK_SPEED_NO_LIMIT) {
- if (limit > msecs_to_jiffies(MSEC_PER_SEC)) {
- lfsck->li_sleep_rate = limit /
- msecs_to_jiffies(MSEC_PER_SEC);
+ if (limit > cfs_time_seconds(1)) {
+ lfsck->li_sleep_rate = limit / cfs_time_seconds(1);
lfsck->li_sleep_jif = 1;
} else {
lfsck->li_sleep_rate = 1;
- lfsck->li_sleep_jif = msecs_to_jiffies(MSEC_PER_SEC) /
- limit;
+ lfsck->li_sleep_jif = cfs_time_seconds(1) / limit;
}
} else {
lfsck->li_sleep_jif = 0;
ltd->ltd_index, lad->lad_name, rc);
lfsck_tgt_put(ltd);
} else {
- rc = ptlrpc_set_wait(set);
+ rc = ptlrpc_set_wait(env, set);
}
ptlrpc_set_destroy(set);
goto again;
}
- rc = ptlrpc_set_wait(set);
+ rc = ptlrpc_set_wait(env, set);
ptlrpc_set_destroy(set);
RETURN(rc);
lad->lad_assistant_status = 0;
lad->lad_post_result = 0;
- lad->lad_to_post = 0;
- lad->lad_to_double_scan = 0;
- lad->lad_in_double_scan = 0;
- lad->lad_exit = 0;
+ lad->lad_flags = 0;
lad->lad_advance_lock = false;
thread_set_flags(athread, 0);
lad->lad_post_result = *result;
if (*result <= 0)
- lad->lad_exit = 1;
- lad->lad_to_post = 1;
+ set_bit(LAD_EXIT, &lad->lad_flags);
+ set_bit(LAD_TO_POST, &lad->lad_flags);
CDEBUG(D_LFSCK, "%s: waiting for assistant to do %s post, rc = %d\n",
lfsck_lfsck2name(com->lc_lfsck), lad->lad_name, *result);
struct l_wait_info lwi = { 0 };
if (status != LS_SCANNING_PHASE2)
- lad->lad_exit = 1;
+ set_bit(LAD_EXIT, &lad->lad_flags);
else
- lad->lad_to_double_scan = 1;
+ set_bit(LAD_TO_DOUBLE_SCAN, &lad->lad_flags);
CDEBUG(D_LFSCK, "%s: waiting for assistant to do %s double_scan, "
"status %d\n",
wake_up_all(&athread->t_ctl_waitq);
l_wait_event(mthread->t_ctl_waitq,
- lad->lad_in_double_scan ||
+ test_bit(LAD_IN_DOUBLE_SCAN, &lad->lad_flags) ||
thread_is_stopped(athread),
&lwi);
struct ptlrpc_thread *athread = &lad->lad_thread;
struct l_wait_info lwi = { 0 };
- lad->lad_exit = 1;
+ set_bit(LAD_EXIT, &lad->lad_flags);
wake_up_all(&athread->t_ctl_waitq);
l_wait_event(mthread->t_ctl_waitq,
thread_is_init(athread) ||
RETURN(PTR_ERR(obj));
rc = obj->do_ops->do_index_try(env, obj, ft);
- if (rc)
+ if (rc) {
lfsck_object_put(env, obj);
- else
+ CDEBUG(D_LFSCK, "%s: LFSCK fail to load "
+ "sub trace file %s: rc = %d\n",
+ lfsck_lfsck2name(com->lc_lfsck), name, rc);
+ } else {
*child = obj;
+ }
RETURN(rc);
}
}
/* external interfaces */
-
-int lfsck_get_speed(struct seq_file *m, struct dt_device *key)
+int lfsck_get_speed(char *buf, struct dt_device *key)
{
struct lu_env env;
struct lfsck_instance *lfsck;
RETURN(rc);
lfsck = lfsck_instance_find(key, true, false);
- if (likely(lfsck != NULL)) {
- seq_printf(m, "%u\n", lfsck->li_bookmark_ram.lb_speed_limit);
+ if (lfsck && buf) {
+ rc = sprintf(buf, "%u\n",
+ lfsck->li_bookmark_ram.lb_speed_limit);
lfsck_instance_put(&env, lfsck);
} else {
rc = -ENXIO;
}
EXPORT_SYMBOL(lfsck_set_speed);
-int lfsck_get_windows(struct seq_file *m, struct dt_device *key)
+int lfsck_get_windows(char *buf, struct dt_device *key)
{
struct lu_env env;
struct lfsck_instance *lfsck;
lfsck = lfsck_instance_find(key, true, false);
if (likely(lfsck != NULL)) {
- seq_printf(m, "%u\n", lfsck->li_bookmark_ram.lb_async_windows);
+ rc = sprintf(buf, "%u\n",
+ lfsck->li_bookmark_ram.lb_async_windows);
lfsck_instance_put(&env, lfsck);
} else {
rc = -ENXIO;
}
EXPORT_SYMBOL(lfsck_get_windows);
-int lfsck_set_windows(struct dt_device *key, int val)
+int lfsck_set_windows(struct dt_device *key, unsigned int val)
{
struct lu_env env;
struct lfsck_instance *lfsck;
}
up_read(<ds->ltd_rw_sem);
- rc = ptlrpc_set_wait(set);
+ rc = ptlrpc_set_wait(env, set);
ptlrpc_set_destroy(set);
if (rc == 0)
RETURN(rc);
}
- rc = ptlrpc_set_wait(set);
+ rc = ptlrpc_set_wait(env, set);
ptlrpc_set_destroy(set);
if (rc == 0)
if (unlikely(rc == -EINPROGRESS)) {
retry = true;
set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(msecs_to_jiffies(MSEC_PER_SEC));
+ schedule_timeout(cfs_time_seconds(1));
set_current_state(TASK_RUNNING);
if (!signal_pending(current) &&
thread_is_running(&lfsck->li_thread))
thread_set_flags(thread, SVC_STOPPING);
+ LASSERT(lfsck->li_task != NULL);
+ force_sig(SIGINT, lfsck->li_task);
+
if (lfsck->li_master) {
struct lfsck_component *com;
struct lfsck_assistant_data *lad;