summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-03-28 07:32:38 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:08:19 +0300
commit4afe700060799d0ccf42c9881f3ebfab96953fd8 (patch)
tree57887161522bf1d608fb36ec9f5e9a3dbda6366b
parentbf7b87a4a92fac3e97228ce94c35d4f78c85417e (diff)
downloadlinux-4afe700060799d0ccf42c9881f3ebfab96953fd8.tar.xz
bcachefs: Unlink not-touched iters on successful transaction commit
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/btree_iter.c4
-rw-r--r--fs/bcachefs/btree_update_leaf.c4
2 files changed, 7 insertions, 1 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index c8122be21029..ad7858d77a58 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -1892,6 +1892,7 @@ int bch2_trans_unlock(struct btree_trans *trans)
inline void bch2_trans_unlink_iters(struct btree_trans *trans, u64 iters)
{
iters &= trans->iters_linked;
+ iters &= ~trans->iters_live;
while (iters) {
unsigned idx = __ffs64(iters);
@@ -1919,9 +1920,10 @@ void __bch2_trans_begin(struct btree_trans *trans)
iters_to_unlink |= trans->iters_unlink_on_restart;
iters_to_unlink |= trans->iters_unlink_on_commit;
+ trans->iters_live = 0;
+
bch2_trans_unlink_iters(trans, iters_to_unlink);
- trans->iters_live = 0;
trans->iters_touched = 0;
trans->iters_unlink_on_restart = 0;
trans->iters_unlink_on_commit = 0;
diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c
index a8ac68b94e25..d345f5a14fde 100644
--- a/fs/bcachefs/btree_update_leaf.c
+++ b/fs/bcachefs/btree_update_leaf.c
@@ -856,6 +856,10 @@ 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);
+ trans->iters_touched = 0;
+ }
trans->nr_updates = 0;
return ret;