backport fix for io_uring to prevent kernel panic
which could be triggered in some corner cases with (but most likely not limited to) LVM-backed QEMU guests using io_uring. Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
This commit is contained in:
		
							parent
							
								
									2c3b526416
								
							
						
					
					
						commit
						437b51a73b
					
				| @ -0,0 +1,49 @@ | |||||||
|  | From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Fabian Ebner <f.ebner@proxmox.com> | ||||||
|  | Date: Wed, 28 Jul 2021 08:55:31 +0200 | ||||||
|  | Subject: [PATCH] io_uring: don't block level reissue off completion path | ||||||
|  | 
 | ||||||
|  | Some setups, like SCSI, can throw spurious -EAGAIN off the softirq | ||||||
|  | completion path. Normally we expect this to happen inline as part | ||||||
|  | of submission, but apparently SCSI has a weird corner case where it | ||||||
|  | can happen as part of normal completions. | ||||||
|  | 
 | ||||||
|  | This should be solved by having the -EAGAIN bubble back up the stack | ||||||
|  | as part of submission, but previous attempts at this failed and we're | ||||||
|  | not just quite there yet. Instead we currently use REQ_F_REISSUE to | ||||||
|  | handle this case. | ||||||
|  | 
 | ||||||
|  | For now, catch it in io_rw_should_reissue() and prevent a reissue | ||||||
|  | from a bogus path. | ||||||
|  | 
 | ||||||
|  | Upstream mail: | ||||||
|  | https://lore.kernel.org/io-uring/20210727165811.284510-3-axboe@kernel.dk/T/#u | ||||||
|  | 
 | ||||||
|  | Originally-by: Jens Axboe <axboe@kernel.dk> | ||||||
|  | [backport] | ||||||
|  | Signed-off-by: Fabian Ebner <f.ebner@proxmox.com> | ||||||
|  | ---
 | ||||||
|  |  fs/io_uring.c | 7 +++++++ | ||||||
|  |  1 file changed, 7 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/fs/io_uring.c b/fs/io_uring.c
 | ||||||
|  | index 2b86b413641a..11f615033c70 100644
 | ||||||
|  | --- a/fs/io_uring.c
 | ||||||
|  | +++ b/fs/io_uring.c
 | ||||||
|  | @@ -2731,6 +2731,13 @@ static bool io_rw_reissue(struct io_kiocb *req, long res)
 | ||||||
|  |  	if (percpu_ref_is_dying(&req->ctx->refs)) | ||||||
|  |  		return false; | ||||||
|  |   | ||||||
|  | +	/*
 | ||||||
|  | +	 * Play it safe and assume not safe to re-import and reissue if we're
 | ||||||
|  | +	 * not in the original thread group (or in task context).
 | ||||||
|  | +	 */
 | ||||||
|  | +	if (!same_thread_group(req->task, current) || !in_task())
 | ||||||
|  | +		return false;
 | ||||||
|  | +
 | ||||||
|  |  	lockdep_assert_held(&req->ctx->uring_lock); | ||||||
|  |   | ||||||
|  |  	ret = io_sq_thread_acquire_mm_files(req->ctx, req); | ||||||
|  | -- 
 | ||||||
|  | 2.30.2 | ||||||
|  | 
 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Fabian Ebner
						Fabian Ebner