Message ID | 1372238672-2614-1-git-send-email-famz@redhat.com |
---|---|
State | New |
Headers | show |
Am 26.06.2013 um 11:24 hat Fam Zheng geschrieben: > When creating image with backing file, the driver tries to calculate the > relative path from created image file to backing file, but the path > computation is incorrect. e.g.: > > $ qemu-img create -f vmdk -b vmdk-data-disk.vmdk vmdk-data-snapshot1 > Formatting 'vmdk-data-snapshot1', fmt=vmdk size=10737418240 > backing_file='vmdk-data-disk.vmdk' compat6=off zeroed_grain=off > > $ qemu-img info vmdk-data-snapshot1 > image: vmdk-data-snapshot1 > file format: vmdk > virtual size: 10G (10737418240 bytes) > disk size: 12K > -> backing file: disk.vmdk > > The common part in file names, "vmdk-data-", is incorrectly forgotten by > relative_path(). As the VMDK specification has no restriction on > parentNameHint to be relative path, we simply remove this by using the > backing_file option. > > Signed-off-by: Fam Zheng <famz@redhat.com> Nice one. Thanks, applied to the block branch. Kevin
Il 26/06/2013 17:05, Kevin Wolf ha scritto: > Am 26.06.2013 um 11:24 hat Fam Zheng geschrieben: >> > When creating image with backing file, the driver tries to calculate the >> > relative path from created image file to backing file, but the path >> > computation is incorrect. e.g.: >> > >> > $ qemu-img create -f vmdk -b vmdk-data-disk.vmdk vmdk-data-snapshot1 >> > Formatting 'vmdk-data-snapshot1', fmt=vmdk size=10737418240 >> > backing_file='vmdk-data-disk.vmdk' compat6=off zeroed_grain=off >> > >> > $ qemu-img info vmdk-data-snapshot1 >> > image: vmdk-data-snapshot1 >> > file format: vmdk >> > virtual size: 10G (10737418240 bytes) >> > disk size: 12K >> > -> backing file: disk.vmdk >> > >> > The common part in file names, "vmdk-data-", is incorrectly forgotten by >> > relative_path(). As the VMDK specification has no restriction on >> > parentNameHint to be relative path, we simply remove this by using the >> > backing_file option. >> > >> > Signed-off-by: Fam Zheng <famz@redhat.com> > Nice one. Thanks, applied to the block branch. Cc: qemu-stable@nongnu.org
Am 27.06.2013 um 09:09 hat Paolo Bonzini geschrieben: > Il 26/06/2013 17:05, Kevin Wolf ha scritto: > > Am 26.06.2013 um 11:24 hat Fam Zheng geschrieben: > >> > When creating image with backing file, the driver tries to calculate the > >> > relative path from created image file to backing file, but the path > >> > computation is incorrect. e.g.: > >> > > >> > $ qemu-img create -f vmdk -b vmdk-data-disk.vmdk vmdk-data-snapshot1 > >> > Formatting 'vmdk-data-snapshot1', fmt=vmdk size=10737418240 > >> > backing_file='vmdk-data-disk.vmdk' compat6=off zeroed_grain=off > >> > > >> > $ qemu-img info vmdk-data-snapshot1 > >> > image: vmdk-data-snapshot1 > >> > file format: vmdk > >> > virtual size: 10G (10737418240 bytes) > >> > disk size: 12K > >> > -> backing file: disk.vmdk > >> > > >> > The common part in file names, "vmdk-data-", is incorrectly forgotten by > >> > relative_path(). As the VMDK specification has no restriction on > >> > parentNameHint to be relative path, we simply remove this by using the > >> > backing_file option. > >> > > >> > Signed-off-by: Fam Zheng <famz@redhat.com> > > Nice one. Thanks, applied to the block branch. > > Cc: qemu-stable@nongnu.org Yeah, why not. I've added it to the commit message now. Kevin
diff --git a/block/vmdk.c b/block/vmdk.c index 975e1d4..a28fb5e 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1487,45 +1487,6 @@ static int filename_decompose(const char *filename, char *path, char *prefix, return VMDK_OK; } -static int relative_path(char *dest, int dest_size, - const char *base, const char *target) -{ - int i = 0; - int n = 0; - const char *p, *q; -#ifdef _WIN32 - const char *sep = "\\"; -#else - const char *sep = "/"; -#endif - - if (!(dest && base && target)) { - return VMDK_ERROR; - } - if (path_is_absolute(target)) { - pstrcpy(dest, dest_size, target); - return VMDK_OK; - } - while (base[i] == target[i]) { - i++; - } - p = &base[i]; - q = &target[i]; - while (*p) { - if (*p == *sep) { - n++; - } - p++; - } - dest[0] = '\0'; - for (; n; n--) { - pstrcat(dest, dest_size, ".."); - pstrcat(dest, dest_size, sep); - } - pstrcat(dest, dest_size, q); - return VMDK_OK; -} - static int vmdk_create(const char *filename, QEMUOptionParameter *options) { int fd, idx = 0; @@ -1625,7 +1586,6 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options) return -ENOTSUP; } if (backing_file) { - char parent_filename[PATH_MAX]; BlockDriverState *bs = bdrv_new(""); ret = bdrv_open(bs, backing_file, NULL, 0, NULL); if (ret != 0) { @@ -1638,10 +1598,8 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options) } parent_cid = vmdk_read_cid(bs, 0); bdrv_delete(bs); - relative_path(parent_filename, sizeof(parent_filename), - filename, backing_file); snprintf(parent_desc_line, sizeof(parent_desc_line), - "parentFileNameHint=\"%s\"", parent_filename); + "parentFileNameHint=\"%s\"", backing_file); } /* Create extents */
When creating image with backing file, the driver tries to calculate the relative path from created image file to backing file, but the path computation is incorrect. e.g.: $ qemu-img create -f vmdk -b vmdk-data-disk.vmdk vmdk-data-snapshot1 Formatting 'vmdk-data-snapshot1', fmt=vmdk size=10737418240 backing_file='vmdk-data-disk.vmdk' compat6=off zeroed_grain=off $ qemu-img info vmdk-data-snapshot1 image: vmdk-data-snapshot1 file format: vmdk virtual size: 10G (10737418240 bytes) disk size: 12K -> backing file: disk.vmdk The common part in file names, "vmdk-data-", is incorrectly forgotten by relative_path(). As the VMDK specification has no restriction on parentNameHint to be relative path, we simply remove this by using the backing_file option. Signed-off-by: Fam Zheng <famz@redhat.com> --- block/vmdk.c | 44 +------------------------------------------- 1 file changed, 1 insertion(+), 43 deletions(-)