summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-04-04 13:01:53 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2018-04-04 13:02:06 -0400
commit39669cecb1fecb570e6fc6a90fff6976fab77cc2 (patch)
treed8961ff4e9b6bc749343cff2c5ffd4e2a1940c46
parent59ed3442fdd626e7fa2e0cafee1555940e05d888 (diff)
bcachefs: fix bch2_read_btree()
-rw-r--r--fs/bcachefs/btree_iter.c4
-rw-r--r--fs/bcachefs/debug.c13
2 files changed, 12 insertions, 5 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index 893fde807c89..465aadbad5ef 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -1335,6 +1335,10 @@ void __bch2_btree_iter_init(struct btree_iter *iter, struct bch_fs *c,
iter->l[iter->level].b = BTREE_ITER_NOT_END;
iter->next = iter;
+ if (unlikely((flags & BTREE_ITER_IS_EXTENTS) &&
+ !bkey_cmp(pos, POS_MAX)))
+ iter->uptodate = BTREE_ITER_END;
+
prefetch(c->btree_roots[btree_id].b);
}
diff --git a/fs/bcachefs/debug.c b/fs/bcachefs/debug.c
index 00e0de167b32..7190990dbfa1 100644
--- a/fs/bcachefs/debug.c
+++ b/fs/bcachefs/debug.c
@@ -212,17 +212,20 @@ static ssize_t bch2_read_btree(struct file *file, char __user *buf,
if (!i->size)
return i->ret;
- for_each_btree_key(&iter, i->c, i->id, i->from,
- BTREE_ITER_PREFETCH, k) {
- i->from = iter.pos;
+ bch2_btree_iter_init(&iter, i->c, i->id, i->from, BTREE_ITER_PREFETCH);
+ k = bch2_btree_iter_peek(&iter);
+ while (k.k && !(err = btree_iter_err(k))) {
bch2_bkey_val_to_text(i->c, bkey_type(0, i->id),
- i->buf, sizeof(i->buf), k);
+ i->buf, sizeof(i->buf), k);
i->bytes = strlen(i->buf);
BUG_ON(i->bytes >= PAGE_SIZE);
i->buf[i->bytes] = '\n';
i->bytes++;
+ k = bch2_btree_iter_next(&iter);
+ i->from = iter.pos;
+
err = flush_buf(i);
if (err)
break;
@@ -230,7 +233,7 @@ static ssize_t bch2_read_btree(struct file *file, char __user *buf,
if (!i->size)
break;
}
- err = bch2_btree_iter_unlock(&iter) ?: err;
+ bch2_btree_iter_unlock(&iter);
return err < 0 ? err : i->ret;
}