mirror of https://github.com/xemu-project/xemu.git
vmdk: align end of file to a sector boundary
There is a rare case which the size of last compressed cluster is larger than the cluster size, which will cause the file is not aligned at the sector boundary. There are three reasons to do it. First, if vmdk doesn't align at the sector boundary, there may be many undefined behaviors, such as, in vbox it will show VMDK: Compressed image is corrupted 'syno-vm-disk1.vmdk' (VERR_ZIP_CORRUPTED) when we try to import an ova with unaligned vmdk. Second, all the cluster_sector is aligned to sector, the last one should be like this, too. Third, it ease reading with sector based I/Os. Signed-off-by: yuchenlin <yuchenlin@synology.com> Message-Id: <20180913082952.3675-1-yuchenlin@synology.com> Reviewed-by: Fam Zheng <famz@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com>
This commit is contained in:
parent
b33bd859d1
commit
51b3c6b73a
21
block/vmdk.c
21
block/vmdk.c
|
@ -1698,6 +1698,27 @@ static int coroutine_fn
|
||||||
vmdk_co_pwritev_compressed(BlockDriverState *bs, uint64_t offset,
|
vmdk_co_pwritev_compressed(BlockDriverState *bs, uint64_t offset,
|
||||||
uint64_t bytes, QEMUIOVector *qiov)
|
uint64_t bytes, QEMUIOVector *qiov)
|
||||||
{
|
{
|
||||||
|
if (bytes == 0) {
|
||||||
|
/* The caller will write bytes 0 to signal EOF.
|
||||||
|
* When receive it, we align EOF to a sector boundary. */
|
||||||
|
BDRVVmdkState *s = bs->opaque;
|
||||||
|
int i, ret;
|
||||||
|
int64_t length;
|
||||||
|
|
||||||
|
for (i = 0; i < s->num_extents; i++) {
|
||||||
|
length = bdrv_getlength(s->extents[i].file->bs);
|
||||||
|
if (length < 0) {
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
length = QEMU_ALIGN_UP(length, BDRV_SECTOR_SIZE);
|
||||||
|
ret = bdrv_truncate(s->extents[i].file, length,
|
||||||
|
PREALLOC_MODE_OFF, NULL);
|
||||||
|
if (ret < 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
return vmdk_co_pwritev(bs, offset, bytes, qiov, 0);
|
return vmdk_co_pwritev(bs, offset, bytes, qiov, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue