[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 1/4] block/io: accept NULL qiov in bdrv_pad_request
From: |
Stefan Hajnoczi |
Subject: |
Re: [PATCH v3 1/4] block/io: accept NULL qiov in bdrv_pad_request |
Date: |
Mon, 25 Mar 2024 15:56:38 -0400 |
On Fri, Mar 22, 2024 at 10:50:06AM +0100, Fiona Ebner wrote:
> From: Stefan Reiter <s.reiter@proxmox.com>
>
> Some operations, e.g. block-stream, perform reads while discarding the
> results (only copy-on-read matters). In this case, they will pass NULL
> as the target QEMUIOVector, which will however trip bdrv_pad_request,
> since it wants to extend its passed vector. In particular, this is the
> case for the blk_co_preadv() call in stream_populate().
>
> If there is no qiov, no operation can be done with it, but the bytes
> and offset still need to be updated, so the subsequent aligned read
> will actually be aligned and not run into an assertion failure.
>
> In particular, this can happen when the request alignment of the top
> node is larger than the allocated part of the bottom node, in which
> case padding becomes necessary. For example:
>
> > ./qemu-img create /tmp/backing.qcow2 -f qcow2 64M -o cluster_size=32768
> > ./qemu-io -c "write -P42 0x0 0x1" /tmp/backing.qcow2
> > ./qemu-img create /tmp/top.qcow2 -f qcow2 64M -b /tmp/backing.qcow2 -F qcow2
> > ./qemu-system-x86_64 --qmp stdio \
> > --blockdev
> > qcow2,node-name=node0,file.driver=file,file.filename=/tmp/top.qcow2 \
> > <<EOF
> > {"execute": "qmp_capabilities"}
> > {"execute": "blockdev-add", "arguments": { "driver": "compress", "file":
> > "node0", "node-name": "node1" } }
> > {"execute": "block-stream", "arguments": { "job-id": "stream0", "device":
> > "node1" } }
> > EOF
>
> Originally-by: Stefan Reiter <s.reiter@proxmox.com>
> Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
> [FE: do update bytes and offset in any case
> add reproducer to commit message]
> Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
> ---
>
> No changes in v3.
> No changes in v2.
>
> block/io.c | 31 +++++++++++++++++++------------
> 1 file changed, 19 insertions(+), 12 deletions(-)
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
signature.asc
Description: PGP signature
- [PATCH v3 0/4] fix two edge cases related to stream block jobs, Fiona Ebner, 2024/03/22
- [PATCH v3 4/4] iotests: add test for stream job with an unaligned prefetch read, Fiona Ebner, 2024/03/22
- [PATCH v3 2/4] block-backend: fix edge case in bdrv_next() where BDS associated to BB changes, Fiona Ebner, 2024/03/22
- [PATCH v3 3/4] block-backend: fix edge case in bdrv_next_cleanup() where BDS associated to BB changes, Fiona Ebner, 2024/03/22
- [PATCH v3 1/4] block/io: accept NULL qiov in bdrv_pad_request, Fiona Ebner, 2024/03/22
- Re: [PATCH v3 1/4] block/io: accept NULL qiov in bdrv_pad_request,
Stefan Hajnoczi <=
- Re: [PATCH v3 0/4] fix two edge cases related to stream block jobs, Stefan Hajnoczi, 2024/03/25