Message ID | 20230130215415.919494-2-stefanha@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | block: fix detect-zeroes= with BDRV_REQ_REGISTERED_BUF | expand |
On Mon, Jan 30, 2023 at 04:54:12PM -0500, Stefan Hajnoczi wrote: > When a write request is converted into a write zeroes request by the > detect-zeroes= feature, it is no longer associated with an I/O buffer. > The BDRV_REQ_REGISTERED_BUF flag doesn't make sense without an I/O > buffer and must be cleared because bdrv_co_do_pwrite_zeroes() fails with > -EINVAL when it's set. > > Fiona Ebner <f.ebner@proxmox.com> bisected and diagnosed this QEMU 7.2 > regression where writes containing zeroes to a blockdev with > discard=unmap,detect-zeroes=unmap fail. > > Buglink: https://gitlab.com/qemu-project/qemu/-/issues/1404 > Fixes: e8b6535533be ("block: add BDRV_REQ_REGISTERED_BUF request flag") > Tested-by: Fiona Ebner <f.ebner@proxmox.com> > Cc: qemu-stable@nongnu.org > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > block/io.c | 3 +++ > 1 file changed, 3 insertions(+) Reviewed-by: Eric Blake <eblake@redhat.com>
diff --git a/block/io.c b/block/io.c index a09a19f7a7..24a2bc42d3 100644 --- a/block/io.c +++ b/block/io.c @@ -1926,6 +1926,9 @@ static int coroutine_fn bdrv_aligned_pwritev(BdrvChild *child, if (bs->detect_zeroes == BLOCKDEV_DETECT_ZEROES_OPTIONS_UNMAP) { flags |= BDRV_REQ_MAY_UNMAP; } + + /* Can't use optimization hint with bufferless zero write */ + flags &= ~BDRV_REQ_REGISTERED_BUF; } if (ret < 0) {