Motr  M0
seg.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2013-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_BE
24 #include "lib/trace.h"
25 
26 #include "be/seg.h"
27 
28 #include "lib/misc.h" /* M0_IN */
29 #include "lib/memory.h" /* m0_alloc_aligned */
30 #include "lib/errno.h" /* ENOMEM */
31 #include "lib/time.h" /* m0_time_now */
32 #include "lib/atomic.h" /* m0_atomic64 */
33 
34 #include "motr/version.h" /* m0_build_info_get */
35 
36 #include "stob/stob.h" /* m0_stob, m0_stob_fd */
37 
38 #include "be/seg_internal.h" /* m0_be_seg_hdr */
39 #include "be/io.h" /* m0_be_io */
40 
41 #include <sys/mman.h> /* mmap */
42 #include <search.h> /* twalk */
43 
50 static const struct m0_be_seg_geom *
51 be_seg_geom_find_by_id(const struct m0_be_seg_hdr *hdr, uint64_t id)
52 {
53  uint16_t i;
54 
55  for (i = 0; i < hdr->bh_items_nr; ++i)
56  if (hdr->bh_items[i].sg_id == id)
57  return &hdr->bh_items[i];
58 
59  return NULL;
60 }
61 
62 static int be_seg_geom_len(const struct m0_be_seg_geom *geom)
63 {
64  uint16_t len;
65 
66  if (geom == NULL || m0_be_seg_geom_eq(geom, &M0_BE_SEG_GEOM0))
67  return -ENOENT;
68 
69  for (len = 0; !m0_be_seg_geom_eq(&geom[len], &M0_BE_SEG_GEOM0); ++len)
70  ;
71 
72  return len;
73 }
74 
75 static int be_seg_hdr_size(void)
76 {
77  return sizeof(struct m0_be_seg_hdr);
78 }
79 
80 static int be_seg_hdr_create(struct m0_stob *stob, struct m0_be_seg_hdr *hdr)
81 {
82  struct m0_be_seg_geom *geom = hdr->bh_items;
83  uint16_t len = hdr->bh_items_nr;
84  unsigned char last_byte;
85  int rc = -ENOENT;
86  int i;
87 
89  .ot_version = M0_BE_SEG_HDR_FORMAT_VERSION,
90  .ot_type = M0_FORMAT_TYPE_BE_SEG_HDR,
91  .ot_footer_offset = offsetof(struct m0_be_seg_hdr, bh_footer)
92  });
93 
94  for (i = 0; i < len; ++i) {
95  const struct m0_be_seg_geom *g = &geom[i];
96  M0_LOG(M0_DEBUG, "stob=%p size=%" PRId64 " addr=%p "
97  "offset=%" PRId64 " id=%"PRId64,
98  stob, g->sg_size, g->sg_addr, g->sg_offset, g->sg_id);
99 
100  M0_PRE(g->sg_addr != NULL);
101  M0_PRE(g->sg_size > 0);
102 
103  /* offset, size, addr must be a multiple of the page size as
104  * returned by M0_BE_SEG_PAGE_SIZE. */
105  M0_PRE(m0_is_aligned((uint64_t)g->sg_addr,
109 
110  hdr->bh_id = g->sg_id;
111  hdr->bh_gen = g->sg_gen;
112  strncpy(hdr->bh_be_version,
113  m0_build_info_get()->bi_xcode_protocol_be_checksum,
115  M0_CASSERT(sizeof hdr->bh_be_version >
117  /* Avoid buffer overflow */
120  rc = m0_be_io_single(stob, SIO_WRITE, hdr, g->sg_offset,
121  be_seg_hdr_size());
122 
123  /* Do not move this block out of the cycle. Segments can come
124  * unordered inside @geom. */
125  if (rc == 0) {
126  /*
127  * Write the last byte on the backing store.
128  *
129  * mmap() will have problem with regular file mapping
130  * otherwise. Also checks that device (if used as
131  * backing storage) has enough size to be used as
132  * segment backing store.
133  */
134  last_byte = 0;
135  rc = m0_be_io_single(stob, SIO_WRITE, &last_byte,
136  g->sg_offset + g->sg_size - 1,
137  sizeof last_byte);
138  if (rc != 0)
139  M0_LOG(M0_WARN,
140  "can't write segment's last byte");
141  } else {
142  M0_LOG(M0_WARN, "can't write segment header");
143  }
144  if (rc != 0)
145  break;
146  }
147  return M0_RC(rc);
148 }
149 
150 M0_INTERNAL bool m0_be_seg_geom_eq(const struct m0_be_seg_geom *left,
151  const struct m0_be_seg_geom *right)
152 {
153  return memcmp(left, right, sizeof(struct m0_be_seg_geom)) == 0;
154 }
155 
156 static bool be_seg_geom_has_no_overlapps(const struct m0_be_seg_geom *geom,
157  int len)
158 {
159  int i;
160  int j;
161  struct m0_ext ei;
162  struct m0_ext ej;
163  struct m0_ext eai;
164  struct m0_ext eaj;
165 
166 
167  M0_PRE(len > 0);
168 
169  for (i = 0; i < len; ++i) {
170  ei = M0_EXT(geom[i].sg_offset,
171  geom[i].sg_offset + geom[i].sg_size);
172  eai = M0_EXT((m0_bindex_t)geom[i].sg_addr,
173  (m0_bindex_t)geom[i].sg_addr +
174  geom[i].sg_size);
175 
176  for (j = 0; j < len; ++j) {
177  if (&geom[j] == &geom[i])
178  continue;
179 
180  ej = M0_EXT(geom[j].sg_offset,
181  geom[j].sg_offset + geom[j].sg_size);
182  eaj = M0_EXT((m0_bindex_t)geom[j].sg_addr,
183  (m0_bindex_t)geom[j].sg_addr +
184  geom[j].sg_size);
185 
186  if (m0_ext_are_overlapping(&ei, &ej) ||
187  m0_ext_are_overlapping(&eai, &eaj))
188  return false;
189  }
190  }
191 
192  return true;
193 }
194 
195 M0_INTERNAL int m0_be_seg_create_multiple(struct m0_stob *stob,
196  const struct m0_be_seg_geom *geom)
197 {
198  struct m0_be_seg_hdr *hdr;
199  int len;
200  int i;
201  int rc;
202 
203  len = be_seg_geom_len(geom);
204  if (len < 0)
205  return M0_RC(len);
206 
209 
210  hdr = m0_alloc(be_seg_hdr_size());
211  if (hdr == NULL)
212  return M0_RC(-ENOMEM);
213 
214  hdr->bh_items_nr = len;
215  for (i = 0; i < len; ++i)
216  hdr->bh_items[i] = geom[i];
217 
218  rc = be_seg_hdr_create(stob, hdr);
219  m0_free(hdr);
220 
221  return M0_RC(rc);
222 }
223 
224 M0_INTERNAL int m0_be_seg_create(struct m0_be_seg *seg,
226  void *addr)
227 {
228  struct m0_be_seg_geom geom[] = {
229  [0] = {
230  .sg_size = size,
231  .sg_addr = addr,
232  .sg_offset = 0ULL,
233  .sg_id = seg->bs_id,
234  .sg_gen = seg->bs_gen = m0_time_now()
235  },
236 
237  [1] = M0_BE_SEG_GEOM0,
238  };
239 
240  return m0_be_seg_create_multiple(seg->bs_stob, geom);
241 }
242 
243 M0_INTERNAL int m0_be_seg_destroy(struct m0_be_seg *seg)
244 {
245  M0_ENTRY("seg=%p", seg);
247 
248  /* XXX TODO: seg destroy ... */
249 
250  return M0_RC(0);
251 }
252 
253 M0_INTERNAL void m0_be_seg_init(struct m0_be_seg *seg,
254  struct m0_stob *stob,
255  struct m0_be_domain *dom,
256  uint64_t seg_id)
257 {
258  M0_ENTRY("seg=%p", seg);
259 
260  /* XXX: Remove this eventually, after explicitly called
261  * m0_be_seg_create_multiple() is used everywhere */
262  if (seg_id == M0_BE_SEG_FAKE_ID)
263  seg_id = m0_stob_fid_get(stob)->f_key;
264 
265  *seg = (struct m0_be_seg) {
266  .bs_domain = dom,
267  .bs_stob = stob,
268  .bs_state = M0_BSS_INIT,
269  .bs_id = seg_id,
270  };
272  M0_LEAVE();
273 }
274 
275 M0_INTERNAL void m0_be_seg_fini(struct m0_be_seg *seg)
276 {
277  M0_ENTRY("seg=%p", seg);
280  M0_LEAVE();
281 }
282 
283 M0_INTERNAL bool m0_be_seg__invariant(const struct m0_be_seg *seg)
284 {
285  return _0C(seg != NULL) &&
286  _0C(seg->bs_addr != NULL) &&
287  _0C(seg->bs_size > 0);
288 }
289 
290 bool m0_be_reg__invariant(const struct m0_be_reg *reg)
291 {
292  return _0C(reg != NULL) && _0C(reg->br_seg != NULL) &&
293  _0C(reg->br_size > 0) && _0C(reg->br_addr != NULL) &&
294  _0C(m0_be_seg_contains(reg->br_seg, reg->br_addr)) &&
296  reg->br_addr + reg->br_size - 1));
297 }
298 
299 static void be_seg_madvise(struct m0_be_seg *seg, m0_bcount_t dump_limit,
300  int flag)
301 {
302  int rc;
303 
304  if (dump_limit >= seg->bs_size)
305  return;
306 
307  if (flag == MADV_DONTDUMP)
308  rc = m0_dont_dump(seg->bs_addr + dump_limit,
309  seg->bs_size - dump_limit);
310  else
311  rc = madvise(seg->bs_addr + dump_limit,
312  seg->bs_size - dump_limit,
313  flag);
314 
315  if (rc == 0)
316  M0_LOG(M0_INFO, "madvise(%p, %" PRIu64 ", %d) = %d",
317  seg->bs_addr, seg->bs_size, flag, rc);
318  else
319  M0_LOG(M0_ERROR, "madvise(%p, %" PRIu64 ", %d) = %d",
320  seg->bs_addr, seg->bs_size, flag, rc);
321 
322 }
323 
324 M0_INTERNAL int m0_be_seg_open(struct m0_be_seg *seg)
325 {
326  const struct m0_be_seg_geom *g;
327  struct m0_be_seg_hdr *hdr;
328  const char *runtime_be_version;
329  void *p;
330  int fd;
331  int rc;
332 
333  M0_ENTRY("seg=%p", seg);
335 
336  hdr = m0_alloc(be_seg_hdr_size());
337  if (hdr == NULL)
338  return M0_ERR(-ENOMEM);
339 
342  if (rc != 0) {
343  m0_free(hdr);
344  return M0_ERR(rc);
345  }
346 
347  runtime_be_version = m0_build_info_get()->
348  bi_xcode_protocol_be_checksum;
349  if (strncmp(hdr->bh_be_version, runtime_be_version,
351  rc = M0_ERR_INFO(-EPROTO, "BE protocol checksum mismatch:"
352  " expected '%s', stored on disk '%s'",
353  runtime_be_version, (char*)hdr->bh_be_version);
354  m0_free(hdr);
355  return rc;
356  }
357 
359  if (g == NULL) {
360  m0_free(hdr);
361  return M0_ERR(-ENOENT);
362  }
363 
364  fd = m0_stob_fd(seg->bs_stob);
365  p = mmap(g->sg_addr, g->sg_size, PROT_READ | PROT_WRITE,
366  MAP_FIXED | MAP_PRIVATE | MAP_NORESERVE, fd, g->sg_offset);
367  if (p != g->sg_addr) {
368  rc = M0_ERR_INFO(-errno, "p=%p g->sg_addr=%p fd=%d",
369  p, g->sg_addr, fd);
370  /* `g' is a part of `hdr'. Don't print it after free. */
371  m0_free(hdr);
372  return rc;
373  }
374 
375  /* rc = be_seg_read_all(seg, &hdr); */
376  rc = 0;
377  if (rc == 0) {
379  seg->bs_size = g->sg_size;
380  seg->bs_addr = g->sg_addr;
381  seg->bs_offset = g->sg_offset;
382  seg->bs_gen = g->sg_gen;
385  be_seg_madvise(seg, 0ULL, MADV_DONTFORK);
386  } else {
387  munmap(g->sg_addr, g->sg_size);
388  }
389 
390  m0_free(hdr);
391  return M0_RC(rc);
392 }
393 
394 M0_INTERNAL void m0_be_seg_close(struct m0_be_seg *seg)
395 {
396  M0_ENTRY("seg=%p", seg);
398 
399  munmap(seg->bs_addr, seg->bs_size);
401  M0_LEAVE();
402 }
403 
404 M0_INTERNAL bool m0_be_seg_contains(const struct m0_be_seg *seg,
405  const void *addr)
406 {
407  return seg->bs_addr <= addr && addr < seg->bs_addr + seg->bs_size;
408 }
409 
410 M0_INTERNAL bool m0_be_reg_eq(const struct m0_be_reg *r1,
411  const struct m0_be_reg *r2)
412 {
413  return r1->br_seg == r2->br_seg &&
414  r1->br_size == r2->br_size &&
415  r1->br_addr == r2->br_addr;
416 }
417 
418 M0_INTERNAL m0_bindex_t m0_be_seg_offset(const struct m0_be_seg *seg,
419  const void *addr)
420 {
422  return addr - seg->bs_addr + seg->bs_offset;
423 }
424 
425 M0_INTERNAL m0_bindex_t m0_be_reg_offset(const struct m0_be_reg *reg)
426 {
427  return m0_be_seg_offset(reg->br_seg, reg->br_addr);
428 }
429 
430 M0_INTERNAL m0_bcount_t m0_be_seg_reserved(const struct m0_be_seg *seg)
431 {
432  return seg->bs_reserved;
433 }
434 
435 M0_INTERNAL struct m0_be_allocator *m0_be_seg_allocator(struct m0_be_seg *seg)
436 {
437  return &seg->bs_allocator;
438 }
439 
440 static int
441 be_seg_io(struct m0_be_reg *reg, void *ptr, enum m0_stob_io_opcode opcode)
442 {
443  return m0_be_io_single(reg->br_seg->bs_stob, opcode,
444  ptr, m0_be_reg_offset(reg), reg->br_size);
445 }
446 
447 M0_INTERNAL int m0_be_seg__read(struct m0_be_reg *reg, void *dst)
448 {
449  return be_seg_io(reg, dst, SIO_READ);
450 }
451 
452 M0_INTERNAL int m0_be_seg__write(struct m0_be_reg *reg, void *src)
453 {
454  return be_seg_io(reg, src, SIO_WRITE);
455 }
456 
457 M0_INTERNAL int m0_be_reg__read(struct m0_be_reg *reg)
458 {
459  return m0_be_seg__read(reg, reg->br_addr);
460 }
461 
462 M0_INTERNAL int m0_be_reg__write(struct m0_be_reg *reg)
463 {
464  return m0_be_seg__write(reg, reg->br_addr);
465 }
466 
467 /* #define USE_TIME_NOW_AS_GEN_IDX */
468 
469 M0_INTERNAL unsigned long m0_be_reg_gen_idx(const struct m0_be_reg *reg)
470 {
471 #ifdef USE_TIME_NOW_AS_GEN_IDX
472  m0_time_t now = m0_time_now();
473 
474  M0_CASSERT(sizeof now == sizeof(unsigned long));
475  return now;
476 #else
477  static struct m0_atomic64 global_gen_idx = {};
478 
479  M0_CASSERT(sizeof global_gen_idx == sizeof(unsigned long));
480  return m0_atomic64_add_return(&global_gen_idx, 1);
481 #endif
482 }
483 
484 M0_INTERNAL bool m0_be_seg_contains_stob(struct m0_be_seg *seg,
485  const struct m0_stob_id *stob_id)
486 {
487  return m0_stob_id_eq(m0_stob_id_get(seg->bs_stob), stob_id);
488 }
489 
491 #undef M0_TRACE_SUBSYSTEM
492 
493 /*
494  * Local variables:
495  * c-indentation-style: "K&R"
496  * c-basic-offset: 8
497  * tab-width: 8
498  * fill-column: 80
499  * scroll-step: 1
500  * End:
501  */
502 /*
503  * vim: tabstop=8 shiftwidth=8 noexpandtab textwidth=80 nowrap
504  */
uint32_t bh_items_nr
Definition: seg_internal.h:50
void * bs_addr
Definition: seg.h:71
M0_INTERNAL int m0_be_seg__write(struct m0_be_reg *reg, void *src)
Definition: seg.c:452
static void ptr(struct m0_addb2__context *ctx, const uint64_t *v, char *buf)
Definition: dump.c:440
static struct m0_addb2_philter p
Definition: consumer.c:40
struct m0_be_domain * bs_domain
Definition: seg.h:82
#define M0_PRE(cond)
uint64_t bs_gen
Definition: seg.h:76
char bh_be_version[M0_BE_SEG_HDR_VERSION_LEN_MAX+1]
Definition: seg_internal.h:53
M0_INTERNAL void m0_be_seg_fini(struct m0_be_seg *seg)
Definition: seg.c:275
M0_INTERNAL void m0_format_header_pack(struct m0_format_header *dest, const struct m0_format_tag *src)
Definition: format.c:40
#define NULL
Definition: misc.h:38
M0_INTERNAL m0_bindex_t m0_be_seg_offset(const struct m0_be_seg *seg, const void *addr)
Definition: seg.c:418
static struct m0_bufvec dst
Definition: xform.c:61
Definition: io.h:230
M0_INTERNAL int m0_be_seg_create_multiple(struct m0_stob *stob, const struct m0_be_seg_geom *geom)
Definition: seg.c:195
m0_bcount_t bs_offset
Definition: seg.h:70
uint64_t bs_id
Definition: seg.h:67
struct m0_be_allocator bs_allocator
Definition: seg.h:81
uint64_t m0_time_t
Definition: time.h:37
#define M0_LOG(level,...)
Definition: trace.h:167
M0_LEAVE()
#define M0_CASSERT(cond)
M0_INTERNAL int m0_be_seg_create(struct m0_be_seg *seg, m0_bcount_t size, void *addr)
Definition: seg.c:224
m0_bcount_t bs_size
Definition: seg.h:69
M0_INTERNAL bool m0_be_seg_contains_stob(struct m0_be_seg *seg, const struct m0_stob_id *stob_id)
Definition: seg.c:484
Allocator.
Definition: alloc.h:132
static int be_seg_hdr_size(void)
Definition: seg.c:75
M0_INTERNAL int m0_be_reg__write(struct m0_be_reg *reg)
Definition: seg.c:462
m0_bcount_t sg_offset
Definition: seg.h:487
m0_bcount_t br_size
Definition: seg.h:144
uint64_t m0_bindex_t
Definition: types.h:80
uint64_t m0_bcount_t
Definition: types.h:77
static int left
Definition: locality.c:280
M0_INTERNAL const struct m0_fid * m0_stob_fid_get(struct m0_stob *stob)
Definition: stob.c:255
M0_INTERNAL int m0_be_reg__read(struct m0_be_reg *reg)
Definition: seg.c:457
M0_INTERNAL unsigned long m0_be_reg_gen_idx(const struct m0_be_reg *reg)
Definition: seg.c:469
#define M0_EXT(start, end)
Definition: ext.h:55
M0_INTERNAL int m0_be_seg_open(struct m0_be_seg *seg)
Definition: seg.c:324
m0_bcount_t bs_reserved
Definition: seg.h:74
bool m0_be_reg__invariant(const struct m0_be_reg *reg)
Definition: seg.c:290
return M0_RC(rc)
#define M0_ENTRY(...)
Definition: trace.h:170
int opcode
Definition: crate.c:301
static char * addr
Definition: node_k.c:37
M0_INTERNAL m0_bcount_t m0_be_seg_reserved(const struct m0_be_seg *seg)
Definition: seg.c:430
int i
Definition: dir.c:1033
#define PRIu64
Definition: types.h:58
#define M0_ERR_INFO(rc, fmt,...)
Definition: trace.h:215
return M0_ERR(-EOPNOTSUPP)
const struct m0_build_info * m0_build_info_get(void)
Definition: version.c:61
m0_bcount_t sg_size
Definition: seg.h:485
Definition: trace.h:482
uint64_t bh_gen
Definition: seg_internal.h:54
M0_INTERNAL int m0_dont_dump(void *p, size_t size)
Definition: memory.c:243
M0_INTERNAL const struct m0_stob_id * m0_stob_id_get(struct m0_stob *stob)
Definition: stob.c:250
Definition: stob.h:163
static struct m0_stob * stob
Definition: storage.c:39
M0_INTERNAL int m0_be_seg__read(struct m0_be_reg *reg, void *dst)
Definition: seg.c:447
#define M0_ASSERT(cond)
m0_stob_io_opcode
Definition: io.h:227
M0_INTERNAL void m0_be_seg_close(struct m0_be_seg *seg)
Definition: seg.c:394
static bool m0_is_aligned(uint64_t val, uint64_t alignment)
Definition: arith.h:179
M0_INTERNAL int m0_be_io_single(struct m0_stob *stob, enum m0_stob_io_opcode opcode, void *ptr_user, m0_bindex_t offset_stob, m0_bcount_t size)
Definition: io.c:682
m0_time_t m0_time_now(void)
Definition: time.c:134
static struct m0_stob_domain * dom
Definition: storage.c:38
M0_INTERNAL struct m0_be_allocator * m0_be_seg_allocator(struct m0_be_seg *seg)
Definition: seg.c:435
void * m0_alloc(size_t size)
Definition: memory.c:126
static int be_seg_hdr_create(struct m0_stob *stob, struct m0_be_seg_hdr *hdr)
Definition: seg.c:80
void * sg_addr
Definition: seg.h:486
Definition: xcode.h:73
Definition: seg.h:66
Definition: seg.h:142
#define PRId64
Definition: types.h:57
M0_INTERNAL bool m0_be_reg_eq(const struct m0_be_reg *r1, const struct m0_be_reg *r2)
Definition: seg.c:410
M0_INTERNAL void m0_be_seg_init(struct m0_be_seg *seg, struct m0_stob *stob, struct m0_be_domain *dom, uint64_t seg_id)
Definition: seg.c:253
#define M0_BE_SEG_GEOM0
Definition: seg.h:100
m0_bcount_t sg_size
Definition: seg.h:90
static int be_seg_io(struct m0_be_reg *reg, void *ptr, enum m0_stob_io_opcode opcode)
Definition: seg.c:441
Definition: ext.h:37
uint64_t f_key
Definition: fid.h:40
M0_INTERNAL void m0_format_footer_update(const void *buffer)
Definition: format.c:95
int bs_state
Definition: seg.h:83
M0_INTERNAL m0_bindex_t m0_be_reg_offset(const struct m0_be_reg *reg)
Definition: seg.c:425
M0_INTERNAL int m0_stob_fd(struct m0_stob *stob)
Definition: stob.c:360
static bool flag
Definition: nucleus.c:266
M0_INTERNAL int m0_be_seg_destroy(struct m0_be_seg *seg)
Definition: seg.c:243
m0_bcount_t size
Definition: di.c:39
#define _0C(exp)
Definition: assert.h:311
static void be_seg_madvise(struct m0_be_seg *seg, m0_bcount_t dump_limit, int flag)
Definition: seg.c:299
M0_INTERNAL bool m0_stob_id_eq(const struct m0_stob_id *stob_id0, const struct m0_stob_id *stob_id1)
Definition: stob.c:352
M0_INTERNAL bool m0_ext_are_overlapping(const struct m0_ext *e0, const struct m0_ext *e1)
Definition: ext.c:53
M0_INTERNAL bool m0_be_seg_geom_eq(const struct m0_be_seg_geom *left, const struct m0_be_seg_geom *right)
Definition: seg.c:150
struct m0t1fs_filedata * fd
Definition: dir.c:1030
static struct m0_be_seg * seg
Definition: btree.c:40
struct m0_stob * bs_stob
Definition: seg.h:68
static bool be_seg_geom_has_no_overlapps(const struct m0_be_seg_geom *geom, int len)
Definition: seg.c:156
M0_INTERNAL bool m0_be_seg_contains(const struct m0_be_seg *seg, const void *addr)
Definition: seg.c:404
uint64_t sg_id
Definition: seg.h:93
M0_INTERNAL bool m0_be_seg__invariant(const struct m0_be_seg *seg)
Definition: seg.c:283
Definition: io.h:229
static int be_seg_geom_len(const struct m0_be_seg_geom *geom)
Definition: seg.c:62
static struct gen g[MAX_GEN]
Definition: beck.c:521
void m0_free(void *data)
Definition: memory.c:146
struct m0_be_seg * br_seg
Definition: seg.h:143
uint64_t bh_id
Definition: seg_internal.h:49
M0_INTERNAL void m0_stob_get(struct m0_stob *stob)
Definition: stob.c:275
void * br_addr
Definition: seg.h:145
struct m0_be_seg_geom bh_items[M0_BE_SEG_HDR_GEOM_ITMES_MAX]
Definition: seg_internal.h:51
struct m0_pdclust_src_addr src
Definition: fd.c:108
struct m0_format_header bh_header
Definition: seg_internal.h:48
int32_t rc
Definition: trigger_fop.h:47
M0_INTERNAL void m0_stob_put(struct m0_stob *stob)
Definition: stob.c:291
static int64_t m0_atomic64_add_return(struct m0_atomic64 *a, int64_t d)
Definition: trace.h:478
static const struct m0_be_seg_geom * be_seg_geom_find_by_id(const struct m0_be_seg_hdr *hdr, uint64_t id)
Definition: seg.c:51