unsigned *whiteout_u64s, int write,
bool have_retry)
{
- struct bkey_packed *k, *prev = NULL;
- struct bpos prev_pos = POS_MIN;
+ struct bkey_packed *k;
+ struct bkey prev = KEY(0, 0, 0);
struct bpos prev_data = POS_MIN;
bool seen_non_whiteout = false;
unsigned version;
const char *err;
int ret = 0;
- if (i == &b->data->keys) {
+ if (!b->written) {
/* These indicate that we read the wrong btree node: */
btree_err_on(BTREE_NODE_ID(b->data) != b->c.btree_id,
BTREE_ERR_MUST_RETRY, c, b, i,
if (!seen_non_whiteout &&
(!bkey_whiteout(k) ||
- (bkey_cmp(prev_pos, bkey_start_pos(u.k)) > 0))) {
+ (bkey_cmp(prev.p, bkey_start_pos(u.k)) > 0))) {
*whiteout_u64s = k->_data - i->_data;
seen_non_whiteout = true;
} else if (bkey_cmp(prev_data, bkey_start_pos(u.k)) > 0 ||
- bkey_cmp(prev_pos, u.k->p) > 0) {
+ bkey_cmp(prev.p, u.k->p) > 0) {
+ char buf1[80];
+ char buf2[80];
+
+ bch2_bkey_to_text(&PBUF(buf1), &prev);
+ bch2_bkey_to_text(&PBUF(buf2), u.k);
+
+ bch2_dump_bset(b, i, 0);
btree_err(BTREE_ERR_FATAL, c, b, i,
- "keys out of order: %llu:%llu > %llu:%llu",
- prev_pos.inode,
- prev_pos.offset,
- u.k->p.inode,
- bkey_start_offset(u.k));
+ "keys out of order: %s > %s",
+ buf1, buf2);
/* XXX: repair this */
}
if (!bkey_deleted(u.k))
prev_data = u.k->p;
- prev_pos = u.k->p;
+ prev = *u.k;
- prev = k;
k = bkey_next_skip_noops(k, vstruct_last(i));
}