Skip to content

Commit

Permalink
qcow2: Pull check_refblocks() up
Browse files Browse the repository at this point in the history
Pull check_refblocks() before calculate_refcounts() so we can drop its
static declaration.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Benoît Canet <benoit.canet@nodalink.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
  • Loading branch information
XanClic authored and kevmw committed Oct 23, 2014
1 parent 78fb328 commit 057a3fe
Showing 1 changed file with 49 additions and 53 deletions.
102 changes: 49 additions & 53 deletions block/qcow2-refcount.c
Expand Up @@ -1535,59 +1535,6 @@ static int64_t realloc_refcount_block(BlockDriverState *bs, int reftable_index,
return new_offset;
}

static int check_refblocks(BlockDriverState *bs, BdrvCheckResult *res,
BdrvCheckMode fix, uint16_t **refcount_table,
int64_t *nb_clusters);

/*
* Calculates an in-memory refcount table.
*/
static int calculate_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
BdrvCheckMode fix, uint16_t **refcount_table,
int64_t *nb_clusters)
{
BDRVQcowState *s = bs->opaque;
int64_t i;
QCowSnapshot *sn;
int ret;

*refcount_table = g_try_new0(uint16_t, *nb_clusters);
if (*nb_clusters && *refcount_table == NULL) {
res->check_errors++;
return -ENOMEM;
}

/* header */
inc_refcounts(bs, res, *refcount_table, *nb_clusters,
0, s->cluster_size);

/* current L1 table */
ret = check_refcounts_l1(bs, res, *refcount_table, *nb_clusters,
s->l1_table_offset, s->l1_size, CHECK_FRAG_INFO);
if (ret < 0) {
return ret;
}

/* snapshots */
for (i = 0; i < s->nb_snapshots; i++) {
sn = s->snapshots + i;
ret = check_refcounts_l1(bs, res, *refcount_table, *nb_clusters,
sn->l1_table_offset, sn->l1_size, 0);
if (ret < 0) {
return ret;
}
}
inc_refcounts(bs, res, *refcount_table, *nb_clusters,
s->snapshots_offset, s->snapshots_size);

/* refcount data */
inc_refcounts(bs, res, *refcount_table, *nb_clusters,
s->refcount_table_offset,
s->refcount_table_size * sizeof(uint64_t));

return check_refblocks(bs, res, fix, refcount_table, nb_clusters);
}

/*
* Checks consistency of refblocks and accounts for each refblock in
* *refcount_table.
Expand Down Expand Up @@ -1664,6 +1611,55 @@ static int check_refblocks(BlockDriverState *bs, BdrvCheckResult *res,
return 0;
}

/*
* Calculates an in-memory refcount table.
*/
static int calculate_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
BdrvCheckMode fix, uint16_t **refcount_table,
int64_t *nb_clusters)
{
BDRVQcowState *s = bs->opaque;
int64_t i;
QCowSnapshot *sn;
int ret;

*refcount_table = g_try_new0(uint16_t, *nb_clusters);
if (*nb_clusters && *refcount_table == NULL) {
res->check_errors++;
return -ENOMEM;
}

/* header */
inc_refcounts(bs, res, *refcount_table, *nb_clusters,
0, s->cluster_size);

/* current L1 table */
ret = check_refcounts_l1(bs, res, *refcount_table, *nb_clusters,
s->l1_table_offset, s->l1_size, CHECK_FRAG_INFO);
if (ret < 0) {
return ret;
}

/* snapshots */
for (i = 0; i < s->nb_snapshots; i++) {
sn = s->snapshots + i;
ret = check_refcounts_l1(bs, res, *refcount_table, *nb_clusters,
sn->l1_table_offset, sn->l1_size, 0);
if (ret < 0) {
return ret;
}
}
inc_refcounts(bs, res, *refcount_table, *nb_clusters,
s->snapshots_offset, s->snapshots_size);

/* refcount data */
inc_refcounts(bs, res, *refcount_table, *nb_clusters,
s->refcount_table_offset,
s->refcount_table_size * sizeof(uint64_t));

return check_refblocks(bs, res, fix, refcount_table, nb_clusters);
}

/*
* Compares the actual reference count for each cluster in the image against the
* refcount as reported by the refcount structures on-disk.
Expand Down

0 comments on commit 057a3fe

Please sign in to comment.