summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/bcachefs/backpointers.c107
-rw-r--r--fs/bcachefs/btree_update_leaf.c9
-rw-r--r--fs/bcachefs/btree_write_buffer.c6
-rw-r--r--fs/bcachefs/btree_write_buffer_types.h5
-rw-r--r--fs/bcachefs/ec.c8
5 files changed, 35 insertions, 100 deletions
diff --git a/fs/bcachefs/backpointers.c b/fs/bcachefs/backpointers.c
index 7d4367f93b5c..8b83992f3963 100644
--- a/fs/bcachefs/backpointers.c
+++ b/fs/bcachefs/backpointers.c
@@ -208,8 +208,7 @@ int bch2_bucket_backpointer_del(struct btree_trans *trans,
struct bch_fs *c = trans->c;
struct bch_backpointer *bps = alloc_v4_backpointers(&a->v);
unsigned i, nr = BCH_ALLOC_V4_NR_BACKPOINTERS(&a->v);
- struct btree_iter bp_iter;
- struct bkey_s_c k;
+ struct bkey_i *delete;
int ret;
for (i = 0; i < nr; i++) {
@@ -228,52 +227,15 @@ found:
set_alloc_v4_u64s(a);
return 0;
btree:
- bch2_trans_iter_init(trans, &bp_iter, BTREE_ID_backpointers,
- bucket_pos_to_bp(c, a->k.p, bp.bucket_offset),
- BTREE_ITER_INTENT|
- BTREE_ITER_SLOTS|
- BTREE_ITER_WITH_UPDATES);
- k = bch2_btree_iter_peek_slot(&bp_iter);
- ret = bkey_err(k);
+ delete = bch2_trans_kmalloc_nomemzero(trans, sizeof(*delete));
+ ret = PTR_ERR_OR_ZERO(delete);
if (ret)
- goto err;
-
- if (k.k->type != KEY_TYPE_backpointer ||
- memcmp(bkey_s_c_to_backpointer(k).v, &bp, sizeof(bp))) {
- struct printbuf buf = PRINTBUF;
-
- prt_printf(&buf, "backpointer not found when deleting");
- prt_newline(&buf);
- printbuf_indent_add(&buf, 2);
-
- prt_printf(&buf, "searching for ");
- bch2_backpointer_to_text(&buf, &bp);
- prt_newline(&buf);
-
- prt_printf(&buf, "got ");
- bch2_bkey_val_to_text(&buf, c, k);
- prt_newline(&buf);
-
- prt_str(&buf, "alloc ");
- bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&a->k_i));
- prt_newline(&buf);
+ return ret;
- prt_printf(&buf, "for ");
- bch2_bkey_val_to_text(&buf, c, orig_k);
+ bkey_init(&delete->k);
+ delete->k.p = bucket_pos_to_bp(c, a->k.p, bp.bucket_offset);
- bch_err(c, "%s", buf.buf);
- if (test_bit(BCH_FS_CHECK_BACKPOINTERS_DONE, &c->flags)) {
- bch2_inconsistent_error(c);
- ret = -EIO;
- }
- printbuf_exit(&buf);
- goto err;
- }
-
- ret = bch2_btree_delete_at(trans, &bp_iter, 0);
-err:
- bch2_trans_iter_exit(trans, &bp_iter);
- return ret;
+ return bch2_trans_update_buffered(trans, BTREE_ID_backpointers, delete);
}
int bch2_bucket_backpointer_add(struct btree_trans *trans,
@@ -282,13 +244,11 @@ int bch2_bucket_backpointer_add(struct btree_trans *trans,
struct bkey_s_c orig_k)
{
struct bch_fs *c = trans->c;
- struct bch_backpointer *bps = alloc_v4_backpointers(&a->v);
- unsigned i, nr = BCH_ALLOC_V4_NR_BACKPOINTERS(&a->v);
struct bkey_i_backpointer *bp_k;
- struct btree_iter bp_iter;
- struct bkey_s_c k;
int ret;
-
+#if 0
+ struct bch_backpointer *bps = alloc_v4_backpointers(&a->v);
+ unsigned i, nr = BCH_ALLOC_V4_NR_BACKPOINTERS(&a->v);
/* Check for duplicates: */
for (i = 0; i < nr; i++) {
int cmp = backpointer_cmp(bps[i], bp);
@@ -331,52 +291,17 @@ int bch2_bucket_backpointer_add(struct btree_trans *trans,
}
/* Overflow: use backpointer btree */
-
- bch2_trans_iter_init(trans, &bp_iter, BTREE_ID_backpointers,
- bucket_pos_to_bp(c, a->k.p, bp.bucket_offset),
- BTREE_ITER_INTENT|
- BTREE_ITER_SLOTS|
- BTREE_ITER_WITH_UPDATES);
- k = bch2_btree_iter_peek_slot(&bp_iter);
- ret = bkey_err(k);
- if (ret)
- goto err;
-
- if (k.k->type) {
- struct printbuf buf = PRINTBUF;
-
- prt_printf(&buf, "existing btree backpointer key found when inserting ");
- bch2_backpointer_to_text(&buf, &bp);
- prt_newline(&buf);
- printbuf_indent_add(&buf, 2);
-
- prt_printf(&buf, "found ");
- bch2_bkey_val_to_text(&buf, c, k);
- prt_newline(&buf);
-
- prt_printf(&buf, "for ");
- bch2_bkey_val_to_text(&buf, c, orig_k);
-
- bch_err(c, "%s", buf.buf);
- printbuf_exit(&buf);
- if (test_bit(BCH_FS_CHECK_BACKPOINTERS_DONE, &c->flags)) {
- bch2_inconsistent_error(c);
- ret = -EIO;
- goto err;
- }
- }
-
- bp_k = bch2_bkey_alloc(trans, &bp_iter, backpointer);
+#endif
+ bp_k = bch2_trans_kmalloc_nomemzero(trans, sizeof(struct bkey_i_backpointer));
ret = PTR_ERR_OR_ZERO(bp_k);
if (ret)
- goto err;
+ return ret;
+ bkey_backpointer_init(&bp_k->k_i);
+ bp_k->k.p = bucket_pos_to_bp(c, a->k.p, bp.bucket_offset);
bp_k->v = bp;
- ret = bch2_trans_update(trans, &bp_iter, &bp_k->k_i, 0);
-err:
- bch2_trans_iter_exit(trans, &bp_iter);
- return ret;
+ return bch2_trans_update_buffered(trans, BTREE_ID_backpointers, &bp_k->k_i);
}
/*
diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c
index 07a18b623475..475a26a3736e 100644
--- a/fs/bcachefs/btree_update_leaf.c
+++ b/fs/bcachefs/btree_update_leaf.c
@@ -1658,7 +1658,8 @@ int __must_check bch2_trans_update_buffered(struct btree_trans *trans,
{
int ret;
- BUG_ON(trans->nr_wb_updates > trans->wb_updates_size);
+ EBUG_ON(trans->nr_wb_updates > trans->wb_updates_size);
+ EBUG_ON(k->k.u64s > BTREE_WRITE_BUFERED_U64s_MAX);
if (!trans->wb_updates ||
trans->nr_wb_updates == trans->wb_updates_size) {
@@ -1686,11 +1687,13 @@ int __must_check bch2_trans_update_buffered(struct btree_trans *trans,
trans->wb_updates = u;
}
- trans->wb_updates[trans->nr_wb_updates++] = (struct btree_write_buffered_key) {
+ trans->wb_updates[trans->nr_wb_updates] = (struct btree_write_buffered_key) {
.btree = btree,
- .k = *k,
};
+ bkey_copy(&trans->wb_updates[trans->nr_wb_updates].k, k);
+ trans->nr_wb_updates++;
+
return 0;
}
diff --git a/fs/bcachefs/btree_write_buffer.c b/fs/bcachefs/btree_write_buffer.c
index b5a419e1960a..c9208596628c 100644
--- a/fs/bcachefs/btree_write_buffer.c
+++ b/fs/bcachefs/btree_write_buffer.c
@@ -172,7 +172,7 @@ int bch2_btree_insert_keys_write_buffer(struct btree_trans *trans)
struct btree_write_buffered_key *i;
unsigned u64s = 0;
- BUG_ON(trans->flags & BTREE_INSERT_JOURNAL_REPLAY);
+ EBUG_ON(trans->flags & BTREE_INSERT_JOURNAL_REPLAY);
mutex_lock(&wb->lock);
if (wb->nr + trans->nr_wb_updates > wb->size) {
@@ -181,7 +181,7 @@ int bch2_btree_insert_keys_write_buffer(struct btree_trans *trans)
}
trans_for_each_wb_update(trans, i) {
- BUG_ON(i->k.k.u64s != BKEY_U64s);
+ EBUG_ON(i->k.k.u64s > BTREE_WRITE_BUFERED_U64s_MAX);
i->journal_seq = trans->journal_res.seq;
i->journal_offset = trans->journal_res.offset;
@@ -195,7 +195,7 @@ int bch2_btree_insert_keys_write_buffer(struct btree_trans *trans)
wb->nr += trans->nr_wb_updates;
if (likely(!(trans->flags & BTREE_INSERT_JOURNAL_REPLAY))) {
- BUG_ON(u64s > trans->journal_preres.u64s);
+ EBUG_ON(u64s > trans->journal_preres.u64s);
trans->journal_preres.u64s -= u64s;
wb->res.u64s += u64s;
diff --git a/fs/bcachefs/btree_write_buffer_types.h b/fs/bcachefs/btree_write_buffer_types.h
index a6a9489afce9..a5bcb196e40f 100644
--- a/fs/bcachefs/btree_write_buffer_types.h
+++ b/fs/bcachefs/btree_write_buffer_types.h
@@ -4,11 +4,14 @@
#include "journal_types.h"
+#define BTREE_WRITE_BUFERED_VAL_U64s_MAX 4
+#define BTREE_WRITE_BUFERED_U64s_MAX (BKEY_U64s + BTREE_WRITE_BUFERED_VAL_U64s_MAX)
+
struct btree_write_buffered_key {
u64 journal_seq;
unsigned journal_offset;
enum btree_id btree;
- struct bkey_i k;
+ __BKEY_PADDED(k, BTREE_WRITE_BUFERED_VAL_U64s_MAX);
};
struct btree_write_buffer {
diff --git a/fs/bcachefs/ec.c b/fs/bcachefs/ec.c
index 9da79651e967..7fed06326701 100644
--- a/fs/bcachefs/ec.c
+++ b/fs/bcachefs/ec.c
@@ -9,6 +9,7 @@
#include "bset.h"
#include "btree_gc.h"
#include "btree_update.h"
+#include "btree_write_buffer.h"
#include "buckets.h"
#include "disk_groups.h"
#include "ec.h"
@@ -913,13 +914,16 @@ static int ec_stripe_update_extents(struct bch_fs *c, struct ec_stripe_buf *s)
bch2_trans_init(&trans, c, 0, 0);
+ ret = bch2_btree_write_buffer_flush(&trans);
+ if (ret)
+ goto err;
+
for (i = 0; i < nr_data; i++) {
ret = ec_stripe_update_bucket(&trans, s, i);
if (ret)
break;
}
-
-
+err:
bch2_trans_exit(&trans);
return ret;