Am 22.11.2016 um 04:45 hat wyang geschrieben: > On 2016年11月21日 19:34, Kevin Wolf wrote: > >Am 21.11.2016 um 02:24 hat Yang Wei geschrieben: > >>In order to preserve sparse disk image, detect_zeroes > >>should also be enabled when bdrv_get_block_status_above() > >>returns BDRV_BLOCK_DATA > >> > >>Signed-off-by: Yang Wei <w90p...@gmail.com> > >Just preserving sparseness is exactly why bdrv_get_block_status_above() > >is checked, and this happens always. > > I have a sparse qcow2 image(virtual size: 20G disk size: 12G), > # qemu-img info 20G.img > image: 20G.img > file format: qcow2 > virtual size: 20G (21474836480 bytes) > disk size: 12G > cluster_size: 65536 > Format specific information: > compat: 1.1 > lazy refcounts: false > refcount bits: 16 > corrupt: false > > and I tried to qemu-img map --output json xxxx.img, as you can see, > the field of data always is true.
Did you use metadata preallocation? If so, you explicitly requested all clusters to be allocated. > >detect_zeroes does not preserve sparseness, but detect zeroes in parts > >of the source image that are not sparse, and make them sparse in the > >target image. This means that it has higher overhead (because all > >sectors need to be processed before copying them) and doesn't result in > >an exact copy. There may be cases where this is wanted, but in the > >common case, it's probably not the right mode of operation. > To be frank, customers are more concerned about sparseness than overhead. All generalisations are wrong. We could be talking about the majority of users (the QEMU project doesn't have customers), but even then I doubt you're right, especially when using preallocation which is a tool for giving up sparseness in favour of improved performance of the first write to a cluster. > >If you really want to detect zeroes, create the target block driver node > >manually (with detect-zeroes=on) and use the blockdev-mirror QMP command > >to mirror to it. > the target block is created by **bdrv_img_create** and opened by > **bdrv_open** inside qmp_drive_mirror, it also mean than we only > enable detect-zeroes while > its opened, i don't find qmp cmd to only enable it, if I understand > correctly. That's why I said you use blockdev-mirror instead drive-mirror. Kevin