Commit acbe5982 authored by Stefan Hajnoczi's avatar Stefan Hajnoczi Committed by Kevin Wolf
Browse files

qcow2: mark image clean after repair succeeds



The dirty bit is cleared after image repair succeeds in qcow2_open().
Move this into qcow2_check() so that all callers benefit from this
behavior when fix mode is enabled.

This is necessary so qemu-img check can call .bdrv_check() and mark the
image clean.

Signed-off-by: default avatarStefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent b10170ac
Loading
Loading
Loading
Loading
+15 −13
Original line number Diff line number Diff line
@@ -270,6 +270,20 @@ static int qcow2_mark_clean(BlockDriverState *bs)
    return 0;
}

static int qcow2_check(BlockDriverState *bs, BdrvCheckResult *result,
                       BdrvCheckMode fix)
{
    int ret = qcow2_check_refcounts(bs, result, fix);
    if (ret < 0) {
        return ret;
    }

    if (fix && result->check_errors == 0 && result->corruptions == 0) {
        return qcow2_mark_clean(bs);
    }
    return ret;
}

static int qcow2_open(BlockDriverState *bs, int flags)
{
    BDRVQcowState *s = bs->opaque;
@@ -474,12 +488,7 @@ static int qcow2_open(BlockDriverState *bs, int flags)
        !bs->read_only) {
        BdrvCheckResult result = {0};

        ret = qcow2_check_refcounts(bs, &result, BDRV_FIX_ERRORS);
        if (ret < 0) {
            goto fail;
        }

        ret = qcow2_mark_clean(bs);
        ret = qcow2_check(bs, &result, BDRV_FIX_ERRORS);
        if (ret < 0) {
            goto fail;
        }
@@ -1568,13 +1577,6 @@ static int qcow2_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
    return 0;
}


static int qcow2_check(BlockDriverState *bs, BdrvCheckResult *result,
                       BdrvCheckMode fix)
{
    return qcow2_check_refcounts(bs, result, fix);
}

#if 0
static void dump_refcounts(BlockDriverState *bs)
{