Whamcloud - gitweb
LU-3534 osp: move RPC pack from declare to execution phase
[fs/lustre-release.git] / lustre / include / lustre_update.h
index e09fe3f..3d941b9 100644 (file)
@@ -20,7 +20,7 @@
  * GPL HEADER END
  */
 /*
- * Copyright (c) 2013, Intel Corporation.
+ * Copyright (c) 2013, 2014, Intel Corporation.
  */
 /*
  * lustre/include/lustre_update.h
 #ifndef _LUSTRE_UPDATE_H
 #define _LUSTRE_UPDATE_H
 #include <lustre_net.h>
+#include <dt_object.h>
 
-#define OUT_UPDATE_INIT_BUFFER_SIZE    8192
-#define OUT_UPDATE_REPLY_SIZE  8192
+#define OUT_UPDATE_INIT_BUFFER_SIZE    4096
+#define OUT_UPDATE_REPLY_SIZE          8192
+
+struct dt_key;
+struct dt_rec;
+
+struct update_buffer {
+       struct object_update_request    *ub_req;
+       size_t                          ub_req_size;
+};
+
+#define TOP_THANDLE_MAGIC      0x20140917
+/* {top,sub}_thandle are used to manage distributed transactions which
+ * include updates on several nodes. A top_handle represents the
+ * whole operation, and sub_thandle represents updates on each node. */
+struct top_thandle {
+       struct thandle          tt_super;
+       __u32                   tt_magic;
+       /* The master sub transaction. */
+       struct thandle          *tt_master_sub_thandle;
+
+       /* Other sub thandle will be listed here. */
+       struct list_head        tt_sub_thandle_list;
+};
+
+struct sub_thandle {
+       /* point to the osd/osp_thandle */
+       struct thandle          *st_sub_th;
+       struct list_head        st_sub_list;
+};
+
+/**
+ * Tracking the updates being executed on this dt_device.
+ */
 struct dt_update_request {
        struct dt_device                *dur_dt;
        /* attached itself to thandle */
-       struct list_head                dur_list;
        int                             dur_flags;
        /* update request result */
        int                             dur_rc;
        /* Current batch(transaction) id */
        __u64                           dur_batchid;
-       /* Holding the update req */
-       struct object_update_request    *dur_req;
-       int                             dur_req_len;
+       /* Holding object updates */
+       struct update_buffer            dur_buf;
        struct list_head                dur_cb_items;
 };
 
-static inline unsigned long
-object_update_param_size(const struct object_update_param *param)
-{
-       return cfs_size_round(sizeof(*param) + param->oup_len);
-}
-
-static inline unsigned long
-object_update_size(const struct object_update *update)
-{
-       const struct    object_update_param *param;
-       unsigned long   size;
-       size_t          i;
-
-       size = offsetof(struct object_update, ou_params[0]);
-       for (i = 0; i < update->ou_params_count; i++) {
-               param = (struct object_update_param *)((char *)update + size);
-               size += object_update_param_size(param);
-       }
-
-       return size;
-}
-
 static inline void
 *object_update_param_get(const struct object_update *update, size_t index,
                         size_t *size)
@@ -111,27 +120,6 @@ object_update_request_size(const struct object_update_request *our)
        return size;
 }
 
-static inline struct object_update
-*object_update_request_get(const struct object_update_request *our,
-                          size_t index, size_t *size)
-{
-       void    *ptr;
-       size_t  i;
-
-       if (index >= our->ourq_count)
-               return NULL;
-
-       ptr = (char *)our + offsetof(struct object_update_request,
-                                    ourq_updates[0]);
-       for (i = 0; i < index; i++)
-               ptr += object_update_size((struct object_update *)ptr);
-
-       if (size != NULL)
-               *size = object_update_size((struct object_update *)ptr);
-
-       return ptr;
-}
-
 static inline void
 object_update_reply_init(struct object_update_reply *reply, size_t count)
 {
@@ -139,31 +127,6 @@ object_update_reply_init(struct object_update_reply *reply, size_t count)
        reply->ourp_count = count;
 }
 
-static inline struct object_update_result
-*object_update_result_get(const struct object_update_reply *reply,
-                         size_t index, size_t *size)
-{
-       char *ptr;
-       size_t count = reply->ourp_count;
-       size_t i;
-
-       if (index >= count)
-               return NULL;
-
-       ptr = (char *)reply +
-             cfs_size_round(offsetof(struct object_update_reply,
-                                     ourp_lens[count]));
-       for (i = 0; i < index; i++) {
-               LASSERT(reply->ourp_lens[i] > 0);
-               ptr += cfs_size_round(reply->ourp_lens[i]);
-       }
-
-       if (size != NULL)
-               *size = reply->ourp_lens[index];
-
-       return (struct object_update_result *)ptr;
-}
-
 static inline void
 object_update_result_insert(struct object_update_reply *reply,
                            void *data, size_t data_len, size_t index,
@@ -218,4 +181,68 @@ static inline void update_inc_batchid(struct dt_update_request *update)
        update->dur_batchid++;
 }
 
+/* target/out_lib.c */
+int out_update_pack(const struct lu_env *env, struct update_buffer *ubuf,
+                   enum update_type op, const struct lu_fid *fid,
+                   int params_count, __u16 *param_sizes, const void **bufs,
+                   __u64 batchid);
+int out_create_pack(const struct lu_env *env, struct update_buffer *ubuf,
+                   const struct lu_fid *fid, struct lu_attr *attr,
+                   struct dt_allocation_hint *hint,
+                   struct dt_object_format *dof, __u64 batchid);
+int out_object_destroy_pack(const struct lu_env *env,
+                           struct update_buffer *ubuf,
+                           const struct lu_fid *fid, __u64 batchid);
+int out_index_delete_pack(const struct lu_env *env, struct update_buffer *ubuf,
+                         const struct lu_fid *fid, const struct dt_key *key,
+                         __u64 batchid);
+int out_index_insert_pack(const struct lu_env *env, struct update_buffer *ubuf,
+                         const struct lu_fid *fid, const struct dt_rec *rec,
+                         const struct dt_key *key, __u64 batchid);
+int out_xattr_set_pack(const struct lu_env *env, struct update_buffer *ubuf,
+                      const struct lu_fid *fid, const struct lu_buf *buf,
+                      const char *name, int flag, __u64 batchid);
+int out_xattr_del_pack(const struct lu_env *env, struct update_buffer *ubuf,
+                      const struct lu_fid *fid, const char *name,
+                      __u64 batchid);
+int out_attr_set_pack(const struct lu_env *env, struct update_buffer *ubuf,
+                     const struct lu_fid *fid, const struct lu_attr *attr,
+                     __u64 batchid);
+int out_ref_add_pack(const struct lu_env *env, struct update_buffer *ubuf,
+                    const struct lu_fid *fid, __u64 batchid);
+int out_ref_del_pack(const struct lu_env *env, struct update_buffer *ubuf,
+                    const struct lu_fid *fid, __u64 batchid);
+int out_write_pack(const struct lu_env *env, struct update_buffer *ubuf,
+                  const struct lu_fid *fid, const struct lu_buf *buf,
+                  loff_t pos, __u64 batchid);
+int out_attr_get_pack(const struct lu_env *env, struct update_buffer *ubuf,
+                     const struct lu_fid *fid);
+int out_index_lookup_pack(const struct lu_env *env, struct update_buffer *ubuf,
+                         const struct lu_fid *fid, struct dt_rec *rec,
+                         const struct dt_key *key);
+int out_xattr_get_pack(const struct lu_env *env, struct update_buffer *ubuf,
+                      const struct lu_fid *fid, const char *name);
+
+/* target/update_trans.c */
+struct thandle *thandle_get_sub_by_dt(const struct lu_env *env,
+                                     struct thandle *th,
+                                     struct dt_device *sub_dt);
+
+static inline struct thandle *
+thandle_get_sub(const struct lu_env *env, struct thandle *th,
+                const struct dt_object *sub_obj)
+{
+       return thandle_get_sub_by_dt(env, th, lu2dt_dev(sub_obj->do_lu.lo_dev));
+}
+
+struct thandle *
+top_trans_create(const struct lu_env *env, struct dt_device *master_dev);
+
+int top_trans_start(const struct lu_env *env, struct dt_device *master_dev,
+                   struct thandle *th);
+
+int top_trans_stop(const struct lu_env *env, struct dt_device *master_dev,
+                  struct thandle *th);
+
+void top_thandle_destroy(struct top_thandle *top_th);
 #endif