From: Jens Axboe Date: Fri, 7 Feb 2020 22:45:22 +0000 (-0700) Subject: io_uring: retry raw bdev writes if we hit -EOPNOTSUPP X-Git-Tag: v5.5.5~79 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=9f1a7b5dddee27143984bcc77e247af8a7cfa3af;p=users%2Fdwmw2%2Flinux.git io_uring: retry raw bdev writes if we hit -EOPNOTSUPP commit faac996ccd5da95bc56b91aa80f2643c2d0a1c56 upstream. For non-blocking issue, we set IOCB_NOWAIT in the kiocb. However, on a raw block device, this yields an -EOPNOTSUPP return, as non-blocking writes aren't supported. Turn this -EOPNOTSUPP into -EAGAIN, so we retry from blocking context with IOCB_NOWAIT cleared. Cc: stable@vger.kernel.org # 5.5 Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- diff --git a/fs/io_uring.c b/fs/io_uring.c index 175eb00742a20..6ae692b02980d 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -1978,6 +1978,12 @@ static int io_write(struct io_kiocb *req, struct io_kiocb **nxt, ret2 = call_write_iter(req->file, kiocb, &iter); else ret2 = loop_rw_iter(WRITE, req->file, kiocb, &iter); + /* + * Raw bdev writes will -EOPNOTSUPP for IOCB_NOWAIT. Just + * retry them without IOCB_NOWAIT. + */ + if (ret2 == -EOPNOTSUPP && (kiocb->ki_flags & IOCB_NOWAIT)) + ret2 = -EAGAIN; if (!force_nonblock || ret2 != -EAGAIN) { kiocb_done(kiocb, ret2, nxt, req->in_async); } else {