mirror of
https://github.com/qemu/qemu.git
synced 2024-11-28 06:13:46 +08:00
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>
This commit is contained in:
parent
9616f7a6c2
commit
09a21edfaf
@ -483,13 +483,12 @@ parallels_check_outside_image(BlockDriverState *bs, BdrvCheckResult *res,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int coroutine_fn GRAPH_RDLOCK
|
static int coroutine_fn GRAPH_RDLOCK
|
||||||
parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
|
parallels_check_leak(BlockDriverState *bs, BdrvCheckResult *res,
|
||||||
BdrvCheckMode fix)
|
BdrvCheckMode fix)
|
||||||
{
|
{
|
||||||
BDRVParallelsState *s = bs->opaque;
|
BDRVParallelsState *s = bs->opaque;
|
||||||
int64_t size, prev_off;
|
int64_t size;
|
||||||
int ret;
|
int ret;
|
||||||
uint32_t i;
|
|
||||||
|
|
||||||
size = bdrv_getlength(bs->file->bs);
|
size = bdrv_getlength(bs->file->bs);
|
||||||
if (size < 0) {
|
if (size < 0) {
|
||||||
@ -497,6 +496,43 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
|
|||||||
return size;
|
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);
|
qemu_co_mutex_lock(&s->lock);
|
||||||
|
|
||||||
parallels_check_unclean(bs, res, fix);
|
parallels_check_unclean(bs, res, fix);
|
||||||
@ -506,6 +542,11 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = parallels_check_leak(bs, res, fix);
|
||||||
|
if (ret < 0) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
res->bfi.total_clusters = s->bat_size;
|
res->bfi.total_clusters = s->bat_size;
|
||||||
res->bfi.compressed_clusters = 0; /* compression is not supported */
|
res->bfi.compressed_clusters = 0; /* compression is not supported */
|
||||||
|
|
||||||
@ -529,31 +570,6 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
|
|||||||
prev_off = off;
|
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:
|
out:
|
||||||
qemu_co_mutex_unlock(&s->lock);
|
qemu_co_mutex_unlock(&s->lock);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user