aboutsummaryrefslogtreecommitdiffstats
path: root/io_uring/cancel.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2023-06-23 10:33:11 -0600
committerJens Axboe <axboe@kernel.dk>2023-07-17 10:05:48 -0600
commit8165b566049b14152873011ea540eb22eae5111d (patch)
tree0d5e8899e2cf4a9c72d1b8219c14eceb9415abe2 /io_uring/cancel.c
parenta30badf66de8516b5a5bca7a5d339f377ff983ea (diff)
downloadlinux-8165b566049b14152873011ea540eb22eae5111d.tar.gz
io_uring/cancel: add IORING_ASYNC_CANCEL_USERDATA
Add a flag to explicitly match on user_data in the request for cancelation purposes. This is the default behavior if none of the other match flags are set, but if we ALSO want to match on user_data, then this flag can be set. Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'io_uring/cancel.c')
-rw-r--r--io_uring/cancel.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/io_uring/cancel.c b/io_uring/cancel.c
index bf44563d687dd..20612e93a3543 100644
--- a/io_uring/cancel.c
+++ b/io_uring/cancel.c
@@ -25,24 +25,30 @@ struct io_cancel {
};
#define CANCEL_FLAGS (IORING_ASYNC_CANCEL_ALL | IORING_ASYNC_CANCEL_FD | \
- IORING_ASYNC_CANCEL_ANY | IORING_ASYNC_CANCEL_FD_FIXED)
+ IORING_ASYNC_CANCEL_ANY | IORING_ASYNC_CANCEL_FD_FIXED | \
+ IORING_ASYNC_CANCEL_USERDATA)
/*
* Returns true if the request matches the criteria outlined by 'cd'.
*/
bool io_cancel_req_match(struct io_kiocb *req, struct io_cancel_data *cd)
{
+ bool match_user_data = cd->flags & IORING_ASYNC_CANCEL_USERDATA;
+
if (req->ctx != cd->ctx)
return false;
- if (cd->flags & IORING_ASYNC_CANCEL_ANY) {
+
+ if (!(cd->flags & (IORING_ASYNC_CANCEL_FD)))
+ match_user_data = true;
+
+ if (cd->flags & IORING_ASYNC_CANCEL_ANY)
goto check_seq;
- } else if (cd->flags & IORING_ASYNC_CANCEL_FD) {
+ if (cd->flags & IORING_ASYNC_CANCEL_FD) {
if (req->file != cd->file)
return false;
- } else {
- if (req->cqe.user_data != cd->data)
- return false;
}
+ if (match_user_data && req->cqe.user_data != cd->data)
+ return false;
if (cd->flags & IORING_ASYNC_CANCEL_ALL) {
check_seq:
if (cd->seq == req->work.cancel_seq)