On Mon, Apr 09, 2012 at 21:52:26 -0600, Eric Blake wrote:
> Expose the full abilities of virDomainBlockCopy.
> 
> * tools/virsh.c (blockJobImpl): Add --format option for block copy.
> * tools/virsh.pod (blockcopy): Document this.
> ---
>  tools/virsh.c   |   26 ++++++++++++++++++++------
>  tools/virsh.pod |   10 +++++-----
>  2 files changed, 25 insertions(+), 11 deletions(-)
> 
> diff --git a/tools/virsh.c b/tools/virsh.c
> index 25403f5..8669a8a 100644
> --- a/tools/virsh.c
> +++ b/tools/virsh.c
> @@ -7527,6 +7527,7 @@ blockJobImpl(vshControl *ctl, const vshCmd *cmd,
>      unsigned long bandwidth = 0;
>      int ret = -1;
>      const char *base = NULL;
> +    const char *format = NULL;
>      unsigned int flags = 0;
> 
>      if (!vshConnectionUsability(ctl, ctl->conn))
> @@ -7566,16 +7567,28 @@ blockJobImpl(vshControl *ctl, const vshCmd *cmd,
>              ret = virDomainBlockPull(dom, path, bandwidth, 0);
>          break;
>      case VSH_CMD_BLOCK_JOB_COPY:
> -        flags |= VIR_DOMAIN_BLOCK_REBASE_COPY;
>          if (vshCommandOptBool(cmd, "shallow"))
> -            flags |= VIR_DOMAIN_BLOCK_REBASE_SHALLOW;
> +            flags |= VIR_DOMAIN_BLOCK_COPY_SHALLOW;
>          if (vshCommandOptBool(cmd, "reuse-external"))
> -            flags |= VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT;
> -        if (vshCommandOptBool(cmd, "raw"))
> -            flags |= VIR_DOMAIN_BLOCK_REBASE_COPY_RAW;
> +            flags |= VIR_DOMAIN_BLOCK_COPY_REUSE_EXT;
>          if (vshCommandOptString(cmd, "dest", &base) < 0)
>              goto cleanup;
> -        ret = virDomainBlockRebase(dom, path, base, bandwidth, flags);
> +        if (vshCommandOptString(cmd, "format", &format) < 0)
> +            goto cleanup;
> +        if (!format) {
> +            if (vshCommandOptBool(cmd, "raw"))
> +                flags |= VIR_DOMAIN_BLOCK_REBASE_COPY_RAW;
> +            flags |= VIR_DOMAIN_BLOCK_REBASE_COPY;
> +            ret = virDomainBlockRebase(dom, path, base, bandwidth, flags);
> +        } else {
> +            if (vshCommandOptBool(cmd, "raw")) {
> +                vshError(ctl, "%s",
> +                         _("--raw and --format are mutually exclusive"));
> +                goto cleanup;
> +            }
> +            ret = virDomainBlockCopy(dom, path, base, format,
> +                                     bandwidth, flags);
> +        }
>      }
> 
>  cleanup:
> @@ -7598,6 +7611,7 @@ static const vshCmdOptDef opts_block_copy[] = {
>      {"path", VSH_OT_DATA, VSH_OFLAG_REQ, N_("Fully-qualified path of disk")},
>      {"dest", VSH_OT_DATA, VSH_OFLAG_REQ, N_("path of the copy to create")},
>      {"bandwidth", VSH_OT_DATA, VSH_OFLAG_NONE, N_("Bandwidth limit in 
> MB/s")},
> +    {"format", VSH_OT_DATA, VSH_OFLAG_NONE, N_("file format of dest")},
>      {"shallow", VSH_OT_BOOL, 0, N_("make the copy share a backing chain")},
>      {"reuse-external", VSH_OT_BOOL, 0, N_("reuse existing destination")},
>      {"raw", VSH_OT_BOOL, 0, N_("use raw destination file")},
> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index ee84ce5..65e2429 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -639,7 +639,7 @@ address of virtual interface (such as I<detach-interface> 
> or
>  I<domif-setlink>) will accept the MAC address printed by this command.
> 
>  =item B<blockcopy> I<domain> I<path> I<dest> [I<bandwidth>] [I<--shallow>]
> -[I<--reuse-external>] [I<--raw>]
> +[I<--reuse-external>] { [I<--raw>] | I<format> }
> 
>  Copy a disk backing image chain to I<dest>. By default, this command
>  flattens the entire chain; but if I<--shallow> is specified, the copy
> @@ -652,10 +652,10 @@ is used, otherwise it must start empty); this option is 
> typically used
>  to set up a relative backing file name in the destination.
> 
>  The format of the destination is determined by the first match in the
> -following list: if I<--raw> is specified, it will be raw; if
> -I<--reuse-external> is specified, the existing destination is probed
> -for a format; and in all other cases, the destination format will
> -match the source format.
> +following list: if I<--raw> is specified, it will be raw; if I<format>
> +is specified, it will have that format; if I<--reuse-external> is
> +specified, the existing destination is probed for a format; and in
> +all other cases, the destination format will match the source format.
> 
>  The copy runs in the background; initially, the job must copy all data
>  from the source, and during this phase, the job can only be canceled to

OK but this patch may be affected in case we decide to rename
virDomainBlockCopy.

Jirka

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to