diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-12-02 05:24:00 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2024-01-16 16:48:40 -0500 |
commit | 8de9a089b84056afb4bf6519c432324526509dbc (patch) | |
tree | b88da26b465ef80dbd9bd535cba03f97be8d033b | |
parent | db991581269b21f1ae1af98d909b7bce2f888d69 (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.c | 27 |
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 |