Motr  M0
ios_start_sm.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2011-2020 Seagate Technology LLC and/or its Affiliates
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * For any questions about this software or licensing,
18  * please email opensource@seagate.com or cortx-questions@seagate.com.
19  *
20  */
21 
22 
23 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_IOSERVICE
24 #include "lib/trace.h"
25 
26 #include "lib/types.h"
27 #include "lib/errno.h"
28 #include "lib/lockers.h"
29 #include "lib/memory.h" /* M0_ALLOC_PTR */
30 #include "lib/misc.h" /* M0_SET0 */
31 #include "be/seg.h"
32 #include "be/tx.h"
33 #include "cob/cob.h"
34 #include "ioservice/io_service.h"
35 #include "ioservice/ios_start_sm.h"
36 #include "motr/setup.h"
37 #include "module/instance.h" /* m0_get */
38 #include "pool/pool.h"
39 #include "reqh/reqh.h"
40 #include "reqh/reqh_service.h"
41 
42 M0_INTERNAL int m0_ios_create_buffer_pool(struct m0_reqh_service *service);
43 M0_INTERNAL void m0_ios_delete_buffer_pool(struct m0_reqh_service *service);
44 
46  [M0_IOS_START_INIT] = {
48  .sd_name = "ios_start_init",
49  .sd_allowed = M0_BITS(M0_IOS_START_CDOM_CREATE,
52  },
54  .sd_flags = 0,
55  .sd_name = "ios_start_be_create",
57  },
59  .sd_flags = 0,
60  .sd_name = "ios_start_be_result",
61  .sd_allowed = M0_BITS(M0_IOS_START_MKFS,
63  },
64  [M0_IOS_START_MKFS] = {
65  .sd_flags = 0,
66  .sd_name = "ios_start_mkfs",
67  .sd_allowed = M0_BITS(M0_IOS_START_MKFS_RESULT)
68  },
70  .sd_flags = 0,
71  .sd_name = "ios_start_mkfs_result",
74  },
76  .sd_flags = 0,
77  .sd_name = "ios_start_buffer_pool_create",
78  .sd_allowed = M0_BITS(M0_IOS_START_COMPLETE,
80  },
82  .sd_flags = M0_SDF_FAILURE | M0_SDF_FINAL,
83  .sd_name = "ios_start_failure",
84  },
86  .sd_flags = M0_SDF_TERMINAL,
87  .sd_name = "ios_start_fini",
88  .sd_allowed = 0
89  },
90 };
91 
92 static const struct m0_sm_conf ios_start_sm_conf = {
93  .scf_name = "ios_cdom conf",
94  .scf_nr_states = ARRAY_SIZE(ios_start_sm_states),
95  .scf_state = ios_start_sm_states
96 };
97 
98 static void ios_start_buffer_pool_create(struct m0_ios_start_sm *ios_sm);
99 static void ios_start_sm_tick(struct m0_ios_start_sm *ios_sm);
100 
101 static struct m0_ios_start_sm *ios_start_clink2sm(struct m0_clink *cl)
102 {
103  return container_of(cl, struct m0_ios_start_sm, ism_clink);
104 }
105 
107 {
108  return (struct m0_ios_start_sm *)ast->sa_datum;
109 }
110 
111 M0_INTERNAL void m0_ios_start_lock(struct m0_ios_start_sm *ios_sm)
112 {
113  m0_sm_group_lock(ios_sm->ism_sm.sm_grp);
114 }
115 
116 M0_INTERNAL void m0_ios_start_unlock(struct m0_ios_start_sm *ios_sm)
117 {
119 }
120 
121 static bool ios_start_is_locked(const struct m0_ios_start_sm *ios_sm)
122 {
123  return m0_mutex_is_locked(&ios_sm->ism_sm.sm_grp->s_lock);
124 }
125 
127  const struct m0_ios_start_sm *ios_sm)
128 {
129  return (enum m0_ios_start_state)ios_sm->ism_sm.sm_state;
130 }
131 
132 static void ios_start_state_set(struct m0_ios_start_sm *ios_sm,
133  enum m0_ios_start_state state)
134 {
135  M0_PRE(ios_start_is_locked(ios_sm));
136 
137  M0_LOG(M0_DEBUG, "IO start sm:%p, state_change:[%s -> %s]", ios_sm,
138  m0_sm_state_name(&ios_sm->ism_sm, ios_start_state_get(ios_sm)),
139  m0_sm_state_name(&ios_sm->ism_sm, state));
140  m0_sm_state_set(&ios_sm->ism_sm, state);
141 }
142 
143 static void ios_start_sm_failure(struct m0_ios_start_sm *ios_sm, int rc)
144 {
145  enum m0_ios_start_state state = ios_start_state_get(ios_sm);
146  struct m0_be_seg *seg = ios_sm->ism_reqh->rh_beseg; /* XXX */
147  struct m0_be_domain *bedom = seg->bs_domain;
148  int rc2 = 0;
149 
150  switch (state) {
151  case M0_IOS_START_INIT:
152  /* fallthrough */
154  /* Possibly errors source: tx close */
155  if (ios_sm->ism_dom != NULL)
156  m0_cob_domain_fini(ios_sm->ism_dom);
157  break;
158  case M0_IOS_START_MKFS:
159  /* Possibly errors source: tx open */
160  rc2 = m0_cob_domain_destroy(ios_sm->ism_dom,
161  ios_sm->ism_sm.sm_grp, bedom);
162  break;
164  /* Possibly errors source: tx close, m0_cob_domain_mkfs */
165  rc2 = m0_cob_domain_destroy(ios_sm->ism_dom,
166  ios_sm->ism_sm.sm_grp, bedom);
167  break;
169  rc2 = m0_cob_domain_destroy(ios_sm->ism_dom,
170  ios_sm->ism_sm.sm_grp, bedom);
172  break;
174  /* Possibly errors source: tx close */
176  m0_cob_domain_fini(ios_sm->ism_dom);
177  break;
178  default:
179  M0_ASSERT(false);
180  break;
181  }
182 
183  if (rc2 != 0)
185  "Ignoring rc2=%d from m0_cob_domain_destroy()", rc2);
186 
188 }
189 
190 M0_INTERNAL int m0_ios_start_sm_init(struct m0_ios_start_sm *ios_sm,
191  struct m0_reqh_service *service,
192  struct m0_sm_group *grp)
193 {
194  static uint64_t cid = M0_IOS_COB_ID_START;
195 
196  M0_ENTRY();
197  M0_PRE(ios_sm != NULL);
198  M0_PRE(service != NULL);
199 
200  ios_sm->ism_cdom_id.id = cid++;
201  ios_sm->ism_dom = NULL;
202  ios_sm->ism_service = service;
203  ios_sm->ism_reqh = service->rs_reqh;
204  ios_sm->ism_last_rc = 0;
205 
207 
208  return M0_RC(0);
209 }
210 
211 M0_INTERNAL void m0_ios_start_sm_exec(struct m0_ios_start_sm *ios_sm)
212 {
213  M0_ENTRY();
214  ios_start_sm_tick(ios_sm);
215  M0_LEAVE();
216 }
217 
218 /* TX section */
219 
220 static void ios_start_tx_waiter(struct m0_clink *cl, uint32_t flag)
221 {
222  struct m0_ios_start_sm *ios_sm = ios_start_clink2sm(cl);
223  struct m0_sm *tx_sm = &ios_sm->ism_tx.t_sm;
224 
225  if (M0_IN(tx_sm->sm_state, (flag, M0_BTS_FAILED))) {
226  if (tx_sm->sm_rc != 0)
227  ios_start_sm_failure(ios_sm, tx_sm->sm_rc);
228  else
229  ios_start_sm_tick(ios_sm);
230  m0_clink_del(cl);
231  m0_clink_fini(cl);
232  }
233 }
234 
235 static bool ios_start_tx_open_wait_cb(struct m0_clink *cl)
236 {
238  return true;
239 }
240 
241 static bool ios_start_tx_done_wait_cb(struct m0_clink *cl)
242 {
244  return true;
245 }
246 
247 static void ios_start_tx_open(struct m0_ios_start_sm *ios_sm, bool exclusive)
248 {
249  struct m0_sm *tx_sm = &ios_sm->ism_tx.t_sm;
250 
252  m0_clink_add(&tx_sm->sm_chan, &ios_sm->ism_clink);
253  if (exclusive)
255  else
256  m0_be_tx_open(&ios_sm->ism_tx);
257 }
258 
259 static void ios_start_tx_close(struct m0_ios_start_sm *ios_sm)
260 {
261  struct m0_sm *tx_sm = &ios_sm->ism_tx.t_sm;
262 
264  m0_clink_add(&tx_sm->sm_chan, &ios_sm->ism_clink);
265  m0_be_tx_close(&ios_sm->ism_tx);
266 }
267 
268 static void ios_start_cdom_tx_open(struct m0_ios_start_sm *ios_sm)
269 {
270  struct m0_be_tx_credit cred = {};
271  struct m0_be_seg *seg = ios_sm->ism_reqh->rh_beseg;
272  struct m0_be_tx *tx = &ios_sm->ism_tx;
273 
275  &ios_sm->ism_cdom_id, &cred);
276 
277  M0_SET0(tx);
278  m0_be_tx_init(tx, 0, seg->bs_domain, ios_sm->ism_sm.sm_grp,
279  NULL, NULL, NULL, NULL);
280  m0_be_tx_prep(tx, &cred);
281 
283  ios_start_tx_open(ios_sm, true);
284 }
285 
286 /* AST section */
287 
288 static void ios_start_ast_start(struct m0_sm_group *grp,
289  struct m0_sm_ast *ast)
290 {
291  struct m0_ios_start_sm *ios_sm = ios_start_ast2sm(ast);
292  int rc;
293 
294  M0_ENTRY();
297  ios_sm->ism_dom = m0_reqh_lockers_get(ios_sm->ism_reqh,
298  m0_get()->i_ios_cdom_key);
300  if (ios_sm->ism_dom == NULL) {
301  ios_start_cdom_tx_open(ios_sm);
302  } else {
303  rc = m0_cob_domain_init(ios_sm->ism_dom,
304  ios_sm->ism_reqh->rh_beseg);
305  if (rc == 0) {
306  ios_start_state_set(ios_sm,
309  } else {
310  ios_start_sm_failure(ios_sm, rc);
311  }
312  }
313  M0_LEAVE();
314 }
315 
317  struct m0_sm_ast *ast)
318 {
319  struct m0_ios_start_sm *ios_sm = ios_start_ast2sm(ast);
320  struct m0_be_seg *seg = ios_sm->ism_reqh->rh_beseg;
321  int rc;
322 
323  M0_ENTRY();
325 
327  grp,
328  &ios_sm->ism_cdom_id,
329  seg->bs_domain,
330  seg,
331  &ios_sm->ism_tx);
332 
333  if (rc != 0)
334  ios_sm->ism_last_rc = M0_ERR(rc);
335 
337  ios_start_tx_close(ios_sm);
338  M0_LEAVE();
339 }
340 
341 static void ios_start_cob_tx_open(struct m0_ios_start_sm *ios_sm)
342 {
343  struct m0_be_tx_credit cred = {};
344  struct m0_be_seg *seg = ios_sm->ism_reqh->rh_beseg;
345 
346  M0_ENTRY("key init for reqh=%p, key=%d",
347  ios_sm->ism_reqh, m0_get()->i_ios_cdom_key);
348 
350  M0_SET0(&ios_sm->ism_tx);
351  m0_be_tx_init(&ios_sm->ism_tx, 0, seg->bs_domain,
352  ios_sm->ism_sm.sm_grp, NULL, NULL, NULL, NULL);
353  m0_be_tx_prep(&ios_sm->ism_tx, &cred);
354 
355  ios_start_tx_open(ios_sm, false);
356 
357  M0_LEAVE();
358 }
359 
361  struct m0_sm_ast *ast)
362 {
363  struct m0_ios_start_sm *ios_sm = ios_start_ast2sm(ast);
364 
365  M0_ENTRY();
366 
368 
369  m0_be_tx_fini(&ios_sm->ism_tx);
370 
371  if (ios_sm->ism_last_rc != 0) {
372  ios_start_sm_failure(ios_sm, ios_sm->ism_last_rc);
373  } else {
374  /*
375  * COB domain is successfully created.
376  * Store its address in m0 instance and then format it.
377  */
379  m0_reqh_lockers_set(ios_sm->ism_reqh, m0_get()->i_ios_cdom_key,
380  ios_sm->ism_dom);
382 
384  ios_start_cob_tx_open(ios_sm);
385  }
386  M0_LEAVE();
387 }
388 
389 static void ios_start_ast_mkfs(struct m0_sm_group *grp, struct m0_sm_ast *ast)
390 {
391  struct m0_ios_start_sm *ios_sm = ios_start_ast2sm(ast);
392 
393  M0_ENTRY();
395 
396  ios_sm->ism_last_rc = m0_cob_domain_mkfs(ios_sm->ism_dom,
398  &ios_sm->ism_tx);
399 
401  ios_start_tx_close(ios_sm);
402  M0_LEAVE();
403 }
404 
406  struct m0_sm_ast *ast)
407 {
408  struct m0_ios_start_sm *ios_sm = ios_start_ast2sm(ast);
409 
410  M0_ENTRY();
412 
413  m0_be_tx_fini(&ios_sm->ism_tx);
414 
417 
418  M0_LEAVE();
419 }
420 
422 {
423  int rc;
424 
425  M0_ENTRY();
426  M0_ASSERT(ios_start_state_get(ios_sm) ==
428 
430  if (rc != 0) {
431  ios_start_sm_failure(ios_sm, rc);
432  } else {
434  }
435 
436  M0_LEAVE();
437 }
438 
439 /* SM section */
440 
441 static void ios_start_sm_tick(struct m0_ios_start_sm *ios_sm)
442 {
443  int state;
444  void (*handlers[])(struct m0_sm_group *, struct m0_sm_ast *) = {
450  };
451 
452  M0_ENTRY();
453  state = ios_start_state_get(ios_sm);
454  M0_LOG(M0_DEBUG, "State: %d", state);
455  M0_ASSERT(handlers[state] != NULL);
456  M0_SET0(&ios_sm->ism_ast);
457  ios_sm->ism_ast.sa_cb = handlers[state];
458  ios_sm->ism_ast.sa_datum = ios_sm;
459  m0_sm_ast_post(ios_sm->ism_sm.sm_grp, &ios_sm->ism_ast);
460  M0_LEAVE();
461 }
462 
463 M0_INTERNAL void m0_ios_start_sm_fini(struct m0_ios_start_sm *ios_sm)
464 {
465  M0_ENTRY("ios_sm: %p", ios_sm);
466  M0_PRE(ios_sm != NULL);
467  M0_PRE(M0_IN(ios_start_state_get(ios_sm),
469  M0_PRE(ios_start_is_locked(ios_sm));
470 
471  m0_sm_fini(&ios_sm->ism_sm);
472  M0_LEAVE();
473 }
474 
475 #undef M0_TRACE_SUBSYSTEM
476 
477 /*
478  * Local variables:
479  * c-indentation-style: "K&R"
480  * c-basic-offset: 8
481  * tab-width: 8
482  * fill-column: 80
483  * scroll-step: 1
484  * End:
485  */
uint64_t id
Definition: cob.h:240
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
struct m0_be_domain * bs_domain
Definition: seg.h:82
#define M0_PRE(cond)
M0_INTERNAL void m0_sm_fail(struct m0_sm *mach, int fail_state, int32_t rc)
Definition: sm.c:468
static void ios_start_ast_cdom_create(struct m0_sm_group *grp, struct m0_sm_ast *ast)
Definition: ios_start_sm.c:316
struct m0_sm_ast ism_ast
Definition: ios_start_sm.h:80
struct m0_sm ism_sm
Definition: ios_start_sm.h:66
M0_INTERNAL int m0_cob_domain_mkfs(struct m0_cob_domain *dom, const struct m0_fid *rootfid, struct m0_be_tx *tx)
Definition: cob.c:980
#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
void(* sa_cb)(struct m0_sm_group *grp, struct m0_sm_ast *)
Definition: sm.h:506
static void ios_start_ast_mkfs_result(struct m0_sm_group *grp, struct m0_sm_ast *ast)
Definition: ios_start_sm.c:405
Definition: sm.h:350
M0_INTERNAL void m0_ios_start_unlock(struct m0_ios_start_sm *ios_sm)
Definition: ios_start_sm.c:116
static struct m0_ios_start_sm * ios_start_ast2sm(struct m0_sm_ast *ast)
Definition: ios_start_sm.c:106
static void ios_start_cob_tx_open(struct m0_ios_start_sm *ios_sm)
Definition: ios_start_sm.c:341
static struct m0_sm_group * grp
Definition: bytecount.c:38
#define M0_LOG(level,...)
Definition: trace.h:167
M0_LEAVE()
static void ios_start_tx_open(struct m0_ios_start_sm *ios_sm, bool exclusive)
Definition: ios_start_sm.c:247
M0_INTERNAL void m0_sm_ast_post(struct m0_sm_group *grp, struct m0_sm_ast *ast)
Definition: sm.c:135
static struct m0_ios_start_sm * ios_start_clink2sm(struct m0_clink *cl)
Definition: ios_start_sm.c:101
M0_INTERNAL void m0_be_tx_fini(struct m0_be_tx *tx)
Definition: stubs.c:163
M0_INTERNAL void m0_be_tx_exclusive_open(struct m0_be_tx *tx)
Definition: tx.c:588
void m0_cob_domain_fini(struct m0_cob_domain *dom)
Definition: cob.c:726
struct m0_be_tx ism_tx
Definition: ios_start_sm.h:76
M0_INTERNAL void m0_rwlock_write_lock(struct m0_rwlock *lock)
Definition: rwlock.c:42
M0_INTERNAL const char * m0_sm_state_name(const struct m0_sm *mach, int state)
Definition: sm.c:781
M0_INTERNAL void m0_be_tx_prep(struct m0_be_tx *tx, const struct m0_be_tx_credit *credit)
Definition: stubs.c:175
#define M0_BITS(...)
Definition: misc.h:236
M0_INTERNAL int m0_cob_domain_credit_add(struct m0_cob_domain *dom, struct m0_be_domain *bedom, struct m0_be_seg *seg, const struct m0_cob_domain_id *cdid, struct m0_be_tx_credit *cred)
Definition: cob.c:742
M0_INTERNAL struct m0 * m0_get(void)
Definition: instance.c:41
Definition: sm.h:504
struct m0_clink ism_clink
Definition: ios_start_sm.h:78
#define container_of(ptr, type, member)
Definition: misc.h:33
#define M0_SET0(obj)
Definition: misc.h:64
struct m0_rwlock rh_rwlock
Definition: reqh.h:143
static void ios_start_sm_failure(struct m0_ios_start_sm *ios_sm, int rc)
Definition: ios_start_sm.c:143
static void ios_start_tx_close(struct m0_ios_start_sm *ios_sm)
Definition: ios_start_sm.c:259
static bool ios_start_is_locked(const struct m0_ios_start_sm *ios_sm)
Definition: ios_start_sm.c:121
return M0_RC(rc)
M0_INTERNAL void m0_cob_tx_credit(struct m0_cob_domain *dom, enum m0_cob_op optype, struct m0_be_tx_credit *accum)
Definition: cob.c:2281
#define M0_ENTRY(...)
Definition: trace.h:170
static struct m0_sm_ast ast[NR]
Definition: locality.c:44
M0_INTERNAL void m0_sm_group_unlock(struct m0_sm_group *grp)
Definition: sm.c:96
return M0_ERR(-EOPNOTSUPP)
struct m0_cob_domain * ism_dom
Definition: ios_start_sm.h:68
void * sa_datum
Definition: sm.h:508
M0_INTERNAL const struct m0_fid M0_MDSERVICE_SLASH_FID
Definition: md_fid.c:63
M0_INTERNAL int m0_cob_domain_create_prepared(struct m0_cob_domain **out, struct m0_sm_group *grp, const struct m0_cob_domain_id *cdid, struct m0_be_domain *bedom, struct m0_be_seg *seg, struct m0_be_tx *tx)
Definition: cob.c:763
#define M0_ASSERT(cond)
const char * scf_name
Definition: sm.h:352
M0_INTERNAL bool m0_mutex_is_locked(const struct m0_mutex *mutex)
Definition: mutex.c:95
void m0_sm_state_set(struct m0_sm *mach, int state)
Definition: sm.c:478
int m0_cob_domain_destroy(struct m0_cob_domain *dom, struct m0_sm_group *grp, struct m0_be_domain *bedom)
Definition: cob.c:871
static bool ios_start_tx_open_wait_cb(struct m0_clink *cl)
Definition: ios_start_sm.c:235
static void ios_start_sm_tick(struct m0_ios_start_sm *ios_sm)
Definition: ios_start_sm.c:441
M0_INTERNAL void m0_be_tx_close(struct m0_be_tx *tx)
Definition: stubs.c:194
static void ios_start_ast_start(struct m0_sm_group *grp, struct m0_sm_ast *ast)
Definition: ios_start_sm.c:288
struct m0_sm_group * sm_grp
Definition: sm.h:321
struct m0_reqh * ism_reqh
Definition: ios_start_sm.h:74
int32_t sm_rc
Definition: sm.h:336
M0_INTERNAL void m0_rwlock_write_unlock(struct m0_rwlock *lock)
Definition: rwlock.c:47
static struct m0_sm_state_descr ios_start_sm_states[]
Definition: ios_start_sm.c:45
M0_INTERNAL void m0_ios_delete_buffer_pool(struct m0_reqh_service *service)
Definition: io_service.c:292
struct m0_mutex s_lock
Definition: sm.h:514
struct m0_sm t_sm
Definition: tx.h:281
Definition: seg.h:66
int m0_cob_domain_init(struct m0_cob_domain *dom, struct m0_be_seg *seg)
Definition: cob.c:708
M0_INTERNAL void m0_be_tx_init(struct m0_be_tx *tx, uint64_t tid, struct m0_be_domain *dom, struct m0_sm_group *sm_group, m0_be_tx_cb_t persistent, m0_be_tx_cb_t discarded, void(*filler)(struct m0_be_tx *tx, void *payload), void *datum)
Definition: stubs.c:150
uint32_t sd_flags
Definition: sm.h:378
static void ios_start_ast_mkfs(struct m0_sm_group *grp, struct m0_sm_ast *ast)
Definition: ios_start_sm.c:389
static void ios_start_state_set(struct m0_ios_start_sm *ios_sm, enum m0_ios_start_state state)
Definition: ios_start_sm.c:132
m0_ios_start_state
Definition: ios_start_sm.h:91
M0_INTERNAL void m0_sm_init(struct m0_sm *mach, const struct m0_sm_conf *conf, uint32_t state, struct m0_sm_group *grp)
Definition: sm.c:313
struct m0_chan sm_chan
Definition: sm.h:331
M0_INTERNAL void m0_clink_add(struct m0_chan *chan, struct m0_clink *link)
Definition: chan.c:228
M0_INTERNAL void m0_ios_start_sm_fini(struct m0_ios_start_sm *ios_sm)
Definition: ios_start_sm.c:463
static const struct m0_sm_conf ios_start_sm_conf
Definition: ios_start_sm.c:92
M0_INTERNAL void m0_be_tx_open(struct m0_be_tx *tx)
Definition: stubs.c:184
static bool flag
Definition: nucleus.c:266
Definition: sm.h:301
static void ios_start_ast_cdom_create_res(struct m0_sm_group *grp, struct m0_sm_ast *ast)
Definition: ios_start_sm.c:360
M0_INTERNAL void m0_clink_fini(struct m0_clink *link)
Definition: chan.c:208
M0_INTERNAL void m0_rwlock_read_lock(struct m0_rwlock *lock)
Definition: rwlock.c:52
struct m0_be_seg * rh_beseg
Definition: reqh.h:112
M0_INTERNAL void m0_sm_group_lock(struct m0_sm_group *grp)
Definition: sm.c:83
static void ios_start_cdom_tx_open(struct m0_ios_start_sm *ios_sm)
Definition: ios_start_sm.c:268
struct m0_cob_domain_id ism_cdom_id
Definition: ios_start_sm.h:70
static struct m0_be_seg * seg
Definition: btree.c:40
static bool ios_start_tx_done_wait_cb(struct m0_clink *cl)
Definition: ios_start_sm.c:241
static void ios_start_tx_waiter(struct m0_clink *cl, uint32_t flag)
Definition: ios_start_sm.c:220
M0_INTERNAL void m0_rwlock_read_unlock(struct m0_rwlock *lock)
Definition: rwlock.c:57
static enum m0_ios_start_state ios_start_state_get(const struct m0_ios_start_sm *ios_sm)
Definition: ios_start_sm.c:126
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
M0_INTERNAL int m0_ios_create_buffer_pool(struct m0_reqh_service *service)
Definition: io_service.c:202
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
int32_t rc
Definition: trigger_fop.h:47
#define ARRAY_SIZE(a)
Definition: misc.h:45
Definition: tx.h:280
struct m0_reqh_service * ism_service
Definition: ios_start_sm.h:72
static void ios_start_buffer_pool_create(struct m0_ios_start_sm *ios_sm)
Definition: ios_start_sm.c:421
M0_INTERNAL void m0_sm_fini(struct m0_sm *mach)
Definition: sm.c:331