io_uring: abstract out a io_poll_find_helper()
authorJens Axboe <axboe@kernel.dk>
Wed, 17 Mar 2021 14:17:19 +0000 (08:17 -0600)
committerJens Axboe <axboe@kernel.dk>
Sun, 11 Apr 2021 23:42:00 +0000 (17:42 -0600)
We'll need this helper for another purpose, for now just abstract it
out and have io_poll_cancel() use it for lookups.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index e23549330904e8c7bc234f2341ae179a7a31ca44..3c54e8c9f81fa5282bc1c11b2b9b1afe70312243 100644 (file)
@@ -5286,7 +5286,7 @@ static bool io_poll_remove_all(struct io_ring_ctx *ctx, struct task_struct *tsk,
        return posted != 0;
 }
 
-static int io_poll_cancel(struct io_ring_ctx *ctx, __u64 sqe_addr)
+static struct io_kiocb *io_poll_find(struct io_ring_ctx *ctx, __u64 sqe_addr)
 {
        struct hlist_head *list;
        struct io_kiocb *req;
@@ -5295,12 +5295,23 @@ static int io_poll_cancel(struct io_ring_ctx *ctx, __u64 sqe_addr)
        hlist_for_each_entry(req, list, hash_node) {
                if (sqe_addr != req->user_data)
                        continue;
-               if (io_poll_remove_one(req))
-                       return 0;
-               return -EALREADY;
+               return req;
        }
 
-       return -ENOENT;
+       return NULL;
+}
+
+static int io_poll_cancel(struct io_ring_ctx *ctx, __u64 sqe_addr)
+{
+       struct io_kiocb *req;
+
+       req = io_poll_find(ctx, sqe_addr);
+       if (!req)
+               return -ENOENT;
+       if (io_poll_remove_one(req))
+               return 0;
+
+       return -EALREADY;
 }
 
 static int io_poll_remove_prep(struct io_kiocb *req,