Am 05.05.2020 um 16:18 hat Max Reitz geschrieben: > Calling bdrv_getlength() to get the pre-truncate file size will not > really work on block devices, because they have always the same length, > and trying to write beyond it will fail with a rather cryptic error > message. > > Instead, we should use qcow2_get_last_cluster() and bdrv_getlength() > only as a fallback. > > Before this patch: > $ truncate -s 1G test.img > $ sudo losetup -f --show test.img > /dev/loop0 > $ sudo qemu-img create -f qcow2 -o preallocation=full /dev/loop0 64M > Formatting '/dev/loop0', fmt=qcow2 size=67108864 cluster_size=65536 > preallocation=full lazy_refcounts=off refcount_bits=16 > qemu-img: /dev/loop0: Could not resize image: Failed to resize refcount > structures: No space left on device > > With this patch: > $ sudo qemu-img create -f qcow2 -o preallocation=full /dev/loop0 64M > Formatting '/dev/loop0', fmt=qcow2 size=67108864 cluster_size=65536 > preallocation=full lazy_refcounts=off refcount_bits=16 > qemu-img: /dev/loop0: Could not resize image: Failed to resize > underlying file: Preallocation mode 'full' unsupported for this > non-regular file > > So as you can see, it still fails, but now the problem is missing > support on the block device level, so we at least get a better error > message. > > Note that we cannot preallocate block devices on truncate by design, > because we do not know what area to preallocate. Their length is always > the same, the truncate operation does not change it. > > Signed-off-by: Max Reitz <mre...@redhat.com>
Thanks, applied to the block branch. Kevin