xref: /openbmc/linux/fs/xfs/xfs_pwork.h (revision d0034a7a4ac7fae708146ac0059b9c47a1543f0d)
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
xfs_pwork_ctl_want_abort(struct xfs_pwork_ctl * pctl)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
xfs_pwork_want_abort(struct xfs_pwork * pwork)47  xfs_pwork_want_abort(
48  	struct xfs_pwork	*pwork)
49  {
50  	return xfs_pwork_ctl_want_abort(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