- bch2_fs_bug_on(!test_bit(BCH_FS_REBUILD_REPLICAS, &c->flags) &&
- !bch2_bkey_replicas_marked(c, k, false), c,
- "btree key bad (replicas not marked in superblock):\n%s",
- (bch2_bkey_val_to_text(&PBUF(buf), c, k), buf));
-
- if (!test_bit(BCH_FS_INITIAL_GC_DONE, &c->flags))
- return;
-
- bkey_for_each_ptr(ptrs, ptr) {
- ca = bch_dev_bkey_exists(c, ptr->dev);
-
- mark = ptr_bucket_mark(ca, ptr);
-
- err = "stale";
- if (gen_after(mark.gen, ptr->gen))
- goto err;
-
- err = "inconsistent";
- if (mark.data_type != BCH_DATA_BTREE ||
- mark.dirty_sectors < c->opts.btree_node_size)
- goto err;
- }
-
- return;
-err:
- bch2_bkey_val_to_text(&PBUF(buf), c, k);
- bch2_fs_bug(c, "%s btree pointer %s: bucket %zi gen %i mark %08x",
- err, buf, PTR_BUCKET_NR(ca, ptr),
- mark.gen, (unsigned) mark.v.counter);
-}
-
-void bch2_btree_ptr_to_text(struct printbuf *out, struct bch_fs *c,
- struct bkey_s_c k)
-{
- const char *invalid;
-
- bkey_ptrs_to_text(out, c, k);
-
- invalid = bch2_btree_ptr_invalid(c, k);
- if (invalid)
- pr_buf(out, " invalid: %s", invalid);
-}
-
-/* Extents */
-
-bool __bch2_cut_front(struct bpos where, struct bkey_s k)
-{
- u64 len = 0;
-
- if (bkey_cmp(where, bkey_start_pos(k.k)) <= 0)
- return false;
-
- EBUG_ON(bkey_cmp(where, k.k->p) > 0);
-
- len = k.k->p.offset - where.offset;
-
- BUG_ON(len > k.k->size);
-
- /*
- * Don't readjust offset if the key size is now 0, because that could
- * cause offset to point to the next bucket:
- */
- if (!len)
- k.k->type = KEY_TYPE_deleted;
- else if (bkey_extent_is_data(k.k)) {
- struct bkey_s_extent e = bkey_s_to_extent(k);
- union bch_extent_entry *entry;
- bool seen_crc = false;
-
- extent_for_each_entry(e, entry) {
- switch (extent_entry_type(entry)) {
- case BCH_EXTENT_ENTRY_ptr:
- if (!seen_crc)
- entry->ptr.offset += e.k->size - len;
- break;
- case BCH_EXTENT_ENTRY_crc32:
- entry->crc32.offset += e.k->size - len;
- break;
- case BCH_EXTENT_ENTRY_crc64:
- entry->crc64.offset += e.k->size - len;
- break;
- case BCH_EXTENT_ENTRY_crc128:
- entry->crc128.offset += e.k->size - len;
- break;
- case BCH_EXTENT_ENTRY_stripe_ptr:
- break;
- }
-
- if (extent_entry_is_crc(entry))
- seen_crc = true;
- }
- }
-
- k.k->size = len;
-
- return true;
-}
-
-bool bch2_cut_back(struct bpos where, struct bkey *k)
-{
- u64 len = 0;
-
- if (bkey_cmp(where, k->p) >= 0)
- return false;
-
- EBUG_ON(bkey_cmp(where, bkey_start_pos(k)) < 0);
-
- len = where.offset - bkey_start_offset(k);