Commit ab5ccbd65de369d34f7bf2996530876790efef43
1 parent
181a29c5
Fix compressed qcow2 (Gleb Natapov)
Correctly calculate number of contiguous clusters. Acked-by: Kevin Wolf <kwolf@suse.de> Signed-off-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6212 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
9 additions
and
6 deletions
block-qcow2.c
| ... | ... | @@ -620,6 +620,9 @@ static int count_contiguous_clusters(uint64_t nb_clusters, int cluster_size, |
| 620 | 620 | int i; |
| 621 | 621 | uint64_t offset = be64_to_cpu(l2_table[0]) & ~mask; |
| 622 | 622 | |
| 623 | + if (!offset) | |
| 624 | + return 0; | |
| 625 | + | |
| 623 | 626 | for (i = 0; i < nb_clusters; i++) |
| 624 | 627 | if (offset + i * cluster_size != (be64_to_cpu(l2_table[i]) & ~mask)) |
| 625 | 628 | break; |
| ... | ... | @@ -981,6 +984,12 @@ static uint64_t alloc_cluster_offset(BlockDriverState *bs, |
| 981 | 984 | /* how many available clusters ? */ |
| 982 | 985 | |
| 983 | 986 | while (i < nb_clusters) { |
| 987 | + i += count_contiguous_clusters(nb_clusters - i, s->cluster_size, | |
| 988 | + &l2_table[l2_index + i], 0); | |
| 989 | + | |
| 990 | + if(be64_to_cpu(l2_table[l2_index + i])) | |
| 991 | + break; | |
| 992 | + | |
| 984 | 993 | i += count_contiguous_free_clusters(nb_clusters - i, |
| 985 | 994 | &l2_table[l2_index + i]); |
| 986 | 995 | |
| ... | ... | @@ -989,12 +998,6 @@ static uint64_t alloc_cluster_offset(BlockDriverState *bs, |
| 989 | 998 | if ((cluster_offset & QCOW_OFLAG_COPIED) || |
| 990 | 999 | (cluster_offset & QCOW_OFLAG_COMPRESSED)) |
| 991 | 1000 | break; |
| 992 | - | |
| 993 | - i += count_contiguous_clusters(nb_clusters - i, s->cluster_size, | |
| 994 | - &l2_table[l2_index + i], 0); | |
| 995 | - | |
| 996 | - if(be64_to_cpu(l2_table[l2_index + i])) | |
| 997 | - break; | |
| 998 | 1001 | } |
| 999 | 1002 | nb_clusters = i; |
| 1000 | 1003 | ... | ... |