| /* SPDX-License-Identifier: GPL-2.0-or-later */ | |
| /* | |
| * Copyright (C) 2019 Oracle. All Rights Reserved. | |
| * Author: Darrick J. Wong <darrick.wong@oracle.com> | |
| */ | |
| #ifndef __XFS_PWORK_H__ | |
| #define __XFS_PWORK_H__ | |
| struct xfs_pwork; | |
| struct xfs_mount; | |
| typedef int (*xfs_pwork_work_fn)(struct xfs_mount *mp, struct xfs_pwork *pwork); | |
| /* | |
| * Parallel work coordination structure. | |
| */ | |
| struct xfs_pwork_ctl { | |
| struct workqueue_struct *wq; | |
| struct xfs_mount *mp; | |
| xfs_pwork_work_fn work_fn; | |
| struct wait_queue_head poll_wait; | |
| atomic_t nr_work; | |
| int error; | |
| }; | |
| /* | |
| * Embed this parallel work control item inside your own work structure, | |
| * then queue work with it. | |
| */ | |
| struct xfs_pwork { | |
| struct work_struct work; | |
| struct xfs_pwork_ctl *pctl; | |
| }; | |
| #define XFS_PWORK_SINGLE_THREADED { .pctl = NULL } | |
| /* Have we been told to abort? */ | |
| static inline bool | |
| xfs_pwork_ctl_want_abort( | |
| struct xfs_pwork_ctl *pctl) | |
| { | |
| return pctl && pctl->error; | |
| } | |
| /* Have we been told to abort? */ | |
| static inline bool | |
| xfs_pwork_want_abort( | |
| struct xfs_pwork *pwork) | |
| { | |
| return xfs_pwork_ctl_want_abort(pwork->pctl); | |
| } | |
| int xfs_pwork_init(struct xfs_mount *mp, struct xfs_pwork_ctl *pctl, | |
| xfs_pwork_work_fn work_fn, const char *tag); | |
| void xfs_pwork_queue(struct xfs_pwork_ctl *pctl, struct xfs_pwork *pwork); | |
| int xfs_pwork_destroy(struct xfs_pwork_ctl *pctl); | |
| void xfs_pwork_poll(struct xfs_pwork_ctl *pctl); | |
| #endif /* __XFS_PWORK_H__ */ |