1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * Copyright (C) 2019 Oracle. All Rights Reserved. |
4 | * Author: Darrick J. Wong <darrick.wong@oracle.com> |
5 | */ |
6 | #ifndef __XFS_PWORK_H__ |
7 | #define __XFS_PWORK_H__ |
8 | |
9 | struct xfs_pwork; |
10 | struct xfs_mount; |
11 | |
12 | typedef int (*xfs_pwork_work_fn)(struct xfs_mount *mp, struct xfs_pwork *pwork); |
13 | |
14 | /* |
15 | * Parallel work coordination structure. |
16 | */ |
17 | struct xfs_pwork_ctl { |
18 | struct workqueue_struct *wq; |
19 | struct xfs_mount *mp; |
20 | xfs_pwork_work_fn work_fn; |
21 | struct wait_queue_head poll_wait; |
22 | atomic_t nr_work; |
23 | int error; |
24 | }; |
25 | |
26 | /* |
27 | * Embed this parallel work control item inside your own work structure, |
28 | * then queue work with it. |
29 | */ |
30 | struct xfs_pwork { |
31 | struct work_struct work; |
32 | struct xfs_pwork_ctl *pctl; |
33 | }; |
34 | |
35 | #define XFS_PWORK_SINGLE_THREADED { .pctl = NULL } |
36 | |
37 | /* Have we been told to abort? */ |
38 | static inline bool |
39 | xfs_pwork_ctl_want_abort( |
40 | struct xfs_pwork_ctl *pctl) |
41 | { |
42 | return pctl && pctl->error; |
43 | } |
44 | |
45 | /* Have we been told to abort? */ |
46 | static inline bool |
47 | xfs_pwork_want_abort( |
48 | struct xfs_pwork *pwork) |
49 | { |
50 | return xfs_pwork_ctl_want_abort(pctl: pwork->pctl); |
51 | } |
52 | |
53 | int xfs_pwork_init(struct xfs_mount *mp, struct xfs_pwork_ctl *pctl, |
54 | xfs_pwork_work_fn work_fn, const char *tag); |
55 | void xfs_pwork_queue(struct xfs_pwork_ctl *pctl, struct xfs_pwork *pwork); |
56 | int xfs_pwork_destroy(struct xfs_pwork_ctl *pctl); |
57 | void xfs_pwork_poll(struct xfs_pwork_ctl *pctl); |
58 | |
59 | #endif /* __XFS_PWORK_H__ */ |
60 | |