diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 3a7c260bd3..54d88672ce 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -11397,6 +11397,120 @@ 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 = "mountpoint", + .type = VSH_OT_ARGV, + .help = N_("mountpoint path to be frozen") + }, + {.name = NULL} +}; +static bool +cmdDomFSFreeze(vshControl *ctl, const vshCmd *cmd) +{ + virDomainPtr dom = NULL; + int ret = -1; + const vshCmdOpt *opt = NULL; + const char **mountpoints = NULL; + size_t nmountpoints = 0; + + if (!(dom = vshCommandOptDomain(ctl, cmd, NULL))) + return false; + + while ((opt = vshCommandOptArgv(cmd, opt))) { + if (VIR_EXPAND_N(mountpoints, nmountpoints, 1) < 0) { + vshError(ctl, _("%s: %d: failed to allocate mountpoints"), + __FILE__, __LINE__); + goto cleanup; + } + mountpoints[nmountpoints-1] = opt->data; + } + + ret = virDomainFSFreeze(dom, mountpoints, nmountpoints, 0); + if (ret < 0) { + vshError(ctl, _("Unable to freeze filesystems")); + goto cleanup; + } + + vshPrint(ctl, _("Froze %d filesystem(s)\n"), ret); + + cleanup: + VIR_FREE(mountpoints); + virDomainFree(dom); + return ret >= 0; +} + +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 = "mountpoint", + .type = VSH_OT_ARGV, + .help = N_("mountpoint path to be thawed") + }, + {.name = NULL} +}; +static bool +cmdDomFSThaw(vshControl *ctl, const vshCmd *cmd) +{ + virDomainPtr dom = NULL; + int ret = -1; + const vshCmdOpt *opt = NULL; + const char **mountpoints = NULL; + size_t nmountpoints = 0; + + if (!(dom = vshCommandOptDomain(ctl, cmd, NULL))) + return false; + + while ((opt = vshCommandOptArgv(cmd, opt))) { + if (VIR_EXPAND_N(mountpoints, nmountpoints, 1) < 0) { + vshError(ctl, _("%s: %d: failed to allocate mountpoints"), + __FILE__, __LINE__); + goto cleanup; + } + mountpoints[nmountpoints-1] = opt->data; + } + + ret = virDomainFSThaw(dom, mountpoints, nmountpoints, 0); + if (ret < 0) { + vshError(ctl, _("Unable to thaw filesystems")); + goto cleanup; + } + + vshPrint(ctl, _("Thawed %d filesystem(s)\n"), ret); + + cleanup: + VIR_FREE(mountpoints); + virDomainFree(dom); + return ret >= 0; +} + const vshCmdDef domManagementCmds[] = { {.name = "attach-device", .handler = cmdAttachDevice, @@ -11544,6 +11658,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 9104804324..22ca196249 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 I [[I<--mountpoint>] B...] + +Freeze mounted filesystems within a running domain to prepare for consistent +snapshots. + +The I<--mountpoint> option takes a parameter B, which is a +mount point path of the filesystem to be frozen. This option can occur +multiple times. If this is not specified, every mounted filesystem is frozen. + +Note: B command has a I<--quiesce> option to freeze +and thaw the filesystems automatically to keep snapshots consistent. +B command is only needed when a user wants to utilize the +native snapshot features of storage devices not supported by libvirt. + +=item B I [[I<--mountpoint>] B...] + +Thaw mounted filesystems within a running domain, which have been frozen by +domfsfreeze command. + +The I<--mountpoint> option takes a parameter B, which is a +mount point path of the filesystem to be thawed. This option can occur +multiple times. If this is not specified, every mounted filesystem is thawed. + =item B I [I<--minimum> B] [I<--mountpoint mountPoint>]