X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flfsck%2Flfsck_internal.h;h=428e28fda1ecb7414c3b5adad5baea56304f8111;hb=3cce65712d94cffe8f1626545845b95b88aef672;hp=6153b0ca1d01e4280b8dae401bf3fb74f2e029a6;hpb=81be387c988787b86565f1e4087fd20809b6a7c3;p=fs%2Flustre-release.git diff --git a/lustre/lfsck/lfsck_internal.h b/lustre/lfsck/lfsck_internal.h index 6153b0c..428e28f 100644 --- a/lustre/lfsck/lfsck_internal.h +++ b/lustre/lfsck/lfsck_internal.h @@ -20,7 +20,7 @@ * GPL HEADER END */ /* - * Copyright (c) 2013, 2014, Intel Corporation. + * Copyright (c) 2013, 2017, Intel Corporation. */ /* * lustre/lfsck/lfsck_internal.h @@ -33,9 +33,6 @@ #ifndef _LFSCK_INTERNAL_H # define _LFSCK_INTERNAL_H -#include -#include -#include #include #include #include @@ -47,7 +44,6 @@ #include #include -#define HALF_SEC msecs_to_jiffies(MSEC_PER_SEC >> 1) #define LFSCK_CHECKPOINT_INTERVAL 60 enum lfsck_flags { @@ -111,10 +107,10 @@ struct lfsck_bookmark { enum lfsck_namespace_trace_flags { LNTF_CHECK_LINKEA = 0x01, LNTF_CHECK_PARENT = 0x02, - LNTF_SKIP_NLINK = 0x04, LNTF_CHECK_ORPHAN = 0x08, LNTF_UNCERTAIN_LMV = 0x10, LNTF_RECHECK_NAME_HASH = 0x20, + LNTF_CHECK_AGENT_ENTRY = 0x40, LNTF_ALL = 0xff }; @@ -142,19 +138,19 @@ struct lfsck_namespace { __u32 ln_success_count; /* How long the LFSCK phase1 has run in seconds. */ - __u32 ln_run_time_phase1; + time64_t ln_run_time_phase1; /* How long the LFSCK phase2 has run in seconds. */ - __u32 ln_run_time_phase2; + time64_t ln_run_time_phase2; /* Time for the last LFSCK completed in seconds since epoch. */ - __u64 ln_time_last_complete; + time64_t ln_time_last_complete; /* Time for the latest LFSCK ran in seconds since epoch. */ - __u64 ln_time_latest_start; + time64_t ln_time_latest_start; /* Time for the last LFSCK checkpoint in seconds since epoch. */ - __u64 ln_time_last_checkpoint; + time64_t ln_time_last_checkpoint; /* Position for the latest LFSCK started from. */ struct lfsck_position ln_pos_latest_start; @@ -274,9 +270,20 @@ struct lfsck_namespace { * the MDTs that contain non-verified MDT-objects. */ __u32 ln_bitmap_size; + /* For further using. 256-bytes aligned now. */ __u32 ln_reserved_1; + + /* Time for the latest LFSCK scan in seconds from the beginning. */ + time64_t ln_time_latest_reset; + + /* How many linkEA overflow timestamp have been cleared. */ + __u64 ln_linkea_overflow_cleared; + + /* How many agent entries have been repaired. */ + __u64 ln_agent_entries_repaired; + /* For further using. 256-bytes aligned now. */ - __u64 ln_reserved[15]; + __u64 ln_reserved[11]; }; enum lfsck_layout_inconsistency_type { @@ -304,19 +311,19 @@ struct lfsck_layout { __u32 ll_success_count; /* How long the LFSCK phase1 has run in seconds. */ - __u32 ll_run_time_phase1; + time64_t ll_run_time_phase1; /* How long the LFSCK phase2 has run in seconds. */ - __u32 ll_run_time_phase2; + time64_t ll_run_time_phase2; /* Time for the last LFSCK completed in seconds since epoch. */ - __u64 ll_time_last_complete; + time64_t ll_time_last_complete; /* Time for the latest LFSCK ran in seconds since epoch. */ - __u64 ll_time_latest_start; + time64_t ll_time_latest_start; /* Time for the last LFSCK checkpoint in seconds since epoch. */ - __u64 ll_time_last_checkpoint; + time64_t ll_time_last_checkpoint; /* Position for the latest LFSCK started from. */ __u64 ll_pos_latest_start; @@ -353,13 +360,27 @@ struct lfsck_layout { /* For further using. 256-bytes aligned now. */ __u32 ll_reserved_1; - __u64 ll_reserved_2[11]; + + /* The latest object has been processed (failed) during double scan. */ + struct lfsck_layout_dangling_key ll_lldk_latest_scanned_phase2; + + /* For further using */ + u64 ll_reserved_2[7]; /* The OST targets bitmap to record the OSTs that contain * non-verified OST-objects. */ __u8 ll_ost_bitmap[0]; }; +struct lfsck_assistant_object { + struct lu_fid lso_fid; + __u64 lso_oit_cookie; + struct lu_attr lso_attr; + atomic_t lso_ref; + unsigned int lso_dead:1, + lso_is_dir:1; +}; + struct lfsck_component; struct lfsck_tgt_descs; struct lfsck_tgt_desc; @@ -393,6 +414,7 @@ struct lfsck_operations { int (*lfsck_exec_dir)(const struct lu_env *env, struct lfsck_component *com, + struct lfsck_assistant_object *lso, struct lu_dirent *ent, __u16 type); @@ -401,9 +423,9 @@ struct lfsck_operations { int result, bool init); - int (*lfsck_dump)(const struct lu_env *env, - struct lfsck_component *com, - struct seq_file *m); + void (*lfsck_dump)(const struct lu_env *env, + struct lfsck_component *com, + struct seq_file *m); int (*lfsck_double_scan)(const struct lu_env *env, struct lfsck_component *com); @@ -414,13 +436,20 @@ struct lfsck_operations { void (*lfsck_quit)(const struct lu_env *env, struct lfsck_component *com); + int (*lfsck_in_notify_local)(const struct lu_env *env, + struct lfsck_component *com, + struct lfsck_req_local *lrl, + struct thandle *th); + int (*lfsck_in_notify)(const struct lu_env *env, struct lfsck_component *com, - struct lfsck_request *lr, - struct thandle *th); + struct lfsck_request *lr); int (*lfsck_query)(const struct lu_env *env, - struct lfsck_component *com); + struct lfsck_component *com, + struct lfsck_request *req, + struct lfsck_reply *rep, + struct lfsck_query *que, int idx); int (*lfsck_join)(const struct lu_env *env, struct lfsck_component *com, @@ -439,11 +468,16 @@ struct lfsck_tgt_desc { struct list_head ltd_layout_phase_list; struct list_head ltd_namespace_list; struct list_head ltd_namespace_phase_list; + __u32 ltd_layout_status; + __u32 ltd_namespace_status; + __u64 ltd_layout_repaired; + __u64 ltd_namespace_repaired; atomic_t ltd_ref; __u32 ltd_index; __u32 ltd_layout_gen; __u32 ltd_namespace_gen; unsigned int ltd_dead:1, + ltd_retry_start:1, ltd_layout_done:1, ltd_namespace_done:1, ltd_synced_failures:1; @@ -458,7 +492,7 @@ struct lfsck_tgt_descs { struct lfsck_tgt_desc_idx *ltd_tgts_idx[TGT_PTRS]; /* bitmap of TGTs available */ - cfs_bitmap_t *ltd_tgts_bitmap; + struct cfs_bitmap *ltd_tgts_bitmap; /* for lfsck_tgt_desc::ltd_xxx_list */ spinlock_t ltd_lock; @@ -473,12 +507,30 @@ struct lfsck_tgt_descs { __u32 ltd_tgtnr; }; -#define LTD_TGT(ltd, index) \ - ((ltd)->ltd_tgts_idx[(index) / TGT_PTRS_PER_BLOCK]->\ - ldi_tgts[(index) % TGT_PTRS_PER_BLOCK]) +static inline struct lfsck_tgt_desc * +lfsck_ltd2tgt(struct lfsck_tgt_descs *ltd, __u32 index) +{ + __u32 idx1 = index / TGT_PTRS_PER_BLOCK; + __u32 idx2 = index % TGT_PTRS_PER_BLOCK; + struct lfsck_tgt_desc *__tgt = NULL; + + if (unlikely(idx1 >= TGT_PTRS)) + CDEBUG(D_LFSCK, "The target idx %u is invalid.\n", index); + else if (likely(ltd->ltd_tgts_idx[idx1] != NULL)) + __tgt = ltd->ltd_tgts_idx[idx1]->ldi_tgts[idx2]; + + return __tgt; +} + +static inline void lfsck_assign_tgt(struct lfsck_tgt_descs *ltd, + struct lfsck_tgt_desc *tgt, __u32 index) +{ + __u32 idx1 = index / TGT_PTRS_PER_BLOCK; + __u32 idx2 = index % TGT_PTRS_PER_BLOCK; -#define OST_TGT(lfsck, index) LTD_TGT(&lfsck->li_ost_descs, index) -#define MDT_TGT(lfsck, index) LTD_TGT(&lfsck->li_mdt_descs, index) + if (likely(idx1 < TGT_PTRS && ltd->ltd_tgts_idx[idx1] != NULL)) + ltd->ltd_tgts_idx[idx1]->ldi_tgts[idx2] = tgt; +} #define LFSCK_STF_BITS 4 /* If want to adjust the LFSCK_STF_COUNT, please change LFSCK_STF_BITS. */ @@ -509,11 +561,11 @@ struct lfsck_component { void *lc_data; struct lu_fid lc_fid_latest_scanned_phase2; - /* The time for last checkpoint, jiffies */ - cfs_time_t lc_time_last_checkpoint; + /* The time for last checkpoint, seconds */ + time64_t lc_time_last_checkpoint; - /* The time for next checkpoint, jiffies */ - cfs_time_t lc_time_next_checkpoint; + /* The time for next checkpoint, seconds */ + time64_t lc_time_next_checkpoint; __u32 lc_file_size; @@ -569,8 +621,9 @@ struct lfsck_lmv { ll_lmv_updated:1, ll_inline:1, ll_failed:1, - ll_ignore:1; - struct lfsck_slave_lmv_rec *ll_lslr; + ll_ignore:1, + ll_counted:1; + struct lfsck_slave_lmv_rec *ll_lslr; /* may be vmalloc'd */ }; /* If the namespace LFSCK finds that the master MDT-object of a striped @@ -622,12 +675,13 @@ struct lfsck_instance { atomic_t li_ref; atomic_t li_double_scan_count; struct ptlrpc_thread li_thread; + struct task_struct *li_task; - /* The time for last checkpoint, jiffies */ - cfs_time_t li_time_last_checkpoint; + /* The time for last checkpoint, seconds */ + time64_t li_time_last_checkpoint; - /* The time for next checkpoint, jiffies */ - cfs_time_t li_time_next_checkpoint; + /* The time for next checkpoint, seconds */ + time64_t li_time_next_checkpoint; lfsck_out_notify li_out_notify; void *li_out_notify_data; @@ -696,7 +750,8 @@ struct lfsck_instance { li_drop_dryrun:1, /* Ever dryrun, not now. */ li_master:1, /* Master instance or not. */ li_current_oit_processed:1, - li_start_unplug:1; + li_start_unplug:1, + li_stopping:1; struct lfsck_rec_lmv_save li_rec_lmv_save[LFSCK_REC_LMV_MAX_DEPTH]; }; @@ -718,15 +773,14 @@ struct lfsck_thread_args { }; struct lfsck_assistant_req { - struct list_head lar_list; - struct lu_fid lar_fid; + struct list_head lar_list; + struct lfsck_assistant_object *lar_parent; }; struct lfsck_namespace_req { struct lfsck_assistant_req lnr_lar; struct lfsck_lmv *lnr_lmv; struct lu_fid lnr_fid; - __u64 lnr_oit_cookie; __u64 lnr_dir_cookie; __u32 lnr_attr; __u32 lnr_size; @@ -735,6 +789,14 @@ struct lfsck_namespace_req { char lnr_name[0]; }; +struct lfsck_layout_req { + struct lfsck_assistant_req llr_lar; + struct dt_object *llr_child; + __u32 llr_comp_id; + __u32 llr_ost_idx; + __u32 llr_lov_idx; /* offset in LOV EA */ +}; + struct lfsck_assistant_operations { int (*la_handler_p1)(const struct lu_env *env, struct lfsck_component *com, @@ -769,7 +831,7 @@ struct lfsck_assistant_data { /* list for the ost targets in phase1 scanning. */ struct list_head lad_ost_phase1_list; - /* list for the ost targets in phase1 scanning. */ + /* list for the ost targets in phase2 scanning. */ struct list_head lad_ost_phase2_list; /* list for the mdt targets involve LFSCK. */ @@ -778,25 +840,30 @@ struct lfsck_assistant_data { /* list for the mdt targets in phase1 scanning. */ struct list_head lad_mdt_phase1_list; - /* list for the mdt targets in phase1 scanning. */ + /* list for the mdt targets in phase2 scanning. */ struct list_head lad_mdt_phase2_list; const char *lad_name; struct ptlrpc_thread lad_thread; + struct task_struct *lad_task; struct lfsck_assistant_operations *lad_ops; - cfs_bitmap_t *lad_bitmap; + struct cfs_bitmap *lad_bitmap; __u32 lad_touch_gen; int lad_prefetched; int lad_assistant_status; int lad_post_result; - unsigned int lad_to_post:1, - lad_to_double_scan:1, - lad_in_double_scan:1, - lad_exit:1, - lad_incomplete:1; + unsigned long lad_flags; + bool lad_advance_lock; +}; +enum { + LAD_TO_POST = 0, + LAD_TO_DOUBLE_SCAN = 1, + LAD_IN_DOUBLE_SCAN = 2, + LAD_EXIT = 3, + LAD_INCOMPLETE = 4, }; #define LFSCK_TMPBUF_LEN 64 @@ -804,8 +871,8 @@ struct lfsck_assistant_data { struct lfsck_lock_handle { struct lustre_handle llh_pdo_lh; struct lustre_handle llh_reg_lh; - ldlm_mode_t llh_pdo_mode; - ldlm_mode_t llh_reg_mode; + enum ldlm_mode llh_pdo_mode; + enum ldlm_mode llh_reg_mode; }; struct lfsck_thread_info { @@ -819,15 +886,11 @@ struct lfsck_thread_info { struct lu_fid lti_fid; struct lu_fid lti_fid2; struct lu_fid lti_fid3; + struct lu_fid lti_fid4; struct lu_attr lti_la; struct lu_attr lti_la2; - struct lu_attr lti_la3; struct ost_id lti_oi; - union { - struct lustre_mdt_attrs lti_lma; - /* old LMA for compatibility */ - char lti_lma_old[LMA_OLD_SIZE]; - }; + struct lustre_ost_attrs lti_loa; struct dt_object_format lti_dof; /* There will be '\0' at the end of the name. */ char lti_key[sizeof(struct lu_dirent) + NAME_MAX + 1]; @@ -838,15 +901,12 @@ struct lfsck_thread_info { struct lfsck_async_interpret_args lti_laia2; struct lfsck_start lti_start; struct lfsck_stop lti_stop; - ldlm_policy_data_t lti_policy; + union ldlm_policy_data lti_policy; struct ldlm_enqueue_info lti_einfo; struct ldlm_res_id lti_resid; - union { - struct filter_fid_old lti_old_pfid; - struct filter_fid lti_new_pfid; - }; + struct filter_fid lti_ff; struct dt_allocation_hint lti_hint; - struct lu_orphan_rec lti_rec; + struct lu_orphan_rec_v3 lti_rec; struct lov_user_md lti_lum; struct dt_insert_rec lti_dt_rec; struct lu_object_conf lti_conf; @@ -856,6 +916,7 @@ struct lfsck_thread_info { struct lmv_mds_md_v1 lti_lmv3; struct lmv_mds_md_v1 lti_lmv4; struct lfsck_lock_handle lti_llh; + struct lfsck_layout_dangling_key lti_lldk; }; /* lfsck_lib.c */ @@ -863,11 +924,15 @@ 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); + __u64 bits, enum ldlm_mode mode); +void lfsck_ibits_unlock(struct lustre_handle *lh, enum ldlm_mode mode); +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); int lfsck_lock(const struct lu_env *env, struct lfsck_instance *lfsck, struct dt_object *obj, const char *name, - struct lfsck_lock_handle *llh, __u64 bits, ldlm_mode_t mode); + struct lfsck_lock_handle *llh, __u64 bits, enum ldlm_mode mode); void lfsck_unlock(struct lfsck_lock_handle *llh); int lfsck_find_mdt_idx_by_fid(const struct lu_env *env, struct lfsck_instance *lfsck, @@ -877,16 +942,15 @@ struct lfsck_instance *lfsck_instance_find(struct dt_device *key, bool ref, bool unlink); struct lfsck_component *lfsck_component_find(struct lfsck_instance *lfsck, __u16 type); -const char *lfsck_status2names(enum lfsck_status status); 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(struct seq_file *m, int bits, const char *names[], +void lfsck_bits_dump(struct seq_file *m, int bits, const char *names[], + const char *prefix); +void lfsck_time_dump(struct seq_file *m, time64_t time, const char *name); +void lfsck_pos_dump(struct seq_file *m, struct lfsck_position *pos, const char *prefix); -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); @@ -896,6 +960,14 @@ void lfsck_thread_args_fini(struct lfsck_thread_args *lta); struct lfsck_assistant_data * lfsck_assistant_data_init(struct lfsck_assistant_operations *lao, const char *name); +struct lfsck_assistant_object * +lfsck_assistant_object_init(const struct lu_env *env, const struct lu_fid *fid, + const struct lu_attr *attr, __u64 cookie, + bool is_dir); +struct dt_object * +lfsck_assistant_object_load(const struct lu_env *env, + struct lfsck_instance *lfsck, + struct lfsck_assistant_object *lso); int lfsck_async_interpret_common(const struct lu_env *env, struct ptlrpc_request *req, void *args, int rc); @@ -904,6 +976,7 @@ int lfsck_async_request(const struct lu_env *env, struct obd_export *exp, struct ptlrpc_request_set *set, ptlrpc_interpterer_t interpterer, void *args, int request); +int lfsck_query_all(const struct lu_env *env, struct lfsck_component *com); int lfsck_start_assistant(const struct lu_env *env, struct lfsck_component *com, struct lfsck_start_param *lsp); int lfsck_checkpoint_generic(const struct lu_env *env, @@ -914,6 +987,16 @@ int lfsck_double_scan_generic(const struct lu_env *env, struct lfsck_component *com, int status); void lfsck_quit_generic(const struct lu_env *env, struct lfsck_component *com); +int lfsck_load_one_trace_file(const struct lu_env *env, + struct lfsck_component *com, + struct dt_object *parent, + struct dt_object **child, + const struct dt_index_features *ft, + const char *name, bool reset); +int lfsck_load_sub_trace_files(const struct lu_env *env, + struct lfsck_component *com, + const struct dt_index_features *ft, + const char *prefix, bool reset); /* lfsck_engine.c */ int lfsck_unpack_ent(struct lu_dirent *ent, __u64 *cookie, __u16 *type); @@ -943,7 +1026,7 @@ int lfsck_namespace_check_exist(const struct lu_env *env, struct dt_object *dir, struct dt_object *obj, const char *name); int __lfsck_links_read(const struct lu_env *env, struct dt_object *obj, - struct linkea_data *ldata); + struct linkea_data *ldata, bool with_rec); int lfsck_namespace_rebuild_linkea(const struct lu_env *env, struct lfsck_component *com, struct dt_object *obj, @@ -972,7 +1055,9 @@ int lfsck_namespace_setup(const struct lu_env *env, /* lfsck_striped_dir.c */ void lfsck_lmv_put(const struct lu_env *env, struct lfsck_lmv *llmv); -int lfsck_read_stripe_lmv(const struct lu_env *env, struct dt_object *obj, +int lfsck_read_stripe_lmv(const struct lu_env *env, + struct lfsck_instance *lfsck, + struct dt_object *obj, struct lmv_mds_md_v1 *lmv); int lfsck_shard_name_to_index(const struct lu_env *env, const char *name, int namelen, __u16 type, @@ -981,6 +1066,7 @@ bool lfsck_is_valid_slave_name_entry(const struct lu_env *env, struct lfsck_lmv *llmv, const char *name, int namelen); int lfsck_namespace_check_name(const struct lu_env *env, + struct lfsck_instance *lfsck, struct dt_object *parent, struct dt_object *child, const struct lu_name *cname); @@ -1005,11 +1091,9 @@ int lfsck_namespace_repair_bad_name_hash(const struct lu_env *env, const char *name); int lfsck_namespace_striped_dir_rescan(const struct lu_env *env, struct lfsck_component *com, - struct dt_object *dir, struct lfsck_namespace_req *lnr); int lfsck_namespace_handle_striped_master(const struct lu_env *env, struct lfsck_component *com, - struct dt_object *dir, struct lfsck_namespace_req *lnr); /* lfsck_layout.c */ @@ -1021,12 +1105,6 @@ extern const char *lfsck_flags_names[]; extern const char *lfsck_param_names[]; extern struct lu_context_key lfsck_thread_key; -static inline bool name_is_dot_or_dotdot(const char *name, int namelen) -{ - return name[0] == '.' && - (namelen == 1 || (namelen == 2 && name[1] == '.')); -} - static inline struct dt_device *lfsck_obj2dev(struct dt_object *obj) { return container_of0(obj->do_lu.lo_dev, struct dt_device, dd_lu_dev); @@ -1157,9 +1235,7 @@ static inline umode_t lfsck_object_type(const struct dt_object *obj) static inline int lfsck_is_dead_obj(const struct dt_object *obj) { - struct lu_object_header *loh = obj->do_lu.lo_header; - - return !!test_bit(LU_OBJECT_HEARD_BANSHEE, &loh->loh_flags); + return lu_object_is_dying(obj->do_lu.lo_header); } static inline struct dt_object *lfsck_object_get(struct dt_object *obj) @@ -1171,7 +1247,7 @@ static inline struct dt_object *lfsck_object_get(struct dt_object *obj) static inline void lfsck_object_put(const struct lu_env *env, struct dt_object *obj) { - lu_object_put(env, &obj->do_lu); + dt_object_put(env, obj); } static inline struct seq_server_site @@ -1186,12 +1262,12 @@ static inline u32 lfsck_dev_idx(struct lfsck_instance *lfsck) } 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) +lfsck_object_find_by_dev_new(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; - conf->loc_flags = LOC_F_NOWAIT; + conf->loc_flags = LOC_F_NEW; return lu2dt(lu_object_find_slice(env, dt2lu_dev(dev), fid, conf)); } @@ -1221,7 +1297,7 @@ lfsck_find_dev_by_fid(const struct lu_env *env, struct lfsck_instance *lfsck, } else { struct lfsck_tgt_desc *ltd; - ltd = LTD_TGT(&lfsck->li_mdt_descs, idx); + ltd = lfsck_ltd2tgt(&lfsck->li_mdt_descs, idx); if (unlikely(ltd == NULL)) return ERR_PTR(-ENODEV); @@ -1245,9 +1321,9 @@ lfsck_object_find_bottom(const struct lu_env *env, struct lfsck_instance *lfsck, } static inline struct dt_object * -lfsck_object_find_bottom_nowait(const struct lu_env *env, - struct lfsck_instance *lfsck, - const struct lu_fid *fid) +lfsck_object_find_bottom_new(const struct lu_env *env, + struct lfsck_instance *lfsck, + const struct lu_fid *fid) { struct dt_device *dev; @@ -1255,7 +1331,7 @@ lfsck_object_find_bottom_nowait(const struct lu_env *env, if (IS_ERR(dev)) return (struct dt_object *)dev; - return lfsck_object_find_by_dev_nowait(env, dev, fid); + return lfsck_object_find_by_dev_new(env, dev, fid); } static inline struct dt_object * @@ -1280,7 +1356,7 @@ static inline struct lfsck_tgt_desc *lfsck_tgt_get(struct lfsck_tgt_descs *ltds, { struct lfsck_tgt_desc *ltd; - ltd = LTD_TGT(ltds, index); + ltd = lfsck_ltd2tgt(ltds, index); if (ltd != NULL) atomic_inc(<d->ltd_ref); @@ -1357,19 +1433,23 @@ static inline void lfsck_lad_set_bitmap(const struct lu_env *env, __u32 index) { struct lfsck_assistant_data *lad = com->lc_data; - cfs_bitmap_t *bitmap = lad->lad_bitmap; + struct cfs_bitmap *bitmap = lad->lad_bitmap; LASSERT(com->lc_lfsck->li_master); LASSERT(bitmap != NULL); if (likely(bitmap->size > index)) { cfs_bitmap_set(bitmap, index); - lad->lad_incomplete = 1; + set_bit(LAD_INCOMPLETE, &lad->lad_flags); } else if (com->lc_type == LFSCK_TYPE_NAMESPACE) { struct lfsck_namespace *ns = com->lc_file_ram; ns->ln_flags |= LF_INCOMPLETE; } + + CDEBUG(D_LFSCK, "%s: %s LFSCK set bitmap (%p/%u) for idx %u\n", + lfsck_lfsck2name(com->lc_lfsck), lad->lad_name, bitmap, + bitmap->size, index); } static inline int lfsck_links_read(const struct lu_env *env, @@ -1378,20 +1458,33 @@ static inline int lfsck_links_read(const struct lu_env *env, { ldata->ld_buf = lu_buf_check_and_alloc(&lfsck_env_info(env)->lti_linkea_buf, - PAGE_CACHE_SIZE); + MAX_LINKEA_SIZE); - return __lfsck_links_read(env, obj, ldata); + return __lfsck_links_read(env, obj, ldata, false); } -static inline int lfsck_links_read2(const struct lu_env *env, - struct dt_object *obj, - struct linkea_data *ldata) +/* Read linkEA for the given object, the linkEA should contain + * at least one entry, otherwise, -ENODATA will be returned. */ +static inline int lfsck_links_read_with_rec(const struct lu_env *env, + struct dt_object *obj, + struct linkea_data *ldata) +{ + ldata->ld_buf = + lu_buf_check_and_alloc(&lfsck_env_info(env)->lti_linkea_buf, + MAX_LINKEA_SIZE); + + return __lfsck_links_read(env, obj, ldata, true); +} + +static inline int lfsck_links_read2_with_rec(const struct lu_env *env, + struct dt_object *obj, + struct linkea_data *ldata) { ldata->ld_buf = lu_buf_check_and_alloc(&lfsck_env_info(env)->lti_linkea_buf2, - PAGE_CACHE_SIZE); + MAX_LINKEA_SIZE); - return __lfsck_links_read(env, obj, ldata); + return __lfsck_links_read(env, obj, ldata, true); } static inline struct lfsck_lmv *lfsck_lmv_get(struct lfsck_lmv *llmv) @@ -1415,6 +1508,8 @@ static inline void lfsck_lmv_header_le_to_cpu(struct lmv_mds_md_v1 *dst, dst->lmv_master_mdt_index = le32_to_cpu(src->lmv_master_mdt_index); dst->lmv_hash_type = le32_to_cpu(src->lmv_hash_type); dst->lmv_layout_version = le32_to_cpu(src->lmv_layout_version); + dst->lmv_migrate_offset = le32_to_cpu(src->lmv_migrate_offset); + dst->lmv_migrate_hash = le32_to_cpu(src->lmv_migrate_hash); } static inline void lfsck_lmv_header_cpu_to_le(struct lmv_mds_md_v1 *dst, @@ -1425,5 +1520,23 @@ static inline void lfsck_lmv_header_cpu_to_le(struct lmv_mds_md_v1 *dst, dst->lmv_master_mdt_index = cpu_to_le32(src->lmv_master_mdt_index); dst->lmv_hash_type = cpu_to_le32(src->lmv_hash_type); dst->lmv_layout_version = cpu_to_le32(src->lmv_layout_version); + dst->lmv_migrate_offset = cpu_to_le32(src->lmv_migrate_offset); + dst->lmv_migrate_hash = cpu_to_le32(src->lmv_migrate_hash); +} + +static inline struct lfsck_assistant_object * +lfsck_assistant_object_get(struct lfsck_assistant_object *lso) +{ + atomic_inc(&lso->lso_ref); + + return lso; +} + +static inline void +lfsck_assistant_object_put(const struct lu_env *env, + struct lfsck_assistant_object *lso) +{ + if (atomic_dec_and_test(&lso->lso_ref)) + OBD_FREE_PTR(lso); } #endif /* _LFSCK_INTERNAL_H */