All of lore.kernel.org
 help / color / mirror / Atom feed
From: Fam Zheng <famz@redhat.com>
To: "Benoît Canet" <benoit.canet@irqsave.net>
Cc: kwolf@redhat.com, rjones@redhat.com, armbru@redhat.com,
	qemu-devel@nongnu.org, imain@redhat.com, stefanha@redhat.com,
	pbonzini@redhat.com
Subject: Re: [Qemu-devel] [PATCH v13 10/14] qmp: Add command 'blockdev-backup'
Date: Mon, 17 Feb 2014 21:32:51 +0800	[thread overview]
Message-ID: <20140217133251.GG1428@T430.redhat.com> (raw)
In-Reply-To: <20140213134832.GF4547@irqsave.net>

On Thu, 02/13 14:48, Benoît Canet wrote:
> The Wednesday 29 Jan 2014 à 13:07:37 (+0800), Fam Zheng wrote :
> > Similar to drive-backup, but this command uses a device id as target
> > instead of creating/opening an image file.
> > 
> > Also add blocker on target bs, since the target is also a named device
> > now.
> > 
> > Add check and report error for bs == target which became possible but is
> > an illegal case with introduction of blockdev-backup.
> > 
> > Signed-off-by: Fam Zheng <famz@redhat.com>
> > ---
> >  block/backup.c   | 26 ++++++++++++++++++++++++++
> >  blockdev.c       | 47 +++++++++++++++++++++++++++++++++++++++++++++++
> >  qapi-schema.json | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
> >  qmp-commands.hx  | 44 ++++++++++++++++++++++++++++++++++++++++++++
> >  4 files changed, 166 insertions(+)
> > 
> > diff --git a/block/backup.c b/block/backup.c
> > index 15a2e55..ea46340 100644
> > --- a/block/backup.c
> > +++ b/block/backup.c
> > @@ -344,6 +344,7 @@ static void coroutine_fn backup_run(void *opaque)
> >      hbitmap_free(job->bitmap);
> >  
> >      bdrv_iostatus_disable(target);
> > +    bdrv_op_unblock_all(target, job->common.blocker);
> >      bdrv_unref(target);
> >  
> >      block_job_completed(&job->common, ret);
> > @@ -362,6 +363,11 @@ void backup_start(BlockDriverState *bs, BlockDriverState *target,
> >      assert(target);
> >      assert(cb);
> >  
> > +    if (bs == target) {
> > +        error_setg(errp, "Source and target cannot be the same");
> > +        return;
> > +    }
> > +
> >      if ((on_source_error == BLOCKDEV_ON_ERROR_STOP ||
> >           on_source_error == BLOCKDEV_ON_ERROR_ENOSPC) &&
> >          !bdrv_iostatus_is_enabled(bs)) {
> > @@ -369,6 +375,24 @@ void backup_start(BlockDriverState *bs, BlockDriverState *target,
> >          return;
> >      }
> >  
> > +    if (!bdrv_is_inserted(bs)) {
> > +        error_set(errp, QERR_DEVICE_HAS_NO_MEDIUM, bs->device_name);
> > +        return;
> > +    }
> > +
> > +    if (!bdrv_is_inserted(target)) {
> > +        error_set(errp, QERR_DEVICE_HAS_NO_MEDIUM, target->device_name);
> > +        return;
> > +    }
> > +
> > +    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_BACKUP_SOURCE, errp)) {
> > +        return;
> > +    }
> > +
> > +    if (bdrv_op_is_blocked(target, BLOCK_OP_TYPE_BACKUP_TARGET, errp)) {
> > +        return;
> > +    }
> > +
> >      len = bdrv_getlength(bs);
> >      if (len < 0) {
> >          error_setg_errno(errp, -len, "unable to get length for '%s'",
> > @@ -382,6 +406,8 @@ void backup_start(BlockDriverState *bs, BlockDriverState *target,
> >          return;
> >      }
> >  
> > +    bdrv_op_block_all(target, job->common.blocker);
> > +
> >      job->on_source_error = on_source_error;
> >      job->on_target_error = on_target_error;
> >      job->target = target;
> > diff --git a/blockdev.c b/blockdev.c
> > index ffaa6a9..b346cc1 100644
> > --- a/blockdev.c
> > +++ b/blockdev.c
> > @@ -1940,6 +1940,8 @@ void qmp_drive_backup(const char *device, const char *target,
> >          return;
> >      }
> >  
> > +    /* Although backup_run has this check too, we need to use bs->drv below, so
> > +     * do an early check redundantly. */
> >      if (!bdrv_is_inserted(bs)) {
> >          error_set(errp, QERR_DEVICE_HAS_NO_MEDIUM, device);
> >          return;
> > @@ -1956,6 +1958,7 @@ void qmp_drive_backup(const char *device, const char *target,
> >          }
> >      }
> >  
> > +    /* Early check to avoid creating target */
> >      if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_BACKUP_SOURCE, errp)) {
> >          return;
> >      }
> > @@ -2019,6 +2022,50 @@ BlockDeviceInfoList *qmp_query_named_block_nodes(Error **errp)
> >      return bdrv_named_nodes_list();
> >  }
> >  
> > +void qmp_blockdev_backup(const char *device, const char *target,
> > +                         enum MirrorSyncMode sync,
> > +                         bool has_speed, int64_t speed,
> > +                         bool has_on_source_error,
> > +                         BlockdevOnError on_source_error,
> > +                         bool has_on_target_error,
> > +                         BlockdevOnError on_target_error,
> > +                         Error **errp)
> > +{
> > +    BlockDriverState *bs;
> > +    BlockDriverState *target_bs;
> > +    Error *local_err = NULL;
> > +
> > +    if (!has_speed) {
> > +        speed = 0;
> > +    }
> > +    if (!has_on_source_error) {
> > +        on_source_error = BLOCKDEV_ON_ERROR_REPORT;
> > +    }
> > +    if (!has_on_target_error) {
> > +        on_target_error = BLOCKDEV_ON_ERROR_REPORT;
> > +    }
> > +
> > +    bs = bdrv_find(device);
> This and the qmp prototype should be upgraded to the new device and node-name
> alternative and make use of bdrv_lookup_bs().
> 

Can we do it later in a separate patch?

Fam

  reply	other threads:[~2014-02-17 13:33 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-29  5:07 [Qemu-devel] [PATCH v13 00/14] Drop in_use from BlockDriverState and enable point-in-time snapshot exporting over NBD Fam Zheng
2014-01-29  5:07 ` [Qemu-devel] [PATCH v13 01/14] block: Add BlockOpType enum Fam Zheng
2014-01-29  5:07 ` [Qemu-devel] [PATCH v13 02/14] block: Introduce op_blockers to BlockDriverState Fam Zheng
2014-02-13 12:24   ` Benoît Canet
2014-02-17 13:30     ` Fam Zheng
2014-02-13 12:37   ` Benoît Canet
2014-02-17 13:30     ` Fam Zheng
2014-01-29  5:07 ` [Qemu-devel] [PATCH v13 03/14] block: Replace in_use with operation blocker Fam Zheng
2014-02-13 12:34   ` Benoît Canet
2014-02-17 13:21     ` Fam Zheng
2014-01-29  5:07 ` [Qemu-devel] [PATCH v13 04/14] block: Move op_blocker check from block_job_create to its caller Fam Zheng
2014-01-29  5:07 ` [Qemu-devel] [PATCH v13 05/14] block: Add bdrv_set_backing_hd() Fam Zheng
2014-02-13 12:49   ` Benoît Canet
2014-02-17 13:31     ` Fam Zheng
2014-01-29  5:07 ` [Qemu-devel] [PATCH v13 06/14] block: Add backing_blocker in BlockDriverState Fam Zheng
2014-01-29  5:07 ` [Qemu-devel] [PATCH v13 07/14] block: Parse "backing" option to reference existing BDS Fam Zheng
2014-02-13 13:17   ` Benoît Canet
2014-01-29  5:07 ` [Qemu-devel] [PATCH v13 08/14] block: Support dropping active in bdrv_drop_intermediate Fam Zheng
2014-01-29  5:07 ` [Qemu-devel] [PATCH v13 09/14] stream: Use bdrv_drop_intermediate and drop close_unused_images Fam Zheng
2014-01-29  5:07 ` [Qemu-devel] [PATCH v13 10/14] qmp: Add command 'blockdev-backup' Fam Zheng
2014-02-13 13:48   ` Benoît Canet
2014-02-17 13:32     ` Fam Zheng [this message]
2014-02-17 14:23       ` Benoît Canet
2014-01-29  5:07 ` [Qemu-devel] [PATCH v13 11/14] block: Allow backup on referenced named BlockDriverState Fam Zheng
2014-01-29  5:07 ` [Qemu-devel] [PATCH v13 12/14] block: Add blockdev-backup to transaction Fam Zheng
2014-01-29  5:07 ` [Qemu-devel] [PATCH v13 13/14] qemu-iotests: Test blockdev-backup in 055 Fam Zheng
2014-01-29  5:07 ` [Qemu-devel] [PATCH v13 14/14] qemu-iotests: Image fleecing test case 081 Fam Zheng
2014-02-01  3:00 ` [Qemu-devel] [PATCH v13 00/14] Drop in_use from BlockDriverState and enable point-in-time snapshot exporting over NBD Ian Main
2014-02-01 15:21   ` Fam Zheng
2014-02-02  1:13     ` Ian Main
2014-02-12 17:22 ` Ian Main
2014-02-12 18:27   ` Richard W.M. Jones

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=20140217133251.GG1428@T430.redhat.com \
    --to=famz@redhat.com \
    --cc=armbru@redhat.com \
    --cc=benoit.canet@irqsave.net \
    --cc=imain@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rjones@redhat.com \
    --cc=stefanha@redhat.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.