qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2 0/4] qcow2: clean-ups around lazy refcounts
@ 2012-08-09 12:05 Stefan Hajnoczi
  2012-08-09 12:05 ` [Qemu-devel] [PATCH v2 1/4] qed: mark image clean after repair succeeds Stefan Hajnoczi
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Stefan Hajnoczi @ 2012-08-09 12:05 UTC (permalink / raw)
  To: qemu-devel; +Cc: Kevin Wolf, Stefan Hajnoczi

The qcow2 lazy refcount feature was merged with two pending clean-ups suggested
by Kevin:

1. Ensure that qemu-iotests/check -nocache 039 does not fail.

2. Fix qemu-img check output when a dirty image file is opened.  It currently
   omits the error summary because automatic repair cleans the image during
   bdrv_open() before qemu-img.c can call bdrv_check().

v2:
 * Fail when qcow2 check finds corruptions [Kevin]

Stefan Hajnoczi (4):
  qed: mark image clean after repair succeeds
  qcow2: mark image clean after repair succeeds
  block: add BLOCK_O_CHECK for qemu-img check
  qemu-iotests: skip 039 with ./check -nocache

 block.h                      |    1 +
 block/qcow2.c                |   32 +++++++++++++++++---------------
 block/qed-check.c            |   26 ++++++++++++++++++++++++++
 block/qed.c                  |   11 ++---------
 block/qed.h                  |    5 +++++
 qemu-img.c                   |    2 +-
 tests/qemu-iotests/039       |    1 +
 tests/qemu-iotests/039.out   |    6 ++++++
 tests/qemu-iotests/common.rc |   14 ++++++++++++++
 9 files changed, 73 insertions(+), 25 deletions(-)

-- 
1.7.10.4

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH v2 1/4] qed: mark image clean after repair succeeds
  2012-08-09 12:05 [Qemu-devel] [PATCH v2 0/4] qcow2: clean-ups around lazy refcounts Stefan Hajnoczi
@ 2012-08-09 12:05 ` Stefan Hajnoczi
  2012-08-09 12:05 ` [Qemu-devel] [PATCH v2 2/4] qcow2: " Stefan Hajnoczi
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Stefan Hajnoczi @ 2012-08-09 12:05 UTC (permalink / raw)
  To: qemu-devel; +Cc: Kevin Wolf, Stefan Hajnoczi

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>
---
 block/qed-check.c |   26 ++++++++++++++++++++++++++
 block/qed.c       |    9 +--------
 block/qed.h       |    5 +++++
 3 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/block/qed-check.c b/block/qed-check.c
index 5edf607..b473dcd 100644
--- a/block/qed-check.c
+++ b/block/qed-check.c
@@ -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)
 {
     QEDCheck check = {
@@ -215,6 +237,10 @@ int qed_check(BDRVQEDState *s, BdrvCheckResult *result, bool fix)
     if (ret == 0) {
         /* Only check for leaks if entire image was scanned successfully */
         qed_check_for_leaks(&check);
+
+        if (fix) {
+            qed_check_mark_clean(s, result);
+        }
     }
 
     g_free(check.used_clusters);
diff --git a/block/qed.c b/block/qed.c
index 5f3eefa..226545d 100644
--- a/block/qed.c
+++ b/block/qed.c
@@ -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);
 }
 
-static int qed_write_header_sync(BDRVQEDState *s)
+int qed_write_header_sync(BDRVQEDState *s)
 {
     QEDHeader le;
     int ret;
@@ -491,13 +491,6 @@ static int bdrv_qed_open(BlockDriverState *bs, int flags)
             if (ret) {
                 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);
-            }
         }
     }
 
diff --git a/block/qed.h b/block/qed.h
index c716772..a063bf7 100644
--- a/block/qed.h
+++ b/block/qed.h
@@ -211,6 +211,11 @@ void *gencb_alloc(size_t len, BlockDriverCompletionFunc *cb, void *opaque);
 void gencb_complete(void *opaque, int ret);
 
 /**
+ * Header functions
+ */
+int qed_write_header_sync(BDRVQEDState *s);
+
+/**
  * L2 cache functions
  */
 void qed_init_l2_cache(L2TableCache *l2_cache);
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH v2 2/4] qcow2: mark image clean after repair succeeds
  2012-08-09 12:05 [Qemu-devel] [PATCH v2 0/4] qcow2: clean-ups around lazy refcounts Stefan Hajnoczi
  2012-08-09 12:05 ` [Qemu-devel] [PATCH v2 1/4] qed: mark image clean after repair succeeds Stefan Hajnoczi
@ 2012-08-09 12:05 ` Stefan Hajnoczi
  2012-08-09 12:05 ` [Qemu-devel] [PATCH v2 3/4] block: add BLOCK_O_CHECK for qemu-img check Stefan Hajnoczi
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Stefan Hajnoczi @ 2012-08-09 12:05 UTC (permalink / raw)
  To: qemu-devel; +Cc: Kevin Wolf, Stefan Hajnoczi

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: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
---
 block/qcow2.c |   28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/block/qcow2.c b/block/qcow2.c
index fd5e214..5896fd6 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -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)
 {
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH v2 3/4] block: add BLOCK_O_CHECK for qemu-img check
  2012-08-09 12:05 [Qemu-devel] [PATCH v2 0/4] qcow2: clean-ups around lazy refcounts Stefan Hajnoczi
  2012-08-09 12:05 ` [Qemu-devel] [PATCH v2 1/4] qed: mark image clean after repair succeeds Stefan Hajnoczi
  2012-08-09 12:05 ` [Qemu-devel] [PATCH v2 2/4] qcow2: " Stefan Hajnoczi
@ 2012-08-09 12:05 ` Stefan Hajnoczi
  2012-08-09 12:05 ` [Qemu-devel] [PATCH v2 4/4] qemu-iotests: skip 039 with ./check -nocache Stefan Hajnoczi
  2012-08-09 15:02 ` [Qemu-devel] [PATCH v2 0/4] qcow2: clean-ups around lazy refcounts Kevin Wolf
  4 siblings, 0 replies; 6+ messages in thread
From: Stefan Hajnoczi @ 2012-08-09 12:05 UTC (permalink / raw)
  To: qemu-devel; +Cc: Kevin Wolf, Stefan Hajnoczi

Image formats with a dirty bit, like qed and qcow2, repair dirty image
files upon open with BDRV_O_RDWR.  Performing automatic repair when
qemu-img check runs is not ideal because the bdrv_open() call repairs
the image before the actual bdrv_check() call from qemu-img.c.

Fix this "double repair" since it leads to confusing output from
qemu-img check.  Tell the block driver that this image is being opened
just for bdrv_check().  This skips automatic repair and qemu-img.c can
invoke it manually with bdrv_check().

Update the golden output for qemu-iotests 039 to reflect the new
qemu-img check output.

Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
---
 block.h                    |    1 +
 block/qcow2.c              |    4 ++--
 block/qed.c                |    2 +-
 qemu-img.c                 |    2 +-
 tests/qemu-iotests/039.out |    6 ++++++
 5 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/block.h b/block.h
index 650d872..2e2be11 100644
--- a/block.h
+++ b/block.h
@@ -79,6 +79,7 @@ typedef struct BlockDevOps {
 #define BDRV_O_NO_FLUSH    0x0200 /* disable flushing on this disk */
 #define BDRV_O_COPY_ON_READ 0x0400 /* copy read backing sectors into image */
 #define BDRV_O_INCOMING    0x0800  /* consistency hint for incoming migration */
+#define BDRV_O_CHECK       0x1000  /* open solely for consistency check */
 
 #define BDRV_O_CACHE_MASK  (BDRV_O_NOCACHE | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH)
 
diff --git a/block/qcow2.c b/block/qcow2.c
index 5896fd6..8f183f1 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -484,8 +484,8 @@ static int qcow2_open(BlockDriverState *bs, int flags)
     qemu_co_mutex_init(&s->lock);
 
     /* Repair image if dirty */
-    if ((s->incompatible_features & QCOW2_INCOMPAT_DIRTY) &&
-        !bs->read_only) {
+    if (!(flags & BDRV_O_CHECK) && !bs->read_only &&
+        (s->incompatible_features & QCOW2_INCOMPAT_DIRTY)) {
         BdrvCheckResult result = {0};
 
         ret = qcow2_check(bs, &result, BDRV_FIX_ERRORS);
diff --git a/block/qed.c b/block/qed.c
index 226545d..a02dbfd 100644
--- a/block/qed.c
+++ b/block/qed.c
@@ -477,7 +477,7 @@ static int bdrv_qed_open(BlockDriverState *bs, int flags)
     }
 
     /* If image was not closed cleanly, check consistency */
-    if (s->header.features & QED_F_NEED_CHECK) {
+    if (!(flags & BDRV_O_CHECK) && (s->header.features & QED_F_NEED_CHECK)) {
         /* Read-only images cannot be fixed.  There is no risk of corruption
          * since write operations are not possible.  Therefore, allow
          * potentially inconsistent images to be opened read-only.  This can
diff --git a/qemu-img.c b/qemu-img.c
index 94a31ad..b41e670 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -379,7 +379,7 @@ static int img_check(int argc, char **argv)
     BlockDriverState *bs;
     BdrvCheckResult result;
     int fix = 0;
-    int flags = BDRV_O_FLAGS;
+    int flags = BDRV_O_FLAGS | BDRV_O_CHECK;
 
     fmt = NULL;
     for(;;) {
diff --git a/tests/qemu-iotests/039.out b/tests/qemu-iotests/039.out
index 155a05e..cb510d6 100644
--- a/tests/qemu-iotests/039.out
+++ b/tests/qemu-iotests/039.out
@@ -26,6 +26,12 @@ incompatible_features     0x1
 == Repairing the image file must succeed ==
 ERROR OFLAG_COPIED: offset=8000000000050000 refcount=0
 Repairing cluster 5 refcount=0 reference=1
+The following inconsistencies were found and repaired:
+
+    0 leaked clusters
+    1 corruptions
+
+Double checking the fixed image now...
 No errors were found on the image.
 incompatible_features     0x0
 
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH v2 4/4] qemu-iotests: skip 039 with ./check -nocache
  2012-08-09 12:05 [Qemu-devel] [PATCH v2 0/4] qcow2: clean-ups around lazy refcounts Stefan Hajnoczi
                   ` (2 preceding siblings ...)
  2012-08-09 12:05 ` [Qemu-devel] [PATCH v2 3/4] block: add BLOCK_O_CHECK for qemu-img check Stefan Hajnoczi
@ 2012-08-09 12:05 ` Stefan Hajnoczi
  2012-08-09 15:02 ` [Qemu-devel] [PATCH v2 0/4] qcow2: clean-ups around lazy refcounts Kevin Wolf
  4 siblings, 0 replies; 6+ messages in thread
From: Stefan Hajnoczi @ 2012-08-09 12:05 UTC (permalink / raw)
  To: qemu-devel; +Cc: Kevin Wolf, Stefan Hajnoczi

When the qemu-io --nocache option is used the 039 test case cannot abort
QEMU at a point where the image is dirty.  Skip the test case.

Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
---
 tests/qemu-iotests/039       |    1 +
 tests/qemu-iotests/common.rc |   14 ++++++++++++++
 2 files changed, 15 insertions(+)

diff --git a/tests/qemu-iotests/039 b/tests/qemu-iotests/039
index a749fcf..c5ae806 100755
--- a/tests/qemu-iotests/039
+++ b/tests/qemu-iotests/039
@@ -44,6 +44,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
 _supported_fmt qcow2
 _supported_proto generic
 _supported_os Linux
+_unsupported_qemu_io_options --nocache
 
 size=128M
 
diff --git a/tests/qemu-iotests/common.rc b/tests/qemu-iotests/common.rc
index 7782808..c5129f4 100644
--- a/tests/qemu-iotests/common.rc
+++ b/tests/qemu-iotests/common.rc
@@ -297,6 +297,20 @@ _supported_os()
     _notrun "not suitable for this OS: $HOSTOS"
 }
 
+_unsupported_qemu_io_options()
+{
+    for bad_opt
+    do
+        for opt in $QEMU_IO_OPTIONS
+        do
+            if [ "$bad_opt" = "$opt" ]
+            then
+                _notrun "not suitable for qemu-io option: $bad_opt"
+            fi
+        done
+    done
+}
+
 # this test requires that a specified command (executable) exists
 #
 _require_command()
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH v2 0/4] qcow2: clean-ups around lazy refcounts
  2012-08-09 12:05 [Qemu-devel] [PATCH v2 0/4] qcow2: clean-ups around lazy refcounts Stefan Hajnoczi
                   ` (3 preceding siblings ...)
  2012-08-09 12:05 ` [Qemu-devel] [PATCH v2 4/4] qemu-iotests: skip 039 with ./check -nocache Stefan Hajnoczi
@ 2012-08-09 15:02 ` Kevin Wolf
  4 siblings, 0 replies; 6+ messages in thread
From: Kevin Wolf @ 2012-08-09 15:02 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: qemu-devel

Am 09.08.2012 14:05, schrieb Stefan Hajnoczi:
> The qcow2 lazy refcount feature was merged with two pending clean-ups suggested
> by Kevin:
> 
> 1. Ensure that qemu-iotests/check -nocache 039 does not fail.
> 
> 2. Fix qemu-img check output when a dirty image file is opened.  It currently
>    omits the error summary because automatic repair cleans the image during
>    bdrv_open() before qemu-img.c can call bdrv_check().
> 
> v2:
>  * Fail when qcow2 check finds corruptions [Kevin]
> 
> Stefan Hajnoczi (4):
>   qed: mark image clean after repair succeeds
>   qcow2: mark image clean after repair succeeds
>   block: add BLOCK_O_CHECK for qemu-img check
>   qemu-iotests: skip 039 with ./check -nocache
> 
>  block.h                      |    1 +
>  block/qcow2.c                |   32 +++++++++++++++++---------------
>  block/qed-check.c            |   26 ++++++++++++++++++++++++++
>  block/qed.c                  |   11 ++---------
>  block/qed.h                  |    5 +++++
>  qemu-img.c                   |    2 +-
>  tests/qemu-iotests/039       |    1 +
>  tests/qemu-iotests/039.out   |    6 ++++++
>  tests/qemu-iotests/common.rc |   14 ++++++++++++++
>  9 files changed, 73 insertions(+), 25 deletions(-)

Thanks, applied all to the block branch.

Kevin

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-08-09 15:02 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-08-09 12:05 [Qemu-devel] [PATCH v2 0/4] qcow2: clean-ups around lazy refcounts Stefan Hajnoczi
2012-08-09 12:05 ` [Qemu-devel] [PATCH v2 1/4] qed: mark image clean after repair succeeds Stefan Hajnoczi
2012-08-09 12:05 ` [Qemu-devel] [PATCH v2 2/4] qcow2: " Stefan Hajnoczi
2012-08-09 12:05 ` [Qemu-devel] [PATCH v2 3/4] block: add BLOCK_O_CHECK for qemu-img check Stefan Hajnoczi
2012-08-09 12:05 ` [Qemu-devel] [PATCH v2 4/4] qemu-iotests: skip 039 with ./check -nocache Stefan Hajnoczi
2012-08-09 15:02 ` [Qemu-devel] [PATCH v2 0/4] qcow2: clean-ups around lazy refcounts Kevin Wolf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).