From: Avi Kivity <avi@redhat.com>
To: Marcelo Tosatti <mtosatti@redhat.com>
Cc: kwolf@redhat.com, Jes.Sorensen@redhat.com, dlaor@redhat.com,
qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [patch 2/7] Add blkmirror block driver
Date: Sun, 29 May 2011 11:45:44 +0300 [thread overview]
Message-ID: <4DE207B8.1070902@redhat.com> (raw)
In-Reply-To: <20110523213410.726580546@amt.cnet>
On 05/24/2011 12:31 AM, Marcelo Tosatti wrote:
> Mirrored writes are used by live block copy.
>
>
> +
> +typedef struct {
> + BlockDriverState *bs[2];
> +} BdrvMirrorState;
Can be generalized one day to N.
> +
> +/* Valid blkmirror filenames look like blkmirror:path/to/image1:path/to/image2 */
> +static int blkmirror_open(BlockDriverState *bs, const char *filename, int flags)
> +{
> + BdrvMirrorState *m = bs->opaque;
> + int ret;
> + char *raw, *c;
> +
> + /* Parse the blkmirror: prefix */
> + if (strncmp(filename, "blkmirror:", strlen("blkmirror:"))) {
Actual format should be documented somewhere.
> + return -EINVAL;
> + }
> + filename += strlen("blkmirror:");
> +
> + /* Parse the raw image filename */
> + c = strchr(filename, ':');
> + if (c == NULL) {
> + return -EINVAL;
> + }
> +
> + raw = strdup(filename);
> + raw[c - filename] = '\0';
> + ret = bdrv_file_open(&m->bs[0], raw, flags);
> + free(raw);
> + if (ret< 0) {
> + return ret;
> + }
> + filename = c + 1;
> +
> + ret = bdrv_file_open(&m->bs[1], filename, flags);
> + if (ret< 0) {
> + bdrv_delete(m->bs[0]);
> + return ret;
> + }
> +
> + return 0;
> +}
> +
>
> +
> +static BlockDriverAIOCB *blkmirror_aio_readv(BlockDriverState *bs,
> + int64_t sector_num,
> + QEMUIOVector *qiov,
> + int nb_sectors,
> + BlockDriverCompletionFunc *cb,
> + void *opaque)
> +{
> + BdrvMirrorState *m = bs->opaque;
> + return bdrv_aio_readv(m->bs[0], sector_num, qiov, nb_sectors, cb, opaque);
We could one day be clever and round-robin once we're synced.
> +}
> +
> +typedef struct DupAIOCB {
> + BlockDriverAIOCB common;
> + int count;
> +
> + BlockDriverCompletionFunc *cb;
> + void *opaque;
> +
> + BlockDriverAIOCB *src_aiocb;
> + BlockDriverAIOCB *dest_aiocb;
> +
> + int ret;
> +} DupAIOCB;
> +
> +static void dup_aio_cancel(BlockDriverAIOCB *blockacb)
> +{
> + DupAIOCB *acb = container_of(blockacb, DupAIOCB, common);
> +
> + bdrv_aio_cancel(acb->src_aiocb);
> + bdrv_aio_cancel(acb->dest_aiocb);
Shouldn't we cancel just the ones that haven't completed yet?
> + qemu_aio_release(acb);
> +}
> +
> +static AIOPool dup_aio_pool = {
> + .aiocb_size = sizeof(DupAIOCB),
> + .cancel = dup_aio_cancel,
> +};
> +
> +static void blkmirror_aio_cb(void *opaque, int ret)
> +{
> + DupAIOCB *dcb = opaque;
> +
> + dcb->count--;
> + assert(dcb->count>= 0);
> + if (dcb->count == 0) {
> + if (dcb->ret< 0) {
> + ret = dcb->ret;
> + }
> + dcb->common.cb(dcb->opaque, ret);
> + qemu_aio_release(dcb);
> + }
> + dcb->ret = ret;
> +}
It would be nicer to do
if (ret < 0) {
dcb->ret = ret;
}
unconditionally. The current code works, but only for N=2, and is a
little obfuscated.
I see you aren't keeping sync/unsync state here. Will read on.
--
error compiling committee.c: too many arguments to function
next prev parent reply other threads:[~2011-05-29 8:45 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-23 21:31 [Qemu-devel] [patch 0/7] live block copy (v3) Marcelo Tosatti
2011-05-23 21:31 ` [Qemu-devel] [patch 1/7] add migration_active function Marcelo Tosatti
2011-05-27 17:43 ` Kevin Wolf
2011-05-30 0:53 ` Jes Sorensen
2011-05-23 21:31 ` [Qemu-devel] [patch 2/7] Add blkmirror block driver Marcelo Tosatti
2011-05-24 19:03 ` Blue Swirl
2011-05-27 17:45 ` Kevin Wolf
2011-05-29 8:45 ` Avi Kivity [this message]
2011-05-23 21:31 ` [Qemu-devel] [patch 3/7] Add error messages for live block copy Marcelo Tosatti
2011-05-23 21:31 ` [Qemu-devel] [patch 4/7] Add blkdebug points " Marcelo Tosatti
2011-05-23 21:31 ` [Qemu-devel] [patch 5/7] Add vmstop code " Marcelo Tosatti
2011-05-23 21:31 ` [Qemu-devel] [patch 6/7] QEMU " Marcelo Tosatti
2011-05-24 19:15 ` Blue Swirl
2011-06-03 15:59 ` Marcelo Tosatti
2011-05-29 8:54 ` Avi Kivity
2011-05-31 16:06 ` Marcelo Tosatti
2011-05-31 16:14 ` Avi Kivity
2011-05-31 16:38 ` Marcelo Tosatti
2011-05-31 16:53 ` Avi Kivity
2011-06-03 16:20 ` Marcelo Tosatti
2011-05-23 21:31 ` [Qemu-devel] [patch 7/7] do not allow migration if block copy in progress Marcelo Tosatti
2011-05-29 8:54 ` Avi Kivity
-- strict thread matches above, loose matches on Subject: below --
2011-06-06 16:55 [Qemu-devel] [patch 0/7] live block copy (v4) Marcelo Tosatti
2011-06-06 16:55 ` [Qemu-devel] [patch 2/7] Add blkmirror block driver Marcelo Tosatti
2011-06-06 21:52 ` malc
2011-06-07 10:25 ` Stefan Hajnoczi
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=4DE207B8.1070902@redhat.com \
--to=avi@redhat.com \
--cc=Jes.Sorensen@redhat.com \
--cc=dlaor@redhat.com \
--cc=kwolf@redhat.com \
--cc=mtosatti@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).