mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 12:21:22 -05:00
io_uring/cancel: add generic remove_all helper
Any opcode that is cancelable ends up defining its own remove all helper, which iterates the pending list and cancels matches. Add a generic helper for it, which can be used by them. Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
@@ -341,3 +341,24 @@ int io_sync_cancel(struct io_ring_ctx *ctx, void __user *arg)
|
||||
fput(file);
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool io_cancel_remove_all(struct io_ring_ctx *ctx, struct io_uring_task *tctx,
|
||||
struct hlist_head *list, bool cancel_all,
|
||||
bool (*cancel)(struct io_kiocb *))
|
||||
{
|
||||
struct hlist_node *tmp;
|
||||
struct io_kiocb *req;
|
||||
bool found = false;
|
||||
|
||||
lockdep_assert_held(&ctx->uring_lock);
|
||||
|
||||
hlist_for_each_entry_safe(req, tmp, list, hash_node) {
|
||||
if (!io_match_task_safe(req, tctx, cancel_all))
|
||||
continue;
|
||||
hlist_del_init(&req->hash_node);
|
||||
if (cancel(req))
|
||||
found = true;
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
@@ -24,6 +24,10 @@ int io_try_cancel(struct io_uring_task *tctx, struct io_cancel_data *cd,
|
||||
int io_sync_cancel(struct io_ring_ctx *ctx, void __user *arg);
|
||||
bool io_cancel_req_match(struct io_kiocb *req, struct io_cancel_data *cd);
|
||||
|
||||
bool io_cancel_remove_all(struct io_ring_ctx *ctx, struct io_uring_task *tctx,
|
||||
struct hlist_head *list, bool cancel_all,
|
||||
bool (*cancel)(struct io_kiocb *));
|
||||
|
||||
static inline bool io_cancel_match_sequence(struct io_kiocb *req, int sequence)
|
||||
{
|
||||
if (req->cancel_seq_set && sequence == req->work.cancel_seq)
|
||||
|
||||
Reference in New Issue
Block a user