mirror of https://github.com/xemu-project/xemu.git
parallels: Move check of cluster outside image 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> Reviewed-by: Denis V. Lunev <den@openvz.org> Message-Id: <20230424093147.197643-8-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
96de69c7d9
commit
6d416e56a7
|
@ -440,13 +440,55 @@ static void parallels_check_unclean(BlockDriverState *bs,
|
|||
}
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
parallels_check_outside_image(BlockDriverState *bs, BdrvCheckResult *res,
|
||||
BdrvCheckMode fix)
|
||||
{
|
||||
BDRVParallelsState *s = bs->opaque;
|
||||
uint32_t i;
|
||||
int64_t off, high_off, size;
|
||||
|
||||
size = bdrv_getlength(bs->file->bs);
|
||||
if (size < 0) {
|
||||
res->check_errors++;
|
||||
return size;
|
||||
}
|
||||
|
||||
high_off = 0;
|
||||
for (i = 0; i < s->bat_size; i++) {
|
||||
off = bat2sect(s, i) << BDRV_SECTOR_BITS;
|
||||
if (off > size) {
|
||||
fprintf(stderr, "%s cluster %u is outside image\n",
|
||||
fix & BDRV_FIX_ERRORS ? "Repairing" : "ERROR", i);
|
||||
res->corruptions++;
|
||||
if (fix & BDRV_FIX_ERRORS) {
|
||||
parallels_set_bat_entry(s, i, 0);
|
||||
res->corruptions_fixed++;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (high_off < off) {
|
||||
high_off = off;
|
||||
}
|
||||
}
|
||||
|
||||
if (high_off == 0) {
|
||||
res->image_end_offset = s->data_end << BDRV_SECTOR_BITS;
|
||||
} else {
|
||||
res->image_end_offset = high_off + s->cluster_size;
|
||||
s->data_end = res->image_end_offset >> BDRV_SECTOR_BITS;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
|
||||
BdrvCheckMode fix)
|
||||
{
|
||||
BDRVParallelsState *s = bs->opaque;
|
||||
int64_t size, prev_off, high_off;
|
||||
int ret = 0;
|
||||
int64_t size, prev_off;
|
||||
int ret;
|
||||
uint32_t i;
|
||||
|
||||
size = bdrv_getlength(bs->file->bs);
|
||||
|
@ -459,10 +501,14 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
|
|||
|
||||
parallels_check_unclean(bs, res, fix);
|
||||
|
||||
ret = parallels_check_outside_image(bs, res, fix);
|
||||
if (ret < 0) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
res->bfi.total_clusters = s->bat_size;
|
||||
res->bfi.compressed_clusters = 0; /* compression is not supported */
|
||||
|
||||
high_off = 0;
|
||||
prev_off = 0;
|
||||
for (i = 0; i < s->bat_size; i++) {
|
||||
int64_t off = bat2sect(s, i) << BDRV_SECTOR_BITS;
|
||||
|
@ -471,23 +517,7 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
|
|||
continue;
|
||||
}
|
||||
|
||||
/* cluster outside the image */
|
||||
if (off > size) {
|
||||
fprintf(stderr, "%s cluster %u is outside image\n",
|
||||
fix & BDRV_FIX_ERRORS ? "Repairing" : "ERROR", i);
|
||||
res->corruptions++;
|
||||
if (fix & BDRV_FIX_ERRORS) {
|
||||
parallels_set_bat_entry(s, i, 0);
|
||||
res->corruptions_fixed++;
|
||||
}
|
||||
prev_off = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
res->bfi.allocated_clusters++;
|
||||
if (off > high_off) {
|
||||
high_off = off;
|
||||
}
|
||||
|
||||
if (prev_off != 0 && (prev_off + s->cluster_size) != off) {
|
||||
res->bfi.fragmented_clusters++;
|
||||
|
@ -495,13 +525,6 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
|
|||
prev_off = off;
|
||||
}
|
||||
|
||||
if (high_off == 0) {
|
||||
res->image_end_offset = s->data_end << BDRV_SECTOR_BITS;
|
||||
} else {
|
||||
res->image_end_offset = high_off + s->cluster_size;
|
||||
s->data_end = res->image_end_offset >> BDRV_SECTOR_BITS;
|
||||
}
|
||||
|
||||
if (size > res->image_end_offset) {
|
||||
int64_t count;
|
||||
count = DIV_ROUND_UP(size - res->image_end_offset, s->cluster_size);
|
||||
|
|
Loading…
Reference in New Issue