summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-03-05 15:21:07 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2022-10-03 22:52:14 -0400
commit180285b2df0e0c8e980b57ec411de3b74e6bfc20 (patch)
tree33dd0bc4154e8e3720e33d3675260c3a07d34330
parent451dd267c2d6aefde2ae8d10326d6d73a719de94 (diff)
bcachefs: Don't keep around btree_paths unnecessarily
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>
-rw-r--r--fs/bcachefs/btree_iter.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index 586aea50b9f8..29191451956f 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -3019,6 +3019,14 @@ void bch2_trans_begin(struct btree_trans *trans)
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
* iterators if we do that