X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Finclude%2Flustre_update.h;h=3d941b927c3332d8766ef3e08304985284bbd3f8;hp=b65e00d409ba58f68f85321cdc175bb213dd3078;hb=de8572645d287d17c409b99dabdf176822d91486;hpb=281671b5ee43c2aea5d5b708aadf10fd1df45b16 diff --git a/lustre/include/lustre_update.h b/lustre/include/lustre_update.h index b65e00d4..3d941b9 100644 --- a/lustre/include/lustre_update.h +++ b/lustre/include/lustre_update.h @@ -20,7 +20,7 @@ * GPL HEADER END */ /* - * Copyright (c) 2013, Intel Corporation. + * Copyright (c) 2013, 2014, Intel Corporation. */ /* * lustre/include/lustre_update.h @@ -31,52 +31,61 @@ #ifndef _LUSTRE_UPDATE_H #define _LUSTRE_UPDATE_H #include +#include -#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; - 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 void -*object_update_param_get(const struct object_update *update, int index, - int *size) +*object_update_param_get(const struct object_update *update, size_t index, + size_t *size) { const struct object_update_param *param; - int i; + size_t i; if (index >= update->ou_params_count) return NULL; @@ -98,8 +107,8 @@ static inline void static inline unsigned long object_update_request_size(const struct object_update_request *our) { - unsigned long size; - int i = 0; + unsigned long size; + size_t i = 0; size = offsetof(struct object_update_request, ourq_updates[0]); for (i = 0; i < our->ourq_count; i++) { @@ -111,62 +120,16 @@ 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, - int index, int *size) -{ - void *ptr; - int 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, int count) +object_update_reply_init(struct object_update_reply *reply, size_t count) { reply->ourp_magic = UPDATE_REPLY_MAGIC; reply->ourp_count = count; } -static inline struct object_update_result -*object_update_result_get(const struct object_update_reply *reply, - int index, int *size) -{ - char *ptr; - int count = reply->ourp_count; - int 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, int data_len, int index, + void *data, size_t data_len, size_t index, int rc) { struct object_update_result *update_result; @@ -190,11 +153,11 @@ object_update_result_insert(struct object_update_reply *reply, static inline int object_update_result_data_get(const struct object_update_reply *reply, - struct lu_buf *lbuf, int index) + struct lu_buf *lbuf, size_t index) { struct object_update_result *update_result; - int size = 0; - int result; + size_t size = 0; + int result; LASSERT(lbuf != NULL); update_result = object_update_result_get(reply, index, &size); @@ -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