From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59335) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XW2gQ-0007MU-HQ for qemu-devel@nongnu.org; Mon, 22 Sep 2014 08:26:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XW2gE-0003WS-Tr for qemu-devel@nongnu.org; Mon, 22 Sep 2014 08:25:34 -0400 Received: from mx1.redhat.com ([209.132.183.28]:7851) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XW2gE-00037A-MR for qemu-devel@nongnu.org; Mon, 22 Sep 2014 08:25:22 -0400 From: Stefan Hajnoczi Date: Mon, 22 Sep 2014 12:42:03 +0100 Message-Id: <1411386150-24003-33-git-send-email-stefanha@redhat.com> In-Reply-To: <1411386150-24003-1-git-send-email-stefanha@redhat.com> References: <1411386150-24003-1-git-send-email-stefanha@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PULL v2 32/59] qcow2: Add qcow2_signal_corruption() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Maydell , Stefan Hajnoczi , Max Reitz From: Max Reitz Add a helper function for easily marking an image corrupt (on fatal corruptions) while outputting an informative message to stderr and via QAPI. Signed-off-by: Max Reitz Reviewed-by: Eric Blake Reviewed-by: Beno=C3=AEt Canet Message-id: 1409926039-29044-3-git-send-email-mreitz@redhat.com Signed-off-by: Stefan Hajnoczi --- block/qcow2.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ block/qcow2.h | 5 +++++ 2 files changed, 53 insertions(+) diff --git a/block/qcow2.c b/block/qcow2.c index 0daf25c..f4bbe8b 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -31,6 +31,8 @@ #include "qapi/qmp/qerror.h" #include "qapi/qmp/qbool.h" #include "qapi/util.h" +#include "qapi/qmp/types.h" +#include "qapi-event.h" #include "trace.h" #include "qemu/option_int.h" =20 @@ -2529,6 +2531,52 @@ static int qcow2_amend_options(BlockDriverState *b= s, QemuOpts *opts) return 0; } =20 +/* + * If offset or size are negative, respectively, they will not be includ= ed in + * the BLOCK_IMAGE_CORRUPTED event emitted. + * fatal will be ignored for read-only BDS; corruptions found there will= always + * be considered non-fatal. + */ +void qcow2_signal_corruption(BlockDriverState *bs, bool fatal, int64_t o= ffset, + int64_t size, const char *message_format, .= ..) +{ + BDRVQcowState *s =3D bs->opaque; + char *message; + va_list ap; + + fatal =3D fatal && !bs->read_only; + + if (s->signaled_corruption && + (!fatal || (s->incompatible_features & QCOW2_INCOMPAT_CORRUPT))) + { + return; + } + + va_start(ap, message_format); + message =3D g_strdup_vprintf(message_format, ap); + va_end(ap); + + if (fatal) { + fprintf(stderr, "qcow2: Marking image as corrupt: %s; further " + "corruption events will be suppressed\n", message); + } else { + fprintf(stderr, "qcow2: Image is corrupt: %s; further non-fatal = " + "corruption events will be suppressed\n", message); + } + + qapi_event_send_block_image_corrupted(bdrv_get_device_name(bs), mess= age, + offset >=3D 0, offset, size >=3D= 0, size, + fatal, &error_abort); + g_free(message); + + if (fatal) { + qcow2_mark_corrupt(bs); + bs->drv =3D NULL; /* make BDS unusable */ + } + + s->signaled_corruption =3D true; +} + static QemuOptsList qcow2_create_opts =3D { .name =3D "qcow2-create-opts", .head =3D QTAILQ_HEAD_INITIALIZER(qcow2_create_opts.head), diff --git a/block/qcow2.h b/block/qcow2.h index 6aeb7ea..7b7b6a6 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -261,6 +261,7 @@ typedef struct BDRVQcowState { bool discard_passthrough[QCOW2_DISCARD_MAX]; =20 int overlap_check; /* bitmask of Qcow2MetadataOverlap values */ + bool signaled_corruption; =20 uint64_t incompatible_features; uint64_t compatible_features; @@ -477,6 +478,10 @@ int qcow2_mark_corrupt(BlockDriverState *bs); int qcow2_mark_consistent(BlockDriverState *bs); int qcow2_update_header(BlockDriverState *bs); =20 +void qcow2_signal_corruption(BlockDriverState *bs, bool fatal, int64_t o= ffset, + int64_t size, const char *message_format, .= ..) + GCC_FMT_ATTR(5, 6); + /* qcow2-refcount.c functions */ int qcow2_refcount_init(BlockDriverState *bs); void qcow2_refcount_close(BlockDriverState *bs); --=20 1.9.3