mirror of https://github.com/proxmox/mirror_qemu
qed: mark image clean after repair succeeds
The dirty bit is cleared after image repair succeeds in qed_open(). Move this into qed_check() so that all callers benefit from this behavior when fix=true. This is necessary so qemu-img check can call .bdrv_check() and mark the image clean. Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>master
parent
1f212b9d3e
commit
b10170aca0
|
@ -194,6 +194,28 @@ static void qed_check_for_leaks(QEDCheck *check)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mark an image clean once it passes check or has been repaired
|
||||||
|
*/
|
||||||
|
static void qed_check_mark_clean(BDRVQEDState *s, BdrvCheckResult *result)
|
||||||
|
{
|
||||||
|
/* Skip if there were unfixable corruptions or I/O errors */
|
||||||
|
if (result->corruptions > 0 || result->check_errors > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip if image is already marked clean */
|
||||||
|
if (!(s->header.features & QED_F_NEED_CHECK)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ensure fixes reach storage before clearing check bit */
|
||||||
|
bdrv_flush(s->bs);
|
||||||
|
|
||||||
|
s->header.features &= ~QED_F_NEED_CHECK;
|
||||||
|
qed_write_header_sync(s);
|
||||||
|
}
|
||||||
|
|
||||||
int qed_check(BDRVQEDState *s, BdrvCheckResult *result, bool fix)
|
int qed_check(BDRVQEDState *s, BdrvCheckResult *result, bool fix)
|
||||||
{
|
{
|
||||||
QEDCheck check = {
|
QEDCheck check = {
|
||||||
|
@ -215,6 +237,10 @@ int qed_check(BDRVQEDState *s, BdrvCheckResult *result, bool fix)
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
/* Only check for leaks if entire image was scanned successfully */
|
/* Only check for leaks if entire image was scanned successfully */
|
||||||
qed_check_for_leaks(&check);
|
qed_check_for_leaks(&check);
|
||||||
|
|
||||||
|
if (fix) {
|
||||||
|
qed_check_mark_clean(s, result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free(check.used_clusters);
|
g_free(check.used_clusters);
|
||||||
|
|
|
@ -89,7 +89,7 @@ static void qed_header_cpu_to_le(const QEDHeader *cpu, QEDHeader *le)
|
||||||
le->backing_filename_size = cpu_to_le32(cpu->backing_filename_size);
|
le->backing_filename_size = cpu_to_le32(cpu->backing_filename_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qed_write_header_sync(BDRVQEDState *s)
|
int qed_write_header_sync(BDRVQEDState *s)
|
||||||
{
|
{
|
||||||
QEDHeader le;
|
QEDHeader le;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -491,13 +491,6 @@ static int bdrv_qed_open(BlockDriverState *bs, int flags)
|
||||||
if (ret) {
|
if (ret) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if (!result.corruptions && !result.check_errors) {
|
|
||||||
/* Ensure fixes reach storage before clearing check bit */
|
|
||||||
bdrv_flush(s->bs);
|
|
||||||
|
|
||||||
s->header.features &= ~QED_F_NEED_CHECK;
|
|
||||||
qed_write_header_sync(s);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -210,6 +210,11 @@ typedef struct {
|
||||||
void *gencb_alloc(size_t len, BlockDriverCompletionFunc *cb, void *opaque);
|
void *gencb_alloc(size_t len, BlockDriverCompletionFunc *cb, void *opaque);
|
||||||
void gencb_complete(void *opaque, int ret);
|
void gencb_complete(void *opaque, int ret);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Header functions
|
||||||
|
*/
|
||||||
|
int qed_write_header_sync(BDRVQEDState *s);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* L2 cache functions
|
* L2 cache functions
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue