提交 8ed610a1 编写于 作者: F Fam Zheng 提交者: Kevin Wolf

vmdk: remove wrong calculation of relative path

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.

Cc: qemu-stable@nongnu.org
Signed-off-by: NFam Zheng <famz@redhat.com>
Signed-off-by: NKevin Wolf <kwolf@redhat.com>
上级 8ab6feec
......@@ -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 */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册