]> www.infradead.org Git - users/jedix/linux-maple.git/commit
io_uring/uring_cmd: switch sqe to async_data on EAGAIN
authorCaleb Sander Mateos <csander@purestorage.com>
Wed, 12 Feb 2025 20:45:46 +0000 (13:45 -0700)
committerJens Axboe <axboe@kernel.dk>
Wed, 12 Feb 2025 20:58:43 +0000 (13:58 -0700)
commite663da62ba8672aaa66843f1af8b20e3bb1a0515
tree83348c059ec2d59b27ae3f7264a75c3a964419b7
parent34cae91215c6f65bed2a124fb9283da6ec0b8dd9
io_uring/uring_cmd: switch sqe to async_data on EAGAIN

5eff57fa9f3a ("io_uring/uring_cmd: defer SQE copying until it's needed")
moved the unconditional memcpy() of the uring_cmd SQE to async_data
to 2 cases when the request goes async:
- If REQ_F_FORCE_ASYNC is set to force the initial issue to go async
- If ->uring_cmd() returns -EAGAIN in the initial non-blocking issue

Unlike the REQ_F_FORCE_ASYNC case, in the EAGAIN case, io_uring_cmd()
copies the SQE to async_data but neglects to update the io_uring_cmd's
sqe field to point to async_data. As a result, sqe still points to the
slot in the userspace-mapped SQ. At the end of io_submit_sqes(), the
kernel advances the SQ head index, allowing userspace to reuse the slot
for a new SQE. If userspace reuses the slot before the io_uring worker
reissues the original SQE, the io_uring_cmd's SQE will be corrupted.

Introduce a helper io_uring_cmd_cache_sqes() to copy the original SQE to
the io_uring_cmd's async_data and point sqe there. Use it for both the
REQ_F_FORCE_ASYNC and EAGAIN cases. This ensures the uring_cmd doesn't
read from the SQ slot after it has been returned to userspace.

Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
Fixes: 5eff57fa9f3a ("io_uring/uring_cmd: defer SQE copying until it's needed")
Link: https://lore.kernel.org/r/20250212204546.3751645-3-csander@purestorage.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/uring_cmd.c