+/* Each one represents a distribute transaction replay
+ * operation, and updates on each MDTs are linked to
+ * dtr_sub_list */
+struct distribute_txn_replay_req {
+ /* update record */
+ struct llog_update_record *dtrq_lur;
+ int dtrq_lur_size;
+
+ /* linked to the distribute transaction replay
+ * list (tdtd_replay_list) */
+ struct list_head dtrq_list;
+
+ /* all of sub updates are linked here */
+ struct list_head dtrq_sub_list;
+ spinlock_t dtrq_sub_list_lock;
+};
+
+/* Each one represents a sub replay item under a distribute
+ * transaction. A distribute transaction will be operated in
+ * two or more MDTs, and updates on each MDT will be represented
+ * by this structure */
+struct distribute_txn_replay_req_sub {
+ __u32 dtrqs_mdt_index;
+
+ /* All of cookies for the update will be linked here */
+ spinlock_t dtrqs_cookie_list_lock;
+ struct list_head dtrqs_cookie_list;
+ struct list_head dtrqs_list;
+};
+
+struct target_distribute_txn_data;
+typedef int (*distribute_txn_replay_handler_t)(struct lu_env *env,
+ struct target_distribute_txn_data *tdtd,
+ struct distribute_txn_replay_req *dtrq);
+struct target_distribute_txn_data {
+ /* Distribution ID is used to identify updates log on different
+ * MDTs for one operation */
+ spinlock_t tdtd_batchid_lock;
+ __u64 tdtd_batchid;
+ struct lu_target *tdtd_lut;
+ struct dt_object *tdtd_batchid_obj;
+ struct dt_device *tdtd_dt;
+
+ /* Committed batchid for distribute transaction */
+ __u64 tdtd_committed_batchid;
+
+ /* List for distribute transaction */
+ struct list_head tdtd_list;
+
+ /* Threads to manage distribute transaction */
+ wait_queue_head_t tdtd_commit_thread_waitq;
+ atomic_t tdtd_refcount;
+
+ /* recovery update */
+ distribute_txn_replay_handler_t tdtd_replay_handler;
+ struct list_head tdtd_replay_list;
+ spinlock_t tdtd_replay_list_lock;
+ /* last replay update transno */
+ __u64 tdtd_last_update_transno;
+ __u32 tdtd_replay_ready:1;
+
+};
+