Am 28.01.2013 18:07, schrieb Benoît Canet: > Signed-off-by: Benoit Canet <ben...@irqsave.net> > --- > block/Makefile.objs | 1 + > block/quorum.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 46 insertions(+) > create mode 100644 block/quorum.c > > diff --git a/block/Makefile.objs b/block/Makefile.objs > index c067f38..4143e34 100644 > --- a/block/Makefile.objs > +++ b/block/Makefile.objs > @@ -2,6 +2,7 @@ block-obj-y += raw.o cow.o qcow.o vdi.o vmdk.o cloop.o dmg.o > bochs.o vpc.o vvfat > block-obj-y += qcow2.o qcow2-refcount.o qcow2-cluster.o qcow2-snapshot.o > qcow2-cache.o > 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-y += quorum.o > block-obj-y += parallels.o blkdebug.o blkverify.o > block-obj-$(CONFIG_WIN32) += raw-win32.o win32-aio.o > block-obj-$(CONFIG_POSIX) += raw-posix.o > diff --git a/block/quorum.c b/block/quorum.c > new file mode 100644 > index 0000000..8dc6e4c > --- /dev/null > +++ b/block/quorum.c > @@ -0,0 +1,45 @@ > +/* > + * Quorum Block filter > + * > + * Copyright (C) 2012-2013 Nodalink, SARL. > + * > + * Author: > + * Benoît Canet <benoit.ca...@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; > + > +typedef struct QuorumSingleAIOCB { > + BlockDriverAIOCB *aiocb; > + QEMUIOVector qiov; > + uint8_t *buf; > + int ret; > + QuorumAIOCB *parent; > +} QuorumSingleAIOCB;
It wouldn't hurt to add a comment describing what the struct is meant for. I guess this one exists for each request that quorum issues against the lower layers? > +struct QuorumAIOCB { > + BlockDriverAIOCB common; > + QEMUBH *bh; > + > + /* Request metadata */ > + uint64_t sector_num; > + int nb_sectors; > + > + QEMUIOVector *qiov; /* calling readv IOV */ > + > + QuorumSingleAIOCB *aios; /* individual AIOs */ > + int count; /* number of completed AIOCB */ > + int success_count; /* number of successfully completed AIOCB */ > + bool *finished; /* completion signal for cancel */ > + > + void (*vote)(QuorumAIOCB *acb); > + int vote_ret; > +}; And this one for all requests that quorum receives from upper layers? Only for read requests or also write requests? The comment for .qiov says "calling readv IOV", so what is used for writes? Kevin