summaryrefslogtreecommitdiff
path: root/fs/bcachefs/thread_with_file.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2024-02-04 22:49:34 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2024-03-13 18:39:13 -0400
commita6777ca4ff237d097b3d6186283eb2d2f24071d1 (patch)
treefaff2e5237bacb14d80b4ad4d5f1a543ed52d98f /fs/bcachefs/thread_with_file.c
parent60e1baa872a1550ea7c083977c817ca2ede04eaf (diff)
bcachefs: thread_with_stdio: kill thread_with_stdio_done()
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>
Diffstat (limited to 'fs/bcachefs/thread_with_file.c')
-rw-r--r--fs/bcachefs/thread_with_file.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/fs/bcachefs/thread_with_file.c b/fs/bcachefs/thread_with_file.c
index ca81d3fec3ee..eb8ab4c47a94 100644
--- a/fs/bcachefs/thread_with_file.c
+++ b/fs/bcachefs/thread_with_file.c
@@ -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)