vmdk: remove wrong calculation of relative path
diff mbox

Message ID 1372238672-2614-1-git-send-email-famz@redhat.com
State New
Headers show

Commit Message

Fam Zheng June 26, 2013, 9:24 a.m. UTC
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(-)

Comments

Kevin Wolf June 26, 2013, 3:05 p.m. UTC | #1
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
Paolo Bonzini June 27, 2013, 7:09 a.m. UTC | #2
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
Kevin Wolf June 27, 2013, 7:55 a.m. UTC | #3
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

Patch
diff mbox

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 */