From: Kevin Wolf <kwolf@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com
Subject: [Qemu-devel] [PULL 41/54] quorum: Create quorum.c, add QuorumChildRequest and QuorumAIOCB.
Date: Fri, 21 Feb 2014 23:12:38 +0100 [thread overview]
Message-ID: <1393020771-32712-42-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1393020771-32712-1-git-send-email-kwolf@redhat.com>
From: Benoît Canet <benoit@irqsave.net>
Quorum is a block filter mirroring writes to num_children children.
For reads quorum reads each children and does a vote.
If more than vote_threshold versions are identical the quorum is reached and
this winning version is returned to the guest. So quorum prevents bit corruption.
For high availability purpose minority errors are reported via QMP but the guest
does not see them.
This patch creates the driver C source file and introduces the structures that
will be used in asynchronous reads and writes.
Signed-off-by: Benoit Canet <benoit@irqsave.net>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block/Makefile.objs | 1 +
block/quorum.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 54 insertions(+)
create mode 100644 block/quorum.c
diff --git a/block/Makefile.objs b/block/Makefile.objs
index e254a21..716556f 100644
--- a/block/Makefile.objs
+++ b/block/Makefile.objs
@@ -3,6 +3,7 @@ block-obj-y += qcow2.o qcow2-refcount.o qcow2-cluster.o qcow2-snapshot.o qcow2-c
block-obj-y += qed.o qed-gencb.o qed-l2-cache.o qed-table.o qed-cluster.o
block-obj-y += qed-check.o
block-obj-$(CONFIG_VHDX) += vhdx.o vhdx-endian.o vhdx-log.o
+block-obj-y += quorum.o
block-obj-y += parallels.o blkdebug.o blkverify.o
block-obj-y += snapshot.o qapi.o
block-obj-$(CONFIG_WIN32) += raw-win32.o win32-aio.o
diff --git a/block/quorum.c b/block/quorum.c
new file mode 100644
index 0000000..950f5cc
--- /dev/null
+++ b/block/quorum.c
@@ -0,0 +1,53 @@
+/*
+ * Quorum Block filter
+ *
+ * Copyright (C) 2012-2014 Nodalink, EURL.
+ *
+ * Author:
+ * Benoît Canet <benoit.canet@irqsave.net>
+ *
+ * Based on the design and code of blkverify.c (Copyright (C) 2010 IBM, Corp)
+ * and blkmirror.c (Copyright (C) 2011 Red Hat, Inc).
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "block/block_int.h"
+
+typedef struct QuorumAIOCB QuorumAIOCB;
+
+/* Quorum will create one instance of the following structure per operation it
+ * performs on its children.
+ * So for each read/write operation coming from the upper layer there will be
+ * $children_count QuorumChildRequest.
+ */
+typedef struct QuorumChildRequest {
+ BlockDriverAIOCB *aiocb;
+ QEMUIOVector qiov;
+ uint8_t *buf;
+ int ret;
+ QuorumAIOCB *parent;
+} QuorumChildRequest;
+
+/* Quorum will use the following structure to track progress of each read/write
+ * operation received by the upper layer.
+ * This structure hold pointers to the QuorumChildRequest structures instances
+ * used to do operations on each children and track overall progress.
+ */
+struct QuorumAIOCB {
+ BlockDriverAIOCB common;
+
+ /* Request metadata */
+ uint64_t sector_num;
+ int nb_sectors;
+
+ QEMUIOVector *qiov; /* calling IOV */
+
+ QuorumChildRequest *qcrs; /* individual child requests */
+ int count; /* number of completed AIOCB */
+ int success_count; /* number of successfully completed AIOCB */
+
+ bool is_read;
+ int vote_ret;
+};
--
1.8.1.4
next prev parent reply other threads:[~2014-02-21 22:14 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-21 22:11 [Qemu-devel] [PULL 00/54] Block patches Kevin Wolf
2014-02-21 22:11 ` [Qemu-devel] [PULL 01/54] qcow2: Set zero flag for discarded clusters Kevin Wolf
2014-02-22 0:01 ` Eric Blake
2014-02-24 9:46 ` Kevin Wolf
2014-02-21 22:11 ` [Qemu-devel] [PULL 02/54] block: Fix bdrv_is_first_non_filter() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 03/54] block: Change BDS parameter of bdrv_open() to ** Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 04/54] block: Add reference parameter to bdrv_open() Kevin Wolf
2014-02-23 1:04 ` Fam Zheng
2014-02-21 22:12 ` [Qemu-devel] [PULL 05/54] block: Make bdrv_file_open() static Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 06/54] block: Reuse reference handling from bdrv_open() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 07/54] block: Remove bdrv_new() from bdrv_file_open() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 08/54] block: Handle bs->options in bdrv_open() only Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 09/54] block: Reuse success path from bdrv_open() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 10/54] block: Remove bdrv_open_image()'s force_raw option Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 11/54] nbd: produce a better error if neither host nor port is passed Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 12/54] nbd: correctly propagate errors Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 13/54] nbd: inline tcp_socket_incoming_spec into sole caller Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 14/54] nbd: move socket wrappers to qemu-nbd Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 15/54] iscsi: fix indentation Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 16/54] iscsi: correctly propagate errors in iscsi_open Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 17/54] gluster: default scheme to gluster:// and host to localhost Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 18/54] gluster: correctly propagate errors Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 19/54] cow: " Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 20/54] curl: " Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 21/54] qcow: " Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 22/54] qed: " Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 23/54] vhdx: " Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 24/54] vvfat: " Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 25/54] vmdk: extract vmdk_read_desc Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 26/54] vmdk: push vmdk_read_desc up to caller Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 27/54] vmdk: do not try opening a file as both image and descriptor Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 28/54] vmdk: correctly propagate errors Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 29/54] block: do not abuse EMEDIUMTYPE Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 30/54] vdi: say why an image is bad Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 31/54] qemu-option: has_help_option() and is_valid_option_list() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 32/54] qemu-img create: Support multiple -o options Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 33/54] qemu-img convert: " Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 34/54] qemu-img amend: " Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 35/54] qemu-img: Allow -o help with incomplete argument list Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 36/54] qemu-iotests: Check qemu-img command line parsing Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 37/54] qemu-config: Sections must consist of keys Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 38/54] qdict: Extract non-QDicts in qdict_array_split() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 39/54] check-qdict: Adjust test for qdict_array_split() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 40/54] check-qdict: Test termination of qdict_array_split() Kevin Wolf
2014-02-21 22:12 ` Kevin Wolf [this message]
2014-02-21 22:12 ` [Qemu-devel] [PULL 42/54] quorum: Create BDRVQuorumState and BlkDriver and do init Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 43/54] quorum: Add quorum_aio_writev and its dependencies Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 44/54] blkverify: Extract qemu_iovec_clone() and qemu_iovec_compare() from blkverify Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 45/54] quorum: Add quorum_aio_readv Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 46/54] quorum: Add quorum mechanism Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 47/54] quorum: Add quorum_getlength() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 48/54] quorum: Add quorum_invalidate_cache() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 49/54] quorum: Add quorum_co_flush() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 50/54] quorum: Implement recursive .bdrv_recurse_is_first_non_filter in quorum Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 51/54] quorum: Add quorum_open() and quorum_close() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 52/54] quorum: Add unit test Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 53/54] quorum: Simplify quorum_open() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 54/54] iotests: Mixed quorum child device specifications Kevin Wolf
2014-02-25 11:53 ` [Qemu-devel] [PULL 00/54] Block patches Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1393020771-32712-42-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).