io_uring: split poll and poll_remove structs
authorPavel Begunkov <asml.silence@gmail.com>
Tue, 27 Oct 2020 23:17:18 +0000 (23:17 +0000)
committerJens Axboe <axboe@kernel.dk>
Wed, 9 Dec 2020 19:03:59 +0000 (12:03 -0700)
Don't use a single struct for polls and poll remove requests, they have
totally different layouts.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index c8ecbc0..10cfb6d 100644 (file)
@@ -395,16 +395,18 @@ struct io_ring_ctx {
  */
 struct io_poll_iocb {
        struct file                     *file;
-       union {
-               struct wait_queue_head  *head;
-               u64                     addr;
-       };
+       struct wait_queue_head          *head;
        __poll_t                        events;
        bool                            done;
        bool                            canceled;
        struct wait_queue_entry         wait;
 };
 
+struct io_poll_remove {
+       struct file                     *file;
+       u64                             addr;
+};
+
 struct io_close {
        struct file                     *file;
        struct file                     *put_file;
@@ -672,6 +674,7 @@ struct io_kiocb {
                struct file             *file;
                struct io_rw            rw;
                struct io_poll_iocb     poll;
+               struct io_poll_remove   poll_remove;
                struct io_accept        accept;
                struct io_sync          sync;
                struct io_cancel        cancel;
@@ -5538,7 +5541,7 @@ static int io_poll_remove_prep(struct io_kiocb *req,
            sqe->poll_events)
                return -EINVAL;
 
-       req->poll.addr = READ_ONCE(sqe->addr);
+       req->poll_remove.addr = READ_ONCE(sqe->addr);
        return 0;
 }
 
@@ -5549,12 +5552,10 @@ static int io_poll_remove_prep(struct io_kiocb *req,
 static int io_poll_remove(struct io_kiocb *req)
 {
        struct io_ring_ctx *ctx = req->ctx;
-       u64 addr;
        int ret;
 
-       addr = req->poll.addr;
        spin_lock_irq(&ctx->completion_lock);
-       ret = io_poll_cancel(ctx, addr);
+       ret = io_poll_cancel(ctx, req->poll_remove.addr);
        spin_unlock_irq(&ctx->completion_lock);
 
        if (ret < 0)