]> git.ipfire.org Git - thirdparty/linux.git/blame - fs/bcachefs/thread_with_file.h
Merge tag 'bcachefs-2024-04-22' of https://evilpiepirate.org/git/bcachefs
[thirdparty/linux.git] / fs / bcachefs / thread_with_file.h
CommitLineData
96f37eab
KO
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _BCACHEFS_THREAD_WITH_FILE_H
3#define _BCACHEFS_THREAD_WITH_FILE_H
4
5#include "thread_with_file_types.h"
6
032b3fd0
KO
7/*
8 * Thread with file: Run a kthread and connect it to a file descriptor, so that
9 * it can be interacted with via fd read/write methods and closing the file
10 * descriptor stops the kthread.
11 *
12 * We have two different APIs:
13 *
14 * thread_with_file, the low level version.
15 * You get to define the full file_operations, including your release function,
16 * which means that you must call bch2_thread_with_file_exit() from your
17 * .release method
18 *
19 * thread_with_stdio, the higher level version
20 * This implements full piping of input and output, including .poll.
21 *
22 * Notes on behaviour:
23 * - kthread shutdown behaves like writing or reading from a pipe that has been
24 * closed
25 * - Input and output buffers are 4096 bytes, although buffers may in some
26 * situations slightly exceed that limit so as to avoid chopping off a
27 * message in the middle in nonblocking mode.
28 * - Input/output buffers are lazily allocated, with GFP_NOWAIT allocations -
29 * should be fine but might change in future revisions.
30 * - Output buffer may grow past 4096 bytes to deal with messages that are
31 * bigger than 4096 bytes
32 * - Writing may be done blocking or nonblocking; in nonblocking mode, we only
33 * drop entire messages.
34 *
35 * To write, use stdio_redirect_printf()
36 * To read, use stdio_redirect_read() or stdio_redirect_readline()
37 */
38
96f37eab
KO
39struct task_struct;
40
41struct thread_with_file {
42 struct task_struct *task;
43 int ret;
44 bool done;
45};
46
47void bch2_thread_with_file_exit(struct thread_with_file *);
48int bch2_run_thread_with_file(struct thread_with_file *,
49 const struct file_operations *,
50 int (*fn)(void *));
51
ab6752e2
DW
52struct thread_with_stdio;
53
54struct thread_with_stdio_ops {
55 void (*exit)(struct thread_with_stdio *);
da23795e 56 int (*fn)(struct thread_with_stdio *);
658a1e42 57 long (*unlocked_ioctl)(struct thread_with_stdio *, unsigned int, unsigned long);
ab6752e2
DW
58};
59
96f37eab
KO
60struct thread_with_stdio {
61 struct thread_with_file thr;
62 struct stdio_redirect stdio;
ab6752e2 63 const struct thread_with_stdio_ops *ops;
96f37eab
KO
64};
65
02bed83d
KO
66void bch2_thread_with_stdio_init(struct thread_with_stdio *,
67 const struct thread_with_stdio_ops *);
68int __bch2_run_thread_with_stdio(struct thread_with_stdio *);
96f37eab 69int bch2_run_thread_with_stdio(struct thread_with_stdio *,
ab6752e2 70 const struct thread_with_stdio_ops *);
fcb1620e 71int bch2_run_thread_with_stdout(struct thread_with_stdio *,
ab6752e2 72 const struct thread_with_stdio_ops *);
96f37eab
KO
73int bch2_stdio_redirect_read(struct stdio_redirect *, char *, size_t);
74int bch2_stdio_redirect_readline(struct stdio_redirect *, char *, size_t);
75
1cbae651
DW
76__printf(3, 0) ssize_t bch2_stdio_redirect_vprintf(struct stdio_redirect *, bool, const char *, va_list);
77__printf(3, 4) ssize_t bch2_stdio_redirect_printf(struct stdio_redirect *, bool, const char *, ...);
60e1baa8 78
96f37eab 79#endif /* _BCACHEFS_THREAD_WITH_FILE_H */