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
9struct xfs_pwork;
10struct xfs_mount;
11
12typedef int (*xfs_pwork_work_fn)(struct xfs_mount *mp, struct xfs_pwork *pwork);
13
14/*
15 * Parallel work coordination structure.
16 */
17struct 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 */
30struct 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? */
38static inline bool
39xfs_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? */
46static inline bool
47xfs_pwork_want_abort(
48 struct xfs_pwork *pwork)
49{
50 return xfs_pwork_ctl_want_abort(pctl: pwork->pctl);
51}
52
53int xfs_pwork_init(struct xfs_mount *mp, struct xfs_pwork_ctl *pctl,
54 xfs_pwork_work_fn work_fn, const char *tag);
55void xfs_pwork_queue(struct xfs_pwork_ctl *pctl, struct xfs_pwork *pwork);
56int xfs_pwork_destroy(struct xfs_pwork_ctl *pctl);
57void xfs_pwork_poll(struct xfs_pwork_ctl *pctl);
58
59#endif /* __XFS_PWORK_H__ */
60

source code of linux/fs/xfs/xfs_pwork.h