bcachefs: thread_with_file: create ops structure for thread_with_stdio
authorDarrick J. Wong <djwong@kernel.org>
Sat, 10 Feb 2024 19:23:01 +0000 (11:23 -0800)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 14 Mar 2024 01:22:13 +0000 (21:22 -0400)
Create an ops structure so we can add more file-based functionality in
the next few patches.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
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 11711f54057e144b4d4ebef4676480e3f9389bee..b1a460729a4b4116fd441f3a338640ecba88cd87 100644 (file)
@@ -165,6 +165,11 @@ static void bch2_fsck_offline_thread_fn(struct thread_with_stdio *stdio)
                bch2_fs_stop(c);
 }
 
+static const struct thread_with_stdio_ops bch2_offline_fsck_ops = {
+       .exit           = bch2_fsck_thread_exit,
+       .fn             = bch2_fsck_offline_thread_fn,
+};
+
 static long bch2_ioctl_fsck_offline(struct bch_ioctl_fsck_offline __user *user_arg)
 {
        struct bch_ioctl_fsck_offline arg;
@@ -217,9 +222,7 @@ static long bch2_ioctl_fsck_offline(struct bch_ioctl_fsck_offline __user *user_a
 
        opt_set(thr->opts, stdio, (u64)(unsigned long)&thr->thr.stdio);
 
-       ret = bch2_run_thread_with_stdio(&thr->thr,
-                       bch2_fsck_thread_exit,
-                       bch2_fsck_offline_thread_fn);
+       ret = bch2_run_thread_with_stdio(&thr->thr, &bch2_offline_fsck_ops);
 err:
        if (ret < 0) {
                if (thr)
@@ -794,6 +797,11 @@ static void bch2_fsck_online_thread_fn(struct thread_with_stdio *stdio)
        bch2_ro_ref_put(c);
 }
 
+static const struct thread_with_stdio_ops bch2_online_fsck_ops = {
+       .exit           = bch2_fsck_thread_exit,
+       .fn             = bch2_fsck_online_thread_fn,
+};
+
 static long bch2_ioctl_fsck_online(struct bch_fs *c,
                                   struct bch_ioctl_fsck_online arg)
 {
@@ -834,9 +842,7 @@ static long bch2_ioctl_fsck_online(struct bch_fs *c,
                        goto err;
        }
 
-       ret = bch2_run_thread_with_stdio(&thr->thr,
-                       bch2_fsck_thread_exit,
-                       bch2_fsck_online_thread_fn);
+       ret = bch2_run_thread_with_stdio(&thr->thr, &bch2_online_fsck_ops);
 err:
        if (ret < 0) {
                bch_err_fn(c, ret);
index fc4f97c56021ac61b629b3019d68397a439b0e7c..d298a8e8d2b9699e8db339b75070b519c203920b 100644 (file)
@@ -155,7 +155,7 @@ static int thread_with_stdio_release(struct inode *inode, struct file *file)
        bch2_thread_with_file_exit(&thr->thr);
        darray_exit(&thr->stdio.input.buf);
        darray_exit(&thr->stdio.output.buf);
-       thr->exit(thr);
+       thr->ops->exit(thr);
        return 0;
 }
 
@@ -266,32 +266,28 @@ static int thread_with_stdio_fn(void *arg)
 {
        struct thread_with_stdio *thr = arg;
 
-       thr->fn(thr);
+       thr->ops->fn(thr);
 
        thread_with_stdio_done(thr);
        return 0;
 }
 
 int bch2_run_thread_with_stdio(struct thread_with_stdio *thr,
-                              void (*exit)(struct thread_with_stdio *),
-                              void (*fn)(struct thread_with_stdio *))
+                              const struct thread_with_stdio_ops *ops)
 {
        stdio_buf_init(&thr->stdio.input);
        stdio_buf_init(&thr->stdio.output);
-       thr->exit       = exit;
-       thr->fn         = fn;
+       thr->ops = ops;
 
        return bch2_run_thread_with_file(&thr->thr, &thread_with_stdio_fops, thread_with_stdio_fn);
 }
 
 int bch2_run_thread_with_stdout(struct thread_with_stdio *thr,
-                               void (*exit)(struct thread_with_stdio *),
-                               void (*fn)(struct thread_with_stdio *))
+                               const struct thread_with_stdio_ops *ops)
 {
        stdio_buf_init(&thr->stdio.input);
        stdio_buf_init(&thr->stdio.output);
-       thr->exit       = exit;
-       thr->fn         = fn;
+       thr->ops = ops;
 
        return bch2_run_thread_with_file(&thr->thr, &thread_with_stdout_fops, thread_with_stdio_fn);
 }
index e20f2d17ee59d9d5091120a9be019743e37332b1..5361611edb4cf8ee2c0e51a9df95430131ab9e32 100644 (file)
@@ -49,19 +49,23 @@ int bch2_run_thread_with_file(struct thread_with_file *,
                              const struct file_operations *,
                              int (*fn)(void *));
 
+struct thread_with_stdio;
+
+struct thread_with_stdio_ops {
+       void (*exit)(struct thread_with_stdio *);
+       void (*fn)(struct thread_with_stdio *);
+};
+
 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 *);
+       const struct thread_with_stdio_ops      *ops;
 };
 
 int bch2_run_thread_with_stdio(struct thread_with_stdio *,
-                              void (*exit)(struct thread_with_stdio *),
-                              void (*fn)(struct thread_with_stdio *));
+                              const struct thread_with_stdio_ops *);
 int bch2_run_thread_with_stdout(struct thread_with_stdio *,
-                               void (*exit)(struct thread_with_stdio *),
-                               void (*fn)(struct thread_with_stdio *));
+                               const struct thread_with_stdio_ops *);
 int bch2_stdio_redirect_read(struct stdio_redirect *, char *, size_t);
 int bch2_stdio_redirect_readline(struct stdio_redirect *, char *, size_t);