]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Don't keep around btree_paths unnecessarily
authorKent Overstreet <kent.overstreet@gmail.com>
Sat, 5 Mar 2022 20:21:07 +0000 (15:21 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:27 +0000 (17:09 -0400)
When bch2_trans_begin() is called and there hasn't been a transaction
restart, we presume that we're now doing something new - iterating over
different keys, and we now shouldn't keep aruond paths related to the
previous transaction, excepting the subvolumes btree.

This should fix some of our "transaction path overflow" bugs.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/btree_iter.c

index b65cd3566872e1e4bfa5b52bc6bbb0ae2f3cec11..109efa73cd4ce8f42eb8f0c2e2f85b66849bb8e2 100644 (file)
@@ -3012,6 +3012,14 @@ void bch2_trans_begin(struct btree_trans *trans)
        trans_for_each_path(trans, path) {
                path->should_be_locked = false;
 
+               /*
+                * If the transaction wasn't restarted, we're presuming to be
+                * doing something new: dont keep iterators excpt the ones that
+                * are in use - except for the subvolumes btree:
+                */
+               if (!trans->restarted && path->btree_id != BTREE_ID_subvolumes)
+                       path->preserve = false;
+
                /*
                 * XXX: we probably shouldn't be doing this if the transaction
                 * was restarted, but currently we still overflow transaction