WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] Fix old QCow tapdisk image handling

To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] Fix old QCow tapdisk image handling
From: Miroslav Rezanina <mrezanin@xxxxxxxxxx>
Date: Fri, 30 Apr 2010 05:07:49 -0400 (EDT)
Delivery-date: Fri, 30 Apr 2010 02:08:35 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <256268088.89581272618420775.JavaMail.root@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
When I tried to use QCow image, I found that only each second boot is 
successful. As I discovered, this is caused by wrong handling old qcow tapdisk 
images. Extended header flag is not stored correctly so the blktap tries to 
change endian fo L1 table on each startup.

Here is a fix for this problem:

--
diff -r 9a1d7caa2024 tools/blktap/drivers/block-qcow.c
--- a/tools/blktap/drivers/block-qcow.c Mon Apr 26 12:13:23 2010 +0100
+++ b/tools/blktap/drivers/block-qcow.c Fri Apr 30 11:00:41 2010 +0200
@@ -862,11 +862,12 @@
                be32_to_cpus(&exthdr->xmagic);
                if(exthdr->xmagic != XEN_MAGIC) 
                        goto end_xenhdr;
-    
+       
+               be32_to_cpus(&exthdr->flags);
                /* Try to detect old tapdisk images. They have to be fixed 
because 
                 * they don't use big endian but native endianess for the L1 
table */
                if ((exthdr->flags & EXTHDR_L1_BIG_ENDIAN) == 0) {
-
+                       QCowHeader_ext *tmphdr = (QCowHeader_ext *)(buf2 + 
sizeof(QCowHeader));
                        /* 
                           The image is broken. Fix it. The L1 table has 
already been 
                           byte-swapped, so we can write it to the image file 
as it is
@@ -874,6 +875,11 @@
                           for operation.
                         */
 
+                       /* Change ENDIAN flag and copy it to store buffer */
+                       exthdr->flags |= EXTHDR_L1_BIG_ENDIAN;
+                       tmphdr->flags = cpu_to_be32(exthdr->flags);
+
+
                        DPRINTF("qcow: Converting image to big endian L1 
table\n");
 
                        memcpy(buf2 + s->l1_table_offset, s->l1_table, 
l1_table_size);
@@ -888,13 +894,6 @@
                                cpu_to_be64s(&s->l1_table[i]);
                        }
 
-                       /* Write the big endian flag to the extended header */
-                       exthdr->flags |= EXTHDR_L1_BIG_ENDIAN;
-
-                       if (write(fd, buf, 512) != 512) {
-                               DPRINTF("qcow: Failed to write extended 
header\n");
-                               goto fail;
-                       }
                }
 
                /*Finally check the L1 table cksum*/
@@ -905,7 +904,6 @@
                        goto end_xenhdr;
                        
                be32_to_cpus(&exthdr->min_cluster_alloc);
-               be32_to_cpus(&exthdr->flags);
                s->sparse = (exthdr->flags & SPARSE_FILE);
                s->min_cluster_alloc = exthdr->min_cluster_alloc; 
        }
@@ -1263,6 +1261,7 @@
        } else
                flags = SPARSE_FILE;
 
+       flags |= EXTHDR_L1_BIG_ENDIAN;
        exthdr.flags = cpu_to_be32(flags);
        
        /* write all the data */
-- 
Miroslav Rezanina
Software Engineer - XEN Virtualization Team

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] Fix old QCow tapdisk image handling, Miroslav Rezanina <=