[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 10/12] qcow2: Support for fixing refcount inconsiste
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH 10/12] qcow2: Support for fixing refcount inconsistencies |
Date: |
Mon, 4 Jun 2012 13:13:27 +0200 |
Signed-off-by: Kevin Wolf <address@hidden>
---
block/qcow2-refcount.c | 31 +++++++++++++++++++++++++++----
block/qcow2.c | 6 +-----
block/qcow2.h | 3 ++-
3 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 443c021..3544fcf 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -1122,11 +1122,12 @@ fail:
* Returns 0 if no errors are found, the number of errors in case the image is
* detected as corrupted, and -errno when an internal error occurred.
*/
-int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res)
+int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
+ BdrvCheckMode fix)
{
BDRVQcowState *s = bs->opaque;
- int64_t size;
- int nb_clusters, refcount1, refcount2, i;
+ int64_t size, i;
+ int nb_clusters, refcount1, refcount2;
QCowSnapshot *sn;
uint16_t *refcount_table;
int ret;
@@ -1205,9 +1206,31 @@ int qcow2_check_refcounts(BlockDriverState *bs,
BdrvCheckResult *res)
refcount2 = refcount_table[i];
if (refcount1 != refcount2) {
+
+ /* Check if we're allowed to fix the mismatch */
+ int *num_fixed = NULL;
+ if (refcount1 > refcount2 && (fix & BDRV_FIX_LEAKS)) {
+ num_fixed = &res->leaks_fixed;
+ } else if (refcount1 < refcount2 && (fix & BDRV_FIX_ERRORS)) {
+ num_fixed = &res->corruptions_fixed;
+ }
+
fprintf(stderr, "%s cluster %d refcount=%d reference=%d\n",
- refcount1 < refcount2 ? "ERROR" : "Leaked",
+ num_fixed != NULL ? "Repairing" :
+ refcount1 < refcount2 ? "ERROR" :
+ "Leaked",
i, refcount1, refcount2);
+
+ if (num_fixed) {
+ ret = update_refcount(bs, i << s->cluster_bits, 1,
+ refcount2 - refcount1);
+ if (ret >= 0) {
+ (*num_fixed)++;
+ continue;
+ }
+ }
+
+ /* And if we couldn't, print an error */
if (refcount1 < refcount2) {
res->corruptions++;
} else {
diff --git a/block/qcow2.c b/block/qcow2.c
index 7797015..d66de58 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -1473,11 +1473,7 @@ static int qcow2_get_info(BlockDriverState *bs,
BlockDriverInfo *bdi)
static int qcow2_check(BlockDriverState *bs, BdrvCheckResult *result,
BdrvCheckMode fix)
{
- if (fix) {
- return -ENOTSUP;
- }
-
- return qcow2_check_refcounts(bs, result);
+ return qcow2_check_refcounts(bs, result, fix);
}
#if 0
diff --git a/block/qcow2.h b/block/qcow2.h
index 93567f6..c6e7237 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -261,7 +261,8 @@ void qcow2_free_any_clusters(BlockDriverState *bs,
int qcow2_update_snapshot_refcount(BlockDriverState *bs,
int64_t l1_table_offset, int l1_size, int addend);
-int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res);
+int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
+ BdrvCheckMode fix);
/* qcow2-cluster.c functions */
int qcow2_grow_l1_table(BlockDriverState *bs, int min_size, bool exact_size);
--
1.7.6.5
- [Qemu-devel] [PULL 00/12] Block patches, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 01/12] qcow2: remove a line of unnecessary code, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 02/12] qcow2: fix the byte endian convertion, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 06/12] stream: move rate limiting to a separate header file, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 05/12] stream: move is_allocated_above to block.c, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 10/12] qcow2: Support for fixing refcount inconsistencies,
Kevin Wolf <=
- [Qemu-devel] [PATCH 08/12] qemu-img check -r for repairing images, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 09/12] qemu-img check: Print fixed clusters and recheck, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 07/12] Un-inline fdctrl_init_isa(), Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 03/12] block: implement is_allocated for raw, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 11/12] rbd: hook up cache options, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 04/12] stream: tweak usage of bdrv_co_is_allocated, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 12/12] sheepdog: add coroutine_fn markers to coroutine functions, Kevin Wolf, 2012/06/04
- Re: [Qemu-devel] [PULL 00/12] Block patches, Anthony Liguori, 2012/06/06