mirror of https://github.com/xemu-project/xemu.git
VMDK: bugfix, align offset to cluster in get_whole_cluster
In get_whole_cluster, the offset is not aligned to cluster when reading from backing_hd. When the first write to child is not at the cluster boundary, wrong address data from parent is copied to child. Signed-off-by: Fam Zheng <famcool@gmail.com> Reviewed-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
b3976d3c8b
commit
0e69c54394
|
@ -514,21 +514,23 @@ static int get_whole_cluster(BlockDriverState *bs,
|
||||||
/* 128 sectors * 512 bytes each = grain size 64KB */
|
/* 128 sectors * 512 bytes each = grain size 64KB */
|
||||||
uint8_t whole_grain[extent->cluster_sectors * 512];
|
uint8_t whole_grain[extent->cluster_sectors * 512];
|
||||||
|
|
||||||
// we will be here if it's first write on non-exist grain(cluster).
|
/* we will be here if it's first write on non-exist grain(cluster).
|
||||||
// try to read from parent image, if exist
|
* try to read from parent image, if exist */
|
||||||
if (bs->backing_hd) {
|
if (bs->backing_hd) {
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!vmdk_is_cid_valid(bs))
|
if (!vmdk_is_cid_valid(bs))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
/* floor offset to cluster */
|
||||||
|
offset -= offset % (extent->cluster_sectors * 512);
|
||||||
ret = bdrv_read(bs->backing_hd, offset >> 9, whole_grain,
|
ret = bdrv_read(bs->backing_hd, offset >> 9, whole_grain,
|
||||||
extent->cluster_sectors);
|
extent->cluster_sectors);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Write grain only into the active image
|
/* Write grain only into the active image */
|
||||||
ret = bdrv_write(extent->file, cluster_offset, whole_grain,
|
ret = bdrv_write(extent->file, cluster_offset, whole_grain,
|
||||||
extent->cluster_sectors);
|
extent->cluster_sectors);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
|
Loading…
Reference in New Issue