xfs_pwork.h (1407B)
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(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__ */