Whamcloud - gitweb
LU-12635 build: Support for gcc -Wimplicit-fallthrough
[fs/lustre-release.git] / lustre / target / tgt_internal.h
index f0ed071..ac7c3c1 100644 (file)
@@ -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 <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.
@@ -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;
 
@@ -133,9 +82,12 @@ struct tgt_thread_info {
                        int                        tti_update_reply_index;
                        struct obdo                tti_obdo;
                        struct dt_object           *tti_dt_object;
+                       struct l_wait_info tti_wait_info;
                } 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;
@@ -168,51 +120,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_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 obd_export *exp, __u16 tag);
+
+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 */