]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
io_uring: fix req->work corruption
authorPavel Begunkov <asml.silence@gmail.com>
Sat, 27 Jun 2020 11:04:59 +0000 (14:04 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 19 Aug 2020 06:26:15 +0000 (08:26 +0200)
[ Upstream commit 8ef77766ba8694968ed4ba24311b4bacee14f235 ]

req->work and req->task_work are in a union, so io_req_task_queue() screws
everything that was in work. De-union them for now.

[  704.367253] BUG: unable to handle page fault for address:
ffffffffaf7330d0
[  704.367256] #PF: supervisor write access in kernel mode
[  704.367256] #PF: error_code(0x0003) - permissions violation
[  704.367261] CPU: 6 PID: 1654 Comm: io_wqe_worker-0 Tainted: G
I       5.8.0-rc2-00038-ge28d0bdc4863-dirty #498
[  704.367265] RIP: 0010:_raw_spin_lock+0x1e/0x36
...
[  704.367276]  __alloc_fd+0x35/0x150
[  704.367279]  __get_unused_fd_flags+0x25/0x30
[  704.367280]  io_openat2+0xcb/0x1b0
[  704.367283]  io_issue_sqe+0x36a/0x1320
[  704.367294]  io_wq_submit_work+0x58/0x160
[  704.367295]  io_worker_handle_work+0x2a3/0x430
[  704.367296]  io_wqe_worker+0x2a0/0x350
[  704.367301]  kthread+0x136/0x180
[  704.367304]  ret_from_fork+0x22/0x30

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

index 8503aec7ea2959b875db23d159da5cf10666c7e5..d732566955d37d5fe18b5a89f93f471cfc9c6769 100644 (file)
@@ -669,12 +669,12 @@ struct io_kiocb {
                 * restore the work, if needed.
                 */
                struct {
-                       struct callback_head    task_work;
                        struct hlist_node       hash_node;
                        struct async_poll       *apoll;
                };
                struct io_wq_work       work;
        };
+       struct callback_head    task_work;
 };
 
 #define IO_PLUG_THRESHOLD              2