Patchwork qemu-img: There is more than one host device driver

login
register
mail settings
Submitter Kevin Wolf
Date Nov. 30, 2009, 3:54 p.m.
Message ID <1259596455-14486-1-git-send-email-kwolf@redhat.com>
Download mbox | patch
Permalink /patch/39811/
State New
Headers show

Comments

Kevin Wolf - Nov. 30, 2009, 3:54 p.m.
I haven't heard yet of anyone using qemu-img to copy an image to a real floppy,
but it's a valid use case.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block/raw-posix.c |    4 ++++
 block_int.h       |    3 +++
 qemu-img.c        |    4 ++--
 3 files changed, 9 insertions(+), 2 deletions(-)

Patch

diff --git a/block/raw-posix.c b/block/raw-posix.c
index f558976..3763d0c 100644
--- a/block/raw-posix.c
+++ b/block/raw-posix.c
@@ -1014,6 +1014,7 @@  static BlockDriver bdrv_host_device = {
     .bdrv_close         = raw_close,
     .bdrv_create        = hdev_create,
     .create_options     = raw_create_options,
+    .no_zero_init       = 1,
     .bdrv_flush         = raw_flush,
 
     .bdrv_aio_readv	= raw_aio_readv,
@@ -1110,6 +1111,7 @@  static BlockDriver bdrv_host_floppy = {
     .bdrv_close         = raw_close,
     .bdrv_create        = hdev_create,
     .create_options     = raw_create_options,
+    .no_zero_init       = 1,
     .bdrv_flush         = raw_flush,
 
     .bdrv_aio_readv     = raw_aio_readv,
@@ -1192,6 +1194,7 @@  static BlockDriver bdrv_host_cdrom = {
     .bdrv_close         = raw_close,
     .bdrv_create        = hdev_create,
     .create_options     = raw_create_options,
+    .no_zero_init       = 1,
     .bdrv_flush         = raw_flush,
 
     .bdrv_aio_readv     = raw_aio_readv,
@@ -1313,6 +1316,7 @@  static BlockDriver bdrv_host_cdrom = {
     .bdrv_close         = raw_close,
     .bdrv_create        = hdev_create,
     .create_options     = raw_create_options,
+    .no_zero_init       = 1,
     .bdrv_flush         = raw_flush,
 
     .bdrv_aio_readv     = raw_aio_readv,
diff --git a/block_int.h b/block_int.h
index 7ebe926..a7ac1f6 100644
--- a/block_int.h
+++ b/block_int.h
@@ -117,6 +117,9 @@  struct BlockDriver {
     /* Returns number of errors in image, -errno for internal errors */
     int (*bdrv_check)(BlockDriverState* bs);
 
+    /* Set if newly created images are not guaranteed to contain only zeros */
+    int no_zero_init;
+
     struct BlockDriver *next;
 };
 
diff --git a/qemu-img.c b/qemu-img.c
index 972843a..f19c644 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -743,7 +743,7 @@  static int img_convert(int argc, char **argv)
             if (n > bs_offset + bs_sectors - sector_num)
                 n = bs_offset + bs_sectors - sector_num;
 
-            if (strcmp(drv->format_name, "host_device")) {
+            if (!drv->no_zero_init) {
                 /* If the output image is being created as a copy on write image,
                    assume that sectors which are unallocated in the input image
                    are present in both the output's and input's base images (no
@@ -776,7 +776,7 @@  static int img_convert(int argc, char **argv)
                    If the output is to a host device, we also write out
                    sectors that are entirely 0, since whatever data was
                    already there is garbage, not 0s. */
-                if (strcmp(drv->format_name, "host_device") == 0 || out_baseimg ||
+                if (drv->no_zero_init || out_baseimg ||
                     is_allocated_sectors(buf1, n, &n1)) {
                     if (bdrv_write(out_bs, sector_num, buf1, n1) < 0)
                         error("error while writing");