Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 3160499aacb81f6735941eb4c372d87a > files > 180

kvm-83-164.el5_5.30.src.rpm

From 71e91af82caff1df4562243f6dda0c2eda12fda3 Mon Sep 17 00:00:00 2001
From: Uri Lublin <uril@redhat.com>
Date: Mon, 30 Mar 2009 23:15:41 +0300
Subject: [PATCH 01/12] Revert "Introducing qcow2 extensions + keep backing file format"

This reverts commit 3580d3070b8bc67dea242cf9d9a1ae3a94277a07.

A newer version was committed upstream (Qemu), to be applied
instead of this one.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Bugzilla: 489964
RH-Upstream-status: not-applicable
Acked-by: Eduardo Habkost <ehabkost@redhat.com>
Acked-by: Dor Laor <dlaor@redhat.com>
---
 qemu/block-qcow2.c |  108 +---------------------------------------------------
 qemu/block.c       |   29 ++------------
 qemu/block.h       |    4 --
 qemu/block_int.h   |    6 ---
 4 files changed, 6 insertions(+), 141 deletions(-)

diff --git a/qemu/block-qcow2.c b/qemu/block-qcow2.c
index 41264f5..b58203c 100644
--- a/qemu/block-qcow2.c
+++ b/qemu/block-qcow2.c
@@ -45,7 +45,6 @@
 
 //#define DEBUG_ALLOC
 //#define DEBUG_ALLOC2
-//#define DEBUG_EXT
 
 #define QCOW_MAGIC (('Q' << 24) | ('F' << 16) | ('I' << 8) | 0xfb)
 #define QCOW_VERSION 2
@@ -78,14 +77,6 @@ typedef struct QCowHeader {
     uint64_t snapshots_offset;
 } QCowHeader;
 
-
-typedef struct {
-    uint32_t magic;
-    uint32_t len;
-} QCowExtension;
-#define  QCOW_EXT_MAGIC_END 0
-#define  QCOW_EXT_MAGIC_BACKING_FORMAT 0xE2792ACA
-
 typedef struct __attribute__((packed)) QCowSnapshotHeader {
     /* header is 8 byte aligned */
     uint64_t l1_table_offset;
@@ -198,66 +189,6 @@ static int qcow_probe(const uint8_t *buf, int buf_size, const char *filename)
         return 0;
 }
 
-
-/* read qcow2 extension and fill bs
- * start reading from start_offset
- * finish reading upon magic of value 0 or when end_offset reached
- * unknown magic is skipped (future extension this version knows nothing about)
- * return 0 upon success, non-0 otherwise
- */
-static int qcow_read_extensions(BlockDriverState *bs, uint64_t start_offset,
-                                uint64_t end_offset)
-{
-    BDRVQcowState *s = bs->opaque;
-    QCowExtension ext;
-    uint64_t offset;
-
-#ifdef DEBUG_EXT
-    printf("qcow_read_extensions: start=%ld end=%ld\n", start_offset, end_offset);
-#endif
-    offset = start_offset;
-    while (offset < end_offset) {
-
-#ifdef DEBUG_EXT
-        /* Sanity check */
-        if (offset >= s->cluster_size)
-            printf("qcow_handle_extension: suspicious offset %lu\n", offset);
-
-        printf("attemting to read extended header in offset %lu\n", offset);
-#endif
-
-        if (bdrv_pread(s->hd, offset, &ext, sizeof(ext)) != sizeof(ext)) {
-            fprintf(stderr, "qcow_handle_extension: ERROR: pread fail from offset %lu\n",
-                    offset);
-            return 1;
-        }
-        be32_to_cpus(&ext.magic);
-        be32_to_cpus(&ext.len);
-        offset += sizeof(ext);
-        switch (ext.magic) {
-        case QCOW_EXT_MAGIC_END:
-            break;
-        case QCOW_EXT_MAGIC_BACKING_FORMAT:
-            if (ext.len >= sizeof(bs->backing_format)) {
-                fprintf(stderr, "ERROR: ext_backing_format: len=%u too large"
-                        " (>=%lu)\n",
-                        ext.len, sizeof(bs->backing_format));
-                return 2;
-            }
-            if (bdrv_pread(s->hd, offset , bs->backing_format,
-                           ext.len) != ext.len)
-                return 3;
-            bs->backing_format[ext.len] = '\0';
-#ifdef DEBUG_EXT
-            printf("Qcow2: Got format extension %s\n", bs->backing_format);
-#endif
-            offset += ((ext.len + 7) & ~7);
-        }
-    }
-
-    return 0;
-}
-
 static int qcow_open(BlockDriverState *bs, const char *filename, int flags)
 {
     BDRVQcowState *s = bs->opaque;
@@ -355,10 +286,6 @@ static int qcow_open(BlockDriverState *bs, const char *filename, int flags)
 
     scan_refcount(bs, &s->highest_alloc, &s->nc_free);
 
-    /* read qcow2 extensions */
-    if (qcow_read_extensions(bs, sizeof(header), header.backing_file_offset))
-        goto fail;
-
     /* read the backing file name */
     if (header.backing_file_offset != 0) {
         len = header.backing_file_size;
@@ -1561,17 +1488,13 @@ static void create_refcount_update(QCowCreateState *s,
     }
 }
 
-static int qcow_create2(const char *filename, int64_t total_size,
-                        const char *backing_file, const char *backing_format,
-                        int flags)
+static int qcow_create(const char *filename, int64_t total_size,
+                      const char *backing_file, int flags)
 {
     int fd, header_size, backing_filename_len, l1_size, i, shift, l2_bits;
-    int backing_format_len = 0;
     QCowHeader header;
     uint64_t tmp, offset;
     QCowCreateState s1, *s = &s1;
-    QCowExtension ext = {0, 0};
-
 
     memset(s, 0, sizeof(*s));
 
@@ -1585,12 +1508,6 @@ static int qcow_create2(const char *filename, int64_t total_size,
     header_size = sizeof(header);
     backing_filename_len = 0;
     if (backing_file) {
-        if (backing_format) {
-            ext.magic = QCOW_EXT_MAGIC_BACKING_FORMAT;
-            backing_format_len = strlen(backing_format);
-            ext.len = (backing_format_len + 7) & ~7;
-            header_size += ((sizeof(ext) + ext.len + 7) & ~7);
-        }
         header.backing_file_offset = cpu_to_be64(header_size);
         backing_filename_len = strlen(backing_file);
         header.backing_file_size = cpu_to_be32(backing_filename_len);
@@ -1639,19 +1556,6 @@ static int qcow_create2(const char *filename, int64_t total_size,
     /* write all the data */
     write(fd, &header, sizeof(header));
     if (backing_file) {
-        if (backing_format_len) {
-            char zero[16];
-            int d = ext.len - backing_format_len;
-
-            memset(zero, 0, sizeof(zero));
-            cpu_to_be32s(&ext.magic);
-            cpu_to_be32s(&ext.len);
-            write(fd, &ext, sizeof(ext));
-            write(fd, backing_format, backing_format_len);
-            if (d>0) {
-                write(fd, zero, d);
-            }
-        }
         write(fd, backing_file, backing_filename_len);
     }
     lseek(fd, s->l1_table_offset, SEEK_SET);
@@ -1676,12 +1580,6 @@ static int qcow_create2(const char *filename, int64_t total_size,
     return -ENOMEM;
 }
 
-static int qcow_create(const char *filename, int64_t total_size,
-                       const char *backing_file, int flags)
-{
-    return qcow_create2(filename, total_size, backing_file, NULL, flags);
-}
-
 static int qcow_make_empty(BlockDriverState *bs)
 {
 #if 0
@@ -2831,6 +2729,4 @@ BlockDriver bdrv_qcow2 = {
     .bdrv_snapshot_delete = qcow_snapshot_delete,
     .bdrv_snapshot_list = qcow_snapshot_list,
     .bdrv_get_info = qcow_get_info,
-
-    .bdrv_create2 = qcow_create2,
 };
diff --git a/qemu/block.c b/qemu/block.c
index 2709bdc..05cd742 100644
--- a/qemu/block.c
+++ b/qemu/block.c
@@ -229,20 +229,6 @@ BlockDriver *bdrv_find_format(const char *format_name)
     return NULL;
 }
 
-int bdrv_create2(BlockDriver *drv,
-                const char *filename, int64_t size_in_sectors,
-                const char *backing_file, const char *backing_format,
-                int flags)
-{
-    if (drv->bdrv_create2)
-        return drv->bdrv_create2(filename, size_in_sectors, backing_file,
-                                 backing_format, flags);
-    if (drv->bdrv_create)
-        return drv->bdrv_create(filename, size_in_sectors, backing_file,
-                                flags);
-    return -ENOTSUP;
-}
-
 int bdrv_create(BlockDriver *drv,
                 const char *filename, int64_t size_in_sectors,
                 const char *backing_file, int flags)
@@ -426,7 +412,7 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
         if (!bs1) {
             return -ENOMEM;
         }
-        if (bdrv_open2(bs1, filename, 0, drv) < 0) {
+        if (bdrv_open(bs1, filename, 0) < 0) {
             bdrv_delete(bs1);
             return -1;
         }
@@ -446,14 +432,11 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
         else
             realpath(filename, backing_filename);
 
-        if (bdrv_create2(&bdrv_qcow2, tmp_filename,
-                         total_size, backing_filename,
-                         (drv ? drv->format_name : NULL),
-                         0) < 0) {
+        if (bdrv_create(&bdrv_qcow2, tmp_filename,
+                        total_size, backing_filename, 0) < 0) {
             return -1;
         }
         filename = tmp_filename;
-        drv = &bdrv_qcow2;
         bs->is_temporary = 1;
     }
 
@@ -501,7 +484,6 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
 #endif
     if (bs->backing_file[0] != '\0') {
         /* if there is a backing file, use it */
-        BlockDriver *back_drv = NULL;
         bs->backing_hd = bdrv_new("");
         if (!bs->backing_hd) {
         fail:
@@ -510,10 +492,7 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
         }
         path_combine(backing_filename, sizeof(backing_filename),
                      filename, bs->backing_file);
-        if (bs->backing_format)
-            back_drv = bdrv_find_format(bs->backing_format);
-        if (bdrv_open2(bs->backing_hd, backing_filename, open_flags,
-                       back_drv) < 0)
+        if (bdrv_open(bs->backing_hd, backing_filename, open_flags) < 0)
             goto fail;
     }
 
diff --git a/qemu/block.h b/qemu/block.h
index 318f81c..1390693 100644
--- a/qemu/block.h
+++ b/qemu/block.h
@@ -64,10 +64,6 @@ BlockDriver *bdrv_find_format(const char *format_name);
 int bdrv_create(BlockDriver *drv,
                 const char *filename, int64_t size_in_sectors,
                 const char *backing_file, int flags);
-int bdrv_create2(BlockDriver *drv,
-                 const char *filename, int64_t size_in_sectors,
-                 const char *backing_file, const char *backing_format,
-                 int flags);
 BlockDriverState *bdrv_new(const char *device_name);
 void bdrv_delete(BlockDriverState *bs);
 int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags);
diff --git a/qemu/block_int.h b/qemu/block_int.h
index 50b57ab..139397e 100644
--- a/qemu/block_int.h
+++ b/qemu/block_int.h
@@ -85,11 +85,6 @@ struct BlockDriver {
     /* to control generic scsi devices */
     int (*bdrv_ioctl)(BlockDriverState *bs, unsigned long int req, void *buf);
 
-    /* new create with backing file format */
-    int (*bdrv_create2)(const char *filename, int64_t total_sectors,
-                        const char *backing_file, const char *backing_format,
-                        int flags);
-
     BlockDriverAIOCB *free_aiocb;
     struct BlockDriver *next;
 };
@@ -113,7 +108,6 @@ struct BlockDriverState {
     char filename[1024];
     char backing_file[1024]; /* if non zero, the image is a diff of
                                 this file image */
-    char backing_format[16]; /* if non-zero and backing_file exists */
     int is_temporary;
     int media_changed;
 
-- 
1.6.1