qcow2-refcount: rename inc_refcounts() and make it public

This is needed for the following patch, which will introduce refcounts
checking for qcow2 bitmaps.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Message-id: 20170628120530.31251-8-vsementsov@virtuozzo.com
[mreitz: s/inc_refcounts/qcow2_inc_refcounts_imrt/ in one more (new)
         place]
Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
Vladimir Sementsov-Ogievskiy 2017-06-28 15:05:07 +03:00 committed by Max Reitz
parent 6bdc8b719a
commit 8a5bb1f114
2 changed files with 35 additions and 28 deletions

View File

@ -1323,11 +1323,10 @@ static int realloc_refcount_array(BDRVQcow2State *s, void **array,
* *
* Modifies the number of errors in res. * Modifies the number of errors in res.
*/ */
static int inc_refcounts(BlockDriverState *bs, int qcow2_inc_refcounts_imrt(BlockDriverState *bs, BdrvCheckResult *res,
BdrvCheckResult *res, void **refcount_table,
void **refcount_table, int64_t *refcount_table_size,
int64_t *refcount_table_size, int64_t offset, int64_t size)
int64_t offset, int64_t size)
{ {
BDRVQcow2State *s = bs->opaque; BDRVQcow2State *s = bs->opaque;
uint64_t start, last, cluster_offset, k, refcount; uint64_t start, last, cluster_offset, k, refcount;
@ -1420,8 +1419,9 @@ static int check_refcounts_l2(BlockDriverState *bs, BdrvCheckResult *res,
nb_csectors = ((l2_entry >> s->csize_shift) & nb_csectors = ((l2_entry >> s->csize_shift) &
s->csize_mask) + 1; s->csize_mask) + 1;
l2_entry &= s->cluster_offset_mask; l2_entry &= s->cluster_offset_mask;
ret = inc_refcounts(bs, res, refcount_table, refcount_table_size, ret = qcow2_inc_refcounts_imrt(bs, res,
l2_entry & ~511, nb_csectors * 512); refcount_table, refcount_table_size,
l2_entry & ~511, nb_csectors * 512);
if (ret < 0) { if (ret < 0) {
goto fail; goto fail;
} }
@ -1454,8 +1454,9 @@ static int check_refcounts_l2(BlockDriverState *bs, BdrvCheckResult *res,
} }
/* Mark cluster as used */ /* Mark cluster as used */
ret = inc_refcounts(bs, res, refcount_table, refcount_table_size, ret = qcow2_inc_refcounts_imrt(bs, res,
offset, s->cluster_size); refcount_table, refcount_table_size,
offset, s->cluster_size);
if (ret < 0) { if (ret < 0) {
goto fail; goto fail;
} }
@ -1508,8 +1509,8 @@ static int check_refcounts_l1(BlockDriverState *bs,
l1_size2 = l1_size * sizeof(uint64_t); l1_size2 = l1_size * sizeof(uint64_t);
/* Mark L1 table as used */ /* Mark L1 table as used */
ret = inc_refcounts(bs, res, refcount_table, refcount_table_size, ret = qcow2_inc_refcounts_imrt(bs, res, refcount_table, refcount_table_size,
l1_table_offset, l1_size2); l1_table_offset, l1_size2);
if (ret < 0) { if (ret < 0) {
goto fail; goto fail;
} }
@ -1538,8 +1539,9 @@ static int check_refcounts_l1(BlockDriverState *bs,
if (l2_offset) { if (l2_offset) {
/* Mark L2 table as used */ /* Mark L2 table as used */
l2_offset &= L1E_OFFSET_MASK; l2_offset &= L1E_OFFSET_MASK;
ret = inc_refcounts(bs, res, refcount_table, refcount_table_size, ret = qcow2_inc_refcounts_imrt(bs, res,
l2_offset, s->cluster_size); refcount_table, refcount_table_size,
l2_offset, s->cluster_size);
if (ret < 0) { if (ret < 0) {
goto fail; goto fail;
} }
@ -1757,14 +1759,15 @@ static int check_refblocks(BlockDriverState *bs, BdrvCheckResult *res,
} }
res->corruptions_fixed++; res->corruptions_fixed++;
ret = inc_refcounts(bs, res, refcount_table, nb_clusters, ret = qcow2_inc_refcounts_imrt(bs, res,
offset, s->cluster_size); refcount_table, nb_clusters,
offset, s->cluster_size);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} }
/* No need to check whether the refcount is now greater than 1: /* No need to check whether the refcount is now greater than 1:
* This area was just allocated and zeroed, so it can only be * This area was just allocated and zeroed, so it can only be
* exactly 1 after inc_refcounts() */ * exactly 1 after qcow2_inc_refcounts_imrt() */
continue; continue;
resize_fail: resize_fail:
@ -1779,8 +1782,8 @@ resize_fail:
} }
if (offset != 0) { if (offset != 0) {
ret = inc_refcounts(bs, res, refcount_table, nb_clusters, ret = qcow2_inc_refcounts_imrt(bs, res, refcount_table, nb_clusters,
offset, s->cluster_size); offset, s->cluster_size);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} }
@ -1820,8 +1823,8 @@ static int calculate_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
} }
/* header */ /* header */
ret = inc_refcounts(bs, res, refcount_table, nb_clusters, ret = qcow2_inc_refcounts_imrt(bs, res, refcount_table, nb_clusters,
0, s->cluster_size); 0, s->cluster_size);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} }
@ -1842,25 +1845,25 @@ static int calculate_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
return ret; return ret;
} }
} }
ret = inc_refcounts(bs, res, refcount_table, nb_clusters, ret = qcow2_inc_refcounts_imrt(bs, res, refcount_table, nb_clusters,
s->snapshots_offset, s->snapshots_size); s->snapshots_offset, s->snapshots_size);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} }
/* refcount data */ /* refcount data */
ret = inc_refcounts(bs, res, refcount_table, nb_clusters, ret = qcow2_inc_refcounts_imrt(bs, res, refcount_table, nb_clusters,
s->refcount_table_offset, s->refcount_table_offset,
s->refcount_table_size * sizeof(uint64_t)); s->refcount_table_size * sizeof(uint64_t));
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} }
/* encryption */ /* encryption */
if (s->crypto_header.length) { if (s->crypto_header.length) {
ret = inc_refcounts(bs, res, refcount_table, nb_clusters, ret = qcow2_inc_refcounts_imrt(bs, res, refcount_table, nb_clusters,
s->crypto_header.offset, s->crypto_header.offset,
s->crypto_header.length); s->crypto_header.length);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} }

View File

@ -544,6 +544,10 @@ int qcow2_check_metadata_overlap(BlockDriverState *bs, int ign, int64_t offset,
int64_t size); int64_t size);
int qcow2_pre_write_overlap_check(BlockDriverState *bs, int ign, int64_t offset, int qcow2_pre_write_overlap_check(BlockDriverState *bs, int ign, int64_t offset,
int64_t size); int64_t size);
int qcow2_inc_refcounts_imrt(BlockDriverState *bs, BdrvCheckResult *res,
void **refcount_table,
int64_t *refcount_table_size,
int64_t offset, int64_t size);
int qcow2_change_refcount_order(BlockDriverState *bs, int refcount_order, int qcow2_change_refcount_order(BlockDriverState *bs, int refcount_order,
BlockDriverAmendStatusCB *status_cb, BlockDriverAmendStatusCB *status_cb,