Commit 7f48fa1f05b0db5583fd191aee60f7b4fb7ffda9

Authored by aliguori
1 parent 062e5527

qcow1: Fix compressed images (Kevin Wolf)

Revert r4673, the removed dead code wasn't dead in fact.

Additionally, change the misleading else which tricks the reader into
believing that allocate is a boolean to else if (allocate == 2).

Signed-off-by: Kevin Wolf <kwolf@suse.de>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>



git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6244 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 25 additions and 20 deletions
block-qcow.c
@@ -339,28 +339,33 @@ static uint64_t get_cluster_offset(BlockDriverState *bs, @@ -339,28 +339,33 @@ static uint64_t get_cluster_offset(BlockDriverState *bs,
339 return -1; 339 return -1;
340 } else { 340 } else {
341 cluster_offset = bdrv_getlength(s->hd); 341 cluster_offset = bdrv_getlength(s->hd);
342 - /* round to cluster size */  
343 - cluster_offset = (cluster_offset + s->cluster_size - 1) &  
344 - ~(s->cluster_size - 1);  
345 - bdrv_truncate(s->hd, cluster_offset + s->cluster_size);  
346 - /* if encrypted, we must initialize the cluster  
347 - content which won't be written */  
348 - if (s->crypt_method &&  
349 - (n_end - n_start) < s->cluster_sectors) {  
350 - uint64_t start_sect;  
351 - start_sect = (offset & ~(s->cluster_size - 1)) >> 9;  
352 - memset(s->cluster_data + 512, 0x00, 512);  
353 - for(i = 0; i < s->cluster_sectors; i++) {  
354 - if (i < n_start || i >= n_end) {  
355 - encrypt_sectors(s, start_sect + i,  
356 - s->cluster_data,  
357 - s->cluster_data + 512, 1, 1,  
358 - &s->aes_encrypt_key);  
359 - if (bdrv_pwrite(s->hd, cluster_offset + i * 512,  
360 - s->cluster_data, 512) != 512)  
361 - return -1; 342 + if (allocate == 1) {
  343 + /* round to cluster size */
  344 + cluster_offset = (cluster_offset + s->cluster_size - 1) &
  345 + ~(s->cluster_size - 1);
  346 + bdrv_truncate(s->hd, cluster_offset + s->cluster_size);
  347 + /* if encrypted, we must initialize the cluster
  348 + content which won't be written */
  349 + if (s->crypt_method &&
  350 + (n_end - n_start) < s->cluster_sectors) {
  351 + uint64_t start_sect;
  352 + start_sect = (offset & ~(s->cluster_size - 1)) >> 9;
  353 + memset(s->cluster_data + 512, 0x00, 512);
  354 + for(i = 0; i < s->cluster_sectors; i++) {
  355 + if (i < n_start || i >= n_end) {
  356 + encrypt_sectors(s, start_sect + i,
  357 + s->cluster_data,
  358 + s->cluster_data + 512, 1, 1,
  359 + &s->aes_encrypt_key);
  360 + if (bdrv_pwrite(s->hd, cluster_offset + i * 512,
  361 + s->cluster_data, 512) != 512)
  362 + return -1;
  363 + }
362 } 364 }
363 } 365 }
  366 + } else if (allocate == 2) {
  367 + cluster_offset |= QCOW_OFLAG_COMPRESSED |
  368 + (uint64_t)compressed_size << (63 - s->cluster_bits);
364 } 369 }
365 } 370 }
366 /* update L2 table */ 371 /* update L2 table */