|
Gabriel Krisman Bertazi |
200ee3 |
From d11d31fc5d8a96f707facee0babdcffaafa38de2 Mon Sep 17 00:00:00 2001
|
|
Gabriel Krisman Bertazi |
200ee3 |
From: Pavel Begunkov <asml.silence@gmail.com>
|
|
Gabriel Krisman Bertazi |
200ee3 |
Date: Mon, 13 Jun 2022 06:30:06 +0100
|
|
Gabriel Krisman Bertazi |
200ee3 |
Subject: [PATCH] io_uring: fix races with buffer table unregister
|
|
Gabriel Krisman Bertazi |
200ee3 |
Git-commit: d11d31fc5d8a96f707facee0babdcffaafa38de2
|
|
Gabriel Krisman Bertazi |
200ee3 |
Patch-mainline: v5.19-rc3
|
|
Gabriel Krisman Bertazi |
200ee3 |
References: bsc#1205205
|
|
Gabriel Krisman Bertazi |
200ee3 |
|
|
Gabriel Krisman Bertazi |
200ee3 |
Fixed buffer table quiesce might unlock ->uring_lock, potentially
|
|
Gabriel Krisman Bertazi |
200ee3 |
letting new requests to be submitted, don't allow those requests to
|
|
Gabriel Krisman Bertazi |
200ee3 |
use the table as they will race with unregistration.
|
|
Gabriel Krisman Bertazi |
200ee3 |
|
|
Gabriel Krisman Bertazi |
200ee3 |
Reported-and-tested-by: van fantasy <g1042620637@gmail.com>
|
|
Gabriel Krisman Bertazi |
200ee3 |
Fixes: bd54b6fe3316ec ("io_uring: implement fixed buffers registration similar to fixed files")
|
|
Gabriel Krisman Bertazi |
200ee3 |
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
|
|
Gabriel Krisman Bertazi |
200ee3 |
Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
|
|
Gabriel Krisman Bertazi |
200ee3 |
---
|
|
Gabriel Krisman Bertazi |
200ee3 |
fs/io_uring.c | 7 +++++++
|
|
Gabriel Krisman Bertazi |
200ee3 |
1 file changed, 7 insertions(+)
|
|
Gabriel Krisman Bertazi |
200ee3 |
|
|
Gabriel Krisman Bertazi |
200ee3 |
diff --git a/fs/io_uring.c b/fs/io_uring.c
|
|
Gabriel Krisman Bertazi |
200ee3 |
index 00d266746916..be05f375a776 100644
|
|
Gabriel Krisman Bertazi |
200ee3 |
--- a/fs/io_uring.c
|
|
Gabriel Krisman Bertazi |
200ee3 |
+++ b/fs/io_uring.c
|
|
Gabriel Krisman Bertazi |
200ee3 |
@@ -10680,12 +10680,19 @@ static void __io_sqe_buffers_unregister(struct io_ring_ctx *ctx)
|
|
Gabriel Krisman Bertazi |
200ee3 |
|
|
Gabriel Krisman Bertazi |
200ee3 |
static int io_sqe_buffers_unregister(struct io_ring_ctx *ctx)
|
|
Gabriel Krisman Bertazi |
200ee3 |
{
|
|
Gabriel Krisman Bertazi |
200ee3 |
+ unsigned nr = ctx->nr_user_bufs;
|
|
Gabriel Krisman Bertazi |
200ee3 |
int ret;
|
|
Gabriel Krisman Bertazi |
200ee3 |
|
|
Gabriel Krisman Bertazi |
200ee3 |
if (!ctx->buf_data)
|
|
Gabriel Krisman Bertazi |
200ee3 |
return -ENXIO;
|
|
Gabriel Krisman Bertazi |
200ee3 |
|
|
Gabriel Krisman Bertazi |
200ee3 |
+ /*
|
|
Gabriel Krisman Bertazi |
200ee3 |
+ * Quiesce may unlock ->uring_lock, and while it's not held
|
|
Gabriel Krisman Bertazi |
200ee3 |
+ * prevent new requests using the table.
|
|
Gabriel Krisman Bertazi |
200ee3 |
+ */
|
|
Gabriel Krisman Bertazi |
200ee3 |
+ ctx->nr_user_bufs = 0;
|
|
Gabriel Krisman Bertazi |
200ee3 |
ret = io_rsrc_ref_quiesce(ctx->buf_data, ctx);
|
|
Gabriel Krisman Bertazi |
200ee3 |
+ ctx->nr_user_bufs = nr;
|
|
Gabriel Krisman Bertazi |
200ee3 |
if (!ret)
|
|
Gabriel Krisman Bertazi |
200ee3 |
__io_sqe_buffers_unregister(ctx);
|
|
Gabriel Krisman Bertazi |
200ee3 |
return ret;
|
|
Gabriel Krisman Bertazi |
200ee3 |
--
|
|
Gabriel Krisman Bertazi |
200ee3 |
2.35.3
|
|
Gabriel Krisman Bertazi |
200ee3 |
|