Motr  M0
io_service.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012-2020 Seagate Technology LLC and/or its Affiliates
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  * For any questions about this software or licensing,
17  * please email opensource@seagate.com or cortx-questions@seagate.com.
18  *
19  */
20 
21 
27 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_IOSERVICE
28 #include "lib/trace.h"
29 
30 #include "lib/errno.h"
31 #include "lib/memory.h"
32 #include "lib/tlist.h"
33 #include "lib/locality.h"
34 #include "lib/misc.h"
35 #include "motr/magic.h"
36 #include "rpc/rpc.h"
37 #include "rpc/rpclib.h"
38 #include "net/buffer_pool.h"
39 #include "reqh/reqh_service.h"
40 #include "reqh/reqh.h"
41 #include "ioservice/io_fops.h"
42 #include "ioservice/io_service.h"
43 #include "ioservice/ios_start_sm.h"
44 #include "pool/pool.h"
45 #include "net/lnet/lnet.h"
46 #include "mdservice/md_fops.h"
47 #include "layout/layout.h"
48 #include "layout/pdclust.h"
49 #include "mdservice/fsync_fops.h"
50 #include "module/instance.h" /* m0_get */
51 #include "ioservice/fid_convert.h" /* m0_fid_convert_gob2cob */
52 
53 M0_TL_DESCR_DEFINE(bufferpools, "rpc machines associated with reqh",
54  M0_INTERNAL,
55  struct m0_rios_buffer_pool, rios_bp_linkage, rios_bp_magic,
57 M0_TL_DEFINE(bufferpools, M0_INTERNAL, struct m0_rios_buffer_pool);
58 
59 
66 static uint32_t ios_net_buffer_pool_size = 32;
67 
71 static unsigned ios_mds_conn_key = 0;
72 
73 static int ios_allocate(struct m0_reqh_service **service,
74  const struct m0_reqh_service_type *stype);
75 static void ios_fini(struct m0_reqh_service *service);
76 
77 static int ios_start(struct m0_reqh_service *service);
78 static int ios_start_async(struct m0_reqh_service_start_async_ctx *asc);
79 static bool ios_start_async_cb(struct m0_clink *clink);
80 static void ios_prepare_to_stop(struct m0_reqh_service *service);
81 static void ios_stop(struct m0_reqh_service *service);
82 
83 static void buffer_pool_not_empty(struct m0_net_buffer_pool *bp);
84 static void buffer_pool_low(struct m0_net_buffer_pool *bp);
85 
89 static const struct m0_reqh_service_type_ops ios_type_ops = {
91 };
92 
96 static const struct m0_reqh_service_ops ios_ops = {
98  .rso_start_async = ios_start_async,
99  .rso_prepare_to_stop = ios_prepare_to_stop,
100  .rso_stop = ios_stop,
101  .rso_fini = ios_fini
102 };
103 
109  .nbpo_below_threshold = buffer_pool_low,
110 };
111 
113  .rst_name = "M0_CST_IOS",
114  .rst_ops = &ios_type_ops,
115  .rst_level = M0_RS_LEVEL_NORMAL,
116  .rst_typecode = M0_CST_IOS,
117 };
118 
128 {
129  struct m0_rios_buffer_pool *buffer_desc;
130 
131  M0_PRE(bp != NULL);
132 
133  buffer_desc = container_of(bp, struct m0_rios_buffer_pool, rios_bp);
134  m0_chan_signal(&buffer_desc->rios_bp_wait);
135 }
136 
146 {
147  /*
148  * Currently ioservice is ignoring this signal.
149  * But in future io_service may grow
150  * buffer pool depending on some policy.
151  */
152 }
153 
158 M0_INTERNAL int m0_ios_register(void)
159 {
160  int rc;
161 
163  if (rc != 0)
164  return M0_ERR_INFO(rc, "Unable to initialize fops");
166  m0_get()->i_ios_cdom_key = m0_reqh_lockers_allot();
167  ios_mds_conn_key = m0_reqh_lockers_allot();
168  return M0_RC(rc);
169 }
170 
174 M0_INTERNAL void m0_ios_unregister(void)
175 {
176  m0_reqh_lockers_free(ios_mds_conn_key);
177  m0_reqh_lockers_free(m0_get()->i_ios_cdom_key);
178 
181 }
182 
184  *rios)
185 {
186  return rios->rios_magic == M0_IOS_REQH_SVC_MAGIC;
187 }
188 
203 {
204  int nbuffs;
205  int colours;
206  int rc = 0;
207  struct m0_rpc_machine *rpcmach;
208  struct m0_reqh_io_service *serv_obj;
209  m0_bcount_t segment_size;
210  uint32_t segments_nr;
211  struct m0_reqh *reqh;
212 
213  serv_obj = container_of(service, struct m0_reqh_io_service, rios_gen);
215 
216  reqh = service->rs_reqh;
218  m0_tl_for(m0_reqh_rpc_mach, &reqh->rh_rpc_machines, rpcmach) {
219  M0_ASSERT(m0_rpc_machine_bob_check(rpcmach));
220  struct m0_rios_buffer_pool *newbp;
221  /*
222  * Check buffer pool for network domain of rpc_machine
223  */
224  if (m0_tl_exists(bufferpools, bp, &serv_obj->rios_buffer_pools,
225  bp->rios_ndom == rpcmach->rm_tm.ntm_dom))
226  continue;
227 
228  /* Buffer pool for network domain not found, create one */
229  M0_ALLOC_PTR(newbp);
230  if (newbp == NULL)
231  return M0_ERR(-ENOMEM);
232 
233  newbp->rios_ndom = rpcmach->rm_tm.ntm_dom;
235 
236  colours = m0_list_length(&newbp->rios_ndom->nd_tms);
237 
239  newbp->rios_ndom);
241  newbp->rios_ndom);
242 
243  M0_LOG(M0_DEBUG, "ios segments_nr=%d", segments_nr);
245  newbp->rios_ndom,
247  segments_nr, segment_size,
248  colours, M0_0VEC_SHIFT,
249  /* dont_dump */true);
250  if (rc != 0) {
251  m0_free(newbp);
252  break;
253  }
254 
255  newbp->rios_bp.nbp_ops = &buffer_pool_ops;
256  /*
257  * Initialise channel for sending availability of buffers
258  * with buffer pool to I/O FOMs.
259  */
260  m0_chan_init(&newbp->rios_bp_wait, &newbp->rios_bp.nbp_mutex);
261 
262  /* Pre-allocate network buffers */
264  nbuffs = m0_net_buffer_pool_provision(&newbp->rios_bp,
267  if (nbuffs < ios_net_buffer_pool_size) {
268  rc = -ENOMEM;
271  m0_free(newbp);
272  break;
273  }
274 
275  bufferpools_tlink_init(newbp);
276  bufferpools_tlist_add(&serv_obj->rios_buffer_pools, newbp);
277 
278  } m0_tl_endfor; /* rpc_machines */
280 
281  return M0_RC(rc);
282 }
283 
293 {
294  struct m0_reqh_io_service *serv_obj;
295  struct m0_rios_buffer_pool *bp;
296 
297  M0_PRE(service != NULL);
298 
299  serv_obj = container_of(service, struct m0_reqh_io_service, rios_gen);
301 
302  m0_tl_for(bufferpools, &serv_obj->rios_buffer_pools, bp) {
303 
304  M0_ASSERT(bp != NULL);
305 
306  m0_chan_fini_lock(&bp->rios_bp_wait);
307  bufferpools_tlink_del_fini(bp);
308  m0_net_buffer_pool_fini(&bp->rios_bp);
309  m0_free(bp);
310 
311  } m0_tl_endfor; /* bufferpools */
312 
313  bufferpools_tlist_fini(&serv_obj->rios_buffer_pools);
314 }
315 
327  const struct m0_reqh_service_type *stype)
328 {
329  struct m0_reqh_io_service *ios;
330 
331  M0_PRE(service != NULL && stype != NULL);
332 
333  M0_ALLOC_PTR(ios);
334  if (ios == NULL)
335  return M0_ERR(-ENOMEM);
336 
337  bufferpools_tlist_init(&ios->rios_buffer_pools);
339 
340  *service = &ios->rios_gen;
341  (*service)->rs_ops = &ios_ops;
342 
343  return 0;
344 }
345 
354 static void ios_fini(struct m0_reqh_service *service)
355 {
356  struct m0_reqh_io_service *serv_obj;
357 
358  M0_PRE(service != NULL);
359 
360  serv_obj = container_of(service, struct m0_reqh_io_service, rios_gen);
362 
363  m0_free(serv_obj);
364 }
365 
366 static int ios_start(struct m0_reqh_service *service)
367 {
368  int rc;
369  struct m0_reqh_io_service *iosvc;
370  struct m0_sm_group *sm_grp = m0_locality0_get()->lo_grp;
371 
372  M0_PRE(service != NULL);
373 
374  iosvc = container_of(service, struct m0_reqh_io_service, rios_gen);
375  rc = m0_ios_start_sm_init(&iosvc->rios_sm, &iosvc->rios_gen, sm_grp);
376  if (rc != 0)
377  return M0_ERR(rc);
378 
379  m0_ios_start_sm_exec(&iosvc->rios_sm);
380  m0_ios_start_lock(&iosvc->rios_sm);
381  rc = m0_sm_timedwait(&iosvc->rios_sm.ism_sm,
384  M0_TIME_NEVER);
385  m0_ios_start_unlock(&iosvc->rios_sm);
386  rc = rc ?: iosvc->rios_sm.ism_sm.sm_rc;
387  iosvc->rios_cdom = (rc == 0) ? iosvc->rios_sm.ism_dom : NULL;
388  m0_sm_group_lock(sm_grp);
389  m0_ios_start_sm_fini(&iosvc->rios_sm);
390  m0_sm_group_unlock(sm_grp);
391  M0_LOG(M0_DEBUG, "io cob domain %p", iosvc->rios_cdom);
392  return M0_RC(rc);
393 }
394 
396 {
397  struct m0_reqh_service *service = asc->sac_service;
398  struct m0_reqh_io_service *serv_obj;
399  struct m0_sm_group *grp = m0_locality0_get()->lo_grp;
400 
401  M0_ENTRY();
402  M0_PRE(service != NULL);
404 
405  serv_obj = container_of(service, struct m0_reqh_io_service, rios_gen);
406 
407  asc->sac_rc = m0_ios_start_sm_init(&serv_obj->rios_sm, service, grp);
408  if (asc->sac_rc != 0) {
409  m0_fom_wakeup(asc->sac_fom);
410  return M0_ERR(asc->sac_rc);
411  }
412 
413  serv_obj->rios_fom = asc->sac_fom;
416  &serv_obj->rios_clink);
417  m0_ios_start_sm_exec(&serv_obj->rios_sm);
418  return M0_RC(0);
419 }
420 
421 static bool ios_start_async_cb(struct m0_clink *clink)
422 {
423  struct m0_reqh_io_service *iosvc;
424  struct m0_ios_start_sm *ios_sm;
425  int rc;
426 
427  iosvc = container_of(clink, struct m0_reqh_io_service, rios_clink);
428  ios_sm = &iosvc->rios_sm;
429  if (M0_IN(ios_sm->ism_sm.sm_state,
433  rc = ios_sm->ism_sm.sm_rc;
434  iosvc->rios_cdom = (rc == 0) ? ios_sm->ism_dom : NULL;
435  m0_ios_start_sm_fini(ios_sm);
436  m0_fom_wakeup(iosvc->rios_fom);
437  }
438  return true;
439 }
440 
442 {
443  M0_LOG(M0_DEBUG, "ioservice PREPARE ......");
445  M0_LOG(M0_DEBUG, "ioservice PREPARE STOPPED");
446 }
447 
448 static void ios_stop(struct m0_reqh_service *service)
449 {
450  M0_PRE(service != NULL);
451 
454  m0_reqh_lockers_clear(service->rs_reqh, m0_get()->i_ios_cdom_key);
455  M0_LOG(M0_DEBUG, "ioservice STOPPED");
456 }
457 
463 M0_INTERNAL void m0_ios_cdom_get(struct m0_reqh *reqh,
464  struct m0_cob_domain **out)
465 {
466  M0_PRE(reqh != NULL);
467 
469  *out = m0_reqh_lockers_get(reqh, m0_get()->i_ios_cdom_key);
470  M0_ASSERT(*out != NULL);
472 }
473 
474 M0_INTERNAL void m0_ios_cdom_fini(struct m0_reqh *reqh)
475 {
476  struct m0_cob_domain *cdom;
477 
478  M0_PRE(reqh != NULL);
479 
481  cdom = m0_reqh_lockers_get(reqh, m0_get()->i_ios_cdom_key);
484 }
485 
486 enum {
487  RPC_TIMEOUT = 8, /* seconds */
489 };
490 
491 M0_TL_DESCR_DECLARE(cs_eps, extern);
492 M0_TL_DECLARE(cs_eps, M0_INTERNAL, struct cs_endpoint_and_xprt);
493 
494 static int m0_ios_mds_conn_init(struct m0_reqh *reqh,
495  struct m0_ios_mds_conn_map *conn_map)
496 {
497  struct m0_motr *motr;
498  struct m0_rpc_machine *rpc_machine;
499  const char *srv_ep_addr;
500  struct cs_endpoint_and_xprt *ep;
501  int rc = 0;
502  struct m0_ios_mds_conn *conn;
503  M0_ENTRY();
504 
505  M0_PRE(reqh != NULL);
507  rpc_machine = m0_reqh_rpc_mach_tlist_head(&reqh->rh_rpc_machines);
508  M0_ASSERT(motr != NULL);
510  conn_map->imc_nr = 0;
511 
512  m0_tl_for(cs_eps, &motr->cc_mds_eps, ep) {
513  M0_ASSERT(cs_endpoint_and_xprt_bob_check(ep));
514  M0_ASSERT(ep->ex_scrbuf != NULL);
515  srv_ep_addr = ep->ex_endpoint;
516  M0_LOG(M0_DEBUG, "Ios connecting to mds %s", srv_ep_addr);
517 
519  if (conn == NULL)
520  return M0_RC(-ENOMEM);
521 
522  rc = m0_rpc_client_find_connect(&conn->imc_conn,
523  &conn->imc_session,
525  M0_CST_MDS,
527  M0_TIME_NEVER);
528  if (rc == 0) {
529  conn->imc_connected = true;
530  M0_LOG(M0_DEBUG, "Ios connected to mds %s",
531  srv_ep_addr);
532  } else {
533  conn->imc_connected = false;
534  M0_LOG(M0_ERROR, "Ios could not connect to mds %s: "
535  "rc = %d",
536  srv_ep_addr, rc);
537  }
538  M0_LOG(M0_DEBUG, "ios connected to mds: conn=%p ep=%s rc=%d "
539  "index=%d", conn, srv_ep_addr, rc,
540  conn_map->imc_nr);
541  conn_map->imc_map[conn_map->imc_nr ++] = conn;
542  M0_ASSERT(conn_map->imc_nr <= M0T1FS_MAX_NR_MDS);
543  } m0_tl_endfor;
544  return M0_RC(rc);
545 }
546 
547 /* Assumes that reqh->rh_rwlock is locked for writing. */
549  struct m0_ios_mds_conn_map **out,
550  bool *new)
551 {
552  M0_PRE(ios_mds_conn_key != 0);
553 
554  *new = false;
555  *out = m0_reqh_lockers_get(reqh, ios_mds_conn_key);
556  if (*out != NULL)
557  return 0;
558 
559  M0_ALLOC_PTR(*out);
560  if (*out == NULL)
561  return M0_ERR(-ENOMEM);
562  *new = true;
563 
564  m0_reqh_lockers_set(reqh, ios_mds_conn_key, *out);
565  M0_LOG(M0_DEBUG, "key init for reqh=%p, key=%d", reqh,
567  return 0;
568 }
569 
579 static int m0_ios_mds_conn_get(struct m0_reqh *reqh,
580  struct m0_ios_mds_conn_map **out)
581 {
582  int rc;
583  bool new;
584 
585  M0_ENTRY("reqh %p", reqh);
586  M0_PRE(reqh != NULL);
587 
591 
592  if (new) {
593  M0_ASSERT(rc == 0);
595  }
596  return M0_RC(rc);
597 }
598 
599 static struct m0_ios_mds_conn *
601  const struct m0_fid *gfid)
602 {
603  struct m0_fid fid = *gfid;
604  unsigned int hash;
605 
606  m0_fid_tchange(&fid, 0);
607  hash = m0_fid_hash(&fid);
608  M0_LOG(M0_DEBUG, "%d nr=%d" FID_F,
609  hash % imc_map->imc_nr,
610  imc_map->imc_nr, FID_P(gfid));
611  return imc_map->imc_map[hash % imc_map->imc_nr];
612 }
613 
617 M0_INTERNAL void m0_ios_mds_conn_fini(struct m0_reqh *reqh)
618 {
620  struct m0_ios_mds_conn *imc;
621  int rc;
622  M0_PRE(reqh != NULL);
623  M0_PRE(ios_mds_conn_key != 0);
624 
626  imc_map = m0_reqh_lockers_get(reqh, ios_mds_conn_key);
627  if (imc_map != NULL)
628  m0_reqh_lockers_clear(reqh, ios_mds_conn_key);
630 
631  while (imc_map != NULL && imc_map->imc_nr > 0) {
632  imc = imc_map->imc_map[--imc_map->imc_nr];
633  M0_LOG(M0_DEBUG, "imc conn fini in reqh = %p, imc = %p",
634  reqh, imc);
635  if (imc != NULL && imc->imc_connected) {
636  M0_LOG(M0_DEBUG, "destroy session for %p", imc);
638  M0_TIME_NEVER);
639  if (rc != 0)
641  "Failed to terminate session %d", rc);
642 
643  M0_LOG(M0_DEBUG, "destroy conn for %p", imc);
645  if (rc != 0)
647  "Failed to terminate connection %d", rc);
648  }
649  m0_free(imc); /* free(NULL) is OK */
650  }
651  m0_free(imc_map); /* free(NULL) is OK */
652 }
653 
663 M0_INTERNAL int m0_ios_mds_getattr(struct m0_reqh *reqh,
664  const struct m0_fid *gfid,
665  struct m0_cob_attr *attr)
666 {
668  struct m0_ios_mds_conn *imc;
669  struct m0_fop *req;
670  struct m0_fop *rep;
671  struct m0_fop_getattr *getattr;
672  struct m0_fop_getattr_rep *getattr_rep;
673  struct m0_fop_cob *req_fop_cob;
674  struct m0_fop_cob *rep_fop_cob;
675  int rc;
676 
677  rc = m0_ios_mds_conn_get(reqh, &imc_map);
678  if (rc != 0)
679  return M0_RC(rc);
680 
681  imc = m0_ios_mds_conn_map_hash(imc_map, gfid);
682  if (!imc->imc_connected)
683  return M0_ERR(-ENODEV);
684 
686  if (req == NULL)
687  return M0_ERR(-ENOMEM);
688 
689  getattr = m0_fop_data(req);
690  req_fop_cob = &getattr->g_body;
691  req_fop_cob->b_tfid = *gfid;
692 
693  M0_LOG(M0_DEBUG, "ios getattr for "FID_F, FID_P(gfid));
694  rc = m0_rpc_post_sync(req, &imc->imc_session, NULL, 0);
695  M0_LOG(M0_DEBUG, "ios getattr for "FID_F" rc: %d", FID_P(gfid), rc);
696 
697  if (rc == 0) {
698  rep = m0_rpc_item_to_fop(req->f_item.ri_reply);
699  getattr_rep = m0_fop_data(rep);
700  rep_fop_cob = &getattr_rep->g_body;
701  if (rep_fop_cob->b_rc == 0)
702  m0_md_cob_wire2mem(attr, rep_fop_cob);
703  else
704  rc = rep_fop_cob->b_rc;
705  }
707  return M0_RC(rc);
708 }
709 
710 static int _rpc_post(struct m0_fop *fop,
711  struct m0_rpc_session *session)
712 {
713  struct m0_rpc_item *item;
714 
715  M0_PRE(fop != NULL);
716  M0_PRE(session != NULL);
717 
718  item = &fop->f_item;
721  item->ri_deadline = 0;
722 
723  return m0_rpc_post(item);
724 }
725 
726 struct mds_op {
727  struct m0_fop mo_fop;
728 
729  void (*mo_cb)(void *arg, int rc);
730  void *mo_arg;
732  void *mo_out;
733 
734  /* These arguments are saved in async call and used in callback */
735  void *mo_p1; /* saved param1 */
736  void *mo_p2; /* saved param2 */
737 };
738 
739 static void mds_op_release(struct m0_ref *ref)
740 {
741  struct mds_op *mds_op;
742  struct m0_fop *fop;
743 
744  fop = container_of(ref, struct m0_fop, f_ref);
745  mds_op = container_of(fop, struct mds_op, mo_fop);
746  m0_fop_fini(fop);
747  m0_free(mds_op);
748 }
749 
751 {
752  struct mds_op *mdsop;
753  struct m0_fop *req;
754  struct m0_fop *rep;
755  struct m0_fop_cob *rep_fop_cob;
756  struct m0_cob_attr *attr;
757  int rc;
758 
759  M0_PRE(item != NULL);
761  mdsop = container_of(req, struct mds_op, mo_fop);
762  attr = mdsop->mo_out;
763 
765  if (rc == 0) {
767  if (m0_is_cob_getattr_fop(req)) {
768  struct m0_fop_cob_getattr_reply *getattr_rep;
769  getattr_rep = m0_fop_data(rep);
770  rep_fop_cob = &getattr_rep->cgr_body;
771  rc = getattr_rep->cgr_rc ?: rep_fop_cob->b_rc;
772  } else {
773  struct m0_fop_getattr_rep *getattr_rep;
774  getattr_rep = m0_fop_data(rep);
775  rep_fop_cob = &getattr_rep->g_body;
776  rc = getattr_rep->g_rc ?: rep_fop_cob->b_rc;
777  }
778  if (rc == 0)
779  m0_md_cob_wire2mem(attr, rep_fop_cob);
780  }
781  M0_LOG(M0_DEBUG, "ios getattr replied: %d", rc);
782  mdsop->mo_cb(mdsop->mo_arg, rc);
783 }
784 
787 };
788 
789 static void ios_cob_fop_populate(struct m0_fop *fop,
790  const struct m0_fid *cob_fid,
791  const struct m0_fid *gob_fid,
792  uint32_t cob_idx,
793  uint32_t cob_type)
794 {
795  struct m0_fop_cob_common *common;
796 
797  M0_PRE(fop != NULL);
798  M0_PRE(fop->f_type != NULL);
799  M0_PRE(cob_fid != NULL);
800  M0_PRE(gob_fid != NULL);
801 
802  common = m0_cobfop_common_get(fop);
803  M0_ASSERT(common != NULL);
804 
805  common->c_gobfid = *gob_fid;
806  common->c_cobfid = *cob_fid;
807  common->c_cob_idx = cob_idx;
808  common->c_cob_type = cob_type;
809 }
810 
814 M0_INTERNAL int m0_ios_getattr(struct m0_reqh *reqh,
815  const struct m0_fid *gfid,
816  uint64_t index,
817  struct m0_cob_attr *attr)
818 {
819  struct m0_fop *req;
820  int rc;
821  struct m0_fid md_fid;
822  struct m0_rpc_session *rpc_session;
823  struct m0_fop_cob *rep_fop_cob;
824 
825  m0_fid_convert_gob2cob(gfid, &md_fid, 0);
827  gfid, index);
829  if (req == NULL)
830  return M0_ERR(-ENOMEM);
831 
833  M0_LOG(M0_DEBUG, "ios getattr for "FID_F, FID_P(gfid));
834  rc = m0_rpc_post_sync(req, rpc_session, NULL, 0);
835  M0_LOG(M0_DEBUG, "ios getattr sent synchronously: rc = %d", rc);
836  if (rc == 0) {
837  struct m0_fop *rep;
838  struct m0_fop_cob_getattr_reply *getattr_rep;
839 
840  rep = m0_rpc_item_to_fop(req->f_item.ri_reply);
841  getattr_rep = m0_fop_data(rep);
842  rep_fop_cob = &getattr_rep->cgr_body;
843  if (rep_fop_cob->b_rc == 0)
844  m0_md_cob_wire2mem(attr, rep_fop_cob);
845  else
846  rc = rep_fop_cob->b_rc;
847  }
849  return M0_RC(rc);
850 }
851 
852 static int _ios_cob_getattr_async(struct m0_rpc_session *rpc_session,
853  struct m0_fid *cob_fid,
854  const struct m0_fid *gfid,
855  struct m0_cob_attr *attr,
856  uint32_t index,
857  uint32_t cob_type,
858  void (*cb)(void *arg, int rc),
859  void *arg)
860 {
861  struct mds_op *mdsop;
862  struct m0_fop *req;
863  int rc;
864 
865  M0_ALLOC_PTR(mdsop);
866  if (mdsop == NULL)
867  return M0_ERR(-ENOMEM);
868  req = &mdsop->mo_fop;
871  if (rc != 0) {
872  m0_free(mdsop);
873  return M0_RC(rc);
874  }
875  req->f_item.ri_ops = &getattr_fop_rpc_item_ops;
876 
877  mdsop->mo_cb = cb;
878  mdsop->mo_arg = arg;
879  mdsop->mo_out = attr;
880 
881  ios_cob_fop_populate(req, cob_fid, gfid, index, cob_type);
882  M0_LOG(M0_DEBUG, "ios getattr for index:%d"FID_F, (int)index, FID_P(gfid));
883  rc = _rpc_post(req, rpc_session);
884  M0_LOG(M0_DEBUG, "ios getattr sent asynchronously: rc = %d", rc);
885 
887 
888  return M0_RC(rc);
889 }
890 
891 M0_INTERNAL int m0_ios_cob_getattr_async(const struct m0_fid *gfid,
892  struct m0_cob_attr *attr,
893  uint64_t cob_idx,
894  struct m0_pool_version *pv,
895  void (*cb)(void *arg, int rc),
896  void *arg)
897 {
898  struct m0_reqh_service_ctx *ctx;
899  struct m0_rpc_session *rpc_session;
900  struct m0_fid cob_fid;
901  int rc;
902 
903  m0_fid_convert_gob2cob(gfid, &cob_fid, cob_idx);
904  ctx = pv->pv_pc->pc_dev2svc[cob_idx].pds_ctx;
905  rpc_session = &ctx->sc_rlink.rlk_sess;
906 
907  rc = _ios_cob_getattr_async(rpc_session, &cob_fid, gfid, attr, cob_idx,
908  M0_COB_IO, cb, arg);
909 
910  return M0_RC(rc);
911 }
912 
916 M0_INTERNAL int m0_ios_getattr_async(struct m0_reqh *reqh,
917  const struct m0_fid *gfid,
918  struct m0_cob_attr *attr,
919  uint64_t index,
920  void (*cb)(void *arg, int rc),
921  void *arg)
922 {
923  int rc;
924  struct m0_fid md_fid;
925  struct m0_rpc_session *rpc_session;
926 
927  m0_fid_convert_gob2cob(gfid, &md_fid, 0);
929  gfid, index);
930  M0_ASSERT(rpc_session != NULL);
931 
932  rc = _ios_cob_getattr_async(rpc_session, &md_fid, gfid, attr, index, M0_COB_MD, cb, arg);
933 
934  return M0_RC(rc);
935 }
936 
940 M0_INTERNAL int m0_ios_mds_getattr_async(struct m0_reqh *reqh,
941  const struct m0_fid *gfid,
942  struct m0_cob_attr *attr,
943  void (*cb)(void *arg, int rc),
944  void *arg)
945 {
947  struct m0_ios_mds_conn *imc;
948  struct mds_op *mdsop;
949  struct m0_fop *req;
950  struct m0_fop_getattr *getattr;
951  struct m0_fop_cob *req_fop_cob;
952  int rc;
953 
954  /* This might block on first call. */
955  rc = m0_ios_mds_conn_get(reqh, &imc_map);
956  if (rc != 0)
957  return M0_RC(rc);
958  M0_ASSERT(imc_map->imc_nr != 0);
959  imc = m0_ios_mds_conn_map_hash(imc_map, gfid);
960 
961  if (!imc->imc_connected)
962  return M0_ERR(-ENODEV);
963 
964  M0_ALLOC_PTR(mdsop);
965  if (mdsop == NULL)
966  return M0_ERR(-ENOMEM);
967 
968  req = &mdsop->mo_fop;
971  if (rc == 0) {
972  req->f_item.ri_ops = &getattr_fop_rpc_item_ops;
973  } else {
974  m0_free(mdsop);
975  return M0_RC(rc);
976  }
977 
978  mdsop->mo_cb = cb;
979  mdsop->mo_arg = arg;
980  mdsop->mo_out = attr;
981 
982  getattr = m0_fop_data(req);
983  req_fop_cob = &getattr->g_body;
984  req_fop_cob->b_tfid = *gfid;
985 
986  M0_LOG(M0_DEBUG, "ios getattr for "FID_F, FID_P(gfid));
987  rc = _rpc_post(req, &imc->imc_session);
988  M0_LOG(M0_DEBUG, "ios getattr sent asynchronously: rc = %d", rc);
989 
991  return M0_RC(rc);
992 }
993 
994 M0_INTERNAL void m0_ios_net_buffer_pool_size_set(uint32_t buffer_pool_size)
995 {
996  ios_net_buffer_pool_size = buffer_pool_size;
997 }
998 
999 #undef M0_TRACE_SUBSYSTEM
1000 
1003 /*
1004  * Local variables:
1005  * c-indentation-style: "K&R"
1006  * c-basic-offset: 8
1007  * tab-width: 8
1008  * fill-column: 80
1009  * scroll-step: 1
1010  * End:
1011  */
static const char * srv_ep_addr
Definition: idx_dix.c:72
M0_INTERNAL int m0_reqh_service_state_get(const struct m0_reqh_service *s)
Definition: reqh_service.c:560
M0_INTERNAL m0_bcount_t m0_net_domain_get_max_buffer_segment_size(struct m0_net_domain *dom)
void * mo_arg
Definition: io_service.c:730
M0_INTERNAL void m0_net_buffer_pool_fini(struct m0_net_buffer_pool *pool)
Definition: buffer_pool.c:154
M0_INTERNAL int m0_rpc_post(struct m0_rpc_item *item)
Definition: rpc.c:63
M0_INTERNAL int m0_ios_start_sm_init(struct m0_ios_start_sm *ios_sm, struct m0_reqh_service *service, struct m0_sm_group *grp)
Definition: ios_start_sm.c:190
static struct m0_fid gob_fid
Definition: net.c:115
M0_INTERNAL void m0_fom_wakeup(struct m0_fom *fom)
Definition: fom.c:532
#define M0_PRE(cond)
struct m0_sm ism_sm
Definition: ios_start_sm.h:66
int(* rso_start)(struct m0_reqh_service *service)
Definition: reqh_service.h:360
M0_INTERNAL struct m0_fop_cob_common * m0_cobfop_common_get(struct m0_fop *fop)
Definition: io_fops.c:990
enum m0_rpc_item_priority ri_prio
Definition: item.h:133
static void buffer_pool_not_empty(struct m0_net_buffer_pool *bp)
Definition: io_service.c:127
void * mo_p1
Definition: io_service.c:735
M0_INTERNAL uint64_t m0_fid_hash(const struct m0_fid *fid)
Definition: fid.c:295
static uint32_t ios_net_buffer_pool_size
Definition: io_service.c:66
#define NULL
Definition: misc.h:38
M0_INTERNAL void m0_clink_init(struct m0_clink *link, m0_chan_cb_t cb)
Definition: chan.c:201
M0_INTERNAL void m0_clink_del(struct m0_clink *link)
Definition: chan.c:267
struct m0_tl rios_buffer_pools
Definition: io_service.h:98
M0_TL_DESCR_DECLARE(cs_eps, extern)
static int m0_ios_mds_conn_init(struct m0_reqh *reqh, struct m0_ios_mds_conn_map *conn_map)
Definition: io_service.c:494
struct m0_fid b_tfid
Definition: md_fops.h:92
M0_INTERNAL void m0_ios_start_unlock(struct m0_ios_start_sm *ios_sm)
Definition: ios_start_sm.c:116
const m0_time_t M0_TIME_NEVER
Definition: time.c:108
M0_INTERNAL int m0_ios_register(void)
Definition: io_service.c:158
static struct io_request req
Definition: file.c:100
static struct m0_sm_group * grp
Definition: bytecount.c:38
M0_INTERNAL void m0_fop_init(struct m0_fop *fop, struct m0_fop_type *fopt, void *data, void(*fop_release)(struct m0_ref *))
Definition: fop.c:79
struct m0_pool_version * pv
Definition: dir.c:629
#define M0_LOG(level,...)
Definition: trace.h:167
M0_INTERNAL void m0_net_buffer_pool_unlock(struct m0_net_buffer_pool *pool)
Definition: buffer_pool.c:203
const struct m0_net_buffer_pool_ops * nbp_ops
Definition: buffer_pool.h:263
M0_INTERNAL int m0_rpc_client_find_connect(struct m0_rpc_conn *conn, struct m0_rpc_session *session, struct m0_rpc_machine *rpc_mach, const char *remote_addr, enum m0_conf_service_type stype, uint64_t max_rpcs_in_flight, m0_time_t abs_timeout)
Definition: rpclib.c:134
void m0_cob_domain_fini(struct m0_cob_domain *dom)
Definition: cob.c:726
M0_TL_DEFINE(bufferpools, M0_INTERNAL, struct m0_rios_buffer_pool)
M0_INTERNAL void m0_ios_cdom_get(struct m0_reqh *reqh, struct m0_cob_domain **out)
Definition: io_service.c:463
int m0_rpc_session_destroy(struct m0_rpc_session *session, m0_time_t abs_timeout)
Definition: session.c:559
M0_INTERNAL void m0_rwlock_write_lock(struct m0_rwlock *lock)
Definition: rwlock.c:42
struct m0_fop_type m0_fop_getattr_fopt
Definition: md_fops.c:59
M0_TL_DECLARE(cs_eps, M0_INTERNAL, struct cs_endpoint_and_xprt)
struct m0_net_domain * rios_ndom
Definition: io_service.h:81
struct m0_net_domain * ntm_dom
Definition: net.h:853
void * m0_fop_data(const struct m0_fop *fop)
Definition: fop.c:220
uint32_t c_cob_type
Definition: io_fops.h:474
M0_INTERNAL int m0_ios_cob_getattr_async(const struct m0_fid *gfid, struct m0_cob_attr *attr, uint64_t cob_idx, struct m0_pool_version *pv, void(*cb)(void *arg, int rc), void *arg)
Definition: io_service.c:891
struct m0_reqh_service rios_gen
Definition: io_service.h:96
static void ios_fini(struct m0_reqh_service *service)
Definition: io_service.c:354
M0_INTERNAL void m0_md_cob_wire2mem(struct m0_cob_attr *attr, const struct m0_fop_cob *body)
Definition: md_foms.c:53
unsigned i_ios_cdom_key
Definition: instance.h:135
#define M0_BITS(...)
Definition: misc.h:236
struct m0_fid c_cobfid
Definition: io_fops.h:465
struct m0_net_buffer_pool_ops buffer_pool_ops
Definition: io_service.c:107
uint64_t m0_bcount_t
Definition: types.h:77
M0_INTERNAL void m0_ios_mds_conn_fini(struct m0_reqh *reqh)
Definition: io_service.c:617
M0_INTERNAL struct m0 * m0_get(void)
Definition: instance.c:41
struct m0_fop mo_fop
Definition: io_service.c:727
#define container_of(ptr, type, member)
Definition: misc.h:33
static struct m0_rpc_session session
Definition: formation2.c:38
static void buffer_pool_low(struct m0_net_buffer_pool *bp)
Definition: io_service.c:145
struct m0_rwlock rh_rwlock
Definition: reqh.h:143
static struct m0_rpc_item * item
Definition: item.c:56
struct m0_fop_getxattr_rep * rep
Definition: dir.c:455
static struct m0_cob_domain * cdom
Definition: xform.c:55
static int ios_allocate(struct m0_reqh_service **service, const struct m0_reqh_service_type *stype)
Definition: io_service.c:326
uint32_t b_rc
Definition: md_fops.h:72
static void ios_stop(struct m0_reqh_service *service)
Definition: io_service.c:448
int m0_reqh_service_type_register(struct m0_reqh_service_type *rstype)
Definition: reqh_service.c:473
struct m0_chan rios_bp_wait
Definition: io_service.h:83
struct m0_reqh_service * sac_service
Definition: reqh_service.h:293
uint64_t rios_magic
Definition: io_service.h:119
struct m0_rpc_session imc_session
Definition: io_service.h:132
#define m0_tl_endfor
Definition: tlist.h:700
M0_INTERNAL int m0_sm_timedwait(struct m0_sm *mach, uint64_t states, m0_time_t deadline)
Definition: sm.c:387
struct m0_fid fid
Definition: di.c:46
static int _rpc_post(struct m0_fop *fop, struct m0_rpc_session *session)
Definition: io_service.c:710
M0_INTERNAL int m0_ios_mds_getattr_async(struct m0_reqh *reqh, const struct m0_fid *gfid, struct m0_cob_attr *attr, void(*cb)(void *arg, int rc), void *arg)
Definition: io_service.c:940
return M0_RC(rc)
M0_INTERNAL bool m0_reqh_io_service_invariant(const struct m0_reqh_io_service *rios)
Definition: io_service.c:183
Definition: sock.c:754
struct m0_clink rios_clink
Definition: io_service.h:114
M0_INTERNAL int m0_ioservice_fop_init(void)
Definition: io_fops.c:281
static struct m0_ios_mds_conn * m0_ios_mds_conn_map_hash(const struct m0_ios_mds_conn_map *imc_map, const struct m0_fid *gfid)
Definition: io_service.c:600
#define M0_ENTRY(...)
Definition: trace.h:170
struct m0_fop_type m0_fop_cob_getattr_fopt
Definition: io_fops.c:80
struct m0_fop_cob g_body
Definition: md_fops.h:198
M0_INTERNAL void m0_sm_group_unlock(struct m0_sm_group *grp)
Definition: sm.c:96
M0_INTERNAL size_t m0_list_length(const struct m0_list *list)
Definition: list.c:75
M0_INTERNAL void m0_chan_signal(struct m0_chan *chan)
Definition: chan.c:159
struct m0_fop_type * f_type
Definition: fop.h:81
static const struct m0_reqh_service_ops ios_ops
Definition: io_service.c:96
static void ios_cob_fop_populate(struct m0_fop *fop, const struct m0_fid *cob_fid, const struct m0_fid *gob_fid, uint32_t cob_idx, uint32_t cob_type)
Definition: io_service.c:789
struct m0_net_buffer_pool rios_bp
Definition: io_service.h:79
#define M0_ERR_INFO(rc, fmt,...)
Definition: trace.h:215
struct m0_fop_cob cgr_body
Definition: io_fops.h:544
return M0_ERR(-EOPNOTSUPP)
struct m0_cob_domain * ism_dom
Definition: ios_start_sm.h:68
struct m0_cob_domain * rios_cdom
Definition: io_service.h:100
Definition: refs.h:34
static void attr(struct m0_addb2__context *ctx, const uint64_t *v, char *buf)
Definition: dump.c:949
static const struct socktype stype[]
Definition: sock.c:1156
uint64_t rios_bp_magic
Definition: io_service.h:87
struct m0_net_transfer_mc rm_tm
Definition: rpc_machine.h:88
M0_INTERNAL void m0_chan_init(struct m0_chan *chan, struct m0_mutex *ch_guard)
Definition: chan.c:96
#define M0_ASSERT(cond)
static int ios_mds_conn_get_locked(struct m0_reqh *reqh, struct m0_ios_mds_conn_map **out, bool *new)
Definition: io_service.c:548
struct m0_ios_start_sm rios_sm
Definition: io_service.h:112
const char * rst_name
Definition: reqh_service.h:447
uint32_t c_cob_idx
Definition: io_fops.h:471
M0_INTERNAL struct m0_rpc_session * m0_reqh_mdpool_service_index_to_session(const struct m0_reqh *reqh, const struct m0_fid *gob_fid, uint32_t index)
Definition: reqh.c:177
struct m0_reqh_service_type m0_ios_type
Definition: io_service.c:112
static int ios_start(struct m0_reqh_service *service)
Definition: io_service.c:366
struct m0_tl rh_rpc_machines
Definition: reqh.h:135
void(* nbpo_not_empty)(struct m0_net_buffer_pool *)
Definition: buffer_pool.h:150
int m0_rpc_conn_destroy(struct m0_rpc_conn *conn, m0_time_t abs_timeout)
Definition: conn.c:974
static struct m0_fid cob_fid
Definition: net.c:116
struct m0_fom * rios_fom
Definition: io_service.h:117
M0_INTERNAL void m0_net_buffer_pool_lock(struct m0_net_buffer_pool *pool)
Definition: buffer_pool.c:186
static const struct m0_rpc_item_ops getattr_fop_rpc_item_ops
Definition: io_service.c:785
struct m0_fid c_gobfid
Definition: io_fops.h:460
struct m0_rpc_item * ri_reply
Definition: item.h:163
M0_INTERNAL int m0_ios_mds_getattr(struct m0_reqh *reqh, const struct m0_fid *gfid, struct m0_cob_attr *attr)
Definition: io_service.c:663
int m0_rpc_post_sync(struct m0_fop *fop, struct m0_rpc_session *session, const struct m0_rpc_item_ops *ri_ops, m0_time_t deadline)
Definition: rpclib.c:284
struct m0_pools_common * pv_pc
Definition: pool.h:130
Definition: reqh.h:94
M0_INTERNAL void m0_ios_net_buffer_pool_size_set(uint32_t buffer_pool_size)
Definition: io_service.c:994
struct m0_sm_group * lo_grp
Definition: locality.h:67
int32_t sm_rc
Definition: sm.h:336
M0_INTERNAL void m0_rwlock_write_unlock(struct m0_rwlock *lock)
Definition: rwlock.c:47
M0_INTERNAL int m0_fop_data_alloc(struct m0_fop *fop)
Definition: fop.c:71
struct m0_rpc_conn conn
Definition: fsync.c:96
M0_INTERNAL void m0_fop_fini(struct m0_fop *fop)
Definition: fop.c:136
struct m0_pool_device_to_service * pc_dev2svc
Definition: pool.h:207
static struct m0_clink clink[RDWR_REQUEST_MAX]
M0_INTERNAL void m0_ios_delete_buffer_pool(struct m0_reqh_service *service)
Definition: io_service.c:292
void(* mo_cb)(void *arg, int rc)
Definition: io_service.c:729
static struct fdmi_ctx ctx
Definition: main.c:80
M0_INTERNAL int m0_ios_getattr(struct m0_reqh *reqh, const struct m0_fid *gfid, uint64_t index, struct m0_cob_attr *attr)
Definition: io_service.c:814
#define FID_P(f)
Definition: fid.h:77
M0_INTERNAL void m0_ios_cdom_fini(struct m0_reqh *reqh)
Definition: io_service.c:474
static int m0_ios_mds_conn_get(struct m0_reqh *reqh, struct m0_ios_mds_conn_map **out)
Definition: io_service.c:579
struct m0_reqh_service_ctx * pds_ctx
Definition: pool.h:74
void(* rio_replied)(struct m0_rpc_item *item)
Definition: item.h:300
void m0_clink_add_lock(struct m0_chan *chan, struct m0_clink *link)
Definition: chan.c:255
struct m0_fop_cob g_body
Definition: md_fops.h:204
int32_t m0_rpc_item_error(const struct m0_rpc_item *item)
Definition: item.c:973
Definition: setup.h:354
struct m0_reqh reqh
Definition: rm_foms.c:48
static void getattr_rpc_item_reply_cb(struct m0_rpc_item *item)
Definition: io_service.c:750
int(* rsto_service_allocate)(struct m0_reqh_service **service, const struct m0_reqh_service_type *stype)
Definition: reqh_service.h:435
char * ep
Definition: sw.h:132
struct m0_tl cc_mds_eps
Definition: setup.h:407
M0_INTERNAL struct m0_locality * m0_locality0_get(void)
Definition: locality.c:169
struct m0_mutex nbp_mutex
Definition: buffer_pool.h:259
M0_INTERNAL void m0_fid_tchange(struct m0_fid *fid, uint8_t tid)
Definition: fid.c:139
void * mo_p2
Definition: io_service.c:736
struct m0_ref f_ref
Definition: fop.h:80
Definition: fid.h:38
static unsigned ios_mds_conn_key
Definition: io_service.c:71
#define M0_ALLOC_PTR(ptr)
Definition: memory.h:86
struct m0_chan sm_chan
Definition: sm.h:331
struct m0_motr motr
M0_INTERNAL void m0_ioservice_fop_fini(void)
Definition: io_fops.c:251
M0_INTERNAL void m0_ios_start_sm_fini(struct m0_ios_start_sm *ios_sm)
Definition: ios_start_sm.c:463
struct m0_rpc_session * ri_session
Definition: item.h:147
struct m0_fop * m0_fop_alloc_at(struct m0_rpc_session *sess, struct m0_fop_type *fopt)
Definition: fop.c:122
M0_INTERNAL int m0_net_buffer_pool_provision(struct m0_net_buffer_pool *pool, uint32_t buf_nr)
Definition: buffer_pool.c:125
M0_INTERNAL void m0_clink_fini(struct m0_clink *link)
Definition: chan.c:208
void m0_fop_put_lock(struct m0_fop *fop)
Definition: fop.c:199
static struct m0_fop * fop
Definition: item.c:57
M0_INTERNAL void m0_rwlock_read_lock(struct m0_rwlock *lock)
Definition: rwlock.c:52
static bool ios_start_async_cb(struct m0_clink *clink)
Definition: io_service.c:421
M0_INTERNAL int32_t m0_net_domain_get_max_buffer_segments(struct m0_net_domain *dom)
M0_INTERNAL void m0_sm_group_lock(struct m0_sm_group *grp)
Definition: sm.c:83
struct m0_fop * m0_rpc_item_to_fop(const struct m0_rpc_item *item)
Definition: fop.c:346
static int _ios_cob_getattr_async(struct m0_rpc_session *rpc_session, struct m0_fid *cob_fid, const struct m0_fid *gfid, struct m0_cob_attr *attr, uint32_t index, uint32_t cob_type, void(*cb)(void *arg, int rc), void *arg)
Definition: io_service.c:852
M0_INTERNAL void m0_ios_unregister(void)
Definition: io_service.c:174
M0_INTERNAL bool m0_is_cob_getattr_fop(const struct m0_fop *fop)
Definition: io_fops.c:971
M0_TL_DESCR_DEFINE(bufferpools, "rpc machines associated with reqh", M0_INTERNAL, struct m0_rios_buffer_pool, rios_bp_linkage, rios_bp_magic, M0_IOS_BUFFER_POOL_MAGIC, M0_IOS_BUFFER_POOL_HEAD_MAGIC)
static struct bulkio_params * bp
Definition: bulkio_ut.c:44
M0_INTERNAL void m0_rwlock_read_unlock(struct m0_rwlock *lock)
Definition: rwlock.c:57
Definition: nucleus.c:42
struct m0_rpc_conn imc_conn
Definition: io_service.h:131
struct m0_ios_mds_conn * imc_map[M0T1FS_MAX_NR_MDS]
Definition: io_service.h:141
M0_INTERNAL void m0_fid_convert_gob2cob(const struct m0_fid *gob_fid, struct m0_fid *cob_fid, uint32_t device_id)
Definition: fid_convert.c:55
#define out(...)
Definition: gen.c:41
struct m0_fid gfid
Definition: dir.c:626
void * mo_out
Definition: io_service.c:732
M0_INTERNAL void m0_ios_start_sm_exec(struct m0_ios_start_sm *ios_sm)
Definition: ios_start_sm.c:211
struct m0_reqh * rs_reqh
Definition: reqh_service.h:259
#define m0_tl_for(name, head, obj)
Definition: tlist.h:695
M0_INTERNAL void m0_chan_fini_lock(struct m0_chan *chan)
Definition: chan.c:112
void m0_free(void *data)
Definition: memory.c:146
M0_INTERNAL int m0_ios_create_buffer_pool(struct m0_reqh_service *service)
Definition: io_service.c:202
struct m0_rpc_item f_item
Definition: fop.h:83
M0_INTERNAL int m0_net_buffer_pool_init(struct m0_net_buffer_pool *pool, struct m0_net_domain *ndom, uint32_t threshold, uint32_t seg_nr, m0_bcount_t seg_size, uint32_t colours, unsigned shift, bool dont_dump)
Definition: buffer_pool.c:82
void m0_reqh_service_type_unregister(struct m0_reqh_service_type *rstype)
Definition: reqh_service.c:490
uint32_t sm_state
Definition: sm.h:307
static struct m0_reqh_service * service[REQH_IN_UT_MAX]
Definition: long_lock_ut.c:46
M0_INTERNAL void m0_ios_start_lock(struct m0_ios_start_sm *ios_sm)
Definition: ios_start_sm.c:111
M0_INTERNAL struct m0_motr * m0_cs_ctx_get(struct m0_reqh *reqh)
Definition: setup.c:1778
static struct m0_rpc_machine rpc_machine
Definition: service_ut.c:63
int32_t rc
Definition: trigger_fop.h:47
static void mds_op_release(struct m0_ref *ref)
Definition: io_service.c:739
#define m0_tl_exists(name, var, head,...)
Definition: tlist.h:774
M0_INTERNAL int m0_ios_getattr_async(struct m0_reqh *reqh, const struct m0_fid *gfid, struct m0_cob_attr *attr, uint64_t index, void(*cb)(void *arg, int rc), void *arg)
Definition: io_service.c:916
static int ios_start_async(struct m0_reqh_service_start_async_ctx *asc)
Definition: io_service.c:395
struct m0_list nd_tms
Definition: net.h:390
Definition: fop.h:79
#define FID_F
Definition: fid.h:75
static const struct m0_reqh_service_type_ops ios_type_ops
Definition: io_service.c:89
static void ios_prepare_to_stop(struct m0_reqh_service *service)
Definition: io_service.c:441
m0_time_t ri_deadline
Definition: item.h:141
const struct m0_reqh_service_ops * rs_ops
Definition: reqh_service.h:254