From: Kent Overstreet Date: Wed, 23 Jan 2019 01:04:06 +0000 (-0500) Subject: bcachefs: Fix fifo overflow in allocator startup X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=5e5d9bdbb89c51603653360ecfbfa90c0bceb108;p=linux.git bcachefs: Fix fifo overflow in allocator startup Signed-off-by: Kent Overstreet --- diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c index 871a41b923da7..b79d5b0596215 100644 --- a/fs/bcachefs/alloc_background.c +++ b/fs/bcachefs/alloc_background.c @@ -1334,6 +1334,24 @@ static void allocator_start_issue_discards(struct bch_fs *c) 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) { struct bch_dev *ca; @@ -1409,6 +1427,12 @@ not_enough: while (!fifo_full(&ca->free[RESERVE_BTREE]) && (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, &journal_seq);