From a9310ab06c0b4a0c199e569dd34579b74b9142d0 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Mon, 11 May 2020 20:01:07 -0400 Subject: [PATCH] bcachefs: Fixes for startup on very full filesystems - Always pass BTREE_INSERT_USE_RESERVE when writing alloc btree keys - Don't strand buckest on the copygc freelist until after recovery is done and we're starting copygc. Signed-off-by: Kent Overstreet Signed-off-by: Kent Overstreet --- fs/bcachefs/alloc_background.c | 16 ++++++++++++++-- fs/bcachefs/super.c | 3 ++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c index 9ce53164d9acc..559b9be509524 100644 --- a/fs/bcachefs/alloc_background.c +++ b/fs/bcachefs/alloc_background.c @@ -315,7 +315,9 @@ retry: bch2_trans_update(trans, iter, &a->k_i, BTREE_TRIGGER_NORUN); ret = bch2_trans_commit(trans, NULL, NULL, - BTREE_INSERT_NOFAIL|flags); + BTREE_INSERT_NOFAIL| + BTREE_INSERT_USE_RESERVE| + flags); err: if (ret == -EINTR) goto retry; @@ -1033,7 +1035,16 @@ static int push_invalidated_bucket(struct bch_fs *c, struct bch_dev *ca, size_t set_current_state(TASK_INTERRUPTIBLE); spin_lock(&c->freelist_lock); - for (i = 0; i < RESERVE_NR; i++) + for (i = 0; i < RESERVE_NR; i++) { + + /* + * Don't strand buckets on the copygc freelist until + * after recovery is finished: + */ + if (!test_bit(BCH_FS_STARTED, &c->flags) && + i == RESERVE_MOVINGGC) + continue; + if (fifo_push(&ca->free[i], bucket)) { fifo_pop(&ca->free_inc, bucket); @@ -1043,6 +1054,7 @@ static int push_invalidated_bucket(struct bch_fs *c, struct bch_dev *ca, size_t spin_unlock(&c->freelist_lock); goto out; } + } if (ca->allocator_state != ALLOCATOR_BLOCKED_FULL) { ca->allocator_state = ALLOCATOR_BLOCKED_FULL; diff --git a/fs/bcachefs/super.c b/fs/bcachefs/super.c index bbb0780bc4ca0..84fb2f51e48ab 100644 --- a/fs/bcachefs/super.c +++ b/fs/bcachefs/super.c @@ -860,6 +860,8 @@ int bch2_fs_start(struct bch_fs *c) if (bch2_fs_init_fault("fs_start")) goto err; + set_bit(BCH_FS_STARTED, &c->flags); + if (c->opts.read_only || c->opts.nochanges) { bch2_fs_read_only(c); } else { @@ -871,7 +873,6 @@ int bch2_fs_start(struct bch_fs *c) goto err; } - set_bit(BCH_FS_STARTED, &c->flags); print_mount_opts(c); ret = 0; out: -- 2.30.2