io_uring: drop 'ctx' ref on task work cancelation
authorJens Axboe <axboe@kernel.dk>
Mon, 14 Sep 2020 14:20:12 +0000 (08:20 -0600)
committerJens Axboe <axboe@kernel.dk>
Mon, 14 Sep 2020 16:22:14 +0000 (10:22 -0600)
If task_work ends up being marked for cancelation, we go through a
cancelation helper instead of the queue path. In converting task_work to
always hold a ctx reference, this path was missed. Make sure that
io_req_task_cancel() puts the reference that is being held against the
ctx.

Fixes: 6d816e088c35 ("io_uring: hold 'ctx' reference around task_work queue + execute")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index be9d628e7854ce52600fe75ab11f0497d984fd8f..01756a131be6af3e636a023cbead7159ff6f4bda 100644 (file)
@@ -1787,8 +1787,10 @@ static void __io_req_task_cancel(struct io_kiocb *req, int error)
 static void io_req_task_cancel(struct callback_head *cb)
 {
        struct io_kiocb *req = container_of(cb, struct io_kiocb, task_work);
+       struct io_ring_ctx *ctx = req->ctx;
 
        __io_req_task_cancel(req, -ECANCELED);
+       percpu_ref_put(&ctx->refs);
 }
 
 static void __io_req_task_submit(struct io_kiocb *req)