From ea3d0138013bff3019021614ed1a50cde2d5a83f Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Wed, 2 Jun 2021 14:54:54 -0400 Subject: fixup! bcachefs: Fix a deadlock --- fs/bcachefs/btree_update_interior.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/fs/bcachefs/btree_update_interior.c b/fs/bcachefs/btree_update_interior.c index b0484c7acb79..95e6d21dac2a 100644 --- a/fs/bcachefs/btree_update_interior.c +++ b/fs/bcachefs/btree_update_interior.c @@ -555,15 +555,15 @@ static void btree_update_nodes_written(struct btree_update *as) * on disk: */ for (i = 0; i < as->nr_old_nodes; i++) { - struct btree_node *bn = READ_ONCE(as->old_nodes[i]->data); + struct btree *old = as->old_nodes[i]; + __le64 seq; - /* - * This is technically a use after free, but it's just a read - - * but it might cause problems in userspace where freeing the - * buffer may unmap it: - */ - if (bn && bn->keys.seq == as->old_nodes_seq[i]) - btree_node_wait_on_io(as->old_nodes[i]); + six_lock_read(&old->c.lock, NULL, NULL); + seq = old->data ? old->data->keys.seq : 0; + six_unlock_read(&old->c.lock); + + if (seq == as->old_nodes_seq[i]) + btree_node_wait_on_io(old); } /* -- cgit v1.2.3