[libvirt] [PATCH v5 5/5] virsh: Expose new virDomainFSFreeze and virDomainFSThaw API

Tomoki Sekiyama tomoki.sekiyama at hds.com
Thu Apr 3 15:39:54 UTC 2014


These are exposed under domfsfreeze command and domfsthaw command.

Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama at hds.com>
---
 tools/virsh-domain.c |  128 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tools/virsh.pod      |   23 +++++++++
 2 files changed, 151 insertions(+)

diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 73414f8..331ba36 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -11391,6 +11391,122 @@ cmdDomFSTrim(vshControl *ctl, const vshCmd *cmd)
     return ret;
 }
 
+static const vshCmdInfo info_domfsfreeze[] = {
+    {.name = "help",
+     .data = N_("Freeze domain's mounted filesystems.")
+    },
+    {.name = "desc",
+     .data = N_("Freeze domain's mounted filesystems.")
+    },
+    {.name = NULL}
+};
+
+static const vshCmdOptDef opts_domfsfreeze[] = {
+    {.name = "domain",
+     .type = VSH_OT_DATA,
+     .flags = VSH_OFLAG_REQ,
+     .help = N_("domain name, id or uuid")
+    },
+    {.name = "disks",
+     .type = VSH_OT_DATA,
+     .help = N_("comma separated list of disks to be frozen")
+    },
+    {.name = NULL}
+};
+static bool
+cmdDomFSFreeze(vshControl *ctl, const vshCmd *cmd)
+{
+    virDomainPtr dom = NULL;
+    bool ret = false;
+    unsigned int flags = 0;
+    const char *disk_string = NULL;
+    char **disk_list = NULL;  /* tokenized disk_string */
+    int ndisks = 0;
+    size_t i;
+
+    ignore_value(vshCommandOptString(cmd, "disks", &disk_string));
+
+    if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
+        return ret;
+
+    if (disk_string) {
+        if ((ndisks = vshStringToArray(disk_string, &disk_list)) < 0)
+            goto cleanup;
+    }
+
+    if (virDomainFSFreeze(dom, (const char **)disk_list, ndisks, flags) < 0) {
+        vshError(ctl, _("Unable to freeze filesystems"));
+        goto cleanup;
+    }
+
+    ret = true;
+
+ cleanup:
+    for (i = 0; i < ndisks; i++)
+        VIR_FREE(disk_list[i]);
+    VIR_FREE(disk_list);
+    virDomainFree(dom);
+    return ret;
+}
+
+static const vshCmdInfo info_domfsthaw[] = {
+    {.name = "help",
+     .data = N_("Thaw domain's mounted filesystems.")
+    },
+    {.name = "desc",
+     .data = N_("Thaw domain's mounted filesystems.")
+    },
+    {.name = NULL}
+};
+
+static const vshCmdOptDef opts_domfsthaw[] = {
+    {.name = "domain",
+     .type = VSH_OT_DATA,
+     .flags = VSH_OFLAG_REQ,
+     .help = N_("domain name, id or uuid")
+    },
+    {.name = "disks",
+     .type = VSH_OT_DATA,
+     .help = N_("comma separated list of disks to be thawed")
+    },
+    {.name = NULL}
+};
+static bool
+cmdDomFSThaw(vshControl *ctl, const vshCmd *cmd)
+{
+    virDomainPtr dom = NULL;
+    bool ret = false;
+    unsigned int flags = 0;
+    const char *disk_string = NULL;
+    char **disk_list = NULL;  /* tokenized disk_string */
+    int ndisks = 0;
+    size_t i;
+
+    ignore_value(vshCommandOptString(cmd, "disks", &disk_string));
+
+    if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
+        return ret;
+
+    if (disk_string) {
+        if ((ndisks = vshStringToArray(disk_string, &disk_list)) < 0)
+            goto cleanup;
+    }
+
+    if (virDomainFSThaw(dom, (const char **)disk_list, ndisks, flags) < 0) {
+        vshError(ctl, _("Unable to thaw filesystems"));
+        goto cleanup;
+    }
+
+    ret = true;
+
+ cleanup:
+    for (i = 0; i < ndisks; i++)
+        VIR_FREE(disk_list[i]);
+    VIR_FREE(disk_list);
+    virDomainFree(dom);
+    return ret;
+}
+
 const vshCmdDef domManagementCmds[] = {
     {.name = "attach-device",
      .handler = cmdAttachDevice,
@@ -11538,6 +11654,18 @@ const vshCmdDef domManagementCmds[] = {
      .info = info_domdisplay,
      .flags = 0
     },
+    {.name = "domfsfreeze",
+     .handler = cmdDomFSFreeze,
+     .opts = opts_domfsfreeze,
+     .info = info_domfsfreeze,
+     .flags = 0
+    },
+    {.name = "domfsthaw",
+     .handler = cmdDomFSThaw,
+     .opts = opts_domfsthaw,
+     .info = info_domfsthaw,
+     .flags = 0
+    },
     {.name = "domfstrim",
      .handler = cmdDomFSTrim,
      .opts = opts_domfstrim,
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 98d891a..652aabc 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -941,6 +941,29 @@ Output a URI which can be used to connect to the graphical display of the
 domain via VNC, SPICE or RDP. If I<--include-password> is specified, the
 SPICE channel password will be included in the URI.
 
+=item B<domfsfreeze> I<domain> [I<--disks> B<disks>]
+
+Freeze all mounted filesystems within a running domain to prepare for
+consistent snapshots.
+
+The I<--disks> flag takes a parameter B<disks>, which is a comma separated
+list of names of disks to be frozen. If this is not specified, every mounted
+filesystem on the guest is frozen.
+
+Note that B<snapshot-create> command has a I<--quiesce> option to freeze
+and thaw the filesystems automatically to keep snapshots consistent.
+B<domfsfreeze> command is only needed when a user wants to utilize the
+native snapshot features of storage devices not supported by libvirt yet.
+
+=item B<domfsthaw> I<domain> [I<--disks> B<disks>]
+
+Thaw all mounted filesystems within a running domain, which are frozen
+by domfsfreeze command.
+
+The I<--disks> flag takes a parameter B<disks>, which is a comma separated
+list of names of disks to be thawed. If this is not specified, every mounted
+filesystem on the guest is thawed.
+
 =item B<domfstrim> I<domain> [I<--minimum> B<bytes>]
 [I<--mountpoint mountPoint>]
 




More information about the libvir-list mailing list