If we exit from a btree transaction with uncommitted updates, that's probably not what we intended to do.
Signed-off-by: Kent Overstreet <[email protected]> --- fs/bcachefs/btree_iter.c | 2 ++ fs/bcachefs/btree_trans_commit.c | 4 +--- fs/bcachefs/btree_update.h | 7 +++++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index bc3f38f7044c..7ce2ed4ac509 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -3551,6 +3551,8 @@ void bch2_trans_put(struct btree_trans *trans) { struct bch_fs *c = trans->c; + WARN_ON(bch2_trans_has_updates(trans)); + if (trans->restarted) bch2_trans_in_restart_error(trans); diff --git a/fs/bcachefs/btree_trans_commit.c b/fs/bcachefs/btree_trans_commit.c index 639ef75b3dbd..454b4c5c1808 100644 --- a/fs/bcachefs/btree_trans_commit.c +++ b/fs/bcachefs/btree_trans_commit.c @@ -1015,9 +1015,7 @@ int __bch2_trans_commit(struct btree_trans *trans, unsigned flags) if (unlikely(ret)) goto out_reset; - if (!trans->nr_updates && - !trans->journal_entries.u64s && - !trans->accounting.u64s) + if (!bch2_trans_has_updates(trans)) goto out_reset; ret = bch2_trans_commit_run_triggers(trans); diff --git a/fs/bcachefs/btree_update.h b/fs/bcachefs/btree_update.h index e4b6e7d51a2e..54c71e3bad63 100644 --- a/fs/bcachefs/btree_update.h +++ b/fs/bcachefs/btree_update.h @@ -272,6 +272,13 @@ static inline int bch2_trans_commit(struct btree_trans *trans, (_i) < (_trans)->updates + (_trans)->nr_updates; \ (_i)++) +static inline bool bch2_trans_has_updates(struct btree_trans *trans) +{ + return trans->nr_updates || + trans->journal_entries.u64s || + trans->accounting.u64s; +} + static inline void bch2_trans_reset_updates(struct btree_trans *trans) { trans_for_each_update(trans, i) -- 2.50.0
