summaryrefslogtreecommitdiff
path: root/libbcachefs
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs')
-rw-r--r--libbcachefs/btree_node_scan.c38
1 files changed, 8 insertions, 30 deletions
diff --git a/libbcachefs/btree_node_scan.c b/libbcachefs/btree_node_scan.c
index 1e250558..00110722 100644
--- a/libbcachefs/btree_node_scan.c
+++ b/libbcachefs/btree_node_scan.c
@@ -330,37 +330,15 @@ again:
} else if (n->level) {
n->overwritten = true;
} else {
- struct printbuf buf = PRINTBUF;
-
- prt_str(&buf, "overlapping btree nodes with same seq! halting\n ");
- found_btree_node_to_text(&buf, c, start);
- prt_str(&buf, "\n ");
- found_btree_node_to_text(&buf, c, n);
- bch_err(c, "%s", buf.buf);
- printbuf_exit(&buf);
-
- struct { __BKEY_PADDED(k, BKEY_BTREE_PTR_VAL_U64s_MAX); } tmp;
- struct btree *b;
-
- struct btree_trans *trans = bch2_trans_get(c);
-
- found_btree_node_to_key(&tmp.k, start);
- b = bch2_btree_node_get_noiter(trans, &tmp.k,
- start->btree_id, start->level, false);
- if (!IS_ERR_OR_NULL(b)) {
- bch2_dump_btree_node(c, b);
- six_unlock_read(&b->c.lock);
- }
-
- found_btree_node_to_key(&tmp.k, n);
- b = bch2_btree_node_get_noiter(trans, &tmp.k,
- start->btree_id, start->level, false);
- if (!IS_ERR_OR_NULL(b)) {
- bch2_dump_btree_node(c, b);
- six_unlock_read(&b->c.lock);
+ if (bpos_cmp(start->max_key, n->max_key) >= 0)
+ n->overwritten = true;
+ else {
+ n->range_updated = true;
+ n->min_key = bpos_successor(start->max_key);
+ n->range_updated = true;
+ bubble_up(n, end);
+ goto again;
}
- bch2_trans_put(trans);
- return -BCH_ERR_fsck_repair_unimplemented;
}
}