mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-26 21:10:42 +00:00
qcow2: Add qcow2_check_fix_snapshot_table()
qcow2_check_read_snapshot_table() can perform consistency checks, but it cannot fix everything. Specifically, it cannot allocate new clusters, because that should wait until the refcount structures are known to be consistent (i.e., after qcow2_check_refcounts()). Thus, it cannot call qcow2_write_snapshots(). Do that in qcow2_check_fix_snapshot_table(), which is called after qcow2_check_refcounts(). Currently, there is nothing that would set result->corruptions, so this is a no-op. A follow-up patch will change that. Signed-off-by: Max Reitz <mreitz@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-id: 20191011152814.14791-10-mreitz@redhat.com Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
8bc584fe03
commit
fe446b5da2
@ -380,6 +380,31 @@ int coroutine_fn qcow2_check_read_snapshot_table(BlockDriverState *bs,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int coroutine_fn qcow2_check_fix_snapshot_table(BlockDriverState *bs,
|
||||
BdrvCheckResult *result,
|
||||
BdrvCheckMode fix)
|
||||
{
|
||||
BDRVQcow2State *s = bs->opaque;
|
||||
int ret;
|
||||
|
||||
if (result->corruptions && (fix & BDRV_FIX_ERRORS)) {
|
||||
qemu_co_mutex_unlock(&s->lock);
|
||||
ret = qcow2_write_snapshots(bs);
|
||||
qemu_co_mutex_lock(&s->lock);
|
||||
if (ret < 0) {
|
||||
result->check_errors++;
|
||||
fprintf(stderr, "ERROR failed to update snapshot table: %s\n",
|
||||
strerror(-ret));
|
||||
return ret;
|
||||
}
|
||||
|
||||
result->corruptions_fixed += result->corruptions;
|
||||
result->corruptions = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void find_new_snapshot_id(BlockDriverState *bs,
|
||||
char *id_str, int id_str_size)
|
||||
{
|
||||
|
@ -597,13 +597,20 @@ static int coroutine_fn qcow2_co_check_locked(BlockDriverState *bs,
|
||||
memset(result, 0, sizeof(*result));
|
||||
|
||||
ret = qcow2_check_read_snapshot_table(bs, &snapshot_res, fix);
|
||||
qcow2_add_check_result(result, &snapshot_res, false);
|
||||
if (ret < 0) {
|
||||
qcow2_add_check_result(result, &snapshot_res, false);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = qcow2_check_refcounts(bs, &refcount_res, fix);
|
||||
qcow2_add_check_result(result, &refcount_res, true);
|
||||
if (ret < 0) {
|
||||
qcow2_add_check_result(result, &snapshot_res, false);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = qcow2_check_fix_snapshot_table(bs, &snapshot_res, fix);
|
||||
qcow2_add_check_result(result, &snapshot_res, false);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
@ -721,6 +721,9 @@ int qcow2_write_snapshots(BlockDriverState *bs);
|
||||
int coroutine_fn qcow2_check_read_snapshot_table(BlockDriverState *bs,
|
||||
BdrvCheckResult *result,
|
||||
BdrvCheckMode fix);
|
||||
int coroutine_fn qcow2_check_fix_snapshot_table(BlockDriverState *bs,
|
||||
BdrvCheckResult *result,
|
||||
BdrvCheckMode fix);
|
||||
|
||||
/* qcow2-cache.c functions */
|
||||
Qcow2Cache *qcow2_cache_create(BlockDriverState *bs, int num_tables,
|
||||
|
Loading…
Reference in New Issue
Block a user