]> git.baikalelectronics.ru Git - kernel.git/commit
io_uring: defer file assignment
authorJens Axboe <axboe@kernel.dk>
Tue, 29 Mar 2022 16:10:08 +0000 (10:10 -0600)
committerJens Axboe <axboe@kernel.dk>
Thu, 7 Apr 2022 17:17:28 +0000 (11:17 -0600)
commit6a1a0367746e3a4253e7213c1cd97885ba57ed59
tree4731711d5848b0dd90c996db745ca730623058bc
parenta53d8d572fc375f3e493885b25121b124df13caa
io_uring: defer file assignment

If an application uses direct open or accept, it knows in advance what
direct descriptor value it will get as it picks it itself. This allows
combined requests such as:

sqe = io_uring_get_sqe(ring);
io_uring_prep_openat_direct(sqe, ..., file_slot);
sqe->flags |= IOSQE_IO_LINK | IOSQE_CQE_SKIP_SUCCESS;

sqe = io_uring_get_sqe(ring);
io_uring_prep_read(sqe,file_slot, buf, buf_size, 0);
sqe->flags |= IOSQE_FIXED_FILE;

io_uring_submit(ring);

where we prepare both a file open and read, and only get a completion
event for the read when both have completed successfully.

Currently links are fully prepared before the head is issued, but that
fails if the dependent link needs a file assigned that isn't valid until
the head has completed.

Conversely, if the same chain is performed but the fixed file slot is
already valid, then we would be unexpectedly returning data from the
old file slot rather than the newly opened one. Make sure we're
consistent here.

Allow deferral of file setup, which makes this documented case work.

Cc: stable@vger.kernel.org # v5.15+
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io-wq.h
fs/io_uring.c