summaryrefslogtreecommitdiff
path: root/libbcachefs/btree_update_leaf.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/btree_update_leaf.c')
-rw-r--r--libbcachefs/btree_update_leaf.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/libbcachefs/btree_update_leaf.c b/libbcachefs/btree_update_leaf.c
index 142230cf..ce1fc29d 100644
--- a/libbcachefs/btree_update_leaf.c
+++ b/libbcachefs/btree_update_leaf.c
@@ -2,6 +2,7 @@
#include "bcachefs.h"
#include "btree_update.h"
#include "btree_update_interior.h"
+#include "btree_gc.h"
#include "btree_io.h"
#include "btree_iter.h"
#include "btree_locking.h"
@@ -601,10 +602,17 @@ static inline int do_btree_insert_at(struct btree_trans *trans,
}
trans_for_each_update_iter(trans, i)
- bch2_mark_update(trans, i, fs_usage);
+ bch2_mark_update(trans, i, fs_usage, 0);
if (fs_usage)
bch2_trans_fs_usage_apply(trans, fs_usage);
+ if (unlikely(c->gc_pos.phase)) {
+ trans_for_each_update_iter(trans, i)
+ if (gc_visited(c, gc_pos_btree_node(i->iter->l[0].b)))
+ bch2_mark_update(trans, i, NULL,
+ BCH_BUCKET_MARK_GC);
+ }
+
trans_for_each_update(trans, i)
do_btree_insert_one(trans, i);
out:
@@ -852,12 +860,15 @@ out_noupdates:
BUG_ON(!(trans->flags & BTREE_INSERT_ATOMIC) && ret == -EINTR);
- bch2_trans_unlink_iters(trans, trans->iters_unlink_on_commit);
if (!ret) {
- bch2_trans_unlink_iters(trans, ~trans->iters_touched);
+ bch2_trans_unlink_iters(trans, ~trans->iters_touched|
+ trans->iters_unlink_on_commit);
trans->iters_touched = 0;
+ } else {
+ bch2_trans_unlink_iters(trans, trans->iters_unlink_on_commit);
}
- trans->nr_updates = 0;
+ trans->nr_updates = 0;
+ trans->mem_top = 0;
return ret;
err: