cancel.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // SPDX-License-Identifier: GPL-2.0
  2. #ifndef IORING_CANCEL_H
  3. #define IORING_CANCEL_H
  4. #include <linux/io_uring_types.h>
  5. struct io_cancel_data {
  6. struct io_ring_ctx *ctx;
  7. u64 data;
  8. struct file *file;
  9. u8 opcode;
  10. u32 flags;
  11. int seq;
  12. };
  13. int io_async_cancel_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe);
  14. int io_async_cancel(struct io_kiocb *req, unsigned int issue_flags);
  15. int io_try_cancel(struct io_uring_task *tctx, struct io_cancel_data *cd,
  16. unsigned int issue_flags);
  17. int io_sync_cancel(struct io_ring_ctx *ctx, void __user *arg);
  18. bool io_cancel_req_match(struct io_kiocb *req, struct io_cancel_data *cd);
  19. bool io_match_task_safe(struct io_kiocb *head, struct io_uring_task *tctx,
  20. bool cancel_all);
  21. bool io_cancel_remove_all(struct io_ring_ctx *ctx, struct io_uring_task *tctx,
  22. struct hlist_head *list, bool cancel_all,
  23. bool (*cancel)(struct io_kiocb *));
  24. int io_cancel_remove(struct io_ring_ctx *ctx, struct io_cancel_data *cd,
  25. unsigned int issue_flags, struct hlist_head *list,
  26. bool (*cancel)(struct io_kiocb *));
  27. __cold bool io_uring_try_cancel_requests(struct io_ring_ctx *ctx,
  28. struct io_uring_task *tctx,
  29. bool cancel_all, bool is_sqpoll_thread);
  30. __cold void io_uring_cancel_generic(bool cancel_all, struct io_sq_data *sqd);
  31. __cold bool io_cancel_ctx_cb(struct io_wq_work *work, void *data);
  32. static inline bool io_cancel_match_sequence(struct io_kiocb *req, int sequence)
  33. {
  34. if (req->cancel_seq_set && sequence == req->work.cancel_seq)
  35. return true;
  36. req->cancel_seq_set = true;
  37. req->work.cancel_seq = sequence;
  38. return false;
  39. }
  40. #endif