Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
parallels: Move check of leaks to a separate function
We will add more and more checks so we need a better code structure
in parallels_co_check. Let each check performs in a separate loop
in a separate helper.

Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
Message-Id: <20230424093147.197643-10-alexander.ivanov@virtuozzo.com>
Reviewed-by: Hanna Czenczek <hreitz@redhat.com>
Signed-off-by: Hanna Czenczek <hreitz@redhat.com>
  • Loading branch information
AlexanderIvanov-Virtuozzo authored and XanClic committed Jun 5, 2023
1 parent 9616f7a commit 09a21ed
Showing 1 changed file with 45 additions and 29 deletions.
74 changes: 45 additions & 29 deletions block/parallels.c
Expand Up @@ -483,20 +483,56 @@ parallels_check_outside_image(BlockDriverState *bs, BdrvCheckResult *res,
}

static int coroutine_fn GRAPH_RDLOCK
parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
BdrvCheckMode fix)
parallels_check_leak(BlockDriverState *bs, BdrvCheckResult *res,
BdrvCheckMode fix)
{
BDRVParallelsState *s = bs->opaque;
int64_t size, prev_off;
int64_t size;
int ret;
uint32_t i;

size = bdrv_getlength(bs->file->bs);
if (size < 0) {
res->check_errors++;
return size;
}

if (size > res->image_end_offset) {
int64_t count;
count = DIV_ROUND_UP(size - res->image_end_offset, s->cluster_size);
fprintf(stderr, "%s space leaked at the end of the image %" PRId64 "\n",
fix & BDRV_FIX_LEAKS ? "Repairing" : "ERROR",
size - res->image_end_offset);
res->leaks += count;
if (fix & BDRV_FIX_LEAKS) {
Error *local_err = NULL;

/*
* In order to really repair the image, we must shrink it.
* That means we have to pass exact=true.
*/
ret = bdrv_co_truncate(bs->file, res->image_end_offset, true,
PREALLOC_MODE_OFF, 0, &local_err);
if (ret < 0) {
error_report_err(local_err);
res->check_errors++;
return ret;
}
res->leaks_fixed += count;
}
}

return 0;
}

static int coroutine_fn GRAPH_RDLOCK
parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
BdrvCheckMode fix)
{
BDRVParallelsState *s = bs->opaque;
int64_t prev_off;
int ret;
uint32_t i;

qemu_co_mutex_lock(&s->lock);

parallels_check_unclean(bs, res, fix);
Expand All @@ -506,6 +542,11 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
goto out;
}

ret = parallels_check_leak(bs, res, fix);
if (ret < 0) {
goto out;
}

res->bfi.total_clusters = s->bat_size;
res->bfi.compressed_clusters = 0; /* compression is not supported */

Expand All @@ -529,31 +570,6 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
prev_off = off;
}

if (size > res->image_end_offset) {
int64_t count;
count = DIV_ROUND_UP(size - res->image_end_offset, s->cluster_size);
fprintf(stderr, "%s space leaked at the end of the image %" PRId64 "\n",
fix & BDRV_FIX_LEAKS ? "Repairing" : "ERROR",
size - res->image_end_offset);
res->leaks += count;
if (fix & BDRV_FIX_LEAKS) {
Error *local_err = NULL;

/*
* In order to really repair the image, we must shrink it.
* That means we have to pass exact=true.
*/
ret = bdrv_co_truncate(bs->file, res->image_end_offset, true,
PREALLOC_MODE_OFF, 0, &local_err);
if (ret < 0) {
error_report_err(local_err);
res->check_errors++;
goto out;
}
res->leaks_fixed += count;
}
}

out:
qemu_co_mutex_unlock(&s->lock);

Expand Down

0 comments on commit 09a21ed

Please sign in to comment.