* GPL HEADER END
*/
/*
- * Copyright (c) 2013, 2016, Intel Corporation.
+ * Copyright (c) 2013, 2017, Intel Corporation.
*/
/*
* lustre/lfsck/lfsck_internal.h
LNTF_CHECK_ORPHAN = 0x08,
LNTF_UNCERTAIN_LMV = 0x10,
LNTF_RECHECK_NAME_HASH = 0x20,
+ LNTF_CHECK_AGENT_ENTRY = 0x40,
LNTF_ALL = 0xff
};
/* 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[12];
+ __u64 ln_reserved[11];
};
enum lfsck_layout_inconsistency_type {
struct lfsck_start_param *lsp);
};
-#define TGT_PTRS 256 /* number of pointers at 1st level */
-#define TGT_PTRS_PER_BLOCK 256 /* number of pointers at 2nd level */
-
struct lfsck_tgt_desc {
struct list_head ltd_orphan_list;
struct dt_device *ltd_tgt;
__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;
struct lfsck_instance *lc_lfsck;
struct dt_object *lc_obj;
struct lfsck_sub_trace_obj lc_sub_trace_objs[LFSCK_STF_COUNT];
- struct lfsck_operations *lc_ops;
+ const struct lfsck_operations *lc_ops;
void *lc_file_ram;
void *lc_file_disk;
void *lc_data;
ll_lmv_updated:1,
ll_inline:1,
ll_failed:1,
- ll_ignore:1;
+ ll_ignore:1,
+ ll_counted:1;
struct lfsck_slave_lmv_rec *ll_lslr; /* may be vmalloc'd */
};
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, seconds */
time64_t li_time_last_checkpoint;
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];
};
+static inline bool lfsck_is_dryrun(struct lfsck_instance *lfsck)
+{
+ return lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN;
+}
+
struct lfsck_async_interpret_args {
struct lfsck_component *laia_com;
struct lfsck_tgt_descs *laia_ltds;
struct ptlrpc_thread lad_thread;
struct task_struct *lad_task;
- struct lfsck_assistant_operations *lad_ops;
+ const struct lfsck_assistant_operations *lad_ops;
struct cfs_bitmap *lad_bitmap;
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
struct ldlm_res_id lti_resid;
struct filter_fid lti_ff;
struct dt_allocation_hint lti_hint;
- struct lu_orphan_rec_v2 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;
struct dt_object *obj, struct lustre_handle *lh,
__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, enum ldlm_mode mode);
struct lfsck_component *com);
void lfsck_instance_cleanup(const struct lu_env *env,
struct lfsck_instance *lfsck);
-void lfsck_bits_dump(struct seq_file *m, int bits, const char *names[],
+void lfsck_bits_dump(struct seq_file *m, int bits, const char *const 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,
void lfsck_control_speed_by_self(struct lfsck_component *com);
void lfsck_thread_args_fini(struct lfsck_thread_args *lta);
struct lfsck_assistant_data *
-lfsck_assistant_data_init(struct lfsck_assistant_operations *lao,
+lfsck_assistant_data_init(const 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,
struct dt_object *child,
const char *name, const char *name2,
__u16 type, bool update, bool dec);
-int lfsck_verify_linkea(const struct lu_env *env, struct dt_object *obj,
- const struct lu_name *cname, const struct lu_fid *pfid);
+int lfsck_verify_linkea(const struct lu_env *env, struct lfsck_instance *lfsck,
+ struct dt_object *obj, const struct lu_name *cname,
+ const struct lu_fid *pfid);
int lfsck_links_get_first(const struct lu_env *env, struct dt_object *obj,
char *name, struct lu_fid *pfid);
int lfsck_update_name_entry(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,
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);
extern const char dot[];
extern const char dotdot[];
-extern const char *lfsck_flags_names[];
-extern const char *lfsck_param_names[];
+extern const char *const lfsck_flags_names[];
+extern const char *const 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);
+ return container_of_safe(obj->do_lu.lo_dev, struct dt_device,
+ dd_lu_dev);
}
static inline struct lfsck_thread_info *
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;
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,
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 *
if (atomic_dec_and_test(&lso->lso_ref))
OBD_FREE_PTR(lso);
}
+
+static inline struct thandle*
+lfsck_trans_create(const struct lu_env *env, struct dt_device *dev,
+ struct lfsck_instance *lfsck)
+{
+ if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN) {
+ CERROR("%s: transaction is being created in DRYRUN mode!\n",
+ lfsck_lfsck2name(lfsck));
+
+ dump_stack();
+ return ERR_PTR(-EINVAL);
+ }
+
+ return dt_trans_create(env, dev);
+}
#endif /* _LFSCK_INTERNAL_H */