• Pavel Begunkov's avatar
    io_uring/rw: fix short rw error handling · 4d9cb92c
    Pavel Begunkov authored
    We have a couple of problems, first reports of unexpected link breakage
    for reads when cqe->res indicates that the IO was done in full. The
    reason here is partial IO with retries.
    
    TL;DR; we compare the result in __io_complete_rw_common() against
    req->cqe.res, but req->cqe.res doesn't store the full length but rather
    the length left to be done. So, when we pass the full corrected result
    via kiocb_done() -> __io_complete_rw_common(), it fails.
    
    The second problem is that we don't try to correct res in
    io_complete_rw(), which, for instance, might be a problem for O_DIRECT
    but when a prefix of data was cached in the page cache. We also
    definitely don't want to pass a corrected result into io_rw_done().
    
    The fix here is to leave __io_complete_rw_common() alone, always pass
    not corrected result into it and fix it up as the last step just before
    actually finishing the I/O.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
    Link: https://github.com/axboe/liburing/issues/643Reported-by: default avatarBeld Zhang <beldzhang@gmail.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    4d9cb92c
rw.c 27 KB