io_uring/cancel: add generic remove_all helper
authorJens Axboe <axboe@kernel.dk>
Wed, 5 Feb 2025 19:48:56 +0000 (12:48 -0700)
committerJens Axboe <axboe@kernel.dk>
Mon, 17 Feb 2025 12:34:45 +0000 (05:34 -0700)
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>
io_uring/cancel.c
io_uring/cancel.h

index 48419356783944a2efb8cf6b8eb8f4b22a6e7414..4feacc57be63bbb9cad151edb4a5208aa2581bab 100644 (file)
@@ -341,3 +341,24 @@ out:
                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;
+}
index bbfea2cd00eafd82cecbf8c7cd53763b969c894e..80734a0a2b2681e0951a08a799d101af2aba0080 100644 (file)
@@ -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)