Wire up the new flag to virsh. Also, the 'dump' command had
undocumented flags.
* tools/virsh.c (cmdSave, cmdManagedSave, cmdDump): Add new flag.
* tools/virsh.pod (save, managedsave, dump): Document flags.
---
tools/virsh.c | 12 ++++++++++--
tools/virsh.pod | 17 ++++++++++++++---
2 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/tools/virsh.c b/tools/virsh.c
index bd6fea7..01c5b39 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -1530,6 +1530,7 @@ static const vshCmdInfo info_save[] = {
};
static const vshCmdOptDef opts_save[] = {
+ {"direct", VSH_OT_BOOL, 0, N_("use O_DIRECT when saving")},
{"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or
uuid")},
{"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("where to save the
data")},
{NULL, 0, 0, NULL}
@@ -1542,6 +1543,7 @@ cmdSave(vshControl *ctl, const vshCmd *cmd)
const char *name = NULL;
const char *to = NULL;
bool ret = true;
+ bool direct = vshCommandOptBool(cmd, "direct");
if (!vshConnectionUsability(ctl, ctl->conn))
return false;
@@ -1552,7 +1554,8 @@ cmdSave(vshControl *ctl, const vshCmd *cmd)
if (!(dom = vshCommandOptDomain(ctl, cmd, &name)))
return false;
- if (virDomainSave(dom, to) == 0) {
+ if ((direct ? virDomainSaveFlags(dom, to, NULL, VIR_DOMAIN_SAVE_DIRECT)
+ : virDomainSave(dom, to)) == 0) {
vshPrint(ctl, _("Domain %s saved to %s\n"), name, to);
} else {
vshError(ctl, _("Failed to save domain %s to %s"), name, to);
@@ -1576,6 +1579,7 @@ static const vshCmdInfo info_managedsave[] = {
};
static const vshCmdOptDef opts_managedsave[] = {
+ {"direct", VSH_OT_BOOL, 0, N_("use O_DIRECT when saving")},
{"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or
uuid")},
{NULL, 0, 0, NULL}
};
@@ -1586,6 +1590,7 @@ cmdManagedSave(vshControl *ctl, const vshCmd *cmd)
virDomainPtr dom;
const char *name;
bool ret = true;
+ bool direct = vshCommandOptBool(cmd, "direct");
if (!vshConnectionUsability(ctl, ctl->conn))
return false;
@@ -1593,7 +1598,7 @@ cmdManagedSave(vshControl *ctl, const vshCmd *cmd)
if (!(dom = vshCommandOptDomain(ctl, cmd, &name)))
return false;
- if (virDomainManagedSave(dom, 0) == 0) {
+ if (virDomainManagedSave(dom, direct ? VIR_DOMAIN_SAVE_DIRECT : 0) == 0) {
vshPrint(ctl, _("Domain %s state saved by libvirt\n"), name);
} else {
vshError(ctl, _("Failed to save domain %s state"), name);
@@ -1962,6 +1967,7 @@ static const vshCmdInfo info_dump[] = {
static const vshCmdOptDef opts_dump[] = {
{"live", VSH_OT_BOOL, 0, N_("perform a live core dump if
supported")},
{"crash", VSH_OT_BOOL, 0, N_("crash the domain after core
dump")},
+ {"direct", VSH_OT_BOOL, 0, N_("use O_DIRECT when saving")},
{"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or
uuid")},
{"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("where to dump the
core")},
{NULL, 0, 0, NULL}
@@ -1989,6 +1995,8 @@ cmdDump(vshControl *ctl, const vshCmd *cmd)
flags |= VIR_DUMP_LIVE;
if (vshCommandOptBool (cmd, "crash"))
flags |= VIR_DUMP_CRASH;
+ if (vshCommandOptBool(cmd, "direct"))
+ flags |= VIR_DUMP_DIRECT;
if (virDomainCoreDump(dom, to, flags) == 0) {
vshPrint(ctl, _("Domain %s dumped to %s\n"), name, to);
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 1a98ec1..97e7f10 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -471,9 +471,16 @@ named by I<format> to a domain XML format.
Convert the file I<xml> in domain XML format to the native guest
configuration format named by I<format>.
-=item B<dump> I<domain-id> I<corefilepath>
+=item B<dump> I<domain-id> I<corefilepath> [I<--live>]
[I<--crash>]
+[I<--direct>]
Dumps the core of a domain to a file for analysis.
+If I<--live> is specified, the domain continues to run until the core
+dump is complete, rather than pausing up front.
+If I<--crash> is specified, the domain is halted with a crashed status,
+rather than merely left in a paused state.
+If I<--direct> is specified, the save uses O_DIRECT, which reduces
+file system cache pressure but may slow down the operation.
=item B<dumpxml> I<domain-id> optional I<--inactive>
I<--security-info> I<--update-cpu>
@@ -507,11 +514,13 @@ except that it does some error checking.
The editor used can be supplied by the C<$VISUAL> or C<$EDITOR> environment
variables, and defaults to C<vi>.
-=item B<managedsave> I<domain-id>
+=item B<managedsave> I<domain-id> [I<--direct>]
Save and destroy (stop) a running domain, so it can be restarted from the same
state at a later time. When the virsh B<start> command is next run for
the domain, it will automatically be started from this saved state.
+If I<--direct> is specified, the save uses O_DIRECT, which reduces
+file system cache pressure but may slow down the operation.
=item B<managedsave-remove> I<domain-id>
@@ -590,13 +599,15 @@ should not reuse the saved state file for a second B<restore>
unless you
have also reverted all storage volumes back to the same contents as when
the state file was created.
-=item B<save> I<domain-id> I<state-file>
+=item B<save> I<domain-id> I<state-file> [I<--direct>]
Saves a running domain (RAM, but not disk state) to a state file so that
it can be restored
later. Once saved, the domain will no longer be running on the
system, thus the memory allocated for the domain will be free for
other domains to use. B<virsh restore> restores from this state file.
+If I<--direct> is specified, the save uses O_DIRECT, which reduces
+file system cache pressure but may slow down the operation.
This is roughly equivalent to doing a hibernate on a running computer,
with all the same limitations. Open network connections may be
--
1.7.4.4