]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
bcachefs: Create allocator threads when allocating filesystem
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 5 Mar 2021 23:00:55 +0000 (18:00 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:53 +0000 (17:08 -0400)
We're seeing failures to mount because of a failure to start the
allocator threads, which currently happens fairly late in the mount
process, after walking all metadata, and kthread_create() fails if
something has tried to kill the mount process, which is probably not
what we want.

This patch avoids this issue by creating, but not starting, the
allocator threads when we preallocate all of our other in memory data
structures.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_background.c
fs/bcachefs/super.c

index eac82c9880bae9b1340ee3d95a4bf0e57e0fce00..b9b97cbda17792b3eca6f257bb79470ee2659e69 100644 (file)
@@ -1068,6 +1068,12 @@ static int discard_invalidated_buckets(struct bch_fs *c, struct bch_dev *ca)
        return 0;
 }
 
+static inline bool allocator_thread_running(struct bch_dev *ca)
+{
+       return ca->mi.state == BCH_MEMBER_STATE_RW &&
+               test_bit(BCH_FS_ALLOCATOR_RUNNING, &ca->fs->flags);
+}
+
 /**
  * bch_allocator_thread - move buckets from free_inc to reserves
  *
@@ -1084,9 +1090,16 @@ static int bch2_allocator_thread(void *arg)
        int ret;
 
        set_freezable();
-       ca->allocator_state = ALLOCATOR_RUNNING;
 
        while (1) {
+               if (!allocator_thread_running(ca)) {
+                       ca->allocator_state = ALLOCATOR_STOPPED;
+                       if (kthread_wait_freezable(allocator_thread_running(ca)))
+                               break;
+               }
+
+               ca->allocator_state = ALLOCATOR_RUNNING;
+
                cond_resched();
                if (kthread_should_stop())
                        break;
index e10e7e0c04540c18fadbf056a008081d5e225016..224c21c3f9f74b3ee2af4a8bc4a8027448b4519e 100644 (file)
@@ -431,6 +431,9 @@ static int __bch2_fs_read_write(struct bch_fs *c, bool early)
 
        set_bit(BCH_FS_ALLOCATOR_RUNNING, &c->flags);
 
+       for_each_rw_member(ca, c, i)
+               bch2_wake_allocator(ca);
+
        ret = bch2_journal_reclaim_start(&c->journal);
        if (ret) {
                bch_err(c, "error starting journal reclaim: %i", ret);
@@ -1008,6 +1011,8 @@ static void bch2_dev_release(struct kobject *kobj)
 
 static void bch2_dev_free(struct bch_dev *ca)
 {
+       bch2_dev_allocator_stop(ca);
+
        cancel_work_sync(&ca->io_error_work);
 
        if (ca->kobj.state_in_sysfs &&
@@ -1172,6 +1177,12 @@ static int bch2_dev_alloc(struct bch_fs *c, unsigned dev_idx)
        if (!ca)
                goto err;
 
+       if (ca->mi.state == BCH_MEMBER_STATE_RW &&
+           bch2_dev_allocator_start(ca)) {
+               bch2_dev_free(ca);
+               goto err;
+       }
+
        bch2_dev_attach(c, ca, dev_idx);
 out:
        pr_verbose_init(c->opts, "ret %i", ret);