struct lfsck_component {
/* into lfsck_instance::li_list_(scan,double_scan,idle} */
- cfs_list_t lc_link;
+ struct list_head lc_link;
/* into lfsck_instance::li_list_dir */
- cfs_list_t lc_link_dir;
+ struct list_head lc_link_dir;
struct rw_semaphore lc_sem;
atomic_t lc_ref;
spinlock_t li_lock;
/* Link into the lfsck_instance_list. */
- cfs_list_t li_link;
+ struct list_head li_link;
/* For the components in (first) scanning via otable-based iteration. */
- cfs_list_t li_list_scan;
+ struct list_head li_list_scan;
/* For the components in scanning via directory traversal. Because
* directory traversal cannot guarantee all the object be scanned,
* so the component in the li_list_dir must be in li_list_scan. */
- cfs_list_t li_list_dir;
+ struct list_head li_list_dir;
/* For the components in double scanning. */
- cfs_list_t li_list_double_scan;
+ struct list_head li_list_double_scan;
/* For the components those are not scanning now. */
- cfs_list_t li_list_idle;
+ struct list_head li_list_idle;
atomic_t li_ref;
atomic_t li_double_scan_count;
struct lu_orphan_rec lti_rec;
struct lov_user_md lti_lum;
struct dt_insert_rec lti_dt_rec;
+ struct lu_object_conf lti_conf;
};
/* lfsck_lib.c */
bool __lfsck_set_speed(struct lfsck_instance *lfsck, __u32 limit);
void lfsck_control_speed(struct lfsck_instance *lfsck);
void lfsck_control_speed_by_self(struct lfsck_component *com);
-int lfsck_reset(const struct lu_env *env, struct lfsck_instance *lfsck,
- bool init);
struct lfsck_thread_args *lfsck_thread_args_init(struct lfsck_instance *lfsck,
struct lfsck_component *com,
struct lfsck_start_param *lsp);
void lfsck_thread_args_fini(struct lfsck_thread_args *lta);
-void lfsck_fail(const struct lu_env *env, struct lfsck_instance *lfsck,
- bool new_checked);
-int lfsck_checkpoint(const struct lu_env *env, struct lfsck_instance *lfsck);
-int lfsck_prep(const struct lu_env *env, struct lfsck_instance *lfsck,
- struct lfsck_start_param *lsp);
-int lfsck_exec_oit(const struct lu_env *env, struct lfsck_instance *lfsck,
- struct dt_object *obj);
-int lfsck_exec_dir(const struct lu_env *env, struct lfsck_instance *lfsck,
- struct dt_object *obj, struct lu_dirent *ent);
-int lfsck_post(const struct lu_env *env, struct lfsck_instance *lfsck,
- int result);
-int lfsck_double_scan(const struct lu_env *env, struct lfsck_instance *lfsck);
-void lfsck_quit(const struct lu_env *env, struct lfsck_instance *lfsck);
int lfsck_async_request(const struct lu_env *env, struct obd_export *exp,
struct lfsck_request *lr,
struct ptlrpc_request_set *set,
return lname;
}
+static inline void
+lfsck_buf_init(struct lu_buf *buf, void *area, ssize_t len)
+{
+ buf->lb_buf = area;
+ buf->lb_len = len;
+}
+
static inline struct lu_buf *
lfsck_buf_get(const struct lu_env *env, void *area, ssize_t len)
{
return !!test_bit(LU_OBJECT_HEARD_BANSHEE, &loh->loh_flags);
}
-static inline struct dt_object *lfsck_object_find(const struct lu_env *env,
- struct lfsck_instance *lfsck,
- const struct lu_fid *fid)
-{
- return lu2dt(lu_object_find_slice(env, dt2lu_dev(lfsck->li_next),
- fid, NULL));
-}
-
static inline struct dt_object *lfsck_object_get(struct dt_object *obj)
{
lu_object_get(&obj->do_lu);
}
static inline struct dt_object *
+lfsck_object_find_by_dev_nowait(const struct lu_env *env, struct dt_device *dev,
+ const struct lu_fid *fid)
+{
+ struct lu_object_conf *conf = &lfsck_env_info(env)->lti_conf;
+ struct dt_object *obj;
+
+ conf->loc_flags = LOC_F_NOWAIT;
+ obj = lu2dt(lu_object_find_slice(env, dt2lu_dev(dev), fid, conf));
+ if (unlikely(obj == NULL))
+ return ERR_PTR(-ENOENT);
+
+ return obj;
+}
+
+static inline struct dt_object *
lfsck_object_find_by_dev(const struct lu_env *env, struct dt_device *dev,
const struct lu_fid *fid)
{
return obj;
}
+static inline struct dt_object *lfsck_object_find(const struct lu_env *env,
+ struct lfsck_instance *lfsck,
+ const struct lu_fid *fid)
+{
+ return lfsck_object_find_by_dev(env, lfsck->li_next, fid);
+}
+
static inline struct lfsck_tgt_desc *lfsck_tgt_get(struct lfsck_tgt_descs *ltds,
__u32 index)
{