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 | 4 ++++
src/libvirt.c | 5 +++++
tools/virsh-domain.c | 7 +++++++
tools/virsh.pod | 5 +++--
4 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index c83b20d..d165fea 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -2599,6 +2599,10 @@ 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, /* try to keep the backing chain
+ relative if the components
+ removed by the commit are
+ already relative */
} virDomainBlockCommitFlags;
int virDomainBlockCommit(virDomainPtr dom, const char *disk, const char *base,
diff --git a/src/libvirt.c b/src/libvirt.c
index 83b7437..eef014e 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -19879,6 +19879,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 as path to the new backing file
+ * will be kept relative to other images in case the backing chain was
+ * using relative names.
+ *
* 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 0ae1538..1d99cce 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -1496,6 +1496,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:
@@ -1629,6 +1631,11 @@ 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 relative if it was relatively "
+ "referenced if it was before")
+ },
{.name = NULL}
};
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 2c0f18a..40163b2 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -782,7 +782,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<blockcommit> I<domain> I<path> [I<bandwidth>]
-[I<base>] [I<--shallow>] [I<top>] [I<--delete>]
+[I<base>] [I<--shallow>] [I<top>] [I<--delete>]
[I<--keep-relative>]
[I<--wait> [I<--async>] [I<--verbose>]] [I<--timeout>
B<seconds>]
[I<--active>] [{I<--pivot> | I<--keep-overlay>}]
@@ -795,7 +795,8 @@ I<--shallow> can be used instead of I<base> 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<top> is omitted or specified as the active image, it is also
possible to specify I<--active> to trigger a two-phase active commit. In
--
1.9.3