aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2009-07-17 08:20:41 +0200
committerGlauber Costa <glommer@redhat.com>2009-07-23 10:39:19 -0400
commitb358a08e7b84176f6dc5a402140f4d346249462d (patch)
tree4f43b4b94a0c87d571743a45202f95a572dc4d79
parentf81eed9ddba94918cc9d8c8ffeea45f5b5ef2832 (diff)
vmdk: Fix backing file handling
Instead of storing the backing file in its own BlockDriverState, VMDK uses the BlockDriverState of the raw image file it opened. This is wrong and breaks functions that access the backing file or protocols. This fix replaces all occurrences of s->hd->backing_* with bs->backing_*. This fixes qemu-iotests failure in 020 (Commit changes to backing file). Signed-off-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Glauber Costa <glommer@redhat.com>
-rw-r--r--block-vmdk.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/block-vmdk.c b/block-vmdk.c
index 71d7504bda..1f2ad170e4 100644
--- a/block-vmdk.c
+++ b/block-vmdk.c
@@ -169,7 +169,7 @@ static int vmdk_is_cid_valid(BlockDriverState *bs)
{
#ifdef CHECK_CID
BDRVVmdkState *s = bs->opaque;
- BlockDriverState *p_bs = s->hd->backing_hd;
+ BlockDriverState *p_bs = bs->backing_hd;
uint32_t cur_pcid;
if (p_bs) {
@@ -337,26 +337,26 @@ static int vmdk_parent_open(BlockDriverState *bs, const char * filename)
p_name += sizeof("parentFileNameHint") + 1;
if ((end_name = strchr(p_name,'\"')) == 0)
return -1;
- if ((end_name - p_name) > sizeof (s->hd->backing_file) - 1)
+ if ((end_name - p_name) > sizeof (bs->backing_file) - 1)
return -1;
- pstrcpy(s->hd->backing_file, end_name - p_name + 1, p_name);
- if (stat(s->hd->backing_file, &file_buf) != 0) {
+ pstrcpy(bs->backing_file, end_name - p_name + 1, p_name);
+ if (stat(bs->backing_file, &file_buf) != 0) {
path_combine(parent_img_name, sizeof(parent_img_name),
- filename, s->hd->backing_file);
+ filename, bs->backing_file);
} else {
pstrcpy(parent_img_name, sizeof(parent_img_name),
- s->hd->backing_file);
+ bs->backing_file);
}
- s->hd->backing_hd = bdrv_new("");
- if (!s->hd->backing_hd) {
+ bs->backing_hd = bdrv_new("");
+ if (!bs->backing_hd) {
failure:
bdrv_close(s->hd);
return -1;
}
parent_open = 1;
- if (bdrv_open(s->hd->backing_hd, parent_img_name, BDRV_O_RDONLY) < 0)
+ if (bdrv_open(bs->backing_hd, parent_img_name, BDRV_O_RDONLY) < 0)
goto failure;
parent_open = 0;
}
@@ -463,13 +463,14 @@ static int get_whole_cluster(BlockDriverState *bs, uint64_t cluster_offset,
// we will be here if it's first write on non-exist grain(cluster).
// try to read from parent image, if exist
- if (s->hd->backing_hd) {
- BDRVVmdkState *ps = s->hd->backing_hd->opaque;
+ if (bs->backing_hd) {
+ BDRVVmdkState *ps = bs->backing_hd->opaque;
if (!vmdk_is_cid_valid(bs))
return -1;
- parent_cluster_offset = get_cluster_offset(s->hd->backing_hd, NULL, offset, allocate);
+ parent_cluster_offset = get_cluster_offset(bs->backing_hd, NULL,
+ offset, allocate);
if (parent_cluster_offset) {
BDRVVmdkState *act_s = activeBDRV.hd->opaque;
@@ -620,10 +621,10 @@ static int vmdk_read(BlockDriverState *bs, int64_t sector_num,
n = nb_sectors;
if (!cluster_offset) {
// try to read from parent image, if exist
- if (s->hd->backing_hd) {
+ if (bs->backing_hd) {
if (!vmdk_is_cid_valid(bs))
return -1;
- ret = bdrv_read(s->hd->backing_hd, sector_num, buf, n);
+ ret = bdrv_read(bs->backing_hd, sector_num, buf, n);
if (ret < 0)
return -1;
} else {