Revision 6377af48
b/block/qcow2-cluster.c | ||
---|---|---|
453 | 453 |
c = 1; |
454 | 454 |
*cluster_offset &= L2E_COMPRESSED_OFFSET_SIZE_MASK; |
455 | 455 |
break; |
456 |
case QCOW2_CLUSTER_ZERO: |
|
457 |
c = count_contiguous_clusters(nb_clusters, s->cluster_size, |
|
458 |
&l2_table[l2_index], 0, |
|
459 |
QCOW_OFLAG_COMPRESSED | QCOW_OFLAG_ZERO); |
|
460 |
*cluster_offset = 0; |
|
461 |
break; |
|
456 | 462 |
case QCOW2_CLUSTER_UNALLOCATED: |
457 | 463 |
/* how many empty clusters ? */ |
458 | 464 |
c = count_contiguous_free_clusters(nb_clusters, &l2_table[l2_index]); |
... | ... | |
461 | 467 |
case QCOW2_CLUSTER_NORMAL: |
462 | 468 |
/* how many allocated clusters ? */ |
463 | 469 |
c = count_contiguous_clusters(nb_clusters, s->cluster_size, |
464 |
&l2_table[l2_index], 0, QCOW_OFLAG_COMPRESSED); |
|
470 |
&l2_table[l2_index], 0, |
|
471 |
QCOW_OFLAG_COMPRESSED | QCOW_OFLAG_ZERO); |
|
465 | 472 |
*cluster_offset &= L2E_OFFSET_MASK; |
466 | 473 |
break; |
467 | 474 |
} |
... | ... | |
720 | 727 |
break; |
721 | 728 |
case QCOW2_CLUSTER_UNALLOCATED: |
722 | 729 |
case QCOW2_CLUSTER_COMPRESSED: |
730 |
case QCOW2_CLUSTER_ZERO: |
|
723 | 731 |
break; |
724 | 732 |
default: |
725 | 733 |
abort(); |
... | ... | |
868 | 876 |
&& (cluster_offset & QCOW_OFLAG_COPIED)) |
869 | 877 |
{ |
870 | 878 |
/* We keep all QCOW_OFLAG_COPIED clusters */ |
871 |
keep_clusters = count_contiguous_clusters(nb_clusters, s->cluster_size, |
|
872 |
&l2_table[l2_index], 0, |
|
873 |
QCOW_OFLAG_COPIED); |
|
879 |
keep_clusters = |
|
880 |
count_contiguous_clusters(nb_clusters, s->cluster_size, |
|
881 |
&l2_table[l2_index], 0, |
|
882 |
QCOW_OFLAG_COPIED | QCOW_OFLAG_ZERO); |
|
874 | 883 |
assert(keep_clusters <= nb_clusters); |
875 | 884 |
nb_clusters -= keep_clusters; |
876 | 885 |
} else { |
b/block/qcow2-refcount.c | ||
---|---|---|
703 | 703 |
nb_clusters << s->cluster_bits); |
704 | 704 |
break; |
705 | 705 |
case QCOW2_CLUSTER_UNALLOCATED: |
706 |
case QCOW2_CLUSTER_ZERO: |
|
706 | 707 |
break; |
707 | 708 |
default: |
708 | 709 |
abort(); |
... | ... | |
973 | 974 |
l2_entry & ~511, nb_csectors * 512); |
974 | 975 |
break; |
975 | 976 |
|
977 |
case QCOW2_CLUSTER_ZERO: |
|
978 |
if ((l2_entry & L2E_OFFSET_MASK) == 0) { |
|
979 |
break; |
|
980 |
} |
|
981 |
/* fall through */ |
|
982 |
|
|
976 | 983 |
case QCOW2_CLUSTER_NORMAL: |
977 | 984 |
{ |
978 | 985 |
/* QCOW_OFLAG_COPIED must be set iff refcount == 1 */ |
b/block/qcow2.c | ||
---|---|---|
536 | 536 |
} |
537 | 537 |
break; |
538 | 538 |
|
539 |
case QCOW2_CLUSTER_ZERO: |
|
540 |
if (s->qcow_version < 3) { |
|
541 |
ret = -EIO; |
|
542 |
goto fail; |
|
543 |
} |
|
544 |
qemu_iovec_memset(&hd_qiov, 0, 512 * cur_nr_sectors); |
|
545 |
break; |
|
546 |
|
|
539 | 547 |
case QCOW2_CLUSTER_COMPRESSED: |
540 | 548 |
/* add AIO support for compressed blocks ? */ |
541 | 549 |
ret = qcow2_decompress_cluster(bs, cluster_offset); |
b/block/qcow2.h | ||
---|---|---|
43 | 43 |
#define QCOW_OFLAG_COPIED (1LL << 63) |
44 | 44 |
/* indicate that the cluster is compressed (they never have the copied flag) */ |
45 | 45 |
#define QCOW_OFLAG_COMPRESSED (1LL << 62) |
46 |
/* The cluster reads as all zeros */ |
|
47 |
#define QCOW_OFLAG_ZERO (1LL << 0) |
|
46 | 48 |
|
47 | 49 |
#define REFCOUNT_SHIFT 1 /* refcount size is 2 bytes */ |
48 | 50 |
|
... | ... | |
184 | 186 |
QCOW2_CLUSTER_UNALLOCATED, |
185 | 187 |
QCOW2_CLUSTER_NORMAL, |
186 | 188 |
QCOW2_CLUSTER_COMPRESSED, |
189 |
QCOW2_CLUSTER_ZERO |
|
187 | 190 |
}; |
188 | 191 |
|
189 | 192 |
#define L1E_OFFSET_MASK 0x00ffffffffffff00ULL |
... | ... | |
213 | 216 |
{ |
214 | 217 |
if (l2_entry & QCOW_OFLAG_COMPRESSED) { |
215 | 218 |
return QCOW2_CLUSTER_COMPRESSED; |
219 |
} else if (l2_entry & QCOW_OFLAG_ZERO) { |
|
220 |
return QCOW2_CLUSTER_ZERO; |
|
216 | 221 |
} else if (!(l2_entry & L2E_OFFSET_MASK)) { |
217 | 222 |
return QCOW2_CLUSTER_UNALLOCATED; |
218 | 223 |
} else { |
Also available in: Unified diff