Commit 04e23a56 authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Ensure we always have a journal pin in interior update path

For the new nodes an interior btree update makes reachable, updates to
those nodes may be journalled after the btree update starts but before
the transactional part - where we make those nodes reachable. Those
updates need to be kept in the journal until after the btree update
completes, hence we should always get a journal pin at the start of the
interior update.
Signed-off-by: default avatarKent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent d7b04163
...@@ -544,6 +544,8 @@ static void btree_update_nodes_written(struct btree_update *as) ...@@ -544,6 +544,8 @@ static void btree_update_nodes_written(struct btree_update *as)
unsigned i; unsigned i;
int ret; int ret;
BUG_ON(!journal_pin_active(&as->journal));
/* /*
* We did an update to a parent node where the pointers we added pointed * 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 * to child nodes that weren't written yet: now, the child nodes have
...@@ -699,17 +701,7 @@ static void btree_update_reparent(struct btree_update *as, ...@@ -699,17 +701,7 @@ static void btree_update_reparent(struct btree_update *as,
child->b = NULL; child->b = NULL;
child->mode = BTREE_INTERIOR_UPDATING_AS; child->mode = BTREE_INTERIOR_UPDATING_AS;
/*
* When we write a new btree root, we have to drop our journal pin
* _before_ the new nodes are technically reachable; see
* btree_update_nodes_written().
*
* This goes for journal pins that are recursively blocked on us - so,
* just transfer the journal pin to the new interior update so
* btree_update_nodes_written() can drop it.
*/
bch2_journal_pin_copy(&c->journal, &as->journal, &child->journal, NULL); bch2_journal_pin_copy(&c->journal, &as->journal, &child->journal, NULL);
bch2_journal_pin_drop(&c->journal, &child->journal);
} }
static void btree_update_updated_root(struct btree_update *as, struct btree *b) static void btree_update_updated_root(struct btree_update *as, struct btree *b)
...@@ -956,6 +948,10 @@ bch2_btree_update_start(struct btree_trans *trans, enum btree_id id, ...@@ -956,6 +948,10 @@ bch2_btree_update_start(struct btree_trans *trans, enum btree_id id,
if (ret) if (ret)
goto err; goto err;
bch2_journal_pin_add(&c->journal,
atomic64_read(&c->journal.seq),
&as->journal, NULL);
mutex_lock(&c->btree_interior_update_lock); mutex_lock(&c->btree_interior_update_lock);
list_add_tail(&as->list, &c->btree_interior_update_list); list_add_tail(&as->list, &c->btree_interior_update_list);
mutex_unlock(&c->btree_interior_update_lock); mutex_unlock(&c->btree_interior_update_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment