On 06/19/2014 07:59 AM, Peter Krempa wrote: > Introduce flag for the block rebase API to allow the rebase operation to > leave the chain relatively addressed. Also adds a virsh switch to enable > this behavior. > --- > include/libvirt/libvirt.h.in | 2 ++ > src/libvirt.c | 5 +++++ > tools/virsh-domain.c | 22 +++++++++++++++++++--- > tools/virsh.pod | 4 ++++ > 4 files changed, 30 insertions(+), 3 deletions(-) Similar comments to 16/19 about being gated on qemu.git. > +++ b/src/libvirt.c > @@ -19716,6 +19716,11 @@ virDomainBlockPull(virDomainPtr dom, const char *disk, > * exists. If the job is aborted, a new one can be started later to > * resume from the same point. > * > + * If @flags contains VIR_DOMAIN_BLOCK_REBASE_RELATIVE, the name recorded > + * into the overlay of the @base image as path to the new backing file > + * will be kept relative to other images in case the backing chain was > + * using relative names. Quite wordy since the overlay of @base is always the active layer (given the current limitations of blockpull); how about: If @flags contains VIR_DOMAIN_BLOCK_REBASE_RELATIVE, the name recorded into the active disk as the location for @base will be kept relative, if the backing chain was using relative names. Also needs to mention what happens if this flag is set bug @base is omitted (silently ignored, or explicit error?) > +++ b/tools/virsh-domain.c > @@ -1479,10 +1479,14 @@ blockJobImpl(vshControl *ctl, const vshCmd *cmd, > case VSH_CMD_BLOCK_JOB_PULL: > if (vshCommandOptStringReq(ctl, cmd, "base", &base) < 0) > goto cleanup; > - if (base) > - ret = virDomainBlockRebase(dom, path, base, bandwidth, 0); > - else > + if (base) { > + if (vshCommandOptBool(cmd, "keep-relative")) > + flags |= VIR_DOMAIN_BLOCK_REBASE_RELATIVE; Here, you silently ignore the flag if base is omitted. Is it worth calling the new API when the flag is specified but base is NULL, in order to let virsh serve as a test for what happens if the flag is set in error? > + > + ret = virDomainBlockRebase(dom, path, base, bandwidth, flags); > + } else { > ret = virDomainBlockPull(dom, path, bandwidth, 0); > + } In fact, I think you want to modify flags in advance, and then do if (base || flags) virDomainBlockRebase(); else virDomainBlockPull() > + {.name = "keep-relative", > + .type = VSH_OT_BOOL, > + .help = N_("keep the backing chain relative if it was relatively " > + "referenced if it was before") s/if it was before/before/ > @@ -2139,6 +2148,13 @@ cmdBlockPull(vshControl *ctl, const vshCmd *cmd) > bool quit = false; > int abort_flags = 0; > > + if (vshCommandOptBool(cmd, "keep-relative") && > + !vshCommandOptBool(cmd, "base")) { > + vshError(ctl, "%s", _("--keep-relative is supported only with partial " > + "pull operations with --base specified")); > + return false; > + } Again, if virsh does less validation up front, then we can ensure that lower in the stack behaves sanely with unusual requests. I'm not sure this condition is worth having in virsh. > +++ b/tools/virsh.pod > > +Using the I<--keep-relative> flag will try to keep the backing chain names > +relative (if they were relative before). Hmm, this wording is a bit nicer compared to the sentence you added in 16/19; might be worth trying to make them similar. Looking forward to v6. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
Attachment:
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list