60 lines · c
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 bool39xfs_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 bool47xfs_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__ */60