• Jens Axboe's avatar
    io_uring: defer file assignment · 6bf9c47a
    Jens Axboe authored
    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: default avatarJens Axboe <axboe@kernel.dk>
    6bf9c47a
io_uring.c 298 KB