__u64 llsd_touch_gen;
struct dt_object *llsd_rb_obj;
struct rb_root llsd_rb_root;
- rwlock_t llsd_rb_lock;
+ struct rw_semaphore llsd_rb_rwsem;
unsigned int llsd_rbtree_valid:1;
};
int rc = 0;
ENTRY;
- if (!lad->lad_incomplete)
+ if (!test_bit(LAD_INCOMPLETE, &lad->lad_flags))
RETURN_EXIT;
/* If the MDT has ever failed to verfiy some OST-objects,
}
#endif
- if (lov_pattern(pattern) != LOV_PATTERN_RAID0) {
+ if (!lov_pattern_supported_normal_comp(lov_pattern(pattern))) {
CDEBUG(D_LFSCK, "Unsupported LOV EA pattern %u for the file "
DFID" in the component %x\n",
pattern, PFID(lfsck_dto2fid(obj)), comp_id);
return 0;
}
+static int lfsck_layout_verify_header_foreign(struct dt_object *obj,
+ struct lov_foreign_md *lfm,
+ size_t len)
+{
+ /* magic has been verified already */
+ __u32 value_len = le32_to_cpu(lfm->lfm_length);
+ /* type and flags are not checked for instance */
+
+ CDEBUG(D_INFO, "foreign LOV EA, magic %x, len %u, type %x, flags %x, for file "DFID"\n",
+ le32_to_cpu(lfm->lfm_magic), value_len,
+ le32_to_cpu(lfm->lfm_type), le32_to_cpu(lfm->lfm_flags),
+ PFID(lfsck_dto2fid(obj)));
+
+ if (len != value_len + offsetof(typeof(*lfm), lfm_value))
+ CDEBUG(D_LFSCK, "foreign LOV EA internal size %u does not match EA full size %zu for file "DFID"\n",
+ value_len, len, PFID(lfsck_dto2fid(obj)));
+
+ /* nothing to repair */
+ return -ENODATA;
+}
+
static int lfsck_layout_verify_header(struct dt_object *obj,
- struct lov_mds_md_v1 *lmm)
+ struct lov_mds_md_v1 *lmm, size_t len)
{
int rc = 0;
le32_to_cpu(lcme->lcme_offset)), start,
comp_id);
}
+ } else if (le32_to_cpu(lmm->lmm_magic) == LOV_MAGIC_FOREIGN) {
+ rc = lfsck_layout_verify_header_foreign(obj,
+ (struct lov_foreign_md *)lmm,
+ len);
} else {
rc = lfsck_layout_verify_header_v1v3(obj, lmm, 1, 0);
}
goto again;
}
- rc1 = lfsck_layout_verify_header(obj, buf->lb_buf);
+ rc1 = lfsck_layout_verify_header(obj, buf->lb_buf, rc);
return rc1 ? rc1 : rc;
}
return lrn;
}
-extern const struct dt_index_operations lfsck_orphan_index_ops;
+static const struct dt_index_operations lfsck_orphan_index_ops;
static int lfsck_rbtree_setup(const struct lu_env *env,
struct lfsck_component *com)
lfsck->li_bottom->dd_record_fid_accessed = 0;
/* Invalid the rbtree, then no others will use it. */
- write_lock(&llsd->llsd_rb_lock);
+ down_write(&llsd->llsd_rb_rwsem);
llsd->llsd_rbtree_valid = 0;
- write_unlock(&llsd->llsd_rb_lock);
+ up_write(&llsd->llsd_rb_rwsem);
while (node != NULL) {
next = rb_next(node);
if (!fid_is_idif(fid) && !fid_is_norm(fid))
RETURN_EXIT;
- read_lock(&llsd->llsd_rb_lock);
+ down_read(&llsd->llsd_rb_rwsem);
if (!llsd->llsd_rbtree_valid)
GOTO(unlock, rc = 0);
LASSERT(!insert);
- read_unlock(&llsd->llsd_rb_lock);
+ up_read(&llsd->llsd_rb_rwsem);
tmp = lfsck_rbtree_new(env, fid);
if (IS_ERR(tmp))
GOTO(out, rc = PTR_ERR(tmp));
insert = true;
- write_lock(&llsd->llsd_rb_lock);
+ down_write(&llsd->llsd_rb_rwsem);
if (!llsd->llsd_rbtree_valid) {
lfsck_rbtree_free(tmp);
GOTO(unlock, rc = 0);
unlock:
if (insert)
- write_unlock(&llsd->llsd_rb_lock);
+ up_write(&llsd->llsd_rb_rwsem);
else
- read_unlock(&llsd->llsd_rb_lock);
+ up_read(&llsd->llsd_rb_rwsem);
out:
if (rc != 0 && accessed) {
struct lfsck_layout *lo = com->lc_file_ram;
}
if (lo->ll_bitmap_size == 0) {
- lad->lad_incomplete = 0;
+ clear_bit(LAD_INCOMPLETE, &lad->lad_flags);
CFS_RESET_BITMAP(bitmap);
RETURN(0);
RETURN(rc >= 0 ? -EINVAL : rc);
if (cfs_bitmap_check_empty(bitmap))
- lad->lad_incomplete = 0;
+ clear_bit(LAD_INCOMPLETE, &lad->lad_flags);
else
- lad->lad_incomplete = 1;
+ set_bit(LAD_INCOMPLETE, &lad->lad_flags);
RETURN(0);
}
loa = &lfsck_env_info(env)->lti_loa;
rc = dt_xattr_get(env, obj, lfsck_buf_get(env, loa, sizeof(*loa)),
XATTR_NAME_LMA);
- if (rc >= sizeof(struct lustre_mdt_attrs)) {
+ if (rc >= (int)sizeof(struct lustre_mdt_attrs)) {
lustre_lma_swab(&loa->loa_lma);
return loa->loa_lma.lma_compat & LMAC_FID_ON_OST ? 1 : 0;
if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_DELAY4) &&
cfs_fail_val > 0) {
- struct l_wait_info lwi = LWI_TIMEOUT(
- cfs_time_seconds(cfs_fail_val),
- NULL, NULL);
-
- /* Some others may changed the cfs_fail_val
- * as zero after above check, re-check it for
- * sure to avoid falling into wait for ever. */
- if (likely(lwi.lwi_timeout > 0)) {
- struct ptlrpc_thread *thread =
- &lfsck->li_thread;
-
- up_write(&com->lc_sem);
- l_wait_event(thread->t_ctl_waitq,
- !thread_is_running(thread),
- &lwi);
- down_write(&com->lc_sem);
- }
+ struct ptlrpc_thread *thread =
+ &lfsck->li_thread;
+
+ up_write(&com->lc_sem);
+ wait_event_idle_timeout(
+ thread->t_ctl_waitq,
+ !thread_is_running(thread),
+ cfs_time_seconds(cfs_fail_val));
+ down_write(&com->lc_sem);
}
}
if (lfsck->li_master) {
struct lfsck_assistant_data *lad = com->lc_data;
- if (lad->lad_incomplete)
+ if (test_bit(LAD_INCOMPLETE, &lad->lad_flags))
lo->ll_status = LS_PARTIAL;
else
lo->ll_status = LS_COMPLETED;
GOTO(unlock, rc);
rc = dt_insert(env, obj, (const struct dt_rec *)rec,
- (const struct dt_key *)key, th, 1);
+ (const struct dt_key *)key, th);
GOTO(unlock, rc);
int rc = 0;
ENTRY;
+ if (lfsck_is_dryrun(lfsck))
+ GOTO(log, rc = 0);
+
if (unlikely(lpf == NULL))
GOTO(log, rc = -ENXIO);
GOTO(stop, rc);
rc = dt_insert(env, lpf, (const struct dt_rec *)dtrec,
- (const struct dt_key *)name, th, 1);
+ (const struct dt_key *)name, th);
if (rc != 0)
GOTO(stop, rc);
if (rc != 0 && rc != -ENOENT)
GOTO(unlock, rc);
+ if (lfsck_is_dryrun(com->lc_lfsck))
+ GOTO(unlock, rc = 0);
+
th = dt_trans_create(env, dev);
if (IS_ERR(th))
GOTO(unlock, rc = PTR_ERR(th));
bool new_mirror = true;
ENTRY;
+ if (lfsck_is_dryrun(lfsck))
+ RETURN(0);
+
rc = lfsck_ibits_lock(env, lfsck, parent, &lh,
MDS_INODELOCK_LAYOUT | MDS_INODELOCK_XATTR,
LCK_EX);
}
lmm = buf->lb_buf;
- rc1 = lfsck_layout_verify_header(parent, lmm);
+ rc1 = lfsck_layout_verify_header(parent, lmm, lovea_size);
/* If the LOV EA crashed, the rebuild it. */
if (rc1 == -EINVAL) {
__u16 mirror_id0 = mirror_id_of(ol->ol_comp_id);
__u16 mirror_id1;
+ if (bk->lb_param & LPF_DRYRUN)
+ GOTO(unlock_parent, rc = 1);
+
lcm = buf->lb_buf;
count = le16_to_cpu(lcm->lcm_entry_count);
for (i = 0; i < count; pos = ++i) {
struct dt_device *dev = lfsck_obj2dev(child);
struct thandle *handle;
int rc;
+ dt_obj_version_t version;
ENTRY;
tla->la_uid = pla->la_uid;
if (unlikely(lfsck_is_dead_obj(parent)))
GOTO(unlock, rc = 1);
+ version = dt_version_get(env, child);
+ if (version == -EOPNOTSUPP)
+ version = 0;
+
/* Get the latest parent's owner. */
rc = dt_attr_get(env, parent, pla);
if (rc != 0)
GOTO(unlock, rc);
/* Some others chown/chgrp during the LFSCK, needs to do nothing. */
- if (unlikely(tla->la_uid != pla->la_uid ||
- tla->la_gid != pla->la_gid))
+ if (unlikely((!version && tla->la_ctime == 0) ||
+ tla->la_uid != pla->la_uid || tla->la_gid != pla->la_gid))
rc = 1;
else
rc = dt_attr_set(env, child, tla, handle);
return rc;
}
+#define CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid, msg) \
+ CDEBUG(D_LFSCK, "%s:("DFID"|"DFID")/"DFID":XATTR %s: %s\n", \
+ lfsck_lfsck2name(lfsck), PFID(&lso->lso_fid), PFID(pfid), \
+ PFID(cfid), XATTR_NAME_FID, msg);
+
/* Check whether the OST-object correctly back points to the
* MDT-object (@parent) via the XATTR_NAME_FID xattr (@pfid). */
static int lfsck_layout_check_parent(const struct lu_env *env,
struct lov_mds_md_v1 *lmm;
struct lov_ost_data_v1 *objs;
struct lustre_handle lh = { 0 };
+ struct lfsck_instance *lfsck = com->lc_lfsck;
int rc;
int i;
__u32 magic;
idx = pfid->f_stripe_idx;
pfid->f_ver = 0;
- if (unlikely(!fid_is_sane(pfid)))
+ if (unlikely(!fid_is_sane(pfid))) {
+ CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+ "the parent FID is invalid");
+
RETURN(LLIT_UNMATCHED_PAIR);
+ }
if (lu_fid_eq(pfid, &lso->lso_fid)) {
if (likely(llr->llr_lov_idx == idx))
RETURN(0);
+ CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+ "the stripe index is unmatched");
+
RETURN(LLIT_UNMATCHED_PAIR);
}
if (IS_ERR(tobj))
RETURN(PTR_ERR(tobj));
- if (dt_object_exists(tobj) == 0 || lfsck_is_dead_obj(tobj) ||
- !S_ISREG(lfsck_object_type(tobj)))
+ if (dt_object_exists(tobj) == 0) {
+ CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+ "the parent is nonexistent");
+
GOTO(out, rc = LLIT_UNMATCHED_PAIR);
+ }
+
+ if (lfsck_is_dead_obj(tobj)) {
+ CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+ "the parent is dead object");
+
+ GOTO(out, rc = LLIT_UNMATCHED_PAIR);
+ }
+
+ if (!S_ISREG(lfsck_object_type(tobj))) {
+ CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+ "the parent is not a regular file");
+
+ GOTO(out, rc = LLIT_UNMATCHED_PAIR);
+ }
/* Load the tobj's layout EA, in spite of it is a local MDT-object or
* remote one on another MDT. Then check whether the given OST-object
* is in such layout. If yes, it is multiple referenced, otherwise it
* is unmatched referenced case. */
rc = lfsck_layout_get_lovea(env, tobj, buf);
- if (rc == 0 || rc == -ENODATA || rc == -ENOENT)
+ if (rc == 0 || rc == -ENODATA || rc == -ENOENT) {
+ CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+ "the parent has no stripe data");
+
GOTO(out, rc = LLIT_UNMATCHED_PAIR);
+ }
if (unlikely(rc == -EOPNOTSUPP))
GOTO(out, rc = LLIT_NONE);
struct lov_comp_md_v1 *lcm = buf->lb_buf;
struct lov_comp_md_entry_v1 *lcme;
- if (ff->ff_layout.ol_comp_id == 0)
+ if (ff->ff_layout.ol_comp_id == 0) {
+ CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+ "the parent has incorrect comp_id");
+
GOTO(out, rc = LLIT_UNMATCHED_PAIR);
+ }
count = le16_to_cpu(lcm->lcm_entry_count);
for (i = 0; i < count; i++) {
le32_to_cpu(lcme->lcme_offset);
magic = le32_to_cpu(lmm->lmm_magic);
if (!(le32_to_cpu(lcme->lcme_flags) &
- LCME_FL_INIT))
+ LCME_FL_INIT)) {
+ CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid,
+ cfid,
+ "the parent has uninitialized component");
+
GOTO(out, rc = LLIT_UNMATCHED_PAIR);
+ }
goto further;
}
}
+ CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+ "the parent has no matched comp_id");
+
GOTO(out, rc = LLIT_UNMATCHED_PAIR);
}
* after taken the lock. */
if (!dt_object_remote(tobj)) {
if (dt_object_exists(tobj) == 0 ||
- lfsck_is_dead_obj(tobj))
+ lfsck_is_dead_obj(tobj)) {
+ CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid,
+ cfid,
+ "the parent doesn't exist anymore after lock");
+
rc = LLIT_UNMATCHED_PAIR;
- else
+ } else {
rc = LLIT_MULTIPLE_REFERENCED;
+ }
GOTO(unlock, rc);
}
* has been been removed or not. */
rc = dt_xattr_get(env, tobj, &LU_BUF_NULL,
XATTR_NAME_DUMMY);
- if (unlikely(rc == -ENOENT || rc >= 0))
+ if (unlikely(rc == -ENOENT || rc >= 0)) {
+ CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+ "the parent is remote object and nonexistent after lock");
+
rc = LLIT_UNMATCHED_PAIR;
- else if (rc == -ENODATA)
+ } else if (rc == -ENODATA) {
rc = LLIT_MULTIPLE_REFERENCED;
+ }
GOTO(unlock, rc);
}
}
+ CDEBUG_UNMATCHED_PAIR(lfsck, lso, pfid, cfid,
+ "the parent has no matched stripe");
+
GOTO(out, rc = LLIT_UNMATCHED_PAIR);
unlock:
lfsck_buf_init(&buf, ff, sizeof(*ff));
rc = dt_xattr_get(env, child, &buf, XATTR_NAME_FID);
if (unlikely(rc > 0 && rc < sizeof(struct lu_fid))) {
+ CDEBUG(D_LFSCK, "%s:"DFID"/"DFID": "
+ "the child object's %s is corrupted\n",
+ lfsck_lfsck2name(lfsck), PFID(&lso->lso_fid),
+ PFID(lu_object_fid(&child->do_lu)),
+ XATTR_NAME_FID);
+
type = LLIT_UNMATCHED_PAIR;
goto repair;
}
if (rc < 0) {
struct lfsck_assistant_data *lad = com->lc_data;
- if (unlikely(lad->lad_exit)) {
+ if (unlikely(test_bit(LAD_EXIT, &lad->lad_flags))) {
rc = 0;
} else if (rc == -ENOTCONN || rc == -ESHUTDOWN ||
rc == -ETIMEDOUT || rc == -EHOSTDOWN ||
if (rc != 0 && bk->lb_param & LPF_FAILOUT)
RETURN(rc);
- if (unlikely(lad->lad_exit ||
+ if (unlikely(test_bit(LAD_EXIT, &lad->lad_flags) ||
!thread_is_running(&lfsck->li_thread)))
RETURN(0);
spin_lock(<ds->ltd_lock);
void *args, int rc)
{
struct lfsck_layout_slave_async_args *llsaa = args;
- struct obd_export *exp = llsaa->llsaa_exp;
- struct lfsck_component *com = llsaa->llsaa_com;
- struct lfsck_layout_slave_target *llst = llsaa->llsaa_llst;
- struct lfsck_layout_slave_data *llsd = com->lc_data;
- struct lfsck_reply *lr = NULL;
- bool done = false;
+ struct obd_export *exp = llsaa->llsaa_exp;
+ struct lfsck_component *com = llsaa->llsaa_com;
+ struct lfsck_layout_slave_target *llst = llsaa->llsaa_llst;
+ struct lfsck_layout_slave_data *llsd = com->lc_data;
+ struct lfsck_reply *lr = NULL;
+ bool done = false;
if (rc != 0) {
/* It is probably caused by network trouble, or target crash,
*tmp = *lr;
ptlrpc_request_set_replen(req);
- llsaa = ptlrpc_req_async_args(req);
+ llsaa = ptlrpc_req_async_args(llsaa, req);
llsaa->llsaa_exp = exp;
llsaa->llsaa_com = lfsck_component_get(com);
llsaa->llsaa_llst = llst;
if (com->lc_lfsck->li_master) {
struct lfsck_assistant_data *lad = com->lc_data;
- lad->lad_incomplete = 0;
+ clear_bit(LAD_INCOMPLETE, &lad->lad_flags);
CFS_RESET_BITMAP(lad->lad_bitmap);
}
if (rc == 0 && start != NULL && start->ls_flags & LPF_OST_ORPHAN) {
LASSERT(!llsd->llsd_rbtree_valid);
- write_lock(&llsd->llsd_rb_lock);
+ down_write(&llsd->llsd_rb_rwsem);
rc = lfsck_rbtree_setup(env, com);
- write_unlock(&llsd->llsd_rb_lock);
+ up_write(&llsd->llsd_rb_rwsem);
}
CDEBUG(D_LFSCK, "%s: layout LFSCK slave prep done, start pos ["
struct dt_object *parent,
struct lov_mds_md_v1 *lmm, __u32 comp_id)
{
- struct lfsck_thread_info *info = lfsck_env_info(env);
+ struct lfsck_thread_info *info = lfsck_env_info(env);
struct lfsck_instance *lfsck = com->lc_lfsck;
struct lfsck_bookmark *bk = &lfsck->li_bookmark_ram;
struct lfsck_layout *lo = com->lc_file_ram;
struct lfsck_tgt_descs *ltds = &lfsck->li_ost_descs;
struct ptlrpc_thread *mthread = &lfsck->li_thread;
struct ptlrpc_thread *athread = &lad->lad_thread;
- struct l_wait_info lwi = { 0 };
struct lu_buf buf;
int rc = 0;
int i;
if (unlikely(lovea_slot_is_dummy(objs)))
continue;
- l_wait_event(mthread->t_ctl_waitq,
- lad->lad_prefetched < bk->lb_async_windows ||
- !thread_is_running(mthread) ||
- thread_is_stopped(athread),
- &lwi);
+ wait_event_idle(mthread->t_ctl_waitq,
+ lad->lad_prefetched < bk->lb_async_windows ||
+ !thread_is_running(mthread) ||
+ thread_is_stopped(athread));
if (unlikely(!thread_is_running(mthread)) ||
thread_is_stopped(athread))
lmm = buf->lb_buf;
magic = le32_to_cpu(lmm->lmm_magic);
if (magic == LOV_MAGIC_COMP_V1) {
+ struct lov_mds_md_v1 *v1;
int i;
lcm = buf->lb_buf;
count = le16_to_cpu(lcm->lcm_entry_count);
for (i = 0; i < count; i++) {
lcme = &lcm->lcm_entries[i];
- lmm = buf->lb_buf + le32_to_cpu(lcme->lcme_offset);
- if (memcmp(oi, &lmm->lmm_oi, sizeof(*oi)) != 0)
+ v1 = buf->lb_buf + le32_to_cpu(lcme->lcme_offset);
+ if (memcmp(oi, &v1->lmm_oi, sizeof(*oi)) != 0)
goto fix;
}
if (IS_ERR(handle))
GOTO(out, rc = PTR_ERR(handle));
- lfsck_buf_init(&ea_buf, lmm, size);
+ lfsck_buf_init(&ea_buf, buf->lb_buf, size);
rc = dt_declare_xattr_set(env, obj, &ea_buf, XATTR_NAME_LOV,
LU_XATTR_REPLACE, handle);
if (rc != 0)
}
if (magic == LOV_MAGIC_COMP_V1) {
+ struct lov_mds_md_v1 *v1;
int i;
for (i = 0; i < count; i++) {
lcme = &lcm->lcm_entries[i];
- lmm = buf->lb_buf + le32_to_cpu(lcme->lcme_offset);
- lmm->lmm_oi = *oi;
+ v1 = buf->lb_buf + le32_to_cpu(lcme->lcme_offset);
+ v1->lmm_oi = *oi;
}
} else {
lmm->lmm_oi = *oi;
if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_DELAY5) &&
cfs_fail_val == lfsck_dev_idx(lfsck)) {
- struct l_wait_info lwi = LWI_TIMEOUT(cfs_time_seconds(1),
- NULL, NULL);
struct ptlrpc_thread *thread = &lfsck->li_thread;
- l_wait_event(thread->t_ctl_waitq,
- !thread_is_running(thread),
- &lwi);
+ wait_event_idle_timeout(thread->t_ctl_waitq,
+ !thread_is_running(thread),
+ cfs_time_seconds(1));
}
lfsck_rbtree_update_bitmap(env, com, fid, false);
"run_time_phase2: %lld seconds\n"
"average_speed_phase1: %llu items/sec\n"
"average_speed_phase2: N/A\n"
- "real-time_speed_phase1: %llu items/sec\n"
- "real-time_speed_phase2: N/A\n",
+ "real_time_speed_phase1: %llu items/sec\n"
+ "real_time_speed_phase2: N/A\n",
checked,
lo->ll_objs_checked_phase2,
rtime,
"run_time_phase2: %lld seconds\n"
"average_speed_phase1: %llu items/sec\n"
"average_speed_phase2: %llu items/sec\n"
- "real-time_speed_phase1: N/A\n"
- "real-time_speed_phase2: %llu items/sec\n"
+ "real_time_speed_phase1: N/A\n"
+ "real_time_speed_phase2: %llu items/sec\n"
"current_position: "DFID"\n",
lo->ll_objs_checked_phase1,
checked,
"run_time_phase2: %lld seconds\n"
"average_speed_phase1: %llu items/sec\n"
"average_speed_phase2: %llu objs/sec\n"
- "real-time_speed_phase1: N/A\n"
- "real-time_speed_phase2: N/A\n"
+ "real_time_speed_phase1: N/A\n"
+ "real_time_speed_phase2: N/A\n"
"current_position: N/A\n",
lo->ll_objs_checked_phase1,
lo->ll_objs_checked_phase2,
LFSCK_CHECKPOINT_INTERVAL;
while (1) {
- struct l_wait_info lwi = LWI_TIMEOUT(cfs_time_seconds(30),
- NULL, NULL);
-
rc = lfsck_layout_slave_query_master(env, com);
if (list_empty(&llsd->llsd_master_list)) {
if (unlikely(!thread_is_running(thread)))
if (rc < 0)
GOTO(done, rc);
- rc = l_wait_event(thread->t_ctl_waitq,
- !thread_is_running(thread) ||
- lo->ll_flags & LF_INCOMPLETE ||
- list_empty(&llsd->llsd_master_list),
- &lwi);
+ rc = wait_event_idle_timeout(
+ thread->t_ctl_waitq,
+ !thread_is_running(thread) ||
+ lo->ll_flags & LF_INCOMPLETE ||
+ list_empty(&llsd->llsd_master_list),
+ cfs_time_seconds(30));
if (unlikely(!thread_is_running(thread)))
GOTO(done, rc = 0);
if (lo->ll_flags & LF_INCOMPLETE)
GOTO(done, rc = 1);
- if (rc == -ETIMEDOUT)
+ if (rc == 0)
continue;
- GOTO(done, rc = (rc < 0 ? rc : 1));
+ GOTO(done, rc = 1);
}
done:
INIT_LIST_HEAD(&llsd->llsd_master_list);
spin_lock_init(&llsd->llsd_lock);
llsd->llsd_rb_root = RB_ROOT;
- rwlock_init(&llsd->llsd_rb_lock);
+ init_rwsem(&llsd->llsd_rb_rwsem);
com->lc_data = llsd;
}
com->lc_file_size = sizeof(*lo);
struct dt_object *dt,
const struct dt_rec *rec,
const struct dt_key *key,
- struct thandle *handle,
- int ignore_quota)
+ struct thandle *handle)
{
return -EOPNOTSUPP;
}
if (dev->dd_record_fid_accessed) {
/* The first iteration against the rbtree, scan the whole rbtree
* to remove the nodes which do NOT need to be handled. */
- write_lock(&llsd->llsd_rb_lock);
+ down_write(&llsd->llsd_rb_rwsem);
if (dev->dd_record_fid_accessed) {
struct rb_node *node;
struct rb_node *next;
node = next;
}
}
- write_unlock(&llsd->llsd_rb_lock);
+ up_write(&llsd->llsd_rb_rwsem);
}
/* read lock the rbtree when init, and unlock when fini */
- read_lock(&llsd->llsd_rb_lock);
+ down_read(&llsd->llsd_rb_rwsem);
it->loi_com = com;
com = NULL;
lfsck_lfsck2name(com->lc_lfsck));
llsd = com->lc_data;
- read_unlock(&llsd->llsd_rb_lock);
+ up_read(&llsd->llsd_rb_rwsem);
llst = it->loi_llst;
LASSERT(llst != NULL);
return 0;
}
-const struct dt_index_operations lfsck_orphan_index_ops = {
+static const struct dt_index_operations lfsck_orphan_index_ops = {
.dio_lookup = lfsck_orphan_index_lookup,
.dio_declare_insert = lfsck_orphan_index_declare_insert,
.dio_insert = lfsck_orphan_index_insert,