diff options
Diffstat (limited to 'tools/blktap')
-rw-r--r-- | tools/blktap/drivers/block-qcow.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/tools/blktap/drivers/block-qcow.c b/tools/blktap/drivers/block-qcow.c index 8027fcaca2..0e4e9cfe0a 100644 --- a/tools/blktap/drivers/block-qcow.c +++ b/tools/blktap/drivers/block-qcow.c @@ -862,11 +862,12 @@ static int tdqcow_open (struct disk_driver *dd, const char *name, td_flag_t flag 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 @@ static int tdqcow_open (struct disk_driver *dd, const char *name, td_flag_t flag 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 @@ static int tdqcow_open (struct disk_driver *dd, const char *name, td_flag_t flag 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_driver *dd, const char *name, td_flag_t flag 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, uint64_t total_size, } else flags = SPARSE_FILE; + flags |= EXTHDR_L1_BIG_ENDIAN; exthdr.flags = cpu_to_be32(flags); /* write all the data */ |