Line data Source code
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 >11046*10^7 : 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 >11014*10^7 : 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__ */