22 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_CLIENT 49 ccr_tlink, ccr_tlink_magic,
55 ce_tlink, ce_tlink_magic,
100 op_grp = &
op->op_sm_group;
119 op_grp = &
op->op_sm_group;
159 lid =
obj->ob_attr.oa_layout_id;
162 obj->ob_attr.oa_layout_id = lid;
205 req->dr_ast.sa_datum =
req;
217 struct m0_fid *layout_fid;
239 struct m0_fid *layout_fid;
249 if (dix_layout ==
NULL) {
291 req->dr_ast.sa_cb = exec_fn;
292 req->dr_ast.sa_datum =
req;
332 struct m0_fid *layout_fid;
347 dmreq = &
req->dr_mreq;
351 layout_fid = (
struct m0_fid *)&
obj->ob_entity.en_id;
387 clayout =
M0_AMB(clayout, to, ccl_layout);
389 dix_cldesc = &dix_layout->
u.dl_comp_desc;
402 clayer_tlink_init_at_tail(layer, &clayout->
ccl_layers);
427 clayout =
M0_AMB(clayout, from, ccl_layout);
429 if (dix_clayers ==
NULL)
434 dix_cldesc = &dix_layout->
u.dl_comp_desc;
492 comp =
M0_AMB(comp, layout, ccl_layout);
536 struct m0_obj *sub_obj,
int priority)
546 clayout =
M0_AMB(clayout, layout, ccl_layout);
572 clayer_tlink_init(layer);
579 clayer_tlist_add_before(anchor, layer);
581 clayer_tlist_add_tail(&clayout->
ccl_layers, layer);
599 clayout =
M0_AMB(clayout, layout, ccl_layout);
611 clayer_tlist_del(layer);
641 sie_tlink, sie_tlink_magic,
658 m0_op_composite_io_bob_check(oci) &&
672 for (
i = 0;
i < nr_subobjs;
i++) {
687 for (
i =
n - 1;
i >= 0;
i--) {
688 if (cexts[
i] ==
NULL)
690 if (cexts[
i]->ce_off <= next_off )
706 for (
i = 0;
i <
n;
i++) {
707 if (cexts[
i] ==
NULL ||
708 cexts[
i]->ce_off + cexts[
i]->ce_len > off)
710 cexts[
i] = cext_tlist_next(cext_tlists[
i], cexts[
i]);
711 while (cexts[
i] !=
NULL &&
712 cexts[
i]->ce_off + cexts[
i]->ce_len <= off)
713 cexts[
i] = cext_tlist_next(cext_tlists[
i], cexts[
i]);
729 int valid_subobj_cnt = 0;
739 struct m0_tl **cext_tlists;
748 if (sio_arr ==
NULL || cext_tlists ==
NULL || cexts ==
NULL) {
755 for (
i = 0;
i < nr_subobjs;
i++) {
758 clayer_tlist_next(&clayout->
ccl_layers, layer);
763 if (cext_tlist_is_empty(tl))
767 cext_tlists[valid_subobj_cnt] = tl;
768 cexts[valid_subobj_cnt] = cext_tlist_head(tl);
769 sio_ext_tlist_init(&sio_arr[valid_subobj_cnt].si_exts);
797 for (
i = 0;
i < valid_subobj_cnt;
i++)
798 if (cexts[
i] !=
NULL && off >= cexts[
i]->ce_off)
803 if (next_off > off + len)
804 next_off = off + len;
805 len = next_off - off;
809 if (sio_ext ==
NULL) {
817 sio_ext_tlink_init_at(sio_ext, &sio_arr[
i].si_exts);
823 *out_nr_sios = valid_subobj_cnt;
845 op_grp = &
op->op_sm_group;
849 if (child_op->
op_rc != 0)
875 struct m0_op *child_op;
990 oc =
M0_AMB(oc, cop, oc_op);
991 oo =
M0_AMB(oo, oc, oo_oc);
992 oci =
M0_AMB(oci, oo, oci_oo);
997 for (
i = 0;
i < nr_subobjs;
i++) {
1047 m0_op_obj_bob_fini(oo);
1048 m0_op_composite_io_bob_fini(oci);
1067 oo =
M0_AMB(oo, oc, oo_oc);
1074 soc =
M0_AMB(soc, sop, oc_op);
1075 soo =
M0_AMB(soo, soc, oo_oc);
1076 sioo =
M0_AMB(sioo, soo, ioo_oo);
1136 entity = &
obj->ob_entity;
1141 oo =
M0_AMB(oo, oc, oo_oc);
1161 m0_op_common_bob_init(oc);
1162 m0_op_obj_bob_init(oo);
1163 m0_op_composite_io_bob_init(oci);
1198 clayout =
M0_AMB(clayout,
obj->ob_layout, ccl_layout);
1200 clayout,
args->ia_opcode,
args->ia_ext,
1201 args->ia_data, &sio_arr, &nr_sios)?:
1255 *out_klen =
sizeof *be_key;
1269 key->cek_layer_id.u_hi =
1271 key->cek_layer_id.u_lo =
1293 *out_vlen =
sizeof *be_val;
1313 bool write,
struct m0_idx *idx)
1321 fid = (write ==
true)?
1346 int *rcs, uint32_t
flags)
1358 ops[0]->op_sm.sm_rc;
1371 struct m0_tl *ext_list,
1399 cext_tlink_init_at_tail(ext, ext_list);
1402 ext = cext_tlist_tail(ext_list);
1431 if (keys ==
NULL || vals ==
NULL) {
1462 &start_key, &keys->
ov_buf[0],
1465 &idx, keys, vals, rcs,
flags);
1473 layer, keys, vals, rcs, ext_list, &max_key);
1476 else if (nr_exts == 0)
1484 else if (nr_exts < nr_kvp)
1488 for (
i = 0;
i < nr_kvp;
i++) {
1498 start_key = max_key;
1511 if (ext_list !=
NULL) {
1546 #undef M0_TRACE_SUBSYSTEM const struct m0_client_layout_ops layout_composite_ops
M0_INTERNAL int m0_uint128_cmp(const struct m0_uint128 *u0, const struct m0_uint128 *u1)
struct m0_entity * ol_entity
M0_INTERNAL void m0_ivec_cursor_init(struct m0_ivec_cursor *cur, const struct m0_indexvec *ivec)
M0_INTERNAL int m0_dix_layout_put(struct m0_dix_meta_req *req, const struct m0_fid *fid, const struct m0_dix_layout *dlay, uint32_t nr, uint32_t flags)
static void composite_io_op_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
const struct m0_bob_type oo_bobtype
M0_INTERNAL int m0_dix_layout_get(struct m0_dix_meta_req *req, const struct m0_fid *fid, uint32_t nr)
#define M0_ALLOC_ARR(arr, nr)
struct m0_op_layout * dr_ol
M0_BOB_DEFINE(static, &oci_bobtype, m0_op_composite_io)
M0_INTERNAL void m0_sm_fail(struct m0_sm *mach, int fail_state, int32_t rc)
void m0_entity_fini(struct m0_entity *entity)
M0_INTERNAL void m0_mutex_unlock(struct m0_mutex *mutex)
M0_INTERNAL int m0__obj_layout_send(struct m0_obj *obj, struct m0_op_layout *ol)
M0_INTERNAL int m0_op_get(struct m0_op **op, size_t size)
static int composite_io_divide(struct m0_client_composite_layout *clayout, enum m0_obj_opcode opcode, struct m0_indexvec *ext, struct m0_bufvec *data, struct composite_sub_io **out, int *out_nr_sios)
M0_INTERNAL int m0_indexvec_alloc(struct m0_indexvec *ivec, uint32_t len)
int const char const void size_t int flags
struct m0_sm_group * ol_sm_grp
M0_INTERNAL void m0_clink_init(struct m0_clink *link, m0_chan_cb_t cb)
M0_INTERNAL int m0_layout_op_launch(struct m0_op_layout *ol)
M0_INTERNAL void m0_clink_del(struct m0_clink *link)
M0_INTERNAL m0_bcount_t m0_ivec_cursor_step(const struct m0_ivec_cursor *cur)
M0_INTERNAL void m0_clink_del_lock(struct m0_clink *link)
static size_t locality(const struct m0_fom *fom)
void(* sa_cb)(struct m0_sm_group *grp, struct m0_sm_ast *)
const m0_time_t M0_TIME_NEVER
const struct m0_bob_type op_bobtype
void m0_op_fini(struct m0_op *op)
static struct io_request req
M0_INTERNAL bool m0_uint128_eq(const struct m0_uint128 *u0, const struct m0_uint128 *u1)
static struct m0_container composite_container
static struct m0_sm_group * grp
#define M0_LOG(level,...)
static void layout_dix_get_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
M0_INTERNAL void m0_sm_ast_post(struct m0_sm_group *grp, struct m0_sm_ast *ast)
struct m0_sm_group * oo_sm_grp
#define M0_OBJ_LAYOUT_TYPE(lid)
static int composite_layer_idx_next_query(struct m0_idx *idx, struct m0_bufvec *keys, struct m0_bufvec *vals, int *rcs, uint32_t flags)
M0_INTERNAL void m0_dix_meta_req_init(struct m0_dix_meta_req *req, struct m0_dix_cli *cli, struct m0_sm_group *grp)
M0_INTERNAL int m0_dix_req_rc(const struct m0_dix_req *req)
M0_INTERNAL int m0_op_init(struct m0_op *op, const struct m0_sm_conf *conf, struct m0_entity *entity)
M0_INTERNAL struct m0_dix_cli * ent_dixc(const struct m0_entity *ent)
M0_INTERNAL void m0_indexvec_free(struct m0_indexvec *ivec)
static int composite_sub_io_op_build(struct m0_obj *cobj, struct m0_op *cop, struct composite_sub_io *sio, struct m0_op **out)
M0_INTERNAL void * m0_bufvec_cursor_addr(struct m0_bufvec_cursor *cur)
void m0_idx_fini(struct m0_idx *idx)
struct m0_fid composite_extent_rd_idx_fid
M0_INTERNAL void m0_mutex_lock(struct m0_mutex *mutex)
const struct m0_uint128 M0_UBER_REALM
static void composite_io_op_cb_fini(struct m0_op_common *oc)
void m0_composite_layer_idx_val_from_buf(struct m0_composite_layer_idx_val *val, void *vbuf)
M0_INTERNAL int m0__obj_attr_get_sync(struct m0_obj *obj)
M0_INTERNAL uint64_t m0__obj_lid(struct m0_obj *obj)
const struct m0_uint128 M0_ID_APP
static void layout_dix_req_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
M0_INTERNAL int m0_bufvec_alloc(struct m0_bufvec *bufvec, uint32_t num_segs, m0_bcount_t seg_size)
int32_t m0_op_wait(struct m0_op *op, uint64_t bits, m0_time_t to)
int m0_idx_op(struct m0_idx *idx, enum m0_idx_opcode opcode, struct m0_bufvec *keys, struct m0_bufvec *vals, int32_t *rcs, uint32_t flags, struct m0_op **op)
static void composite_sub_io_destroy(struct composite_sub_io *sio_arr, int nr_subobjs)
int m0_obj_op(struct m0_obj *obj, enum m0_obj_opcode opcode, struct m0_indexvec *ext, struct m0_bufvec *data, struct m0_bufvec *attr, uint64_t mask, uint32_t flags, struct m0_op **op)
int(* olo_launch)(struct m0_op_layout *ol)
M0_INTERNAL struct m0_obj * m0__obj_entity(struct m0_entity *entity)
static struct m0_sm_ast ast[NR]
M0_INTERNAL void m0_bufvec_free(struct m0_bufvec *bufvec)
M0_INTERNAL void m0_sm_group_unlock(struct m0_sm_group *grp)
M0_INTERNAL bool m0_bufvec_cursor_move(struct m0_bufvec_cursor *cur, m0_bcount_t count)
enum m0_client_layout_type ml_type
M0_INTERNAL int m0__dix_layout_get_sync(struct m0_obj *obj, struct m0_dix_layout *dlayout)
static void composite_layout_put(struct m0_client_layout *layout)
M0_INTERNAL int m0_dix_layout_rep_get(struct m0_dix_meta_req *req, uint64_t idx, struct m0_dix_layout *dlay)
struct m0_sm_ast op_parent_ast
static void layout_dix_req_free(struct layout_dix_req *req)
const struct m0_bob_type oc_bobtype
void(* oc_cb_free)(struct m0_op_common *oc)
return M0_ERR(-EOPNOTSUPP)
M0_INTERNAL int m0_op_stable(struct m0_op *op)
struct m0_indexvec ioo_ext
#define M0_FID_TINIT(type, container, key)
#define M0_AMB(obj, ptr, field)
static void attr(struct m0_addb2__context *ctx, const uint64_t *v, char *buf)
#define m0_tl_teardown(name, head, obj)
void m0_composite_layer_idx_key_from_buf(struct m0_composite_layer_idx_key *key, void *kbuf)
struct m0_entity re_entity
static void layout_dix_put_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
int m0_composite_layer_idx(struct m0_uint128 layer_id, bool write, struct m0_idx *idx)
static void layout_dix_req_launch(struct layout_dix_req *req, void(*exec_fn)(struct m0_sm_group *grp, struct m0_sm_ast *ast))
static int composite_layout_get(struct m0_client_layout *layout)
static struct layout_dix_req * layout_dix_req_alloc(struct m0_sm_group *grp, struct m0_dix_cli *cli, m0_chan_cb_t cb, struct m0_op_layout *ol)
int m0_composite_layer_idx_key_to_buf(struct m0_composite_layer_idx_key *key, void **out_kbuf, m0_bcount_t *out_klen)
static int composite_sub_io_ops_build(struct m0_obj *cobj, struct m0_op *cop, struct composite_sub_io *sio_arr, int nr_subobjs)
static void layout_op_completed(struct m0_op *op)
struct m0_client_layout * ol_layout
static int composite_layout_alloc(struct m0_client_layout **out)
#define bob_of(ptr, type, field, bt)
struct m0_bufvec ioo_data
static const struct m0_bob_type oci_bobtype
M0_TL_DESCR_DEFINE(clayer, "composite layout layers", static, struct m0_composite_layer, ccr_tlink, ccr_tlink_magic, M0_CLAYER_TL_MAGIC, M0_CLAYER_TL_MAGIC)
struct m0_client_layout ccl_layout
M0_INTERNAL void m0_dix_req_lock(struct m0_dix_req *req)
void m0_op_launch(struct m0_op **op, uint32_t nr)
M0_INTERNAL int m0_dix_req_wait(struct m0_dix_req *req, uint64_t states, m0_time_t to)
M0_INTERNAL void m0_bufvec_cursor_init(struct m0_bufvec_cursor *cur, const struct m0_bufvec *bvec)
struct m0_op_common ol_oc
struct m0_uint128 cr_subobj
static bool layout_dix_req_clink_cb(struct m0_clink *cl)
void m0_composite_layer_del(struct m0_client_layout *layout, struct m0_uint128 subobj_id)
M0_INTERNAL void m0_dix_meta_req_fini(struct m0_dix_meta_req *req)
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
static int composite_layout_io_build(struct m0_io_args *args, struct m0_op **op)
static bool m0_op_composite_io_invariant(const struct m0_op_composite_io *oci)
struct m0_sm_group * lo_grp
int(* lo_alloc)(struct m0_client_layout **)
static void composite_io_op_done(struct m0_op_composite_io *oci)
void(* oc_cb_fini)(struct m0_op_common *oc)
M0_INTERNAL bool m0_ivec_cursor_move(struct m0_ivec_cursor *cur, m0_bcount_t count)
struct m0_op_common oo_oc
union m0_dix_layout::@145 u
static struct m0_stob_io io
M0_INTERNAL int m0_op_executed(struct m0_op *op)
static int composite_extents_scan_sync(struct m0_obj *obj, struct m0_client_composite_layout *clayout)
bool(* m0_chan_cb_t)(struct m0_clink *link)
static int composite_layer_idx_extents_extract(struct m0_composite_layer *layer, struct m0_bufvec *keys, struct m0_bufvec *vals, int *rcs, struct m0_tl *ext_list, struct m0_composite_layer_idx_key *max_key)
struct m0_uint128 cek_layer_id
void m0_clink_add_lock(struct m0_chan *chan, struct m0_clink *link)
static uint64_t m0_byteorder_be64_to_cpu(uint64_t big_endian_64bits)
static struct m0_client cinst
struct m0_dix_composite_layer * cld_layers
static void advance_layers_cursor(struct m0_tl *cext_tlists[], struct m0_composite_extent *cexts[], int n, m0_bindex_t off)
struct m0_uint128 ccr_subobj
int(* olo_copy_to_app)(struct m0_client_layout *to, void *data)
struct m0_realm * en_realm
struct m0_fid composite_extent_wr_idx_fid
const struct m0_op_layout_ops m0_op_layout_composite_ops
M0_INTERNAL struct m0_locality * m0_locality0_get(void)
static void layout_dix_req_fini(struct layout_dix_req *req)
struct m0_op ** oci_sub_ops
#define M0_FI_ENABLED(tag)
M0_INTERNAL struct m0_dix_cli * ol_dixc(const struct m0_op_layout *ol)
M0_INTERNAL int m0_op_failed(struct m0_op *op)
#define M0_ALLOC_PTR(ptr)
struct m0_entity * op_entity
M0_INTERNAL struct m0_locality * m0__locality_pick(struct m0_client *cinst)
int m0_composite_layer_add(struct m0_client_layout *layout, struct m0_obj *sub_obj, int priority)
M0_TL_DEFINE(clayer, static, struct m0_composite_layer)
M0_INTERNAL int m0_dix_meta_generic_rc(const struct m0_dix_meta_req *req)
static int composite_layout_get_sync(struct m0_obj *obj)
struct m0_entity ob_entity
const struct m0_op_layout_ops * ol_ops
M0_INTERNAL m0_bindex_t m0_ivec_cursor_index(const struct m0_ivec_cursor *cur)
M0_INTERNAL void m0_sm_move(struct m0_sm *mach, int32_t rc, int state)
static void layout_op_failed(struct m0_op *op, int rc)
M0_INTERNAL void m0_mutex_fini(struct m0_mutex *mutex)
M0_INTERNAL void m0_clink_fini(struct m0_clink *link)
static m0_bindex_t get_next_off(struct m0_composite_extent *cexts[], int n)
const struct m0_client_layout_ops * ml_ops
M0_INTERNAL void m0_dix_req_unlock(struct m0_dix_req *req)
void m0_obj_init(struct m0_obj *obj, struct m0_realm *parent, const struct m0_uint128 *id, uint64_t layout_id)
M0_INTERNAL void m0_sm_group_lock(struct m0_sm_group *grp)
#define M0_OBJ_LAYOUT_MAKE_LID(lid, type)
static uint64_t m0_byteorder_cpu_to_be64(uint64_t cpu_64bits)
int(* olo_copy_from_app)(struct m0_client_layout *from, void *data)
void m0_container_init(struct m0_container *con, struct m0_realm *parent, const struct m0_uint128 *id, struct m0_client *instance)
static int composite_layout_copy_from_app(struct m0_client_layout *from, void *to)
void m0_op_free(struct m0_op *op)
static int composite_io_op_init(struct m0_obj *obj, int opcode, struct m0_op *op)
static void composite_io_op_cb_launch(struct m0_op_common *oc)
static int composite_layout_copy_to_app(struct m0_client_layout *to, void *from)
M0_INTERNAL bool m0_fid_is_valid(const struct m0_fid *fid)
void(* oc_cb_launch)(struct m0_op_common *oc)
#define m0_tl_find(name, var, head,...)
#define m0_tl_for(name, head, obj)
struct m0_bufvec ioo_attr
M0_INTERNAL void m0_bufvec_free2(struct m0_bufvec *bufvec)
static int composite_layer_idx_scan(struct m0_composite_layer *layer, bool is_wr_list)
int m0_composite_layer_idx_val_to_buf(struct m0_composite_layer_idx_val *val, void **out_vbuf, m0_bcount_t *out_vlen)
struct m0_tlink sie_tlink
#define offsetof(typ, memb)
struct m0_dix_meta_req dr_mreq
M0_INTERNAL bool m0_sm_group_is_locked(const struct m0_sm_group *grp)
void m0_idx_init(struct m0_idx *idx, struct m0_realm *parent, const struct m0_uint128 *id)
struct m0_sm_conf m0_op_conf
M0_INTERNAL int m0__composite_container_init(struct m0_client *cinst)
M0_INTERNAL int m0_bufvec_empty_alloc(struct m0_bufvec *bufvec, uint32_t num_segs)
#define M0_IMPOSSIBLE(fmt,...)
M0_INTERNAL struct m0_client * m0__entity_instance(const struct m0_entity *entity)
static void composite_io_op_cb_free(struct m0_op_common *oc)