X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Flfsck%2Flfsck_internal.h;h=f9bd20edb7b9ef73d9a675d9d6aac0ad928a5236;hb=53380e03668325423d6ffb80f3a955ad3a16d21a;hp=24b84aec72cb4f4ae209d9ee19328eee571f88e7;hpb=cb22837bcded8f95461c0d4760b2b9add0956e71;p=fs%2Flustre-release.git diff --git a/lustre/lfsck/lfsck_internal.h b/lustre/lfsck/lfsck_internal.h index 24b84ae..f9bd20e 100644 --- a/lustre/lfsck/lfsck_internal.h +++ b/lustre/lfsck/lfsck_internal.h @@ -45,6 +45,7 @@ #include #include #include +#include #define HALF_SEC (HZ >> 1) #define LFSCK_CHECKPOINT_INTERVAL 60 @@ -303,8 +304,7 @@ struct lfsck_operations { int (*lfsck_dump)(const struct lu_env *env, struct lfsck_component *com, - char *buf, - int len); + struct seq_file *m); int (*lfsck_double_scan)(const struct lu_env *env, struct lfsck_component *com); @@ -371,7 +371,7 @@ struct lfsck_tgt_descs { struct list_head ltd_orphan; /* number of registered TGTs */ - int ltd_tgtnr; + __u32 ltd_tgtnr; }; #define LTD_TGT(ltd, index) \ @@ -383,10 +383,10 @@ struct lfsck_tgt_descs { 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; @@ -423,21 +423,21 @@ struct lfsck_instance { 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; @@ -558,10 +558,8 @@ struct lfsck_thread_info { char lti_lma_old[LMA_OLD_SIZE]; }; struct dt_object_format lti_dof; - /* lti_ent and lti_key must be conjoint, - * then lti_ent::lde_name will be lti_key. */ - struct lu_dirent lti_ent; - char lti_key[NAME_MAX + 16]; + /* There will be '\0' at the end of the name. */ + char lti_key[sizeof(struct lu_dirent) + NAME_MAX + 1]; char lti_tmpbuf[LFSCK_TMPBUF_LEN]; struct lfsck_request lti_lr; struct lfsck_async_interpret_args lti_laia; @@ -575,11 +573,18 @@ struct lfsck_thread_info { }; struct dt_allocation_hint lti_hint; 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 */ int lfsck_fid_alloc(const struct lu_env *env, struct lfsck_instance *lfsck, struct lu_fid *fid, bool locked); +int lfsck_ibits_lock(const struct lu_env *env, struct lfsck_instance *lfsck, + struct dt_object *obj, struct lustre_handle *lh, + __u64 bits, ldlm_mode_t mode); +void lfsck_ibits_unlock(struct lustre_handle *lh, ldlm_mode_t mode); int lfsck_create_lpf(const struct lu_env *env, struct lfsck_instance *lfsck); struct lfsck_instance *lfsck_instance_find(struct dt_device *key, bool ref, bool unlink); @@ -590,35 +595,20 @@ void lfsck_component_cleanup(const struct lu_env *env, struct lfsck_component *com); void lfsck_instance_cleanup(const struct lu_env *env, struct lfsck_instance *lfsck); -int lfsck_bits_dump(char **buf, int *len, int bits, const char *names[], +int lfsck_bits_dump(struct seq_file *m, int bits, const char *names[], const char *prefix); -int lfsck_time_dump(char **buf, int *len, __u64 time, const char *prefix); -int lfsck_pos_dump(char **buf, int *len, struct lfsck_position *pos, +int lfsck_time_dump(struct seq_file *m, __u64 time, const char *prefix); +int lfsck_pos_dump(struct seq_file *m, struct lfsck_position *pos, const char *prefix); void lfsck_pos_fill(const struct lu_env *env, struct lfsck_instance *lfsck, struct lfsck_position *pos, bool init); 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, @@ -639,6 +629,9 @@ int lfsck_set_param(const struct lu_env *env, struct lfsck_instance *lfsck, struct lfsck_start *start, bool reset); /* lfsck_namespace.c */ +int lfsck_verify_linkea(const struct lu_env *env, struct dt_device *dev, + struct dt_object *obj, const struct lu_name *cname, + const struct lu_fid *pfid); int lfsck_namespace_setup(const struct lu_env *env, struct lfsck_instance *lfsck); @@ -675,6 +668,13 @@ lfsck_name_get_const(const struct lu_env *env, const void *area, ssize_t len) 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) { @@ -777,14 +777,6 @@ static inline int lfsck_is_dead_obj(const struct dt_object *obj) 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); @@ -798,6 +790,21 @@ static inline void lfsck_object_put(const struct lu_env *env, } 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) { @@ -810,6 +817,13 @@ lfsck_object_find_by_dev(const struct lu_env *env, struct dt_device *dev, 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) { @@ -871,7 +885,7 @@ static inline void lfsck_instance_put(const struct lu_env *env, lfsck_instance_cleanup(env, lfsck); } -static inline mdsno_t lfsck_dev_idx(struct dt_device *dev) +static inline u32 lfsck_dev_idx(struct dt_device *dev) { return dev->dd_lu_dev.ld_site->ld_seq_site->ss_node_id; }