diff options
author | Jens Axboe <axboe@kernel.dk> | 2021-07-23 11:53:54 -0600 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2021-07-23 16:44:51 -0600 |
commit | 991468dcf198bb87f24da330676724a704912b47 (patch) | |
tree | fae574f2aeff461ddfa0e95389f4246960643555 /fs/io-wq.c | |
parent | 3c30ef0f78cfb36fdb13753794b0384cf7e37cc9 (diff) |
io_uring: explicitly catch any illegal async queue attempt
Catch an illegal case to queue async from an unrelated task that got
the ring fd passed to it. This should not be possible to hit, but
better be proactive and catch it explicitly. io-wq is extended to
check for early IO_WQ_WORK_CANCEL being set on a work item as well,
so it can run the request through the normal cancelation path.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs/io-wq.c')
-rw-r--r-- | fs/io-wq.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/fs/io-wq.c b/fs/io-wq.c index 843d4a7bcd6e..cf086b01c6c6 100644 --- a/fs/io-wq.c +++ b/fs/io-wq.c @@ -731,7 +731,12 @@ static void io_wqe_enqueue(struct io_wqe *wqe, struct io_wq_work *work) int work_flags; unsigned long flags; - if (test_bit(IO_WQ_BIT_EXIT, &wqe->wq->state)) { + /* + * If io-wq is exiting for this task, or if the request has explicitly + * been marked as one that should not get executed, cancel it here. + */ + if (test_bit(IO_WQ_BIT_EXIT, &wqe->wq->state) || + (work->flags & IO_WQ_WORK_CANCEL)) { io_run_cancel(work, wqe); return; } |