X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Ftarget%2Ftgt_internal.h;h=39fb4101e6f2c200e86b3131f021d88d534139a5;hb=23773b32bfe15fccc9c029d722dc1bd5b0144779;hp=ebe3a1ab99f85a2caa0db68a7bbcce7a67550649;hpb=b69b7de30c3977cb69a741099218bc4a81752717;p=fs%2Flustre-release.git diff --git a/lustre/target/tgt_internal.h b/lustre/target/tgt_internal.h index ebe3a1a..39fb410 100644 --- a/lustre/target/tgt_internal.h +++ b/lustre/target/tgt_internal.h @@ -21,7 +21,7 @@ * GPL HEADER END */ /* - * Copyright (c) 2012, Intel Corporation. + * Copyright (c) 2012, 2017, Intel Corporation. */ /* * lustre/target/tgt_internal.h @@ -35,7 +35,6 @@ #define _TG_INTERNAL_H #include -#include #include #include #include @@ -43,61 +42,10 @@ #include #include -extern int (*tgt_lfsck_in_notify)(const struct lu_env *env, - struct dt_device *key, - struct lfsck_request *lr); - -struct tx_arg; -typedef int (*tx_exec_func_t)(const struct lu_env *env, struct thandle *th, - struct tx_arg *ta); - -struct tx_arg { - tx_exec_func_t exec_fn; - tx_exec_func_t undo_fn; - struct dt_object *object; - const char *file; - struct object_update_reply *reply; - int line; - int index; - union { - struct { - struct dt_insert_rec rec; - const struct dt_key *key; - } insert; - struct { - } ref; - struct { - struct lu_attr attr; - } attr_set; - struct { - struct lu_buf buf; - const char *name; - int flags; - __u32 csum; - } xattr_set; - struct { - struct lu_attr attr; - struct dt_allocation_hint hint; - struct dt_object_format dof; - struct lu_fid fid; - } create; - struct { - struct lu_buf buf; - loff_t pos; - } write; - struct { - struct ost_body *body; - } destroy; - } u; -}; - -struct thandle_exec_args { - struct thandle *ta_handle; - int ta_argno; /* used args */ - int ta_alloc_args; /* allocated args count */ - struct tx_arg **ta_args; -}; - +extern int (*tgt_lfsck_in_notify_local)(const struct lu_env *env, + struct dt_device *key, + struct lfsck_req_local *lrl, + struct thandle *th); /** * Common data shared by tg-level handlers. This is allocated per-thread to * reduce stack consumption. @@ -106,6 +54,7 @@ struct tgt_thread_info { /* server and client data buffers */ struct lr_server_data tti_lsd; struct lsd_client_data tti_lcd; + struct lsd_reply_data tti_lrd; struct lu_buf tti_buf; loff_t tti_off; @@ -123,8 +72,6 @@ struct tgt_thread_info { struct { /* for tgt_readpage() */ struct lu_rdpg tti_rdpg; - /* for tgt_sendpage() */ - struct l_wait_info tti_wait_info; } rdpg; struct { struct dt_object_format tti_update_dof; @@ -134,8 +81,9 @@ struct tgt_thread_info { struct obdo tti_obdo; struct dt_object *tti_dt_object; } update; + struct obd_statfs osfs; /* for obd_statfs() in OFD/MDT */ } tti_u; - struct lfsck_request tti_lr; + struct lfsck_req_local tti_lrl; struct dt_insert_rec tti_rec; }; @@ -169,55 +117,186 @@ static inline char *dt_obd_name(struct dt_device *dt) return dt->dd_lu_dev.ld_obd->obd_name; } +/* out_lib.c */ +int out_tx_create_exec(const struct lu_env *env, struct thandle *th, + struct tx_arg *arg); +struct tx_arg *tx_add_exec(struct thandle_exec_args *ta, + tx_exec_func_t func, tx_exec_func_t undo, + const char *file, int line); + +int out_create_add_exec(const struct lu_env *env, struct dt_object *obj, + struct lu_attr *attr, struct lu_fid *parent_fid, + struct dt_object_format *dof, + struct thandle_exec_args *ta, struct thandle *th, + struct object_update_reply *reply, + int index, const char *file, int line); + +int out_attr_set_add_exec(const struct lu_env *env, struct dt_object *dt_obj, + const struct lu_attr *attr, + struct thandle_exec_args *ta, struct thandle *th, + struct object_update_reply *reply, int index, + const char *file, int line); + +int out_write_add_exec(const struct lu_env *env, struct dt_object *dt_obj, + const struct lu_buf *buf, loff_t pos, + struct thandle_exec_args *ta, struct thandle *th, + struct object_update_reply *reply, int index, + const char *file, int line); + +int out_xattr_set_add_exec(const struct lu_env *env, struct dt_object *dt_obj, + const struct lu_buf *buf, const char *name, + int flags, struct thandle_exec_args *ta, + struct thandle *th, + struct object_update_reply *reply, int index, + const char *file, int line); + +int out_xattr_del_add_exec(const struct lu_env *env, struct dt_object *dt_obj, + const char *name, struct thandle_exec_args *ta, + struct thandle *th, + struct object_update_reply *reply, int index, + const char *file, int line); + +int out_ref_add_add_exec(const struct lu_env *env, struct dt_object *dt_obj, + struct thandle_exec_args *ta, struct thandle *th, + struct object_update_reply *reply, int index, + const char *file, int line); + +int out_ref_del_add_exec(const struct lu_env *env, struct dt_object *dt_obj, + struct thandle_exec_args *ta, struct thandle *th, + struct object_update_reply *reply, int index, + const char *file, int line); + +int out_index_insert_add_exec(const struct lu_env *env, + struct dt_object *dt_obj, + const struct dt_rec *rec, + const struct dt_key *key, + struct thandle_exec_args *ta, + struct thandle *th, + struct object_update_reply *reply, + int index, const char *file, int line); + +int out_index_delete_add_exec(const struct lu_env *env, + struct dt_object *dt_obj, + const struct dt_key *key, + struct thandle_exec_args *ta, + struct thandle *th, + struct object_update_reply *reply, + int index, const char *file, int line); + +int out_destroy_add_exec(const struct lu_env *env, struct dt_object *dt_obj, + struct thandle_exec_args *ta, struct thandle *th, + struct object_update_reply *reply, + int index, const char *file, int line); + /* Update handlers */ int out_handle(struct tgt_session_info *tsi); -#define out_tx_create(info, obj, attr, fid, dof, th, reply, idx) \ - __out_tx_create(info, obj, attr, fid, dof, th, reply, idx, \ - __FILE__, __LINE__) +#define out_tx_create(env, obj, attr, fid, dof, ta, th, reply, idx) \ + out_create_add_exec(env, obj, attr, fid, dof, ta, th, reply, idx, \ + __FILE__, __LINE__) -#define out_tx_attr_set(info, obj, attr, th, reply, idx) \ - __out_tx_attr_set(info, obj, attr, th, reply, idx, \ - __FILE__, __LINE__) +#define out_tx_attr_set(env, obj, attr, ta, th, reply, idx) \ + out_attr_set_add_exec(env, obj, attr, ta, th, reply, idx, \ + __FILE__, __LINE__) -#define out_tx_xattr_set(info, obj, buf, name, fl, th, reply, idx) \ - __out_tx_xattr_set(info, obj, buf, name, fl, th, reply, idx, \ - __FILE__, __LINE__) +#define out_tx_xattr_set(env, obj, buf, name, fl, ta, th, reply, idx) \ + out_xattr_set_add_exec(env, obj, buf, name, fl, ta, th, reply, idx, \ + __FILE__, __LINE__) -#define out_tx_xattr_del(info, obj, name, th, reply, idx) \ - __out_tx_xattr_del(info, obj, name, th, reply, idx, \ - __FILE__, __LINE__) +#define out_tx_xattr_del(env, obj, name, ta, th, reply, idx) \ + out_xattr_del_add_exec(env, obj, name, ta, th, reply, idx, \ + __FILE__, __LINE__) -#define out_tx_ref_add(info, obj, th, reply, idx) \ - __out_tx_ref_add(info, obj, th, reply, idx, __FILE__, __LINE__) +#define out_tx_ref_add(env, obj, ta, th, reply, idx) \ + out_ref_add_add_exec(env, obj, ta, th, reply, idx, \ + __FILE__, __LINE__) -#define out_tx_ref_del(info, obj, th, reply, idx) \ - __out_tx_ref_del(info, obj, th, reply, idx, __FILE__, __LINE__) +#define out_tx_ref_del(env, obj, ta, th, reply, idx) \ + out_ref_del_add_exec(env, obj, ta, th, reply, idx, \ + __FILE__, __LINE__) -#define out_tx_index_insert(info, obj, rec, key, th, reply, idx) \ - __out_tx_index_insert(info, obj, rec, key, th, reply, idx, \ - __FILE__, __LINE__) +#define out_tx_index_insert(env, obj, rec, key, ta, th, reply, idx) \ + out_index_insert_add_exec(env, obj, rec, key, ta, th, reply, idx, \ + __FILE__, __LINE__) -#define out_tx_index_delete(info, obj, key, th, reply, idx) \ - __out_tx_index_delete(info, obj, key, th, reply, idx, \ - __FILE__, __LINE__) +#define out_tx_index_delete(env, obj, key, ta, th, reply, idx) \ + out_index_delete_add_exec(env, obj, key, ta, th, reply, idx, \ + __FILE__, __LINE__) -#define out_tx_destroy(info, obj, th, reply, idx) \ - __out_tx_destroy(info, obj, th, reply, idx, __FILE__, __LINE__) +#define out_tx_destroy(env, obj, ta, th, reply, idx) \ + out_destroy_add_exec(env, obj, ta, th, reply, idx, \ + __FILE__, __LINE__) -#define out_tx_write(info, obj, buf, pos, th, reply, idx) \ - __out_tx_write(info, obj, buf, pos, th, reply, idx, __FILE__, __LINE__) +#define out_tx_write(env, obj, buf, pos, ta, th, reply, idx) \ + out_write_add_exec(env, obj, buf, pos, ta, th, reply, idx,\ + __FILE__, __LINE__) -extern struct page *tgt_page_to_corrupt; +const char *update_op_str(__u16 opcode); -struct tgt_thread_big_cache { - struct niobuf_local local[PTLRPC_MAX_BRW_PAGES]; -}; +extern struct page *tgt_page_to_corrupt; int tgt_server_data_init(const struct lu_env *env, struct lu_target *tgt); int tgt_txn_start_cb(const struct lu_env *env, struct thandle *th, void *cookie); int tgt_txn_stop_cb(const struct lu_env *env, struct thandle *th, void *cookie); +int tgt_handle_received_xid(struct obd_export *exp, __u64 rcvd_xid); +int tgt_handle_tag(struct ptlrpc_request *req); + +void update_records_dump(const struct update_records *records, + unsigned int mask, bool dump_updates); +int check_and_prepare_update_record(const struct lu_env *env, + struct thandle_update_records *tur); +struct update_thread_info { + struct lu_attr uti_attr; + struct lu_fid uti_fid; + struct lu_buf uti_buf; + struct thandle_update_records uti_tur; + struct obdo uti_obdo; + struct thandle_exec_args uti_tea; + struct dt_insert_rec uti_rec; + struct distribute_txn_replay_req *uti_dtrq; +}; + +extern struct lu_context_key update_thread_key; + +static inline struct update_thread_info * +update_env_info(const struct lu_env *env) +{ + struct update_thread_info *uti; + + uti = lu_context_key_get(&env->le_ctx, &update_thread_key); + LASSERT(uti != NULL); + return uti; +} + +void update_info_init(void); +void update_info_fini(void); +struct sub_thandle *create_sub_thandle(struct top_multiple_thandle *tmt, + struct dt_device *dt_dev); +int sub_thandle_trans_create(const struct lu_env *env, + struct top_thandle *top_th, + struct sub_thandle *st); +void distribute_txn_insert_by_batchid(struct top_multiple_thandle *new); +int top_trans_create_tmt(const struct lu_env *env, + struct top_thandle *top_th); + +void tgt_cancel_slc_locks(struct lu_target *tgt, __u64 transno); +void barrier_init(void); +void barrier_fini(void); + +/* FMD tracking data */ +struct tgt_fmd_data { + struct list_head fmd_list; /* linked to tgt_fmd_list */ + struct lu_fid fmd_fid; /* FID being written to */ + __u64 fmd_mactime_xid; /* xid highest {m,a,c}time setattr */ + time64_t fmd_expire; /* time when the fmd should expire */ + int fmd_refcount; /* reference counter - list holds 1 */ +}; + +/* tgt_fmd.c */ +extern struct kmem_cache *tgt_fmd_kmem; +void tgt_fmd_expire(struct obd_export *exp); +void tgt_fmd_cleanup(struct obd_export *exp); #endif /* _TG_INTERNAL_H */