* GPL HEADER END
*/
/*
- * Copyright (c) 2012, Intel Corporation.
+ * Copyright (c) 2012, 2017, Intel Corporation.
*/
/*
* lustre/target/tgt_internal.h
#define _TG_INTERNAL_H
#include <lustre_net.h>
-#include <lustre/lustre_idl.h>
#include <lu_target.h>
#include <lustre_export.h>
#include <lustre_fid.h>
#include <lustre_req_layout.h>
#include <lustre_sec.h>
-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;
- char *file;
- struct object_update_reply *reply;
- int line;
- int index;
- union {
- struct {
- const struct dt_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.
/* 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;
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;
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;
};
extern struct lu_context_key tgt_thread_key;
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_ref_add(info, obj, th, reply, idx) \
- __out_tx_ref_add(info, obj, 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_del(info, obj, th, reply, idx) \
- __out_tx_ref_del(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_index_insert(info, obj, th, name, fid, reply, idx) \
- __out_tx_index_insert(info, obj, th, name, fid, 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_delete(info, obj, th, name, reply, idx) \
- __out_tx_index_delete(info, obj, th, name, 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_destroy(info, obj, th, reply, idx) \
- __out_tx_destroy(info, obj, 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_write(info, obj, buf, pos, th, reply, idx) \
- __out_tx_write(info, obj, buf, pos, 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__)
-extern struct page *tgt_page_to_corrupt;
+#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__)
-struct tgt_thread_big_cache {
- struct niobuf_local local[PTLRPC_MAX_BRW_PAGES];
-};
+const char *update_op_str(__u16 opcode);
+
+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 */