summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2020-06-28 18:11:12 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2020-06-28 18:12:45 -0400
commit1e66bb1860dd117073730dd73603961e1e8fbb51 (patch)
tree5d81e483769bb6021399bd587a691e49b4003cad
parentb1708f0191fcad1b7afa47dd6a7c6b1104c4639d (diff)
bcachefs: Fix bch2_extent_can_insert() not being called
It's supposed to check whether we're splitting a compressed extent and if so get a bigger disk reservation - hence this fixes a "disk usage increased by x without a reservaiton" bug. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/btree_types.h6
-rw-r--r--fs/bcachefs/btree_update_leaf.c2
-rw-r--r--fs/bcachefs/buckets.c48
3 files changed, 34 insertions, 22 deletions
diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h
index ea25b04b7517..d489251e914c 100644
--- a/fs/bcachefs/btree_types.h
+++ b/fs/bcachefs/btree_types.h
@@ -568,6 +568,12 @@ static inline bool btree_node_is_extents(struct btree *b)
return btree_node_type_is_extents(btree_node_type(b));
}
+static inline bool btree_iter_is_extents(struct btree_iter *iter)
+{
+ return btree_node_type_is_extents(
+ __btree_node_type(iter->level, iter->btree_id));
+}
+
#define BTREE_NODE_TYPE_HAS_TRIGGERS \
((1U << BKEY_TYPE_EXTENTS)| \
(1U << BKEY_TYPE_ALLOC)| \
diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c
index e82d4df9ccab..6e9688d0bb77 100644
--- a/fs/bcachefs/btree_update_leaf.c
+++ b/fs/bcachefs/btree_update_leaf.c
@@ -281,7 +281,7 @@ btree_key_can_insert(struct btree_trans *trans,
if (unlikely(btree_node_old_extent_overwrite(b)))
return BTREE_INSERT_BTREE_NODE_FULL;
- ret = !(iter->flags & BTREE_ITER_IS_EXTENTS)
+ ret = !btree_iter_is_extents(iter)
? BTREE_INSERT_OK
: bch2_extent_can_insert(trans, iter, insert);
if (ret)
diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c
index 4c9371991fa6..0ec194b93c71 100644
--- a/fs/bcachefs/buckets.c
+++ b/fs/bcachefs/buckets.c
@@ -1367,8 +1367,8 @@ int bch2_mark_update(struct btree_trans *trans,
unsigned flags)
{
struct bch_fs *c = trans->c;
- struct btree *b = iter->l[0].b;
- struct btree_node_iter node_iter = iter->l[0].iter;
+ struct btree *b = iter_l(iter)->b;
+ struct btree_node_iter node_iter = iter_l(iter)->iter;
struct bkey_packed *_k;
int ret = 0;
@@ -1430,32 +1430,38 @@ void bch2_trans_fs_usage_apply(struct btree_trans *trans,
disk_res_sectors);
trans_for_each_update(trans, i) {
- struct btree_iter *iter = i->iter;
- struct btree *b = iter->l[0].b;
- struct btree_node_iter node_iter = iter->l[0].iter;
- struct bkey_packed *_k;
-
pr_err("while inserting");
bch2_bkey_val_to_text(&PBUF(buf), c, bkey_i_to_s_c(i->k));
pr_err("%s", buf);
pr_err("overlapping with");
- node_iter = iter->l[0].iter;
- while ((_k = bch2_btree_node_iter_peek(&node_iter, b))) {
- struct bkey unpacked;
- struct bkey_s_c k;
+ if (btree_iter_type(i->iter) != BTREE_ITER_CACHED) {
+ struct btree *b = iter_l(i->iter)->b;
+ struct btree_node_iter node_iter = iter_l(i->iter)->iter;
+ struct bkey_packed *_k;
- k = bkey_disassemble(b, _k, &unpacked);
+ while ((_k = bch2_btree_node_iter_peek(&node_iter, b))) {
+ struct bkey unpacked;
+ struct bkey_s_c k;
- if (btree_node_is_extents(b)
- ? bkey_cmp(i->k->k.p, bkey_start_pos(k.k)) <= 0
- : bkey_cmp(i->k->k.p, k.k->p))
- break;
+ pr_info("_k %px format %u", _k, _k->format);
+ k = bkey_disassemble(b, _k, &unpacked);
- bch2_bkey_val_to_text(&PBUF(buf), c, k);
- pr_err("%s", buf);
+ if (btree_node_is_extents(b)
+ ? bkey_cmp(i->k->k.p, bkey_start_pos(k.k)) <= 0
+ : bkey_cmp(i->k->k.p, k.k->p))
+ break;
+
+ bch2_bkey_val_to_text(&PBUF(buf), c, k);
+ pr_err("%s", buf);
- bch2_btree_node_iter_advance(&node_iter, b);
+ bch2_btree_node_iter_advance(&node_iter, b);
+ }
+ } else {
+ struct bkey_cached *ck = (void *) i->iter->l[0].b;
+
+ bch2_bkey_val_to_text(&PBUF(buf), c, bkey_i_to_s_c(ck->k));
+ pr_err("%s", buf);
}
}
}
@@ -1807,8 +1813,8 @@ int bch2_trans_mark_update(struct btree_trans *trans,
struct bkey_i *insert,
unsigned flags)
{
- struct btree *b = iter->l[0].b;
- struct btree_node_iter node_iter = iter->l[0].iter;
+ struct btree *b = iter_l(iter)->b;
+ struct btree_node_iter node_iter = iter_l(iter)->iter;
struct bkey_packed *_k;
int ret;