30 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_DIX 60 .sd_name =
"layout-discovery",
67 .sd_name =
"lid-discovery",
73 .sd_name =
"discovery-done",
79 .sd_name =
"idxop-meta-update",
84 .sd_name =
"in-progress",
89 .sd_name =
"resend-get-req",
93 .sd_name =
"delete-phase2",
101 .sd_name =
"failure",
172 return req->dr_sm.sm_grp;
216 req->dr_is_meta = meta;
237 return req->dr_sm.sm_state;
259 req->dr_indices[
i].dd_layout.dl_type ==
type);
303 for (
i = 0, k = 0;
rc == 0 &&
i <
req->dr_indices_nr;
i++) {
304 switch(
req->dr_indices[
i].dd_layout.dl_type) {
308 &
req->dr_indices[k].dd_layout);
312 ldesc = &
req->dr_indices[k].dd_layout.u.dl_desc;
321 req->dr_indices[
i].dd_layout.dl_type);
333 req->dr_items[k].dxi_rc = rc2;
349 req->dr_items[
i].dxi_rc == 0)) {
378 req->dr_ast.sa_datum =
req;
404 meta_req =
req->dr_meta_req;
405 for (
i = 0, k = 0;
i <
req->dr_indices_nr;
i++)
407 fids[k++] =
req->dr_indices[
i].dd_fid;
432 const struct m0_dix *src_indices,
445 for (
i = 0;
i < indices_nr;
i++) {
451 for (
i = 0;
i < indices_nr;
i++)
470 req->dr_indices_nr = indices_nr;
475 const struct m0_fid *pver_fid)
502 switch (
req->dr_type) {
535 bool del_phase2 =
false;
620 if (cas_svc->
sc_type != M0_CST_CAS) {
626 state = sdev->pd_state;
661 if (
rc == 0 && *creqs_nr == 0)
666 M0_POST(
rc == 0 ? *creqs_nr > 0 : *creqs_nr == 0);
703 sdev = &
pver->pv_mach.pm_state->pst_devices_array[
i];
710 creqs_nr, k-1, creq);
726 &
index->dd_layout.u.dl_desc);
790 for (
i = 0;
i <
req->dr_items_nr;
i++) {
792 if (
item->dxi_rc == 0) {
794 cont = cont ||
item->dxi_rc == 0;
834 req->dr_ast.sa_datum =
req;
867 meta_req =
req->dr_meta_req;
869 for (
i = 0;
i <
req->dr_items_nr;
i++) {
870 if (
req->dr_items[
i].dxi_rc == 0) {
872 fids[k] =
req->dr_orig_indices[
i].dd_fid;
873 layouts[k] =
req->dr_orig_indices[
i].dd_layout;
875 fids[k] =
req->dr_indices[
i].dd_fid;
912 req->dr_items[
i].dxi_del_phase2 :
913 req->dr_items[
i].dxi_rc == 0;
940 for (
i = 0, k = 0;
i <
req->dr_items_nr;
i++) {
947 &layout->
u.dl_desc.ld_pver);
973 if (!
req->dr_is_meta &&
1025 req->dr_items_nr = indices_nr;
1053 for (
i = 0, k = 0;
i <
req->dr_indices_nr;
i++)
1055 lids[k++] =
indices[
i].dd_layout.u.dl_id;
1056 meta_req =
req->dr_meta_req;
1094 req->dr_keys->ov_vec.v_nr);
1097 req->dr_vals->ov_vec.v_nr);
1110 switch (
req->dr_type) {
1147 req->dr_ast.sa_datum =
req;
1168 "dg_cas_reqs_nr=%" PRIu64 " dr_type=%d",
1192 uint64_t indices_nr,
1207 req->dr_items_nr = indices_nr;
1216 uint32_t indices_nr)
1227 req->dr_items_nr = indices_nr;
1273 if (*cas_rop ==
NULL)
1275 (*cas_rop)->crp_parent =
req;
1276 (*cas_rop)->crp_sdev_idx = sdev;
1277 (*cas_rop)->crp_flags =
req->dr_flags;
1278 cas_rop_tlink_init_at(*cas_rop, &rop->
dg_cas_reqs);
1280 return M0_RC_INFO(0,
"dix req=%p rop=%p cas_rop=%p sdev=%u",
1281 req, rop, *cas_rop, sdev);
1289 cas_rop_tlink_fini(cas_rop);
1307 struct m0_dix *dix = &
req->dr_indices[0];
1327 for (
i = 0;
i < keys_nr;
i++) {
1438 rep.crr_rc == -ENOENT)
1451 return item->dxi_rc != 0 &&
item->dxi_rc != -ENOENT;
1460 return item->dxi_pg_unit ==
pver->pv_attr.pa_N +
pver->pv_attr.pa_K - 1;
1490 for (
i = 0;
i <
req->dr_items_nr;
i++) {
1500 req->dr_items[
i].dxi_rc = 0;
1501 req->dr_items[
i].dxi_pg_unit++;
1611 ditem = &
req->dr_items[item_idx];
1626 bool del_phase2 =
false;
1660 }
else if (
req->dr_type ==
DIX_DEL && del_phase2) {
1662 req->dr_rop = rop_del_phase2;
1769 &cctg_id.
ci_fid, sdev_idx);
1774 &layout->
u.dl_desc);
1781 switch (
req->dr_type) {
1808 cas_rop_tlink_del_fini(cas_rop);
1884 uint64_t failed_tgt,
1885 uint32_t *spare_slot)
1911 return pver->pv_mach.pm_state->pst_max_device_failures;
1921 uint32_t *spare_slot,
1929 uint64_t spare_offset;
1938 pm_state =
pver->pv_mach.pm_state;
1947 spare = &rec_op->
dgp_units[spare_offset + slot];
1950 *spare_unit = spare;
1968 uint32_t *spare_slot,
1977 uint32_t *spare_slot,
1988 uint64_t start_unit;
1994 start_unit =
req->dr_items[rec_op->
dgp_item].dxi_pg_unit;
1996 for (
i = 0;
i < start_unit;
i++)
2013 pgu->
dpu_failed = pool_failed_devs_tlink_is_in(pd);
2028 uint32_t spare_offset;
2029 uint32_t spare_slot;
2039 switch (
req->dr_type) {
2047 &spare_slot, &spare);
2060 unit = spare_offset + spare_slot;
2071 unit = spare_offset + spare_slot;
2141 "We do not operate with spares in DTM0");
2156 " failed devices exist.");
2191 uint32_t max_failures;
2307 keys = &
map[
tgt]->crp_keys;
2308 vals = &
map[
tgt]->crp_vals;
2310 idx =
map[
tgt]->crp_cur_key;
2315 req->dr_vals->ov_vec.v_count[
item];
2347 req->dr_items_nr = keys_nr;
2348 req->dr_keys = keys;
2349 req->dr_vals = vals;
2371 req->dr_items_nr = keys_nr;
2372 req->dr_keys = keys;
2383 M0_PRE(idx < req->dr_items_nr);
2384 rep->dgr_rc =
req->dr_items[idx].dxi_rc;
2385 rep->dgr_val =
req->dr_items[idx].dxi_val;
2406 req->dr_items_nr = keys_nr;
2407 req->dr_keys = keys;
2418 const uint32_t *recs_nr,
2439 req->dr_items_nr = keys_nr;
2440 req->dr_keys = start_keys;
2443 for (
i = 0;
i < keys_nr;
i++)
2444 req->dr_recs_nr[
i] = recs_nr[
i];
2461 reps =
res->drs_reps;
2471 M0_ASSERT(key_idx < req->dr_rs.nrs_res_nr);
2472 return req->dr_rs.nrs_res[key_idx].drs_pos;
2480 return req->dr_items[idx].dxi_rc;
2506 return req->dr_items_nr;
2513 M0_PRE(idx < req->dr_items_nr);
2530 M0_PRE(key_idx < rs->nrs_res_nr);
2532 reps =
res->drs_reps;
2533 M0_PRE(val_idx < res->drs_pos);
2541 switch(
req->dr_type){
2558 for (
i = 0;
i <
req->dr_indices_nr;
i++)
2563 if (
req->dr_orig_indices !=
NULL) {
2564 for (
i = 0;
i <
req->dr_indices_nr;
i++)
2568 for (
i = 0;
i <
req->dr_items_nr;
i++)
2592 &
src->dd_layout.u.dl_desc);
2624 #undef M0_TRACE_SUBSYSTEM
M0_INTERNAL void m0_cas_req_fini(struct m0_cas_req *req)
struct m0_poolmach_state * pm_state
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 m0_bindex_t indices[ZEROVEC_UT_SEGS_NR]
static void dix_layout_find_ast_cb(struct m0_sm_group *grp, struct m0_sm_ast *ast)
struct m0_be_tx_remid ccr_remid
struct m0_dtm0_dtx * tx_dtx
M0_INTERNAL int m0_dix_layout_get(struct m0_dix_meta_req *req, const struct m0_fid *fid, uint32_t nr)
M0_INTERNAL void m0_sm_conf_init(struct m0_sm_conf *conf)
#define M0_ALLOC_ARR(arr, nr)
struct m0_dix_layout dd_layout
M0_INTERNAL void m0_dix_get_rep(const struct m0_dix_req *req, uint64_t idx, struct m0_dix_get_reply *rep)
M0_INTERNAL void m0_sm_fail(struct m0_sm *mach, int fail_state, int32_t rc)
struct m0_dix_cli * dr_cli
struct m0_rpc_session * ccr_sess
static void dix_rop_del_phase2(struct m0_dix_req *req)
static void dix_rop_failures_analyse(struct m0_dix_req *req)
uint32_t dcd_idxop_reqs_nr
struct m0_dix_pg_unit * dgp_units
M0_INTERNAL uint32_t m0_dix_liter_K(struct m0_dix_layout_iter *iter)
int const char const void size_t int flags
M0_INTERNAL int m0_dtx0_open(struct m0_dtx *dtx, uint32_t nr)
M0_INTERNAL int m0_sm_addb2_init(struct m0_sm_conf *conf, uint64_t id, uint64_t counter)
struct m0_dix_req * ds_parent
static int dix_idxop_reqs_send(struct m0_dix_req *req)
static void dix_idxop_ctx_free(struct m0_dix_idxop_ctx *idxop)
M0_INTERNAL void m0_clink_init(struct m0_clink *link, m0_chan_cb_t cb)
M0_INTERNAL void m0_clink_del(struct m0_clink *link)
M0_INTERNAL void m0_clink_del_lock(struct m0_clink *link)
struct m0_pool_version * l_pver
struct m0_dix_layout_iter dgp_iter
static void addb2_add_dix_req_attrs(const struct m0_dix_req *req)
void(* sa_cb)(struct m0_sm_group *grp, struct m0_sm_ast *)
M0_INTERNAL int m0_dix_desc_set(struct m0_dix *dix, const struct m0_dix_ldesc *desc)
static void dix_get_req_resend(struct m0_dix_req *req)
struct m0_pool_version * pm_pver
static int dix_idxop_meta_update(struct m0_dix_req *req)
M0_INTERNAL struct m0_pool_version * m0_pool_version_find(struct m0_pools_common *pc, const struct m0_fid *id)
static void dix_cas_rops_fini(struct m0_tl *cas_rops)
static struct io_request req
static struct m0_sm_group * grp
#define m0_count(var, nr,...)
struct m0_poolmach pv_mach
#define M0_LOG(level,...)
M0_INTERNAL void m0_sm_ast_post(struct m0_sm_group *grp, struct m0_sm_ast *ast)
static int dix_id_layouts_nr(struct m0_dix_req *req)
static void dix_rop_one_completed(struct m0_dix_cas_rop *crop)
static bool dix_req_is_idxop(const struct m0_dix_req *req)
struct m0_dix_linst dit_linst
M0_INTERNAL int m0_dix_ldescr_rep_get(struct m0_dix_meta_req *req, uint64_t idx, struct m0_dix_ldesc *ldesc)
M0_INTERNAL int m0_dix_next_result_prepare(struct m0_dix_req *req)
static enum m0_dix_req_state dix_req_state(const struct m0_dix_req *req)
M0_INTERNAL void m0_dix_mreq_init(struct m0_dix_req *req, struct m0_dix_cli *cli, struct m0_sm_group *grp)
M0_INTERNAL int m0_dix_delete(struct m0_dix_req *req, const struct m0_dix *indices, uint64_t indices_nr, struct m0_dtx *dtx, 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)
void m0_dix_req_cancel(struct m0_dix_req *dreq)
static void dix_layout_find(struct m0_dix_req *req)
M0_INTERNAL void m0_cas_id_fini(struct m0_cas_id *cid)
M0_INTERNAL int m0_dix_req_rc(const struct m0_dix_req *req)
M0_INTERNAL void m0_cas_get_rep(const struct m0_cas_req *req, uint64_t idx, struct m0_cas_get_reply *rep)
struct m0_dix_cas_req * dcr_creqs
M0_INTERNAL int m0_dix_item_rc(const struct m0_dix_req *req, uint64_t idx)
M0_INTERNAL int m0_dtx0_close(struct m0_dtx *dtx)
struct m0_dix_rop_ctx * dr_rop
struct m0_dix_layout ci_layout
M0_INTERNAL int m0_dix_layout_iter_init(struct m0_dix_layout_iter *iter, const struct m0_fid *index, struct m0_layout_domain *ldom, struct m0_pool_version *pver, struct m0_dix_ldesc *ldesc, struct m0_buf *key)
static struct m0_sm_group * dix_req_smgrp(const struct m0_dix_req *req)
uint32_t dgp_failed_devs_nr
M0_INTERNAL const char * m0_sm_state_name(const struct m0_sm *mach, int state)
M0_INTERNAL void m0_cas_index_create_rep(const struct m0_cas_req *req, uint64_t idx, struct m0_cas_rec_reply *rep)
#define m0_exists(var, nr,...)
static bool is_spare(uint64_t alloc_flags)
struct m0_pool_version * dcr_pver
static bool dix_item_should_be_sent(const struct m0_dix_req *req, uint32_t i)
#define container_of(ptr, type, member)
static void dix_idxop_meta_update_ast_cb(struct m0_sm_group *grp, struct m0_sm_ast *ast)
M0_ADDB2_ADD(M0_AVI_FS_CREATE, new_fid.f_container, new_fid.f_key, mode, rc)
M0_INTERNAL bool m0_sm_addb2_counter_init(struct m0_sm *sm)
void(* dx_sync_rec_update)(struct m0_dix_req *, struct m0_rpc_session *, struct m0_be_tx_remid *)
static struct m0_rpc_item * item
struct m0_fop_getxattr_rep * rep
M0_INTERNAL void m0_dix_rs_fini(struct m0_dix_next_resultset *rs)
M0_INTERNAL int m0_cas_get(struct m0_cas_req *req, struct m0_cas_id *index, const struct m0_bufvec *keys)
M0_INTERNAL void m0_dix_req_fini(struct m0_dix_req *req)
M0_INTERNAL uint32_t m0_dix_liter_S(struct m0_dix_layout_iter *iter)
static struct m0_pools_common pc
M0_INTERNAL int m0_dix_copy(struct m0_dix *dst, const struct m0_dix *src)
M0_INTERNAL void m0_dix_layout_iter_fini(struct m0_dix_layout_iter *iter)
M0_INTERNAL int m0_dix_ldesc_copy(struct m0_dix_ldesc *dst, const struct m0_dix_ldesc *src)
M0_INTERNAL int m0_sm_timedwait(struct m0_sm *mach, uint64_t states, m0_time_t deadline)
struct m0_pooldev * pst_devices_array
struct m0_cas_req crp_creq
static void dix_rop_tgt_iter_next(const struct m0_dix_req *req, struct m0_dix_rec_op *rec_op, uint64_t *target, bool *is_spare)
static bool dix_layout_find_clink_cb(struct m0_clink *cl)
M0_INTERNAL uint64_t m0_dix_req_nr(const struct m0_dix_req *req)
static uint32_t dix_rop_tgt_iter_max(struct m0_dix_req *req, struct m0_dix_rec_op *rec_op)
static struct m0_sm_ast ast[NR]
M0_INTERNAL void m0_sm_group_unlock(struct m0_sm_group *grp)
static struct m0_pool_version * dix_rec_op_pver(struct m0_dix_rec_op *rec_op)
static bool dix_idxop_clink_cb(struct m0_clink *cl)
#define M0_RC_INFO(rc, fmt,...)
static uint32_t dix_rop_max_failures(struct m0_dix_rop_ctx *rop)
static bool dix_item_get_has_failed(struct m0_dix_item *item)
M0_INTERNAL int m0_dix_layout_rep_get(struct m0_dix_meta_req *req, uint64_t idx, struct m0_dix_layout *dlay)
M0_INTERNAL int m0_dix_next(struct m0_dix_req *req, const struct m0_dix *index, const struct m0_bufvec *start_keys, const uint32_t *recs_nr, uint32_t flags)
#define M0_ERR_INFO(rc, fmt,...)
return M0_ERR(-EOPNOTSUPP)
M0_INTERNAL int m0_cas_req_generic_rc(const struct m0_cas_req *req)
M0_INTERNAL void m0_cas_req_init(struct m0_cas_req *req, struct m0_rpc_session *sess, struct m0_sm_group *grp)
uint64_t dcd_completed_nr
void m0_rpc_item_cancel(struct m0_rpc_item *item)
#define M0_AMB(obj, ptr, field)
static void dix_online_unit_choose(struct m0_dix_req *req, struct m0_dix_rec_op *rec_op)
#define m0_tl_teardown(name, head, obj)
M0_INTERNAL void m0_cas_put_rep(struct m0_cas_req *req, uint64_t idx, struct m0_cas_rec_reply *rep)
static void dix_req_state_set(struct m0_dix_req *req, enum m0_dix_req_state state)
M0_INTERNAL int m0_cas_next(struct m0_cas_req *req, struct m0_cas_id *index, struct m0_bufvec *start_keys, uint32_t *recs_nr, uint32_t flags)
static void dix_item_rc_update(struct m0_dix_req *req, struct m0_cas_req *creq, uint64_t key_idx, struct m0_dix_item *ditem)
M0_INTERNAL int m0_dix_get(struct m0_dix_req *req, const struct m0_dix *index, const struct m0_bufvec *keys)
static int dix_resolved_nr(struct m0_dix_req *req)
M0_INTERNAL uint32_t m0_dix_liter_spare_offset(struct m0_dix_layout_iter *iter)
M0_INTERNAL void m0_dix_layout_iter_next(struct m0_dix_layout_iter *iter, uint64_t *tgt)
static void dix_cas_rop_fini(struct m0_dix_cas_rop *cas_rop)
static int dix_cas_rops_send(struct m0_dix_req *req)
static int dix_cas_rops_fill(struct m0_dix_req *req)
void m0_sm_state_set(struct m0_sm *mach, int state)
M0_INTERNAL int m0_dix_ldescr_get(struct m0_dix_meta_req *req, const uint64_t *lid, uint32_t nr)
struct m0_dix_idxop_ctx dr_idxop
M0_INTERNAL int m0_dix_meta_item_rc(const struct m0_dix_meta_req *req, uint64_t idx)
struct m0_bufvec crp_keys
M0_INTERNAL void m0_dix_req_lock(struct m0_dix_req *req)
M0_INTERNAL void m0_dix_req_init(struct m0_dix_req *req, struct m0_dix_cli *cli, struct m0_sm_group *grp)
M0_INTERNAL int m0_dix_req_wait(struct m0_dix_req *req, uint64_t states, m0_time_t to)
static void dix_discovery(struct m0_dix_req *req)
enum m0_conf_service_type sc_type
M0_INTERNAL int m0_dix_sm_conf_init(void)
static bool dix_del_phase2_is_needed(const struct m0_dix_rec_op *rec_op)
M0_INTERNAL int m0_cas_del(struct m0_cas_req *req, struct m0_cas_id *index, struct m0_bufvec *keys, struct m0_dtx *dtx, uint32_t flags)
M0_INTERNAL uint32_t m0_dix_liter_unit_classify(struct m0_dix_layout_iter *iter, uint64_t unit)
struct m0_sm_group * sm_grp
M0_INTERNAL void m0_dix_meta_req_fini(struct m0_dix_meta_req *req)
static void dix__rop(struct m0_dix_req *req, const struct m0_bufvec *keys, uint64_t *indices)
static void dix_rop_failed_unit_tgt(struct m0_dix_req *req, struct m0_dix_rec_op *rec_op, uint64_t unit)
M0_TL_DEFINE(cas_rop, M0_INTERNAL, struct m0_dix_cas_rop)
M0_INTERNAL void m0_sm_addb2_fini(struct m0_sm_conf *conf)
static bool dix_item_parity_unit_is_last(const struct m0_dix_req *req, const struct m0_dix_item *item)
static int dix_type_layouts_nr(struct m0_dix_req *req, enum dix_layout_type type)
static void dix_cas_rop_rc_update(struct m0_dix_cas_rop *cas_rop, int rc)
M0_INTERNAL void m0_dix_req_fini_lock(struct m0_dix_req *req)
M0_INTERNAL int m0_cas_index_create(struct m0_cas_req *req, const struct m0_cas_id *cids, uint64_t cids_nr, struct m0_dtx *dtx)
struct m0_bufvec crp_vals
struct m0_dix_cas_rop ** dg_target_rop
struct m0_dix_idxop_req * dcd_idxop_reqs
static struct m0_sm_trans_descr dix_req_trans[]
M0_INTERNAL void m0_buf_free(struct m0_buf *buf)
static const struct m0_fid fids[]
static void dix_rop_completed(struct m0_sm_group *grp, struct m0_sm_ast *ast)
struct m0_pool_device_to_service * pc_dev2svc
M0_INTERNAL int m0_dix_create(struct m0_dix_req *req, const struct m0_dix *indices, uint32_t indices_nr, struct m0_dtx *dtx, uint32_t flags)
union m0_dix_layout::@145 u
static int dix_rop_ctx_init(struct m0_dix_req *req, struct m0_dix_rop_ctx *rop, const struct m0_bufvec *keys, uint64_t *indices)
struct m0_layout_domain * dx_ldom
static bool dix_cas_rop_clink_cb(struct m0_clink *cl)
static int dix_spare_target_with_data(struct m0_dix_rec_op *rec_op, const struct m0_dix_pg_unit *failed_unit, uint32_t *spare_slot, struct m0_dix_pg_unit **spare_unit)
static struct m0_pool pool
M0_INTERNAL void m0_dix_layout_iter_reset(struct m0_dix_layout_iter *iter)
M0_INTERNAL int m0_cas_index_delete(struct m0_cas_req *req, const struct m0_cas_id *cids, uint64_t cids_nr, struct m0_dtx *dtx, uint32_t flags)
M0_INTERNAL struct m0_layout * m0_pdl_to_layout(struct m0_pdclust_layout *pl)
struct m0_reqh_service_ctx * pds_ctx
M0_INTERNAL void m0_dix_ldesc_fini(struct m0_dix_ldesc *ld)
#define m0_forall(var, nr,...)
void m0_clink_add_lock(struct m0_chan *chan, struct m0_clink *link)
struct m0_clink crp_clink
static int dix_rop_del_phase2_rop(struct m0_dix_req *req, struct m0_dix_rop_ctx **out)
struct m0_dix_rec_op * dg_rec_ops
struct m0_pdclust_tgt_addr tgt
M0_INTERNAL void m0_cas_index_delete_rep(const struct m0_cas_req *req, uint64_t idx, struct m0_cas_rec_reply *rep)
static void dix_rec_op_fini(struct m0_dix_rec_op *rec_op)
static void dix_req_failure(struct m0_dix_req *req, int32_t rc)
M0_INTERNAL void m0_cas_del_rep(struct m0_cas_req *req, uint64_t idx, struct m0_cas_rec_reply *rep)
M0_INTERNAL void m0_dtx0_executed(struct m0_dtx *dtx, uint32_t pa_idx)
static void dix_discovery_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
M0_INTERNAL int m0_dtx0_fid_assign(struct m0_dtx *dtx, uint32_t pa_idx, const struct m0_fid *pa_sfid)
static int dix_indices_copy(struct m0_dix **dst_indices, const struct m0_dix *src_indices, uint32_t indices_nr)
struct m0_sm_conf dix_req_sm_conf
static void dix_idxop(struct m0_dix_req *req)
struct m0_pool_version * dg_pver
M0_INTERNAL void m0_dtx0_fop_assign(struct m0_dtx *dtx, uint32_t pa_idx, const struct m0_fop *pa_fop)
M0_INTERNAL void m0_sm_init(struct m0_sm *mach, const struct m0_sm_conf *conf, uint32_t state, struct m0_sm_group *grp)
struct m0_dix_crop_attrs * crp_attrs
uint32_t psu_device_index
M0_INTERNAL int m0_cas_index_lookup(struct m0_cas_req *req, const struct m0_cas_id *cids, uint64_t cids_nr)
static int dix_req_indices_copy(struct m0_dix_req *req, const struct m0_dix *indices, uint32_t indices_nr)
M0_INTERNAL void m0_dix_sm_conf_fini(void)
static int dix_spare_slot_find(struct m0_poolmach_state *pm_state, uint64_t failed_tgt, uint32_t *spare_slot)
static int dix__spare_target(struct m0_dix_rec_op *rec_op, const struct m0_dix_pg_unit *failed_unit, uint32_t *spare_slot, struct m0_dix_pg_unit **spare_unit, bool with_data)
#define M0_ALLOC_PTR(ptr)
M0_INTERNAL void m0_clink_add(struct m0_chan *chan, struct m0_clink *link)
static uint32_t dix_rec_op_spare_offset(struct m0_dix_rec_op *rec_op)
static void dix_rop(struct m0_dix_req *req)
static void dix_rop_tgt_iter_begin(const struct m0_dix_req *req, struct m0_dix_rec_op *rec_op)
static void dix_req_init(struct m0_dix_req *req, struct m0_dix_cli *cli, struct m0_sm_group *grp, bool meta)
M0_INTERNAL int m0_dix_del(struct m0_dix_req *req, const struct m0_dix *index, const struct m0_bufvec *keys, struct m0_dtx *dtx, uint32_t flags)
static void dix_ldescr_resolve(struct m0_dix_req *req)
static void dix_discovery_completed(struct m0_dix_req *req)
M0_INTERNAL int m0_dix_meta_generic_rc(const struct m0_dix_meta_req *req)
static int dix_rec_op_init(struct m0_dix_rec_op *rec_op, struct m0_dix_req *req, struct m0_dix_cli *cli, struct m0_pool_version *pver, struct m0_dix *dix, struct m0_buf *key, uint64_t user_item)
M0_INTERNAL int m0_cas_put(struct m0_cas_req *req, struct m0_cas_id *index, const struct m0_bufvec *keys, const struct m0_bufvec *values, struct m0_dtx *dtx, uint32_t flags)
static struct m0_sm_state_descr dix_req_states[]
static void dix_to_cas_map(const struct m0_dix_req *dreq, const struct m0_cas_req *creq)
M0_TL_DESCR_DEFINE(cas_rop, "cas record operations", M0_INTERNAL, struct m0_dix_cas_rop, crp_linkage, crp_magix, M0_DIX_ROP_MAGIC, M0_DIX_ROP_HEAD_MAGIC)
M0_INTERNAL uint32_t m0_dix_liter_N(struct m0_dix_layout_iter *iter)
static int dix_cas_rops_alloc(struct m0_dix_req *req)
static int dix_cas_rop_alloc(struct m0_dix_req *req, uint32_t sdev, struct m0_dix_cas_rop **cas_rop)
M0_INTERNAL void m0_clink_fini(struct m0_clink *link)
static struct m0_fop * fop
M0_INTERNAL void m0_rwlock_read_lock(struct m0_rwlock *lock)
M0_INTERNAL void m0_dix_req_unlock(struct m0_dix_req *req)
M0_INTERNAL int m0_dix_meta_req_nr(const struct m0_dix_meta_req *req)
M0_INTERNAL void m0_sm_group_lock(struct m0_sm_group *grp)
M0_INTERNAL void m0_dix_get_rep_mlock(struct m0_dix_req *req, uint64_t idx)
static void dix_idxop_completed(struct m0_sm_group *grp, struct m0_sm_ast *ast)
struct m0_pdclust_layout * li_pl
#define M0_ASSERT_INFO(cond, fmt,...)
static void dix_idxop_item_rc_update(struct m0_dix_item *ditem, struct m0_dix_req *req, const struct m0_dix_cas_req *creq)
M0_INTERNAL void m0_cas_rep_mlock(const struct m0_cas_req *req, uint64_t idx)
struct m0_rpc_session rlk_sess
M0_INTERNAL int m0_dix_layout_del(struct m0_dix_meta_req *req, const struct m0_fid *fid, uint32_t nr)
M0_INTERNAL struct m0_pool_version * m0_dix_pver(const struct m0_dix_cli *cli, const struct m0_dix *dix)
static void dix_rop_ctx_fini(struct m0_dix_rop_ctx *rop)
struct m0_dix * dr_indices
struct m0_cas_req ds_creq
M0_INTERNAL void m0_rwlock_read_unlock(struct m0_rwlock *lock)
static struct m0_pool_version * dix_pver_find(const struct m0_dix_req *req, const struct m0_fid *pver_fid)
enum dix_req_type dr_type
static void dix_item_fini(const struct m0_dix_req *req, struct m0_dix_item *item)
static void dix_to_mdix_map(const struct m0_dix_req *req, const struct m0_dix_meta_req *mreq)
M0_INTERNAL void m0_sm_conf_fini(struct m0_sm_conf *conf)
M0_INTERNAL void m0_dix_next_rep_mlock(struct m0_dix_req *req, uint32_t key_idx, uint32_t val_idx)
struct m0_rpc_link sc_rlink
struct m0_dix_next_results * nrs_res
static void dix_rop_units_set(struct m0_dix_req *req)
static int dix_unknown_layouts_nr(struct m0_dix_req *req)
M0_INTERNAL void m0_dix_next_rep(const struct m0_dix_req *req, uint64_t key_idx, uint64_t val_idx, struct m0_dix_next_reply *rep)
M0_INTERNAL uint64_t m0_sm_id_get(const struct m0_sm *sm)
M0_INTERNAL bool m0_dix_req_is_locked(const struct m0_dix_req *req)
#define m0_tl_for(name, head, obj)
static bool dix_idxop_meta_update_clink_cb(struct m0_clink *cl)
M0_INTERNAL uint32_t m0_dix_next_rep_nr(const struct m0_dix_req *req, uint64_t key_idx)
struct m0_rpc_item f_item
static int dix_spare_target(struct m0_dix_rec_op *rec_op, const struct m0_dix_pg_unit *failed_unit, uint32_t *spare_slot, struct m0_dix_pg_unit **spare_unit)
#define M0_BUF_INIT(size, data)
struct m0_pdclust_attr pv_attr
struct m0_pdclust_src_addr src
M0_INTERNAL void m0_bufvec_free2(struct m0_bufvec *bufvec)
static void dix_pg_unit_pd_assign(struct m0_dix_pg_unit *pgu, struct m0_pooldev *pd)
M0_INTERNAL void m0_dix_fid_convert_dix2cctg(const struct m0_fid *dix_fid, struct m0_fid *cctg_fid, uint32_t device_id)
M0_INTERNAL uint32_t m0_dix_liter_P(struct m0_dix_layout_iter *iter)
struct m0_pool_spare_usage * pst_spare_usage_array
static bool dix_pg_unit_skip(struct m0_dix_req *req, struct m0_dix_pg_unit *unit)
M0_INTERNAL void m0_cas_index_lookup_rep(const struct m0_cas_req *req, uint64_t idx, struct m0_cas_rec_reply *rep)
M0_INTERNAL int m0_dix_cctgs_lookup(struct m0_dix_req *req, const struct m0_dix *indices, uint32_t indices_nr)
M0_INTERNAL bool m0_sm_group_is_locked(const struct m0_sm_group *grp)
static struct m0_sm_state_descr states[C_NR]
struct m0_dix_req * crp_parent
M0_INTERNAL int m0_dix_put(struct m0_dix_req *req, const struct m0_dix *index, const struct m0_bufvec *keys, const struct m0_bufvec *vals, struct m0_dtx *dtx, uint32_t flags)
M0_INTERNAL struct m0_pooldev * m0_dix_tgt2sdev(struct m0_dix_linst *linst, uint64_t tgt)
M0_INTERNAL void m0_dix_fini(struct m0_dix *dix)
M0_INTERNAL int m0_bufvec_empty_alloc(struct m0_bufvec *bufvec, uint32_t num_segs)
static int dix_idxop_pver_analyse(struct m0_dix_idxop_req *idxop_req, struct m0_dix_req *dreq, uint64_t *creqs_nr)
enum m0_pool_nd_state dpu_pd_state
M0_INTERNAL int m0_dix_generic_rc(const struct m0_dix_req *req)
#define m0_tl_forall(name, var, head,...)
static int dix_idxop_req_send(struct m0_dix_idxop_req *idxop_req, struct m0_dix_req *dreq, uint64_t *reqs_acc)
#define M0_IMPOSSIBLE(fmt,...)
M0_INTERNAL void m0_sm_fini(struct m0_sm *mach)
struct m0_tl po_failed_devices