diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-12-20 16:35:24 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:08:33 -0400 |
commit | a8abd3a7f63efe4a366ae5aba10b2466feba39d7 (patch) | |
tree | ea1d23cd85f294ca2ea459949f495f207978d8e6 /fs/bcachefs/io.c | |
parent | 780c4e43f8f8986bb8d97d654cb17edd0dfca4b4 (diff) | |
download | lwn-a8abd3a7f63efe4a366ae5aba10b2466feba39d7.tar.gz lwn-a8abd3a7f63efe4a366ae5aba10b2466feba39d7.zip |
bcachefs: bch2_trans_reset() calls should be at the tops of loops
It needs to be called when we get -EINTR due to e.g. lock restart - this
fixes a transaction iterators overflow bug.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/io.c')
-rw-r--r-- | fs/bcachefs/io.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/fs/bcachefs/io.c b/fs/bcachefs/io.c index e98ab738cd10..6e0444f3c4f9 100644 --- a/fs/bcachefs/io.c +++ b/fs/bcachefs/io.c @@ -336,6 +336,8 @@ int bch2_fpunch_at(struct btree_trans *trans, struct btree_iter *iter, bch2_disk_reservation_init(c, 0); struct bkey_i delete; + bch2_trans_reset(trans, TRANS_RESET_MEM); + ret = bkey_err(k); if (ret) goto btree_err; @@ -347,8 +349,6 @@ int bch2_fpunch_at(struct btree_trans *trans, struct btree_iter *iter, bch2_key_resize(&delete.k, max_sectors); bch2_cut_back(end, &delete); - bch2_trans_begin_updates(trans); - ret = bch2_extent_update(trans, iter, &delete, &disk_res, journal_seq, 0, i_sectors_delta); @@ -410,14 +410,14 @@ int bch2_write_index_default(struct bch_write_op *op) BTREE_ITER_SLOTS|BTREE_ITER_INTENT); do { + bch2_trans_reset(&trans, TRANS_RESET_MEM); + k = bch2_keylist_front(keys); bkey_on_stack_realloc(&sk, c, k->k.u64s); bkey_copy(sk.k, k); bch2_cut_front(iter->pos, sk.k); - bch2_trans_begin_updates(&trans); - ret = bch2_extent_update(&trans, iter, sk.k, &op->res, op_journal_seq(op), op->new_i_size, &op->i_sectors_delta); |