io_uring/cancel: wire up IORING_ASYNC_CANCEL_OP for sync cancel
authorJens Axboe <axboe@kernel.dk>
Thu, 22 Jun 2023 19:03:52 +0000 (13:03 -0600)
committerJens Axboe <axboe@kernel.dk>
Mon, 17 Jul 2023 16:05:48 +0000 (10:05 -0600)
Allow usage of IORING_ASYNC_CANCEL_OP through the sync cancelation
API as well.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/uapi/linux/io_uring.h
io_uring/cancel.c

index b64ddd4..36f9c73 100644 (file)
@@ -701,7 +701,9 @@ struct io_uring_sync_cancel_reg {
        __s32                           fd;
        __u32                           flags;
        struct __kernel_timespec        timeout;
-       __u64                           pad[4];
+       __u8                            opcode;
+       __u8                            pad[7];
+       __u64                           pad2[3];
 };
 
 /*
index d91116b..7b23607 100644 (file)
@@ -265,17 +265,22 @@ int io_sync_cancel(struct io_ring_ctx *ctx, void __user *arg)
        struct io_uring_sync_cancel_reg sc;
        struct fd f = { };
        DEFINE_WAIT(wait);
-       int ret;
+       int ret, i;
 
        if (copy_from_user(&sc, arg, sizeof(sc)))
                return -EFAULT;
        if (sc.flags & ~CANCEL_FLAGS)
                return -EINVAL;
-       if (sc.pad[0] || sc.pad[1] || sc.pad[2] || sc.pad[3])
-               return -EINVAL;
+       for (i = 0; i < ARRAY_SIZE(sc.pad); i++)
+               if (sc.pad[i])
+                       return -EINVAL;
+       for (i = 0; i < ARRAY_SIZE(sc.pad2); i++)
+               if (sc.pad2[i])
+                       return -EINVAL;
 
        cd.data = sc.addr;
        cd.flags = sc.flags;
+       cd.opcode = sc.opcode;
 
        /* we can grab a normal file descriptor upfront */
        if ((cd.flags & IORING_ASYNC_CANCEL_FD) &&