Index: block-qcow.c
===================================================================
RCS file: /sources/qemu/qemu/block-qcow.c,v
retrieving revision 1.8
diff -u -1 -0 -r1.8 block-qcow.c
--- block-qcow.c	1 Aug 2006 16:21:11 -0000	1.8
+++ block-qcow.c	2 Aug 2006 12:48:48 -0000
@@ -480,47 +480,77 @@
             }
         }
         nb_sectors -= n;
         sector_num += n;
         buf += n * 512;
     }
     return 0;
 }
 #endif
 
+static int is_not_zero(const uint8_t *data, int len)
+{
+    int left;
+    while (len && (((unsigned int) data) & 3) != 0) {
+        if (*data++)
+            return 1;
+        --len;
+    }
+    left = len & 3;
+    len >>= 2;
+    while (len) {
+        if (*((uint32_t *)data) != 0)
+            return 1;
+        data += 4;
+        --len;
+    }
+    while (left) {
+        if (*data++)
+            return 1;
+        --left;
+    }
+    return 0;
+}
+
 static int qcow_write(BlockDriverState *bs, int64_t sector_num, 
                      const uint8_t *buf, int nb_sectors)
 {
     BDRVQcowState *s = bs->opaque;
     int ret, index_in_cluster, n;
     uint64_t cluster_offset;
+    int not_zero;
     
     while (nb_sectors > 0) {
         index_in_cluster = sector_num & (s->cluster_sectors - 1);
         n = s->cluster_sectors - index_in_cluster;
         if (n > nb_sectors)
             n = nb_sectors;
-        cluster_offset = get_cluster_offset(bs, sector_num << 9, 1, 0, 
+        not_zero = is_not_zero(buf, n * 512);
+        cluster_offset = get_cluster_offset(bs, sector_num << 9, not_zero, 0, 
                                             index_in_cluster, 
                                             index_in_cluster + n);
-        if (!cluster_offset)
-            return -1;
+        if (!cluster_offset) {
+            if (not_zero)
+                return -1;
+            goto next_cluster;
+        }
         if (s->crypt_method) {
             encrypt_sectors(s, sector_num, s->cluster_data, buf, n, 1,
                             &s->aes_encrypt_key);
             ret = bdrv_pwrite(s->hd, cluster_offset + index_in_cluster * 512, 
                               s->cluster_data, n * 512);
         } else {
             ret = bdrv_pwrite(s->hd, cluster_offset + index_in_cluster * 512, buf, n * 512);
         }
         if (ret != n * 512) 
             return -1;
+next_cluster:
         nb_sectors -= n;
         sector_num += n;
         buf += n * 512;
     }
     s->cluster_cache_offset = -1; /* disable compressed cache */
     return 0;
 }
 
 typedef struct {
     int64_t sector_num;
