summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/bcachefs/alloc_background.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c
index 6de6e26384b2..eb6b22177d26 100644
--- a/fs/bcachefs/alloc_background.c
+++ b/fs/bcachefs/alloc_background.c
@@ -1333,6 +1333,24 @@ static void allocator_start_issue_discards(struct bch_fs *c)
ca->mi.bucket_size, GFP_NOIO, 0);
}
+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;
@@ -1408,6 +1426,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);