summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-12-02 05:24:00 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2024-01-16 16:48:40 -0500
commit8de9a089b84056afb4bf6519c432324526509dbc (patch)
treeb88da26b465ef80dbd9bd535cba03f97be8d033b
parentdb991581269b21f1ae1af98d909b7bce2f888d69 (diff)
bcachefs: Don't wait on btree IO with btree_trans SRCU lock held
More work to improve SRCU lock hold times Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/btree_update_interior.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/fs/bcachefs/btree_update_interior.c b/fs/bcachefs/btree_update_interior.c
index 17a5938aa71a..870e49a0d17f 100644
--- a/fs/bcachefs/btree_update_interior.c
+++ b/fs/bcachefs/btree_update_interior.c
@@ -590,23 +590,11 @@ static void btree_update_nodes_written(struct btree_update *as)
{
struct bch_fs *c = as->c;
struct btree *b;
- struct btree_trans *trans = bch2_trans_get(c);
u64 journal_seq = 0;
unsigned i;
int ret;
/*
- * If we're already in an error state, it might be because a btree node
- * was never written, and we might be trying to free that same btree
- * node here, but it won't have been marked as allocated and we'll see
- * spurious disk usage inconsistencies in the transactional part below
- * if we don't skip it:
- */
- ret = bch2_journal_error(&c->journal);
- if (ret)
- goto err;
-
- /*
* Wait for any in flight writes to finish before we free the old nodes
* on disk:
*/
@@ -615,7 +603,7 @@ static void btree_update_nodes_written(struct btree_update *as)
b = as->old_nodes[i];
- btree_node_lock_nopath_nofail(trans, &b->c, SIX_LOCK_read);
+ six_lock_read(&b->c.lock, NULL, NULL);
seq = b->data ? b->data->keys.seq : 0;
six_unlock_read(&b->c.lock);
@@ -624,6 +612,19 @@ static void btree_update_nodes_written(struct btree_update *as)
TASK_UNINTERRUPTIBLE);
}
+ struct btree_trans *trans = bch2_trans_get(c);
+
+ /*
+ * If we're already in an error state, it might be because a btree node
+ * was never written, and we might be trying to free that same btree
+ * node here, but it won't have been marked as allocated and we'll see
+ * spurious disk usage inconsistencies in the transactional part below
+ * if we don't skip it:
+ */
+ ret = bch2_journal_error(&c->journal);
+ if (ret)
+ goto err;
+
/*
* We did an update to a parent node where the pointers we added pointed
* to child nodes that weren't written yet: now, the child nodes have