@@ -1177,11 +1177,11 @@ void qcow2_free_any_cluster(BlockDriverState *bs, uint64_t l2_entry,
1177
1177
switch (ctype ) {
1178
1178
case QCOW2_CLUSTER_COMPRESSED :
1179
1179
{
1180
- int64_t offset = ( l2_entry & s -> cluster_offset_mask )
1181
- & QCOW2_COMPRESSED_SECTOR_MASK ;
1182
- int size = QCOW2_COMPRESSED_SECTOR_SIZE *
1183
- ((( l2_entry >> s -> csize_shift ) & s -> csize_mask ) + 1 );
1184
- qcow2_free_clusters (bs , offset , size , type );
1180
+ uint64_t coffset ;
1181
+ int csize ;
1182
+
1183
+ qcow2_parse_compressed_l2_entry ( bs , l2_entry , & coffset , & csize );
1184
+ qcow2_free_clusters (bs , coffset , csize , type );
1185
1185
}
1186
1186
break ;
1187
1187
case QCOW2_CLUSTER_NORMAL :
@@ -1247,7 +1247,7 @@ int qcow2_update_snapshot_refcount(BlockDriverState *bs,
1247
1247
bool l1_allocated = false;
1248
1248
int64_t old_entry , old_l2_offset ;
1249
1249
unsigned slice , slice_size2 , n_slices ;
1250
- int i , j , l1_modified = 0 , nb_csectors ;
1250
+ int i , j , l1_modified = 0 ;
1251
1251
int ret ;
1252
1252
1253
1253
assert (addend >= -1 && addend <= 1 );
@@ -1318,14 +1318,14 @@ int qcow2_update_snapshot_refcount(BlockDriverState *bs,
1318
1318
1319
1319
switch (qcow2_get_cluster_type (bs , entry )) {
1320
1320
case QCOW2_CLUSTER_COMPRESSED :
1321
- nb_csectors = ((entry >> s -> csize_shift ) &
1322
- s -> csize_mask ) + 1 ;
1323
1321
if (addend != 0 ) {
1324
- uint64_t coffset = (entry & s -> cluster_offset_mask )
1325
- & QCOW2_COMPRESSED_SECTOR_MASK ;
1322
+ uint64_t coffset ;
1323
+ int csize ;
1324
+
1325
+ qcow2_parse_compressed_l2_entry (bs , entry ,
1326
+ & coffset , & csize );
1326
1327
ret = update_refcount (
1327
- bs , coffset ,
1328
- nb_csectors * QCOW2_COMPRESSED_SECTOR_SIZE ,
1328
+ bs , coffset , csize ,
1329
1329
abs (addend ), addend < 0 ,
1330
1330
QCOW2_DISCARD_SNAPSHOT );
1331
1331
if (ret < 0 ) {
@@ -1603,7 +1603,7 @@ static int check_refcounts_l2(BlockDriverState *bs, BdrvCheckResult *res,
1603
1603
BDRVQcow2State * s = bs -> opaque ;
1604
1604
uint64_t l2_entry ;
1605
1605
uint64_t next_contiguous_offset = 0 ;
1606
- int i , nb_csectors , ret ;
1606
+ int i , ret ;
1607
1607
size_t l2_size_bytes = s -> l2_size * l2_entry_size (s );
1608
1608
g_autofree uint64_t * l2_table = g_malloc (l2_size_bytes );
1609
1609
@@ -1617,6 +1617,8 @@ static int check_refcounts_l2(BlockDriverState *bs, BdrvCheckResult *res,
1617
1617
1618
1618
/* Do the actual checks */
1619
1619
for (i = 0 ; i < s -> l2_size ; i ++ ) {
1620
+ uint64_t coffset ;
1621
+ int csize ;
1620
1622
l2_entry = get_l2_entry (s , l2_table , i );
1621
1623
1622
1624
switch (qcow2_get_cluster_type (bs , l2_entry )) {
@@ -1638,13 +1640,9 @@ static int check_refcounts_l2(BlockDriverState *bs, BdrvCheckResult *res,
1638
1640
}
1639
1641
1640
1642
/* Mark cluster as used */
1641
- nb_csectors = ((l2_entry >> s -> csize_shift ) &
1642
- s -> csize_mask ) + 1 ;
1643
- l2_entry &= s -> cluster_offset_mask ;
1643
+ qcow2_parse_compressed_l2_entry (bs , l2_entry , & coffset , & csize );
1644
1644
ret = qcow2_inc_refcounts_imrt (
1645
- bs , res , refcount_table , refcount_table_size ,
1646
- l2_entry & QCOW2_COMPRESSED_SECTOR_MASK ,
1647
- nb_csectors * QCOW2_COMPRESSED_SECTOR_SIZE );
1645
+ bs , res , refcount_table , refcount_table_size , coffset , csize );
1648
1646
if (ret < 0 ) {
1649
1647
return ret ;
1650
1648
}
0 commit comments