Motr  M0
file.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2014-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_SNSCM
24 #include "lib/trace.h"
25 #include "lib/finject.h"
26 #include "lib/locality.h"
27 
28 #include "ioservice/io_service.h"
29 #include "ioservice/fid_convert.h"
30 #include "reqh/reqh.h"
31 #include "reqh/reqh_service.h"
32 
33 #include "sns/cm/cm.h"
34 #include "sns/cm/cm_utils.h"
35 #include "sns/cm/file.h"
36 #include "pool/pool.h"
37 
44 #define _AST2FCTX(ast, field) \
45  container_of(ast, struct m0_sns_cm_file_ctx, field)
46 
49 
50 static int _layout_fetch(struct m0_sns_cm_file_ctx *fctx);
51 static int _fid_layout_instance(struct m0_sns_cm_file_ctx *fctx);
52 
53 M0_INTERNAL void m0_sns_cm_fctx_lock(struct m0_sns_cm_file_ctx *fctx)
54 {
56 }
57 
59 {
61 }
62 
63 static uint64_t sns_cm_fctx_hash_func(const struct m0_htable *htable,
64  const void *k)
65 {
66  const struct m0_fid *fid = (struct m0_fid *)k;
67  const uint64_t key = fid->f_key;
68 
69  return key % htable->h_bucket_nr;
70 }
71 
72 static bool sns_cm_fctx_key_eq(const void *key1, const void *key2)
73 {
74  return m0_fid_eq((struct m0_fid *)key1, (struct m0_fid *)key2);
75 }
76 
77 M0_HT_DESCR_DEFINE(m0_scmfctx, "Hash of files used by sns cm", M0_INTERNAL,
78  struct m0_sns_cm_file_ctx, sf_sc_link, sf_magic,
80  sf_fid, sns_cm_fctx_hash_func,
82 
83 M0_HT_DEFINE(m0_scmfctx, M0_INTERNAL, struct m0_sns_cm_file_ctx,
84  struct m0_fid);
85 
87  [M0_SCFS_INIT] = {
89  .sd_name = "file ctx init",
91  },
92  [M0_SCFS_LOCK_WAIT] = {
93  .sd_flags = 0,
94  .sd_name = "file lock wait",
95  .sd_allowed = M0_BITS(M0_SCFS_LOCKED, M0_SCFS_FINI)
96  },
97  [M0_SCFS_LOCKED] = {
98  .sd_flags = 0,
99  .sd_name = "file locked",
100  .sd_allowed = M0_BITS(M0_SCFS_ATTR_FETCH,
102  M0_SCFS_FINI)
103  },
104  [M0_SCFS_ATTR_FETCH] = {
105  .sd_flags = 0,
106  .sd_name = "file attr fetch",
108  },
110  .sd_flags = 0,
111  .sd_name = "file attr fetched",
113  },
115  .sd_flags = 0,
116  .sd_name = "file layout fetch",
118  },
120  .sd_flags = 0,
121  .sd_name = "file ctx layout fetched",
122  .sd_allowed = M0_BITS(M0_SCFS_FINI)
123  },
124  [M0_SCFS_FINI] = {
125  .sd_flags = M0_SDF_TERMINAL,
126  .sd_name = "file ctx fini",
127  .sd_allowed = 0
128  }
129 };
130 
131 static const struct m0_sm_conf fctx_sm_conf = {
132  .scf_name = "sm: fctx_conf",
133  .scf_nr_states = ARRAY_SIZE(fctx_sd),
134  .scf_state = fctx_sd
135 };
136 
138 {
139  return fctx->sf_sm.sm_state;
140 }
141 
142 static void _fctx_status_set(struct m0_sns_cm_file_ctx *fctx, int state)
143 {
144  m0_sm_state_set(&fctx->sf_sm, state);
145 }
146 
148  struct m0_sm_ast *ast)
149 {
151 }
152 
153 static void _fctx_fini(struct m0_sm_group *grp, struct m0_sm_ast *ast)
154 {
156 
162  }
166  m0_sm_fini(&fctx->sf_sm);
167  m0_free(fctx);
168 }
169 
171 {
172  if (fctx->sf_pi != NULL)
174  if (fctx->sf_layout != NULL)
176  m0_scmfctx_htable_del(&fctx->sf_scm->sc_file_ctx, fctx);
178 }
179 
180 M0_INTERNAL void m0_sns_cm_fctx_cleanup(struct m0_sns_cm *scm)
181 {
182  struct m0_sns_cm_file_ctx *fctx;
183 
185  m0_htable_for(m0_scmfctx, fctx, &scm->sc_file_ctx) {
189 }
190 
191 static void sns_cm_fctx_release(struct m0_ref *ref)
192 {
193  struct m0_sns_cm_file_ctx *fctx;
194 
195  M0_PRE(ref != NULL);
196 
197  fctx = container_of(ref, struct m0_sns_cm_file_ctx, sf_ref);
199 }
200 
201 M0_INTERNAL void m0_sns_cm_flock_resource_set(struct m0_sns_cm *scm)
202 {
205 }
206 
208 {
209  struct m0_sns_cm_rm_ctx *rm_ctx;
210 
211  M0_PRE(fctx != NULL && fctx->sf_scm != NULL);
212 
214  m0_file_init(&fctx->sf_file, &fctx->sf_fid, &rm_ctx->rc_dom,
215  M0_DI_NONE);
222  &fctx->sf_creditor);
225 }
226 
228 {
234 }
235 
236 static bool fctx_fini_clink_cb(struct m0_clink *link)
237 {
238  struct m0_sns_cm_file_ctx *fctx = M0_AMB(fctx, link, sf_fini_clink);
241  }
242 
243  return true;
244 }
245 
246 M0_INTERNAL int m0_sns_cm_fctx_init(struct m0_sns_cm *scm,
247  const struct m0_fid *fid,
248  struct m0_sns_cm_file_ctx **sc_fctx)
249 {
250  struct m0_sns_cm_file_ctx *fctx;
251 
252  M0_ENTRY();
253  M0_PRE(sc_fctx != NULL || scm != NULL || fid!= NULL);
259 
261  if (fctx == NULL)
262  return M0_ERR(-ENOMEM);
264 
265  fctx->sf_pd = NULL;
266  fctx->sf_layout = NULL;
267  fctx->sf_pi = NULL;
268  fctx->sf_nr_ios_visited = 0;
269  fctx->sf_max_group = 0;
270  m0_scmfctx_tlink_init(fctx);
277  fctx->sf_scm = scm;
278  if (!m0_sns_cm2reqh(scm)->rh_oostore)
280  *sc_fctx = fctx;
281 
282  return M0_RC(0);
283 }
284 
285 M0_INTERNAL void m0_sns_cm_fctx_fini(struct m0_sns_cm_file_ctx *fctx)
286 {
287  M0_PRE(fctx != NULL);
288 
289  m0_scmfctx_tlink_fini(fctx);
290 
292  /* In non-oostore mode we use resource manager to acquire file lock
293  * across the nodes. We wait until file lock resource is finalised
294  * before finalising fctx.
295  * In oostore mode we do not use file lock resource.
296  */
299  else
301 }
302 
303 extern const struct m0_rm_incoming_ops file_lock_incoming_ops;
305 {
306  struct m0_sns_cm *scm;
307  M0_ENTRY();
308 
309  M0_PRE(fctx != NULL);
312 
313  scm = fctx->sf_scm;
314  M0_ASSERT(scm != NULL);
317 
318  M0_LOG(M0_DEBUG, "Lock file for FID : "FID_F, FID_P(&fctx->sf_fid));
320  m0_scmfctx_htable_add(&scm->sc_file_ctx, fctx);
321  /* XXX: Ideally m0_file_lock should be called, but
322  * it internally calls m0_rm_incoming_init(). This has already been
323  * called here in m0_sns_cm_file_lock_init().
324  * m0_file_lock(&fctx->sf_owner, &fctx->sf_rin);
325  */
329 
331 
333  return M0_RC(-EAGAIN);
334 }
335 
337 {
338  struct m0_sns_cm *scm;
339  M0_ENTRY();
340 
341  M0_PRE(fctx != NULL);
343 
344  scm = fctx->sf_scm;
345  M0_ASSERT(scm != NULL);
348 
349  M0_LOG(M0_DEBUG, "Lock file for FID : "FID_F, FID_P(&fctx->sf_fid));
350  m0_scmfctx_htable_add(&scm->sc_file_ctx, fctx);
352 
354  return M0_RC(0);
355 }
356 
358 {
359  M0_PRE(fctx != NULL);
364 
366  M0_LOG(M0_DEBUG, "Unlock file for FID : "FID_F, FID_P(&fctx->sf_fid));
367 }
368 
369 M0_INTERNAL int
371 {
372  struct m0_chan *rm_chan;
373  uint32_t state;
374 
375  M0_ENTRY();
376 
377  M0_PRE(fctx != NULL && fctx->sf_scm != NULL && fom != NULL);
382 
384  state = fctx->sf_rin.rin_sm.sm_state;
385  if (state == RI_SUCCESS || state == RI_FAILURE) {
387  if (state == RI_FAILURE) {
389  return M0_ERR_INFO(-EFAULT,
390  "Failed to lock file "FID_F,
391  FID_P(&fctx->sf_fid));
392  } else {
395  return M0_RC(0);
396  }
397  }
398  rm_chan = &fctx->sf_rin.rin_sm.sm_chan;
399  m0_fom_wait_on(fom, rm_chan, &fom->fo_cb);
401  return M0_RC(-EAGAIN);
402 }
403 
404 M0_INTERNAL int m0_sns_cm_file_lock(struct m0_sns_cm *scm,
405  const struct m0_fid *fid,
406  struct m0_sns_cm_file_ctx **out)
407 {
408  struct m0_sns_cm_file_ctx *fctx;
409  struct m0_fid f = *fid;
410  int rc;
411 
412  M0_ENTRY();
413 
414  M0_PRE(scm != NULL || fid != NULL);
418 
419  fctx = m0_scmfctx_htable_lookup(&scm->sc_file_ctx, &f);
420  if ( fctx != NULL) {
421  *out = fctx;
423  M0_LOG(M0_DEBUG, "fid: "FID_F, FID_P(fid));
425  return M0_RC(0);
426  }
428  return M0_RC(-EAGAIN);
429  }
431  if (rc == 0) {
435  *out = fctx;
436  }
437  return M0_RC(rc);
438 }
439 
440 M0_INTERNAL struct m0_sns_cm_file_ctx *
442 {
443  struct m0_sns_cm_file_ctx *fctx;
444 
445  M0_ENTRY("sns cm %p, fid %p="FID_F, scm, fid, FID_P(fid));
446  M0_PRE(scm != NULL && fid != NULL);
448 
449  fctx = m0_scmfctx_htable_lookup(&scm->sc_file_ctx, fid);
450  M0_ASSERT(ergo(fctx != NULL, m0_fid_cmp(fid, &fctx->sf_fid) == 0));
451 
452  M0_LEAVE();
453  return fctx;
454 }
455 
456 M0_INTERNAL struct m0_sns_cm_file_ctx *
457 m0_sns_cm_fctx_get(struct m0_sns_cm *scm, const struct m0_cm_ag_id *id)
458 {
459  struct m0_fid *fid;
460  struct m0_sns_cm_file_ctx *fctx;
461 
462  if (M0_FI_ENABLED("do_nothing"))
463  return NULL;
464 
465  M0_PRE(scm != NULL && id != NULL);
466 
468  fid = (struct m0_fid *)&id->ai_hi;
471  M0_ASSERT(fctx != NULL);
473  M0_LOG(M0_DEBUG, "ag nr: %" PRId64 ", FID :"FID_F, fctx->sf_ag_nr,
474  FID_P(fid));
477 
478  return fctx;
479 }
480 
481 M0_INTERNAL void m0_sns_cm_fctx_put(struct m0_sns_cm *scm,
482  const struct m0_cm_ag_id *id)
483 {
484  struct m0_fid *fid;
485  struct m0_sns_cm_file_ctx *fctx;
486 
487  if (M0_FI_ENABLED("do_nothing"))
488  return;
489 
490  M0_PRE(scm != NULL && id != NULL);
491 
492  fid = (struct m0_fid *)&id->ai_hi;
496  M0_ASSERT(fctx != NULL);
498  M0_LOG(M0_DEBUG, "ag nr: %" PRId64 ", FID : "FID_F, fctx->sf_ag_nr,
499  FID_P(fid));
502 }
503 
504 M0_INTERNAL void m0_sns_cm_file_unlock(struct m0_sns_cm *scm,
505  struct m0_fid *fid)
506 {
507  struct m0_sns_cm_file_ctx *fctx;
508 
509  if (M0_FI_ENABLED("do_nothing"))
510  return;
511 
512  M0_PRE(scm != NULL && fid != NULL);
515 
517  M0_ASSERT(fctx != NULL);
518  M0_LOG(M0_DEBUG, "File with FID : "FID_F" has %" PRId64 " AGs",
519  FID_P(&fctx->sf_fid), fctx->sf_ag_nr);
521 }
522 
523 static int _attr_fetch(struct m0_sns_cm_file_ctx *fctx);
524 
525 static uint64_t max_frame(const struct m0_sns_cm_file_ctx *fctx,
526  size_t max_cob_size)
527 {
528  uint64_t frame_size;
529  uint64_t frame;
530  struct m0_pdclust_layout *pl;
531 
533  frame_size = pl->pl_attr.pa_unit_size;
534  if (max_cob_size < frame_size)
535  frame = 0;
536  else {
537  frame = max_cob_size % frame_size ?
538  max_cob_size / frame_size + 1 :
539  max_cob_size / frame_size;
540  }
541 
542  return frame;
543 }
544 
546 {
547  struct m0_pdclust_src_addr sa;
548  struct m0_pdclust_tgt_addr ta;
549  uint64_t cob_size;
550 
551  cob_size = fctx->sf_attr.ca_size;
552  ta.ta_frame = max_frame(fctx, cob_size);
553  ta.ta_obj = fctx->sf_pd->pd_index;
554  m0_fd_bwd_map(fctx->sf_pi, &ta, &sa);
555  if (fctx->sf_max_group < sa.sa_group)
556  fctx->sf_max_group = sa.sa_group;
557 }
558 
559 static void _attr_ast_cb(struct m0_sm_group *grp, struct m0_sm_ast *ast)
560 {
562 
563  fctx->sf_rc = (long)ast->sa_datum;
564  if (fctx->sf_rc == 0) {
568  }
569  _attr_fetch(fctx);
570 }
571 
572 static inline void _attr_cb(void *arg, int rc)
573 {
574  struct m0_sns_cm_file_ctx *fctx = arg;
575 
577  M0_LOG(M0_DEBUG, "rc:%d %" PRIx64 " %d", rc, fctx->sf_attr.ca_size,
578  (int)fctx->sf_nr_ios_visited);
579 
580  /*
581  * We save file attribute fetch result temporarily and update
582  * m0_sns_cm_file_ctx::sf_rc in ast callback under copy machine lock
583  * in-order to avoid the race between update and reading of
584  * m0_sns_cm_file_ctx::sf_rc.
585  */
586  fctx->sf_attr_ast.sa_datum = (void *)(long)rc;
588 }
589 
591 {
592  struct m0_poolmach *pm;
593  struct m0_pool *pool;
594  struct m0_pooldev *pd;
595  int rc = fctx->sf_rc;
596 
597  M0_PRE(fctx->sf_pm != NULL);
598 
599  pm = fctx->sf_pm;
600  pool = pm->pm_pver->pv_pool;
601  pd = fctx->sf_pd;
602 
603  if (pd == NULL)
604  pd = pool_failed_devs_tlist_head(&pool->po_failed_devices);
605  else
606  pd = pool_failed_devs_tlist_next(&pool->po_failed_devices, pd);
607 
608  if (pd != NULL) {
609  fctx->sf_pd = pd;
611  &fctx->sf_attr, pd->pd_index,
612  pm->pm_pver, &_attr_cb, fctx);
613  rc = rc == -ENOMEM ? rc : -EAGAIN;
614  }
615 
616  return M0_RC(rc);
617 }
618 
620 {
622 
623 
625  /* Transition to M0_SCFS_ATTR_FETCHED in case of success or error. */
626  if (fctx->sf_rc != -EAGAIN)
628 
629  return M0_RC(fctx->sf_rc);
630 }
631 
633 {
634  struct m0_cm *cm = &fctx->sf_scm->sc_base;
635  struct m0_reqh *reqh = cm->cm_service.rs_reqh;
636  struct m0_layout_domain *ldom = &reqh->rh_ldom;
637  struct m0_layout *l;
638  uint64_t layout_id;
639 
642 
644  fctx->sf_attr.ca_lid);
645  l = fctx->sf_layout ?: m0_layout_find(ldom, layout_id);
646  if (l == NULL)
647  return M0_RC(-ENOENT);
648  fctx->sf_layout = l;
649  return M0_RC(0);
650 }
651 
653 {
654  struct m0_layout_instance *li;
655  int rc;
656 
658  if (rc == 0)
660 
661  return M0_RC(rc);
662 }
663 
664 static struct m0_poolmach *
666 {
667  struct m0_reqh *reqh;
668  struct m0_pool_version *pv;
669  M0_PRE(fctx != NULL);
670 
673 
674  if (pv != NULL) {
675  return &pv->pv_mach;
676  } else {
677  M0_LOG(M0_ERROR, "Cannot find pool version for fid="FID_F
678  " pver="FID_F,
679  FID_P(&fctx->sf_fid),
681  return NULL;
682  }
683 }
684 
685 M0_INTERNAL struct m0_pool_version *
687 {
688  M0_PRE(fctx != NULL && fctx->sf_pm != NULL);
689 
690  return fctx->sf_pm->pm_pver;
691 }
692 
693 M0_INTERNAL int
695 {
696  int rc = 0;
697 
704 
705  if (M0_FI_ENABLED("ut_attr_layout")) {
707  if (rc != 0)
708  return M0_RC(rc);
711  return M0_RC(rc);
712  }
713 
714  switch (m0_sns_cm_fctx_state_get(fctx)) {
715  case M0_SCFS_LOCKED :
717  rc = _attr_fetch(fctx);
718  if (rc == -EAGAIN)
719  return M0_RC(rc);
720  case M0_SCFS_ATTR_FETCHED :
721  if (fctx->sf_rc != 0)
722  return M0_ERR_INFO(fctx->sf_rc, FID_F,
723  FID_P(&fctx->sf_fid));
724 
725  /* populate fctx->sf_pm here */
727  if (fctx->sf_pm == NULL) {
728  fctx->sf_rc = -ENOENT;
729  return M0_ERR(fctx->sf_rc);
730  }
731  break;
732  case M0_SCFS_ATTR_FETCH :
733  case M0_SCFS_LAYOUT_FETCH :
734  rc = -EAGAIN;
735  break;
736  default :
737  rc = -EINVAL;
738  }
739 
740  return M0_RC(rc);
741 }
742 
743 M0_INTERNAL void
745  struct m0_fom *fom)
746 {
747  m0_fom_wait_on(fom, &fctx->sf_sm.sm_chan, &fom->fo_cb);
748 }
749 
751  const struct m0_pdclust_src_addr *sa,
752  struct m0_pdclust_tgt_addr *ta)
753 {
755  m0_fd_fwd_map(fctx->sf_pi, sa, ta);
757 }
758 
760  const struct m0_pdclust_tgt_addr *ta,
761  struct m0_pdclust_src_addr *sa)
762 {
764  m0_fd_bwd_map(fctx->sf_pi, ta, sa);
766 }
767 
768 M0_INTERNAL uint64_t m0_sns_cm_file_data_units(struct m0_sns_cm_file_ctx *fctx)
769 {
770  size_t fsize;
771  uint64_t nr_total_du = 0;
773 
774  M0_PRE(fctx != NULL);
775  M0_ENTRY();
776 
777  fsize = fctx->sf_attr.ca_size;
778  nr_total_du = fsize / m0_pdclust_unit_size(pl);
779  if (fsize % m0_pdclust_unit_size(pl) > 0)
780  M0_CNT_INC(nr_total_du);
781 
782  M0_LEAVE();
783  return nr_total_du;
784 }
785 
786 M0_INTERNAL bool m0_sns_cm_file_unit_is_EOF(struct m0_pdclust_layout *pl,
787  uint64_t nr_max_data_units,
788  uint64_t group, uint32_t unit)
789 {
790  uint32_t d;
791 
792  M0_PRE(pl != NULL);
793 
794  if (m0_pdclust_unit_classify(pl, unit) == M0_PUT_DATA) {
796  return (group * d + unit + 1) > nr_max_data_units;
797  }
798 
799  return false;
800 }
801 
802 #undef _AST2FCTX
803 
805 #undef M0_TRACE_SUBSYSTEM
806 /*
807  * Local variables:
808  * c-indentation-style: "K&R"
809  * c-basic-offset: 8
810  * tab-width: 8
811  * fill-column: 80
812  * scroll-step: 1
813  * End:
814  */
M0_INTERNAL struct m0_layout * m0_layout_find(struct m0_layout_domain *dom, uint64_t lid)
Definition: layout.c:861
uint64_t ca_lid
Definition: cob.h:380
M0_INTERNAL uint64_t m0_sns_cm_ag_nr_data_units(const struct m0_pdclust_layout *pl)
Definition: cm_utils.c:222
uint64_t id
Definition: cob.h:2380
Definition: cm.h:205
struct m0_sm_ast sf_attr_ast
Definition: file.h:116
#define M0_PRE(cond)
static void __fctx_ast_post(struct m0_sns_cm_file_ctx *fctx, struct m0_sm_ast *ast)
Definition: file.c:147
M0_INTERNAL void m0_mutex_unlock(struct m0_mutex *mutex)
Definition: mutex.c:66
enum m0_rm_remote_state rem_state
Definition: rm.h:748
M0_INTERNAL bool m0_sns_cm_fid_is_valid(const struct m0_sns_cm *snscm, const struct m0_fid *fid)
Definition: cm_utils.c:539
#define m0_htable_for(name, var, htable)
Definition: hash.h:483
static void __sns_cm_fctx_cleanup(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:170
struct m0_rm_resource_type rc_rt
Definition: cm.h:200
uint64_t cr_datum
Definition: rm.h:514
uint64_t sa_group
Definition: pdclust.h:241
#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
struct m0_htable sc_file_ctx
Definition: cm.h:268
uint64_t pa_unit_size
Definition: pdclust.h:118
M0_INTERNAL void m0_clink_del_lock(struct m0_clink *link)
Definition: chan.c:293
#define ergo(a, b)
Definition: misc.h:293
Definition: storage.c:103
void(* sa_cb)(struct m0_sm_group *grp, struct m0_sm_ast *)
Definition: sm.h:506
Definition: sm.h:350
struct m0_pool_version * pm_pver
Definition: pool_machine.h:172
M0_INTERNAL struct m0_pool_version * m0_pool_version_find(struct m0_pools_common *pc, const struct m0_fid *id)
Definition: pool.c:586
static FILE * f
Definition: adieu.c:79
static struct m0_sm_group * grp
Definition: bytecount.c:38
struct m0_pool_version * pv
Definition: dir.c:629
struct m0_poolmach pv_mach
Definition: pool.h:133
#define M0_LOG(level,...)
Definition: trace.h:167
M0_LEAVE()
static struct m0_sm_state_descr fctx_sd[M0_SCFS_NR]
Definition: file.c:86
M0_INTERNAL void m0_sm_ast_post(struct m0_sm_group *grp, struct m0_sm_ast *ast)
Definition: sm.c:135
M0_INTERNAL uint64_t m0_sns_cm_file_data_units(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:768
static int __sns_cm_file_lock(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:304
M0_INTERNAL void m0_sns_cm_file_fwd_map(struct m0_sns_cm_file_ctx *fctx, const struct m0_pdclust_src_addr *sa, struct m0_pdclust_tgt_addr *ta)
Definition: file.c:750
struct m0_layout_instance pi_base
Definition: pdclust.h:173
M0_INTERNAL bool m0_sns_cm_file_unit_is_EOF(struct m0_pdclust_layout *pl, uint64_t nr_max_data_units, uint64_t group, uint32_t unit)
Definition: file.c:786
static void sns_cm_fctx_rm_init(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:207
uint64_t sf_max_group
Definition: file.h:67
static uint64_t max_frame(const struct m0_sns_cm_file_ctx *fctx, size_t max_cob_size)
Definition: file.c:525
struct m0_layout * sf_layout
Definition: file.h:74
uint64_t ta_obj
Definition: pdclust.h:256
uint64_t sf_nr_ios_visited
Definition: file.h:123
M0_INTERNAL void m0_sns_cm_fctx_unlock(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:58
static struct m0_sns_cm * scm
Definition: cm.c:64
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
M0_HT_DESCR_DEFINE(tioreqht, "Hash of target_ioreq objects", static, struct target_ioreq, ti_link, ti_magic, M0_T1FS_TIOREQ_MAGIC, M0_T1FS_TLIST_HEAD_MAGIC, ti_fid.f_container, tioreqs_hash_func, tioreq_key_eq)
M0_INTERNAL void m0_fom_wait_on(struct m0_fom *fom, struct m0_chan *chan, struct m0_fom_callback *cb)
Definition: fom.c:1490
#define M0_BITS(...)
Definition: misc.h:236
M0_INTERNAL void m0_rm_remote_init(struct m0_rm_remote *rem, struct m0_rm_resource *res)
Definition: rm.c:1411
M0_INTERNAL int m0_sns_cm_file_lock(struct m0_sns_cm *scm, const struct m0_fid *fid, struct m0_sns_cm_file_ctx **out)
Definition: file.c:404
struct m0_fid sf_fid
Definition: file.h:63
Definition: sm.h:504
M0_INTERNAL void m0_sns_cm_fctx_fini(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:285
#define container_of(ptr, type, member)
Definition: misc.h:33
struct m0_rm_credit rin_want
Definition: rm.h:1450
M0_INTERNAL void m0_mutex_lock(struct m0_mutex *mutex)
Definition: mutex.c:49
struct m0_rpc_session * rem_session
Definition: rm.h:755
struct m0_poolmach * sf_pm
Definition: file.h:70
M0_INTERNAL int m0_sns_cm_fctx_init(struct m0_sns_cm *scm, const struct m0_fid *fid, struct m0_sns_cm_file_ctx **sc_fctx)
Definition: file.c:246
M0_INTERNAL int m0_fid_cmp(const struct m0_fid *fid0, const struct m0_fid *fid1)
Definition: fid.c:170
static int _layout_fetch(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:632
M0_INTERNAL void m0_sns_cm_file_attr_and_layout_wait(struct m0_sns_cm_file_ctx *fctx, struct m0_fom *fom)
Definition: file.c:744
struct m0_pool * pv_pool
Definition: pool.h:128
struct m0_pdclust_attr pl_attr
Definition: pdclust.h:150
#define PRIx64
Definition: types.h:61
uint64_t sf_ag_nr
Definition: file.h:101
M0_INTERNAL int m0_layout_instance_build(struct m0_layout *l, const struct m0_fid *fid, struct m0_layout_instance **out)
Definition: layout.c:1113
struct m0_fid fid
Definition: di.c:46
return M0_RC(rc)
static struct m0_cm * cm
Definition: cm.c:63
struct m0_pooldev * sf_pd
Definition: file.h:72
#define M0_ENTRY(...)
Definition: trace.h:170
static struct m0_sm_ast ast[NR]
Definition: locality.c:44
M0_INTERNAL struct m0_sns_cm_file_ctx * m0_sns_cm_fctx_get(struct m0_sns_cm *scm, const struct m0_cm_ag_id *id)
Definition: file.c:457
static void _attr_cb(void *arg, int rc)
Definition: file.c:572
struct m0_sm rin_sm
Definition: rm.h:1436
M0_INTERNAL void m0_ref_put(struct m0_ref *ref)
Definition: refs.c:38
Definition: rmut.h:123
M0_INTERNAL void m0_fid_set(struct m0_fid *fid, uint64_t container, uint64_t key)
Definition: fid.c:116
#define M0_ERR_INFO(rc, fmt,...)
Definition: trace.h:215
struct m0_sm ro_sm
Definition: rm.h:1005
void m0_ref_init(struct m0_ref *ref, int init_num, void(*release)(struct m0_ref *ref))
Definition: refs.c:24
return M0_ERR(-EOPNOTSUPP)
static void _fctx_fini(struct m0_sm_group *grp, struct m0_sm_ast *ast)
Definition: file.c:153
M0_INTERNAL void m0_ref_get(struct m0_ref *ref)
Definition: refs.c:32
struct m0_mutex sc_file_ctx_mutex
Definition: cm.h:271
void * sa_datum
Definition: sm.h:508
struct m0_sns_cm * sf_scm
Definition: file.h:94
M0_INTERNAL const struct m0_fid M0_MDSERVICE_SLASH_FID
Definition: md_fid.c:63
M0_INTERNAL void m0_sns_cm_file_bwd_map(struct m0_sns_cm_file_ctx *fctx, const struct m0_pdclust_tgt_addr *ta, struct m0_pdclust_src_addr *sa)
Definition: file.c:759
M0_INTERNAL void m0_rm_incoming_init(struct m0_rm_incoming *in, struct m0_rm_owner *owner, enum m0_rm_incoming_type type, enum m0_rm_incoming_policy policy, uint64_t flags)
Definition: rm.c:1060
M0_INTERNAL uint64_t m0_pool_version2layout_id(const struct m0_fid *pv_fid, uint64_t lid)
Definition: pool.c:1900
M0_INTERNAL int m0_sns_cm_file_lock_wait(struct m0_sns_cm_file_ctx *fctx, struct m0_fom *fom)
Definition: file.c:370
struct m0_rm_remote sf_creditor
Definition: file.h:88
#define M0_AMB(obj, ptr, field)
Definition: misc.h:320
Definition: refs.h:34
if(value==NULL)
Definition: dir.c:350
static void _fctx_status_set(struct m0_sns_cm_file_ctx *fctx, int state)
Definition: file.c:142
M0_INTERNAL void m0_sns_cm_file_unlock(struct m0_sns_cm *scm, struct m0_fid *fid)
Definition: file.c:504
#define M0_ASSERT(cond)
#define _AST2FCTX(ast, field)
Definition: file.c:44
const char * scf_name
Definition: sm.h:352
M0_INTERNAL struct m0_pool_version * m0_sns_cm_pool_version_get(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:686
M0_INTERNAL bool m0_mutex_is_locked(const struct m0_mutex *mutex)
Definition: mutex.c:95
static void __sns_cm_file_unlock(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:357
static void _max_group_set(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:545
void m0_sm_state_set(struct m0_sm *mach, int state)
Definition: sm.c:478
uint64_t ta_frame
Definition: pdclust.h:254
static int _fid_layout_instance(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:652
static int __sns_cm_file_oo_lock(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:336
const struct m0_rm_incoming_ops * rin_ops
Definition: rm.h:1471
struct m0_clink sf_fini_clink
Definition: file.h:120
struct m0_sm_ast sf_fini_ast
Definition: file.h:118
int layout_id
Definition: dir.c:331
M0_INTERNAL void m0_file_owner_init(struct m0_rm_owner *owner, const struct m0_uint128 *grp_id, struct m0_file *file, struct m0_rm_remote *creditor)
Definition: file.c:507
M0_INTERNAL struct m0_pdclust_layout * m0_layout_to_pdl(const struct m0_layout *l)
Definition: pdclust.c:382
bool rh_oostore
Definition: reqh.h:171
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
Definition: mutex.c:35
uint64_t f_container
Definition: fid.h:39
#define M0_POST(cond)
const struct m0_rm_incoming_ops file_lock_incoming_ops
Definition: file.c:215
Definition: reqh.h:94
struct m0_layout_domain rh_ldom
Definition: reqh.h:153
Definition: dump.c:103
Definition: chan.h:229
static void group(void)
Definition: sm.c:386
M0_INTERNAL void m0_fd_bwd_map(struct m0_pdclust_instance *pi, const struct m0_pdclust_tgt_addr *tgt, struct m0_pdclust_src_addr *src)
Definition: fd.c:959
M0_INTERNAL void m0_sns_cm_fctx_lock(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:53
const struct m0_uint128 m0_rm_sns_cm_group
Definition: file.c:47
#define FID_P(f)
Definition: fid.h:77
static struct m0_clink l[NR]
Definition: chan.c:37
#define PRId64
Definition: types.h:57
static void sns_cm_fctx_rm_fini(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:227
static const struct m0_sm_conf fctx_sm_conf
Definition: file.c:131
struct m0_fid ca_pver
Definition: cob.h:366
M0_INTERNAL struct m0_reqh * m0_sns_cm2reqh(const struct m0_sns_cm *snscm)
Definition: cm_utils.c:547
static struct m0_pool pool
Definition: iter_ut.c:58
struct m0_sm_group cm_sm_group
Definition: cm.h:185
M0_INTERNAL bool m0_fid_eq(const struct m0_fid *fid0, const struct m0_fid *fid1)
Definition: fid.c:164
uint32_t sd_flags
Definition: sm.h:378
Definition: fom.h:481
M0_INTERNAL void m0_sns_cm_fctx_cleanup(struct m0_sns_cm *scm)
Definition: file.c:180
struct m0_reqh reqh
Definition: rm_foms.c:48
M0_INTERNAL void m0_file_unlock(struct m0_rm_incoming *req)
Definition: file.c:540
#define M0_CNT_INC(cnt)
Definition: arith.h:226
struct m0_sm_group * sf_group
Definition: file.h:114
#define M0_FI_ENABLED(tag)
Definition: finject.h:231
Definition: fid.h:38
struct m0_ref sf_ref
Definition: file.h:110
uint64_t f_key
Definition: fid.h:40
M0_INTERNAL void m0_rm_remote_fini(struct m0_rm_remote *rem)
Definition: rm.c:1431
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
static int _attr_fetch(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:619
#define M0_ALLOC_PTR(ptr)
Definition: memory.h:86
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
struct m0_rm_resource fi_res
Definition: file.h:90
struct m0_reqh_service cm_service
Definition: cm.h:191
Definition: rm.h:863
struct m0_rm_incoming sf_rin
Definition: file.h:91
M0_INTERNAL void m0_rm_owner_windup(struct m0_rm_owner *owner)
Definition: rm.c:930
Definition: cm.h:166
M0_INTERNAL enum m0_pdclust_unit_type m0_pdclust_unit_classify(const struct m0_pdclust_layout *pl, int unit)
Definition: pdclust.c:425
M0_INTERNAL int m0_sns_cm_file_attr_and_layout(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:694
M0_INTERNAL void m0_mutex_fini(struct m0_mutex *mutex)
Definition: mutex.c:42
M0_INTERNAL void m0_clink_fini(struct m0_clink *link)
Definition: chan.c:208
struct m0_pools_common * rh_pools
Definition: reqh.h:118
M0_INTERNAL struct m0_sns_cm_file_ctx * m0_sns_cm_fctx_locate(struct m0_sns_cm *scm, struct m0_fid *fid)
Definition: file.c:441
struct m0_sm sf_sm
Definition: file.h:112
M0_INTERNAL int m0_sns_cm_fctx_state_get(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:137
const struct m0_rm_resource_type_ops * rt_ops
Definition: rm.h:388
M0_INTERNAL void m0_rm_owner_unlock(struct m0_rm_owner *owner)
Definition: rm.c:603
struct m0_sns_cm_rm_ctx sc_rm_ctx
Definition: cm.h:274
#define M0_UINT128(hi, lo)
Definition: types.h:40
static uint64_t sns_cm_fctx_hash_func(const struct m0_htable *htable, const void *k)
Definition: file.c:63
static void _attr_ast_cb(struct m0_sm_group *grp, struct m0_sm_ast *ast)
Definition: file.c:559
#define M0_CNT_DEC(cnt)
Definition: arith.h:219
M0_INTERNAL void m0_file_fini(struct m0_file *file)
Definition: file.c:498
struct m0_cm sc_base
Definition: cm.h:206
M0_INTERNAL struct m0_rpc_session * m0_pools_common_active_rm_session(struct m0_pools_common *pc)
Definition: pool.c:1074
struct m0_cob_attr sf_attr
Definition: file.h:65
M0_INTERNAL void m0_layout_instance_fini(struct m0_layout_instance *li)
Definition: layout.c:1123
struct m0_pdclust_instance * sf_pi
Definition: file.h:77
static struct m0_sns_cm_file_ctx fctx
Definition: net.c:55
Definition: pool.h:80
M0_INTERNAL struct m0_pdclust_instance * m0_layout_instance_to_pdi(const struct m0_layout_instance *li)
Definition: pdclust.c:400
M0_INTERNAL void m0_layout_put(struct m0_layout *l)
Definition: layout.c:893
#define out(...)
Definition: gen.c:41
struct m0_file sf_file
Definition: file.h:56
Definition: di.h:73
M0_INTERNAL void m0_rm_owner_lock(struct m0_rm_owner *owner)
Definition: rm.c:592
struct m0_uint128 cr_group_id
Definition: rm.h:506
M0_INTERNAL void m0_file_owner_fini(struct m0_rm_owner *owner)
Definition: file.c:516
M0_INTERNAL void m0_fd_fwd_map(struct m0_pdclust_instance *pi, const struct m0_pdclust_src_addr *src, struct m0_pdclust_tgt_addr *tgt)
Definition: fd.c:838
static bool sns_cm_fctx_key_eq(const void *key1, const void *key2)
Definition: file.c:72
M0_INTERNAL bool m0_cm_is_locked(const struct m0_cm *cm)
Definition: cm.c:560
struct m0_rm_owner sf_owner
Definition: file.h:85
struct m0_reqh * rs_reqh
Definition: reqh_service.h:259
void m0_free(void *data)
Definition: memory.c:146
static int _ios_failed_cob_attr(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:590
#define m0_htable_endfor
Definition: hash.h:491
static struct m0_poolmach * sns_cm_poolmach_get(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:665
struct m0_mutex sf_lock
Definition: file.h:79
uint32_t sm_state
Definition: sm.h:307
const struct m0_rm_resource_type_ops file_lock_type_ops
Definition: file.c:188
M0_INTERNAL int m0_sns_cm_ut_file_size_layout(struct m0_sns_cm_file_ctx *fctx)
Definition: cm_utils.c:68
int32_t rc
Definition: trigger_fop.h:47
uint64_t rt_id
Definition: rm.h:403
uint64_t h_bucket_nr
Definition: hash.h:178
#define ARRAY_SIZE(a)
Definition: misc.h:45
uint32_t pd_index
Definition: pool.h:432
M0_HT_DEFINE(tioreqht, static, struct target_ioreq, uint64_t)
M0_INTERNAL void m0_sns_cm_fctx_put(struct m0_sns_cm *scm, const struct m0_cm_ag_id *id)
Definition: file.c:481
Definition: ag.h:49
M0_INTERNAL void m0_rm_credit_get(struct m0_rm_incoming *in)
Definition: rm.c:1758
M0_INTERNAL uint64_t m0_pdclust_unit_size(const struct m0_pdclust_layout *pl)
Definition: pdclust.c:377
M0_INTERNAL const struct m0_fid M0_COB_ROOT_FID
Definition: md_fid.c:39
struct m0_rm_resource * ro_resource
Definition: rm.h:1015
#define FID_F
Definition: fid.h:75
M0_INTERNAL void m0_file_init(struct m0_file *file, const struct m0_fid *fid, struct m0_rm_domain *dom, enum m0_di_types di_type)
Definition: file.c:477
static void sns_cm_fctx_release(struct m0_ref *ref)
Definition: file.c:191
Definition: idx_mock.c:47
Definition: rm.h:1156
uint64_t ca_size
Definition: cob.h:376
M0_INTERNAL void m0_sns_cm_flock_resource_set(struct m0_sns_cm *scm)
Definition: file.c:201
M0_INTERNAL void m0_sm_fini(struct m0_sm *mach)
Definition: sm.c:331
struct m0_tl po_failed_devices
Definition: pool.h:93
static bool fctx_fini_clink_cb(struct m0_clink *link)
Definition: file.c:236