io_uring-file req cancel syzbot reports
Subsystems (3)
cover io_uring-file req cancel syzbot reports
Fixes for two latest syzbot reports
Pavel Begunkov (2):
io_uring: fix list corruption for splice file_get
io_uring: fix sqo ownership false positive warning
fs/io_uring.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
Signature · 1 line
2.24.0
PATCH 2/2 io_uring: fix sqo ownership false positive warning
WARNING: CPU: 0 PID: 21359 at fs/io_uring.c:9042
io_uring_cancel_task_requests+0xe55/0x10c0 fs/io_uring.c:9042
Call Trace:
io_uring_flush+0x47b/0x6e0 fs/io_uring.c:9227
filp_close+0xb4/0x170 fs/open.c:1295
close_files fs/file.c:403 [inline]
put_files_struct fs/file.c:418 [inline]
put_files_struct+0x1cc/0x350 fs/file.c:415
exit_files+0x7e/0xa0 fs/file.c:435
do_exit+0xc22/0x2ae0 kernel/exit.c:820
do_group_exit+0x125/0x310 kernel/exit.c:922
get_signal+0x427/0x20f0 kernel/signal.c:2773
arch_do_signal_or_restart+0x2a8/0x1eb0 arch/x86/kernel/signal.c:811
handle_signal_work kernel/entry/common.c:147 [inline]
exit_to_user_mode_loop kernel/entry/common.c:171 [inline]
exit_to_user_mode_prepare+0x148/0x250 kernel/entry/common.c:201
__syscall_exit_to_user_mode_work kernel/entry/common.c:291 [inline]
syscall_exit_to_user_mode+0x19/0x50 kernel/entry/common.c:302
entry_SYSCALL_64_after_hwframe+0x44/0xa9Now io_uring_cancel_task_requests() can be called not through file notes but directly, remove a WARN_ONCE() there that give us false positives. That check is not very important and we catch it in other places.
Fixes 84965ff8a84f0 ("io_uring: if we see flush on exit, cancel related tasks")
Cc [email protected] # 5.9+
Reported-by [email protected]
Signed-off-by Pavel Begunkov <[email protected]>
--- fs/io_uring.c | 2 -- 1 file changed, 2 deletions(-)
fs/io_uring.c +0 -2
@@ -8967,8 +8967,6 @@ static void io_uring_cancel_task_requests(struct io_ring_ctx *ctx,struct task_struct *task = current;if ((ctx->flags &IORING_SETUP_SQPOLL ) && ctx->sq_data) { -/* for SQPOLL only sqo_task has task notes */ -WARN_ON_ONCE (ctx->sqo_task != current);io_disable_sqo_submit (ctx); task = ctx->sq_data->thread;atomic_inc (&task->io_uring->in_idle);
Signature · 1 line
2.24.0
PATCH 1/2 io_uring: fix list corruption for splice file_get
In reply to Pavel Begunkovkernel BUG at lib/list_debug.c:29!
Call Trace: __list_add include/linux/list.h:67 [inline] list_add include/linux/list.h:86 [inline] io_file_get+0x8cc/0xdb0 fs/io_uring.c:6466 __io_splice_prep+0x1bc/0x530 fs/io_uring.c:3866 io_splice_prep fs/io_uring.c:3920 [inline] io_req_prep+0x3546/0x4e80 fs/io_uring.c:6081 io_queue_sqe+0x609/0x10d0 fs/io_uring.c:6628 io_submit_sqe fs/io_uring.c:6705 [inline] io_submit_sqes+0x1495/0x2720 fs/io_uring.c:6953 __do_sys_io_uring_enter+0x107d/0x1f30 fs/io_uring.c:9353 do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46 entry_SYSCALL_64_after_hwframe+0x44/0xa9
io_file_get() may be called from splice, and so REQ_F_INFLIGHT may already be set.
Fixes 02a13674fa0e8 ("io_uring: account io_uring internal files as REQ_F_INFLIGHT")
Cc [email protected] # 5.9+
Reported-by [email protected]
Signed-off-by Pavel Begunkov <[email protected]>
--- fs/io_uring.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/io_uring.c +2 -1
@@ -6460,7 +6460,8 @@ static struct file *io_file_get(struct io_submit_state *state, file =__io_file_get (state, fd); } -if (file && file->f_op == &io_uring_fops) { +if (file && file->f_op == &io_uring_fops && + !(req->flags &REQ_F_INFLIGHT )) {io_req_init_async (req); req->flags |=REQ_F_INFLIGHT ;
Signature · 1 line
2.24.0