diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-03-28 00:32:38 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-03-28 02:05:05 -0400 |
commit | a0079728c6c2b92935bb0856a11a04d21545b935 (patch) | |
tree | 0022981a40791682be07c1cc2c7a66307cb86966 | |
parent | 5b7a225cd1a22b8e562f121c88d92acdf2ee63b4 (diff) |
bcachefs: Unlink not-touched iters on successful transaction commit
-rw-r--r-- | fs/bcachefs/btree_iter.c | 4 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_leaf.c | 4 |
2 files changed, 7 insertions, 1 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index cd00e68e7036..33a184ea80c0 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -1890,6 +1890,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); @@ -1917,9 +1918,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 8c13a2e3e13f..a0abc5694b35 100644 --- a/fs/bcachefs/btree_update_leaf.c +++ b/fs/bcachefs/btree_update_leaf.c @@ -855,6 +855,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; |