|
|
|
|
|
|
|
|
|
|
xen-changelog
[Xen-changelog] [xen-unstable] blktap: Fix old QCow tapdisk image handli
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1272973099 -3600
# Node ID d6cf080505cda4944e923194bd24faacece668d4
# Parent 67303cccfb79206efd2975f9121807c95c05aa40
blktap: Fix old QCow tapdisk image handling
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.
From: Miroslav Rezanina <mrezanin@xxxxxxxxxx>
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
tools/blktap/drivers/block-qcow.c | 19 +++++++++----------
1 files changed, 9 insertions(+), 10 deletions(-)
diff -r 67303cccfb79 -r d6cf080505cd tools/blktap/drivers/block-qcow.c
--- a/tools/blktap/drivers/block-qcow.c Tue May 04 12:36:30 2010 +0100
+++ b/tools/blktap/drivers/block-qcow.c Tue May 04 12:38:19 2010 +0100
@@ -862,17 +862,23 @@ static int tdqcow_open (struct disk_driv
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
currently in memory. Then swap it back to native
endianess
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");
@@ -888,13 +894,6 @@ static int tdqcow_open (struct disk_driv
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 @@ static int tdqcow_open (struct disk_driv
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 @@ int qcow_create(const char *filename, ui
} else
flags = SPARSE_FILE;
+ flags |= EXTHDR_L1_BIG_ENDIAN;
exthdr.flags = cpu_to_be32(flags);
/* write all the data */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
<Prev in Thread] |
Current Thread |
[Next in Thread> |
- [Xen-changelog] [xen-unstable] blktap: Fix old QCow tapdisk image handling,
Xen patchbot-unstable <=
|
|
|
|
|