37 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_LAYOUT 85 const void *
key0,
const void *key1)
110 m0_layout_list_enum_bob_check(le) &&
118 m0_layout_list_enum_bob_check(le) &&
142 if (list_enum ==
NULL) {
149 m0_layout_list_enum_bob_init(list_enum);
152 M0_LEAVE(
"list enum pointer %p", list_enum);
166 m0_layout_list_enum_bob_fini(list_enum);
174 struct m0_fid *cob_list, uint32_t
nr)
181 "list_enum %p, Invalid attributes (nr = 0), rc %d",
192 struct m0_fid *cob_list, uint32_t
nr,
203 if (
M0_FI_ENABLED(
"fid_invalid_err")) {
goto err1_injected; }
204 for (
i = 0;
i <
nr; ++
i) {
248 M0_ENTRY(
"lid %llu, enum_pointer %p", (
unsigned long long)lid, e);
250 m0_layout_list_enum_bob_fini(list_enum);
281 {
rc = -EEXIST;
goto err2_injected; }
329 struct m0_db_pair
pair;
330 struct m0_db_cursor cursor;
334 M0_ENTRY(
"lid %llu, idx_start %lu, idx_end %lu",
336 (
unsigned long)idx_start,
337 (
unsigned long)idx_end);
342 {
rc = -ENOENT;
goto err1_injected; }
347 "m0_db_cursor_init() failed",
353 key.clk_cob_index = idx_start;
355 &
key,
sizeof key, &rec,
sizeof rec);
356 for (
i = idx_start;
i < idx_end; ++
i) {
358 {
rc = -ENOMEM;
goto err2_injected; }
360 rc = m0_db_cursor_get(&cursor, &
pair);
362 rc = m0_db_cursor_next(&cursor, &
pair);
366 "m0_db_cursor_get() failed",
371 if (
M0_FI_ENABLED(
"invalid_fid_err")) {
goto err3_injected; }
376 "fid invalid",
key.clk_lid,
rc);
382 m0_db_pair_fini(&
pair);
383 m0_db_cursor_fini(&cursor);
415 M0_ENTRY(
"lid %llu, nr %lu", (
unsigned long long)lid,
416 (
unsigned long)ce_header->
ces_nr);
424 if (cob_list ==
NULL) {
436 M0_LOG(
M0_DEBUG,
"lid %llu, nr %lu, Start reading inline entries",
437 (
unsigned long long)lid, (
unsigned long)ce_header->
ces_nr);
438 for (
i = 0;
i < num_inline; ++
i) {
442 if (
M0_FI_ENABLED(
"fid_invalid_err")) {
goto err2_injected; }
449 cob_list[
i] = *cob_id;
452 if (ce_header->
ces_nr > num_inline) {
455 "lid %llu, nr %lu, Start reading noninline entries",
456 (
unsigned long long)lid,
457 (
unsigned long)ce_header->
ces_nr);
474 M0_LEAVE(
"lid %llu, rc %d", (
unsigned long long)lid,
rc);
486 struct m0_db_cursor cursor;
489 struct m0_db_pair
pair;
496 M0_ENTRY(
"lid %llu, idx_start %lu, idx_end %lu",
498 (
unsigned long)idx_start,
499 (
unsigned long)list_enum->
lle_nr);
505 {
rc = -ENOENT;
goto err1_injected; }
511 "m0_db_cursor_init() failed",
517 for (
i = idx_start;
i < list_enum->
lle_nr; ++
i) {
519 key.clk_cob_index =
i;
521 &
key,
sizeof key, &rec,
sizeof rec);
527 {
rc = -ENOENT;
goto err2_injected; }
528 rc = m0_db_cursor_add(&cursor, &
pair);
532 "m0_db_cursor_add() failed",
538 {
rc = -ENOENT;
goto err3_injected; }
540 rc = m0_db_cursor_get(&cursor, &
pair);
542 rc = m0_db_cursor_next(&cursor, &
pair);
546 "m0_db_cursor_get() failed",
553 {
rc = -ENOMEM;
goto err4_injected; }
554 rc = m0_db_cursor_del(&cursor);
558 "m0_db_cursor_del() failed",
565 m0_db_pair_fini(&
pair);
566 m0_db_cursor_fini(&cursor);
596 M0_ENTRY(
"lid %llu, nr %lu", (
unsigned long long)lid,
597 (
unsigned long)list_enum->
lle_nr);
610 M0_LOG(
M0_DEBUG,
"lid %llu, nr %lu, Start accepting inline entries",
611 (
unsigned long long)lid, (
unsigned long)list_enum->
lle_nr);
612 for (
i = 0;
i < num_inline; ++
i) {
627 "lid %llu, nr %lu, Start writing noninline entries",
628 (
unsigned long long)lid,
629 (
unsigned long)list_enum->
lle_nr);
635 M0_LEAVE(
"lid %llu, rc %d", (
unsigned long long)lid,
rc);
646 M0_ENTRY(
"lid %llu, enum_pointer %p",
649 M0_LEAVE(
"lid %llu, enum_pointer %p, nr %lu",
651 (
unsigned long)list_enum->
lle_nr);
665 M0_ENTRY(
"lid %llu, enum_pointer %p",
671 M0_LEAVE(
"lid %llu, enum_pointer %p, fid_pointer %p",
713 #undef M0_TRACE_SUBSYSTEM int(* leto_register)(struct m0_layout_domain *dom, const struct m0_layout_enum_type *et)
#define M0_ALLOC_ARR(arr, nr)
static struct m0_layout_list_enum * enum_to_list_enum(const struct m0_layout_enum *e)
static int list_encode(const struct m0_layout_enum *e, enum m0_layout_xcode_op op, struct m0_db_tx *tx, struct m0_bufvec_cursor *out)
static int lcl_key_cmp(struct m0_table *table, const void *key0, const void *key1)
static void list_fini(struct m0_layout_enum *e)
struct m0_table lsd_cob_lists
static struct buffer * cur(struct m0_addb2_mach *mach, m0_bcount_t space)
static int noninline_write(const struct m0_layout_enum *e, struct m0_db_tx *tx, enum m0_layout_xcode_op op, uint32_t idx_start)
static int noninline_read(struct m0_fid *cob_list, struct m0_striped_layout *stl, struct m0_db_tx *tx, uint32_t idx_start, uint32_t idx_end)
#define M0_LOG(level,...)
static void list_unregister(struct m0_layout_domain *dom, const struct m0_layout_enum_type *et)
struct m0_layout_enum lle_base
static int list_populate(struct m0_layout_list_enum *list_enum, struct m0_fid *cob_list, uint32_t nr)
M0_INTERNAL void * m0_bufvec_cursor_addr(struct m0_bufvec_cursor *cur)
M0_INTERNAL bool m0_layout__striped_allocated_invariant(const struct m0_striped_layout *stl)
static const struct m0_layout_enum_type_ops list_type_ops
M0_INTERNAL bool m0_layout__enum_invariant(const struct m0_layout_enum *e)
static int list_allocate(struct m0_layout_domain *dom, struct m0_layout_enum **out)
M0_INTERNAL bool m0_bufvec_cursor_move(struct m0_bufvec_cursor *cur, m0_bcount_t count)
static void list_delete(struct m0_layout_enum *e)
M0_INTERNAL void m0_layout__enum_fini(struct m0_layout_enum *le)
return M0_ERR(-EOPNOTSUPP)
static bool list_invariant(const struct m0_layout_list_enum *le)
static int list_register(struct m0_layout_domain *dom, const struct m0_layout_enum_type *et)
static m0_bcount_t list_max_recsize(void)
static int list_decode(struct m0_layout_enum *e, struct m0_bufvec_cursor *cur, enum m0_layout_xcode_op op, struct m0_db_tx *tx, struct m0_striped_layout *stl)
M0_INTERNAL m0_bcount_t m0_bufvec_cursor_step(const struct m0_bufvec_cursor *cur)
static const struct m0_layout_enum_ops list_enum_ops
M0_INTERNAL void m0_layout__enum_init(struct m0_layout_domain *dom, struct m0_layout_enum *le, struct m0_layout_enum_type *let, const struct m0_layout_enum_ops *ops)
#define bob_of(ptr, type, field, bt)
static struct m0_stob_domain * dom
M0_BOB_DEFINE(static, &list_bob, m0_layout_list_enum)
static uint32_t list_nr(const struct m0_layout_enum *e)
M0_INTERNAL bool m0_layout__domain_invariant(const struct m0_layout_domain *dom)
M0_INTERNAL int m0_list_enum_build(struct m0_layout_domain *dom, struct m0_fid *cob_list, uint32_t nr, struct m0_layout_list_enum **out)
M0_INTERNAL void m0_layout__log(const char *fn_name, const char *err_msg, uint64_t lid, int rc)
static const struct m0_table_ops cob_lists_table_ops
M0_INTERNAL bool m0_fid_eq(const struct m0_fid *fid0, const struct m0_fid *fid1)
#define m0_forall(var, nr,...)
#define M0_FI_ENABLED(tag)
#define M0_ALLOC_PTR(ptr)
static m0_bcount_t list_recsize(struct m0_layout_enum *e)
static bool list_allocated_invariant(const struct m0_layout_list_enum *le)
M0_INTERNAL m0_bcount_t m0_bufvec_cursor_copyto(struct m0_bufvec_cursor *dcur, void *sdata, m0_bcount_t num_bytes)
struct m0_striped_layout * le_sl
#define IS_IN_ARRAY(idx, array)
static void list_get(const struct m0_layout_enum *e, uint32_t idx, const struct m0_fid *gfid, struct m0_fid *out)
void * ld_type_data[M0_LAYOUT_TYPE_MAX]
struct m0_fid * lle_list_of_cobs
uint32_t(* leo_nr)(const struct m0_layout_enum *e)
M0_INTERNAL bool m0_fid_is_valid(const struct m0_fid *fid)
struct m0_layout_domain * l_dom
static const struct m0_bob_type list_bob
#define offsetof(typ, memb)
struct m0_layout_enum_type m0_list_enum_type