These are exposed under domfsfreeze command and domfsthaw command. Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@xxxxxxx> --- 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>] -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list