summaryrefslogtreecommitdiff
path: root/fs/bcachefs
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-04-19 17:17:34 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:09:01 -0400
commit4d47b21c4dac0d27ad02add2c68be0afaa63ef98 (patch)
tree06fe3ecd40a355725c39cc4886bcded5c818b15c /fs/bcachefs
parent8ce600d44720a86c069fafefc92167ed85cc72c7 (diff)
downloadlwn-4d47b21c4dac0d27ad02add2c68be0afaa63ef98.tar.gz
lwn-4d47b21c4dac0d27ad02add2c68be0afaa63ef98.zip
bcachefs: Fix a use after free
Turns out, we weren't waiting on in flight btree writes when freeing existing btree nodes. This lead to stray btree writes overwriting newly allocated buckets, but only started showing itself with some of the recent allocator work and another patch to move submitting of btree writes to worqueues. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs')
-rw-r--r--fs/bcachefs/btree_update_interior.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/fs/bcachefs/btree_update_interior.c b/fs/bcachefs/btree_update_interior.c
index b3137525f9c1..dabd1a3e3aa3 100644
--- a/fs/bcachefs/btree_update_interior.c
+++ b/fs/bcachefs/btree_update_interior.c
@@ -887,6 +887,14 @@ void bch2_btree_interior_update_will_free_node(struct btree_update *as,
btree_update_drop_new_node(c, b);
btree_update_will_delete_key(as, &b->key);
+
+ /*
+ * XXX: Waiting on io with btree node locks held, we don't want to be
+ * doing this. We can't have btree writes happening after the space has
+ * been freed, but we really only need to block before
+ * btree_update_nodes_written_trans() happens.
+ */
+ btree_node_wait_on_io(b);
}
void bch2_btree_update_done(struct btree_update *as)