qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Partial fix for vvfat + -snapshot


From: Lorenzo Campedelli
Subject: [Qemu-devel] Partial fix for vvfat + -snapshot
Date: Sat, 10 Mar 2007 16:34:18 +0100
User-agent: Thunderbird 1.5.0.10 (X11/20070302)

Hi,

the attached patch is an attempt to fix support of
virtual FAT disk images when used with -snapshot
option.
This combination doesn't work anymore in 0.9.0,
and the reason seems to be that code in block.c
that handles -snapshot, completely disregards
the different "filename" format used for vvfat.

The patch only restores the -hdX fat:dirname
functionality, while additional options such
as :rw:, :floppy: :32: etc, still fail, as some
functions (e.g. path_combine() and path_is_absolute())
only support the "fat:" prefix.

I'm not sure the fix is correct (I doubt code in
block.c should know specific issues of different
drivers), but it works for my needs, and maybe
somebody else is interested.

The patch is agains 0.9.0.

Best Regards,
Lorenzo
--- qemu-0.9.0/block.c.orig     2007-03-10 12:53:27.000000000 +0100
+++ qemu-0.9.0/block.c  2007-03-10 16:22:51.000000000 +0100
@@ -331,6 +331,7 @@
 
     if (flags & BDRV_O_SNAPSHOT) {
         BlockDriverState *bs1;
+        BlockDriver *drv1; 
         int64_t total_size;
         
         /* if snapshot, we create a temporary backing file and open it
@@ -346,10 +347,22 @@
             return -1;
         }
         total_size = bdrv_getlength(bs1) >> SECTOR_BITS;
+        drv1 = bs1->drv;
         bdrv_delete(bs1);
         
         get_tmp_filename(tmp_filename, sizeof(tmp_filename));
-        realpath(filename, backing_filename);
+        /*
+         * for vvfat protocol the string "fat:<options>:" should remain
+         * the prefix of the filename even after realpath() call ...
+         */
+        if (drv1 == &bdrv_vvfat) {
+            int i = strrchr(filename, ':') - filename + 1;
+
+            strncpy(backing_filename, filename, i);
+            realpath(filename + i, backing_filename + i);
+        } else {
+            realpath(filename, backing_filename);
+        }
         if (bdrv_create(&bdrv_qcow2, tmp_filename, 
                         total_size, backing_filename, 0) < 0) {
             return -1;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]