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>
Fri, 1 Apr 2022 15:02:18 +0000 (09:02 -0600)
commitb4f73ede83dabfd49d925846bf7658ecf3a2986a
tree6cf7be4f0fe2059c1d9c2defd1719226c1819d38
parent67b218c9af375407a743f5efcdd28b741a60fc96
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