Commit 5e5d9bdb authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Fix fifo overflow in allocator startup

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 7ef2a73a
...@@ -1334,6 +1334,24 @@ static void allocator_start_issue_discards(struct bch_fs *c) ...@@ -1334,6 +1334,24 @@ static void allocator_start_issue_discards(struct bch_fs *c)
ca->mi.bucket_size, GFP_NOIO); ca->mi.bucket_size, GFP_NOIO);
} }
static int resize_free_inc(struct bch_dev *ca)
{
alloc_fifo free_inc;
if (!fifo_full(&ca->free_inc))
return 0;
if (!init_fifo(&free_inc,
ca->free_inc.size * 2,
GFP_KERNEL))
return -ENOMEM;
fifo_move(&free_inc, &ca->free_inc);
swap(free_inc, ca->free_inc);
free_fifo(&free_inc);
return 0;
}
static int __bch2_fs_allocator_start(struct bch_fs *c) static int __bch2_fs_allocator_start(struct bch_fs *c)
{ {
struct bch_dev *ca; struct bch_dev *ca;
...@@ -1409,6 +1427,12 @@ static int __bch2_fs_allocator_start(struct bch_fs *c) ...@@ -1409,6 +1427,12 @@ static int __bch2_fs_allocator_start(struct bch_fs *c)
while (!fifo_full(&ca->free[RESERVE_BTREE]) && while (!fifo_full(&ca->free[RESERVE_BTREE]) &&
(bu = next_alloc_bucket(ca)) >= 0) { (bu = next_alloc_bucket(ca)) >= 0) {
ret = resize_free_inc(ca);
if (ret) {
percpu_ref_put(&ca->io_ref);
return ret;
}
bch2_invalidate_one_bucket(c, ca, bu, bch2_invalidate_one_bucket(c, ca, bu,
&journal_seq); &journal_seq);
......
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