Whamcloud - gitweb
LU-3536 osp: move update packing into out_lib.c
[fs/lustre-release.git] / lustre / include / lustre / lustre_idl.h
index 61216c3..8372ace 100644 (file)
@@ -4008,6 +4008,12 @@ struct object_update_param {
        char    oup_buf[0];
 };
 
+static inline size_t
+object_update_param_size(const struct object_update_param *param)
+{
+       return cfs_size_round(sizeof(*param) + param->oup_len);
+}
+
 /* object update */
 struct object_update {
        __u16           ou_type;                /* enum update_type */
@@ -4034,6 +4040,43 @@ struct object_update_request {
 void lustre_swab_object_update(struct object_update *ou);
 void lustre_swab_object_update_request(struct object_update_request *our);
 
+static inline size_t
+object_update_size(const struct object_update *update)
+{
+       const struct    object_update_param *param;
+       size_t          size;
+       unsigned int    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 struct object_update *
+object_update_request_get(const struct object_update_request *our,
+                         unsigned int index, size_t *size)
+{
+       void    *ptr;
+       unsigned int i;
+
+       if (index >= our->ourq_count)
+               return NULL;
+
+       ptr = (void *)&our->ourq_updates[0];
+       for (i = 0; i < index; i++)
+               ptr += object_update_size(ptr);
+
+       if (size != NULL)
+               *size = object_update_size(ptr);
+
+       return ptr;
+}
+
+
 /* the result of object update */
 struct object_update_result {
        __u32   our_rc;
@@ -4056,6 +4099,33 @@ struct object_update_reply {
 void lustre_swab_object_update_result(struct object_update_result *our);
 void lustre_swab_object_update_reply(struct object_update_reply *our);
 
+static inline struct object_update_result *
+object_update_result_get(const struct object_update_reply *reply,
+                        unsigned int index, size_t *size)
+{
+       __u16 count = reply->ourp_count;
+       unsigned int i;
+       void *ptr;
+
+       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++) {
+               if (reply->ourp_lens[i] == 0)
+                       return NULL;
+
+               ptr += cfs_size_round(reply->ourp_lens[i]);
+       }
+
+       if (size != NULL)
+               *size = reply->ourp_lens[index];
+
+       return ptr;
+}
+
 /** layout swap request structure
  * fid1 and fid2 are in mdt_body
  */