linux/fs/xfs/xfs_pwork.h
<<
>>
Prefs
   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__ */
  60