bcachefs: thread_with_stdio: kill thread_with_stdio_done()
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 5 Feb 2024 03:49:34 +0000 (22:49 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 13 Mar 2024 22:39:13 +0000 (18:39 -0400)
Move the cleanup code to a wrapper function, where we can call it after
the thread_with_stdio fn exits.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/chardev.c
fs/bcachefs/thread_with_file.c
fs/bcachefs/thread_with_file.h

index 226b39c176673a374f50ab06ad5f6d3e0a4858d8..11711f54057e144b4d4ebef4676480e3f9389bee 100644 (file)
@@ -155,17 +155,14 @@ static void bch2_fsck_thread_exit(struct thread_with_stdio *_thr)
        kfree(thr);
 }
 
-static int bch2_fsck_offline_thread_fn(void *arg)
+static void bch2_fsck_offline_thread_fn(struct thread_with_stdio *stdio)
 {
-       struct fsck_thread *thr = container_of(arg, struct fsck_thread, thr);
+       struct fsck_thread *thr = container_of(stdio, struct fsck_thread, thr);
        struct bch_fs *c = bch2_fs_open(thr->devs, thr->nr_devs, thr->opts);
 
        thr->thr.thr.ret = PTR_ERR_OR_ZERO(c);
        if (!thr->thr.thr.ret)
                bch2_fs_stop(c);
-
-       thread_with_stdio_done(&thr->thr);
-       return 0;
 }
 
 static long bch2_ioctl_fsck_offline(struct bch_ioctl_fsck_offline __user *user_arg)
@@ -763,9 +760,9 @@ static long bch2_ioctl_disk_resize_journal(struct bch_fs *c,
        return ret;
 }
 
-static int bch2_fsck_online_thread_fn(void *arg)
+static void bch2_fsck_online_thread_fn(struct thread_with_stdio *stdio)
 {
-       struct fsck_thread *thr = container_of(arg, struct fsck_thread, thr);
+       struct fsck_thread *thr = container_of(stdio, struct fsck_thread, thr);
        struct bch_fs *c = thr->c;
 
        c->stdio_filter = current;
@@ -793,11 +790,8 @@ static int bch2_fsck_online_thread_fn(void *arg)
        c->stdio_filter = NULL;
        c->opts.fix_errors = old_fix_errors;
 
-       thread_with_stdio_done(&thr->thr);
-
        up(&c->online_fsck_mutex);
        bch2_ro_ref_put(c);
-       return 0;
 }
 
 static long bch2_ioctl_fsck_online(struct bch_fs *c,
index ca81d3fec3eef8388de8f98587d94de80b149665..eb8ab4c47a94ba506e081b3f2f4105f6bea34341 100644 (file)
@@ -228,15 +228,29 @@ static const struct file_operations thread_with_stdio_fops = {
        .release        = thread_with_stdio_release,
 };
 
+static int thread_with_stdio_fn(void *arg)
+{
+       struct thread_with_stdio *thr = arg;
+
+       thr->fn(thr);
+
+       thr->thr.done = true;
+       thr->stdio.done = true;
+       wake_up(&thr->stdio.input.wait);
+       wake_up(&thr->stdio.output.wait);
+       return 0;
+}
+
 int bch2_run_thread_with_stdio(struct thread_with_stdio *thr,
                               void (*exit)(struct thread_with_stdio *),
-                              int (*fn)(void *))
+                              void (*fn)(struct thread_with_stdio *))
 {
        stdio_buf_init(&thr->stdio.input);
        stdio_buf_init(&thr->stdio.output);
-       thr->exit = exit;
+       thr->exit       = exit;
+       thr->fn         = fn;
 
-       return bch2_run_thread_with_file(&thr->thr, &thread_with_stdio_fops, fn);
+       return bch2_run_thread_with_file(&thr->thr, &thread_with_stdio_fops, thread_with_stdio_fn);
 }
 
 int bch2_stdio_redirect_read(struct stdio_redirect *stdio, char *ubuf, size_t len)
index 4243c7c5ad3f3ab7950b645a4e9a8584f583ba55..66212fcae226aaf4f6bc52f414bc1dad489db405 100644 (file)
@@ -21,19 +21,12 @@ struct thread_with_stdio {
        struct thread_with_file thr;
        struct stdio_redirect   stdio;
        void                    (*exit)(struct thread_with_stdio *);
+       void                    (*fn)(struct thread_with_stdio *);
 };
 
-static inline void thread_with_stdio_done(struct thread_with_stdio *thr)
-{
-       thr->thr.done = true;
-       thr->stdio.done = true;
-       wake_up(&thr->stdio.input.wait);
-       wake_up(&thr->stdio.output.wait);
-}
-
 int bch2_run_thread_with_stdio(struct thread_with_stdio *,
                               void (*exit)(struct thread_with_stdio *),
-                              int (*fn)(void *));
+                              void (*fn)(struct thread_with_stdio *));
 int bch2_stdio_redirect_read(struct stdio_redirect *, char *, size_t);
 int bch2_stdio_redirect_readline(struct stdio_redirect *, char *, size_t);