Commit 1633e492 authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: improved flush_held_btree_writes()

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 6409c6a0
...@@ -1467,24 +1467,16 @@ int bch2_dev_allocator_start(struct bch_dev *ca) ...@@ -1467,24 +1467,16 @@ int bch2_dev_allocator_start(struct bch_dev *ca)
return 0; return 0;
} }
static void flush_held_btree_writes(struct bch_fs *c) static bool flush_done(struct bch_fs *c)
{ {
struct bucket_table *tbl; struct bucket_table *tbl;
struct rhash_head *pos; struct rhash_head *pos;
struct btree *b; struct btree *b;
bool nodes_blocked; bool nodes_unwritten;
size_t i; size_t i;
struct closure cl;
closure_init_stack(&cl);
clear_bit(BCH_FS_HOLD_BTREE_WRITES, &c->flags);
again: again:
pr_debug("flushing dirty btree nodes");
cond_resched(); cond_resched();
closure_wait(&c->btree_interior_update_wait, &cl); nodes_unwritten = false;
nodes_blocked = false;
rcu_read_lock(); rcu_read_lock();
for_each_cached_btree(b, c, tbl, i, pos) for_each_cached_btree(b, c, tbl, i, pos)
...@@ -1496,24 +1488,25 @@ static void flush_held_btree_writes(struct bch_fs *c) ...@@ -1496,24 +1488,25 @@ static void flush_held_btree_writes(struct bch_fs *c)
six_unlock_read(&b->lock); six_unlock_read(&b->lock);
goto again; goto again;
} else { } else {
nodes_blocked = true; nodes_unwritten = true;
} }
} }
rcu_read_unlock(); rcu_read_unlock();
if (c->btree_roots_dirty) if (c->btree_roots_dirty) {
bch2_journal_meta(&c->journal); bch2_journal_meta(&c->journal);
if (nodes_blocked) {
closure_sync(&cl);
goto again; goto again;
} }
closure_wake_up(&c->btree_interior_update_wait); return !nodes_unwritten &&
closure_sync(&cl); !bch2_btree_interior_updates_nr_pending(c);
}
static void flush_held_btree_writes(struct bch_fs *c)
{
clear_bit(BCH_FS_HOLD_BTREE_WRITES, &c->flags);
closure_wait_event(&c->btree_interior_update_wait, closure_wait_event(&c->btree_interior_update_wait, flush_done(c));
!bch2_btree_interior_updates_nr_pending(c));
} }
static void allocator_start_issue_discards(struct bch_fs *c) static void allocator_start_issue_discards(struct bch_fs *c)
......
...@@ -413,11 +413,13 @@ int bch2_fs_initialize(struct bch_fs *c) ...@@ -413,11 +413,13 @@ int bch2_fs_initialize(struct bch_fs *c)
bch2_btree_root_alloc(c, i); bch2_btree_root_alloc(c, i);
err = "unable to allocate journal buckets"; err = "unable to allocate journal buckets";
for_each_online_member(ca, c, i) for_each_online_member(ca, c, i) {
if (bch2_dev_journal_alloc(ca)) { ret = bch2_dev_journal_alloc(ca);
if (ret) {
percpu_ref_put(&ca->io_ref); percpu_ref_put(&ca->io_ref);
goto err; goto err;
} }
}
/* /*
* journal_res_get() will crash if called before this has * journal_res_get() will crash if called before this has
......
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