void bch_extent_to_text(char *buf, size_t size, const struct bkey *k) { unsigned i = 0; char *out = buf, *end = buf + size; #define p(...) (out += scnprintf(out, end - out, __VA_ARGS__)) p("%llu:%llu len %llu -> [", KEY_INODE(k), KEY_START(k), KEY_SIZE(k)); for (i = 0; i < KEY_PTRS(k); i++) { if (i) p(", "); if (PTR_DEV(k, i) == PTR_CHECK_DEV) p("check dev"); else p("%llu:%llu gen %llu", PTR_DEV(k, i), PTR_OFFSET(k, i), PTR_GEN(k, i)); } p("]"); if (KEY_DIRTY(k)) p(" dirty"); if (KEY_CSUM(k)) p(" cs%llu %llx", KEY_CSUM(k), k->ptr[1]); #undef p }
struct keyprint_hack bch_pkey(const struct bkey *k) { unsigned i = 0; struct keyprint_hack r; char *out = r.s, *end = r.s + KEYHACK_SIZE; #define p(...) (out += scnprintf(out, end - out, __VA_ARGS__)) p("%llu:%llu len %llu -> [", KEY_INODE(k), KEY_OFFSET(k), KEY_SIZE(k)); if (KEY_PTRS(k)) while (1) { p("%llu:%llu gen %llu", PTR_DEV(k, i), PTR_OFFSET(k, i), PTR_GEN(k, i)); if (++i == KEY_PTRS(k)) break; p(", "); } p("]"); if (KEY_DIRTY(k)) p(" dirty"); if (KEY_CSUM(k)) p(" cs%llu %llx", KEY_CSUM(k), k->ptr[1]); #undef p return r; }
static bool bch_extent_merge(struct btree_keys *bk, struct bkey *l, struct bkey *r) { struct btree *b = container_of(bk, struct btree, keys); unsigned i; if (key_merging_disabled(b->c)) return false; for (i = 0; i < KEY_PTRS(l); i++) if (l->ptr[i] + PTR(0, KEY_SIZE(l), 0) != r->ptr[i] || PTR_BUCKET_NR(b->c, l, i) != PTR_BUCKET_NR(b->c, r, i)) return false; /* Keys with no pointers aren't restricted to one bucket and could * overflow KEY_SIZE */ if (KEY_SIZE(l) + KEY_SIZE(r) > USHRT_MAX) { SET_KEY_OFFSET(l, KEY_OFFSET(l) + USHRT_MAX - KEY_SIZE(l)); SET_KEY_SIZE(l, USHRT_MAX); bch_cut_front(l, r); return false; } if (KEY_CSUM(l)) { if (KEY_CSUM(r)) l->ptr[KEY_PTRS(l)] = merge_chksums(l, r); else SET_KEY_CSUM(l, 0); } SET_KEY_OFFSET(l, KEY_OFFSET(l) + KEY_SIZE(r)); SET_KEY_SIZE(l, KEY_SIZE(l) + KEY_SIZE(r)); return true; }