From bda44ca2ca5bf06721df07b09df4e102d929bd7c Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Tue, 13 May 2014 17:59:32 +0200 Subject: [PATCH] lib: Introduce flag VIR_DOMAIN_BLOCK_COMMIT_RELATIVE Introduce flag for the block commit API to allow the commit operation to leave the chain relatively addressed. Also adds a virsh switch to enable this behavior. --- include/libvirt/libvirt.h.in | 3 +++ src/libvirt.c | 5 +++++ tools/virsh-domain.c | 6 ++++++ tools/virsh.pod | 5 +++-- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index aedd49ad57..8c4ee8b890 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -2606,6 +2606,9 @@ typedef enum { have been committed */ VIR_DOMAIN_BLOCK_COMMIT_ACTIVE = 1 << 2, /* Allow a two-phase commit when top is the active layer */ + VIR_DOMAIN_BLOCK_COMMIT_RELATIVE = 1 << 3, /* keep the backing chain + referenced using relative + names */ } virDomainBlockCommitFlags; int virDomainBlockCommit(virDomainPtr dom, const char *disk, const char *base, diff --git a/src/libvirt.c b/src/libvirt.c index b80b484cf1..f178727f01 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -19884,6 +19884,11 @@ virDomainBlockRebase(virDomainPtr dom, const char *disk, * VIR_DOMAIN_BLOCK_COMMIT_DELETE, then this command will unlink all files * that were invalidated, after the commit successfully completes. * + * If @flags contains VIR_DOMAIN_BLOCK_COMMIT_RELATIVE, the name recorded + * into the overlay of the @top image (if there is such image) as the + * path to the new backing file will be kept relative to other images. + * The operation will fail if libvirt can't infer the name. + * * By default, if @base is NULL, the commit target will be the bottom of * the backing chain; if @flags contains VIR_DOMAIN_BLOCK_COMMIT_SHALLOW, * then the immediate backing file of @top will be used instead. If @top diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 3efacede8c..ff804c5447 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -1505,6 +1505,8 @@ blockJobImpl(vshControl *ctl, const vshCmd *cmd, vshCommandOptBool(cmd, "pivot") || vshCommandOptBool(cmd, "keep-overlay")) flags |= VIR_DOMAIN_BLOCK_COMMIT_ACTIVE; + if (vshCommandOptBool(cmd, "keep-relative")) + flags |= VIR_DOMAIN_BLOCK_COMMIT_RELATIVE; ret = virDomainBlockCommit(dom, path, base, top, bandwidth, flags); break; case VSH_CMD_BLOCK_JOB_COPY: @@ -1638,6 +1640,10 @@ static const vshCmdOptDef opts_block_commit[] = { .type = VSH_OT_BOOL, .help = N_("with --wait, don't wait for cancel to finish") }, + {.name = "keep-relative", + .type = VSH_OT_BOOL, + .help = N_("keep the backing chain relatively referenced") + }, {.name = NULL} }; diff --git a/tools/virsh.pod b/tools/virsh.pod index 1b6f3c40ee..7f0e76a3ef 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -820,7 +820,7 @@ address of virtual interface (such as I or I) will accept the MAC address printed by this command. =item B I I [I] -[I] [I<--shallow>] [I] [I<--delete>] +[I] [I<--shallow>] [I] [I<--delete>] [I<--keep-relative>] [I<--wait> [I<--async>] [I<--verbose>]] [I<--timeout> B] [I<--active>] [{I<--pivot> | I<--keep-overlay>}] @@ -833,7 +833,8 @@ I<--shallow> can be used instead of I to specify the immediate backing file of the resulting top image to be committed. The files being committed are rendered invalid, possibly as soon as the operation starts; using the I<--delete> flag will attempt to remove these invalidated -files at the successful completion of the commit operation. +files at the successful completion of the commit operation. When the +I<--keep-relative> flag is used, the backing file paths will be kept relative. When I is omitted or specified as the active image, it is also possible to specify I<--active> to trigger a two-phase active commit. In