diff options
author | Stefan Hajnoczi <stefanha@redhat.com> | 2023-02-07 15:37:16 -0500 |
---|---|---|
committer | Stefan Hajnoczi <stefanha@redhat.com> | 2023-02-09 10:22:30 -0500 |
commit | 3c5867156eb81c7c71611d078b2c5c2c863f884a (patch) | |
tree | 5c489e5cb88525417e5b48917e01f49b37cb26b0 | |
parent | 1f433e84c3f3ddda90ba235e65b99ef1112f48c7 (diff) | |
download | qemu-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.c | 3 |
1 files changed, 3 insertions, 0 deletions
@@ -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) { |