aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Hajnoczi <stefanha@redhat.com>2023-02-07 15:37:16 -0500
committerStefan Hajnoczi <stefanha@redhat.com>2023-02-09 10:22:30 -0500
commit3c5867156eb81c7c71611d078b2c5c2c863f884a (patch)
tree5c489e5cb88525417e5b48917e01f49b37cb26b0
parent1f433e84c3f3ddda90ba235e65b99ef1112f48c7 (diff)
downloadqemu-3c5867156eb81c7c71611d078b2c5c2c863f884a.zip
qemu-3c5867156eb81c7c71611d078b2c5c2c863f884a.tar.gz
qemu-3c5867156eb81c7c71611d078b2c5c2c863f884a.tar.bz2
block: fix detect-zeroes= with BDRV_REQ_REGISTERED_BUF
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 Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Hanna Czenczek <hreitz@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Message-Id: <20230207203719.242926-2-stefanha@redhat.com>
-rw-r--r--block/io.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/block/io.c b/block/io.c
index 2dc0c13..d2be37b 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) {