bcachefs: thread_with_stdio: Mark completed in ->release()
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 9 Feb 2024 01:27:06 +0000 (20:27 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 14 Mar 2024 01:22:00 +0000 (21:22 -0400)
This fixes stdio_redirect_read() getting stuck, not noticing that the
pipe has been closed.

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

index dde9679..83186e8 100644 (file)
@@ -97,6 +97,14 @@ static void stdio_buf_init(struct stdio_buf *buf)
 
 /* thread_with_stdio */
 
+static 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);
+}
+
 static ssize_t thread_with_stdio_read(struct file *file, char __user *ubuf,
                                      size_t len, loff_t *ppos)
 {
@@ -142,6 +150,7 @@ static int thread_with_stdio_release(struct inode *inode, struct file *file)
        struct thread_with_stdio *thr =
                container_of(file->private_data, struct thread_with_stdio, thr);
 
+       thread_with_stdio_done(thr);
        bch2_thread_with_file_exit(&thr->thr);
        darray_exit(&thr->stdio.input.buf);
        darray_exit(&thr->stdio.output.buf);
@@ -235,10 +244,7 @@ static int thread_with_stdio_fn(void *arg)
 
        thr->fn(thr);
 
-       thr->thr.done = true;
-       thr->stdio.done = true;
-       wake_up(&thr->stdio.input.wait);
-       wake_up(&thr->stdio.output.wait);
+       thread_with_stdio_done(thr);
        return 0;
 }