aboutsummaryrefslogtreecommitdiff
path: root/qga/vss-win32/requester.cpp
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2018-11-01 17:26:16 +0000
committerPeter Maydell <peter.maydell@linaro.org>2018-11-01 17:26:16 +0000
commitf96a3165ab1c36dbf4cb63e8761fa45457381aca (patch)
treea205d410506d616e109976d94675bf450df2fd90 /qga/vss-win32/requester.cpp
parent00878c95165de8ffc015a43e14249d789de1b8ff (diff)
parentb70d6afe4d7f252259d3344e12daa2d6baf006e2 (diff)
Merge remote-tracking branch 'remotes/mdroth/tags/qga-pull-2018-10-30-v3-tag' into staging
qemu-ga patch queue for soft-freeze * support for --retry-path option for recovering from communication path failures * support for serial/device name in guest-get-fsinfo for linux/w32 * support for freezing individual mount points in guest-fsfreeze-* * fixes for unicode paths on w32, not-present vcpus in guest-get-vcpus, buffer overflow in guest-get-fsinfo for w32, and other minor fixes v3: * remove redundant check for --static in configure * correct authorship on "qga-win: add debugging information" v2: * set libudev=off in configure for static builds # gpg: Signature made Wed 31 Oct 2018 14:13:58 GMT # gpg: using RSA key 3353C9CEF108B584 # gpg: Good signature from "Michael Roth <flukshun@gmail.com>" # gpg: aka "Michael Roth <mdroth@utexas.edu>" # gpg: aka "Michael Roth <mdroth@linux.vnet.ibm.com>" # Primary key fingerprint: CEAC C9E1 5534 EBAB B82D 3FA0 3353 C9CE F108 B584 * remotes/mdroth/tags/qga-pull-2018-10-30-v3-tag: (24 commits) qga-win: changing --retry-path option behavior qga-win: report specific error when failing to open channel qga-win: install service with --retry-path set by default qga: add --retry-path option for re-initializing channel on failure qga: move w32 service handling out of run_agent() qga: hang GAConfig/socket_activation off of GAState global qga: group agent init/cleanup init separate routines qga: fix an off-by-one issue qga-win: demystify namespace stripping qga-win: return disk device in guest-get-fsinfo qga-win: handle multi-disk volumes qga-win: refactor disk info qga-win: report disk serial number qga-win: refactor disk properties (bus) qga-win: add debugging information build: rename CONFIG_QGA_NTDDDISK to CONFIG_QGA_NTDDSCSI qga-win: fsinfo: pci-info: allow partial info qga-win: prevent crash when executing fsinfo command qga: linux: return disk device in guest-get-fsinfo qga: linux: report disk serial number ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'qga/vss-win32/requester.cpp')
-rw-r--r--qga/vss-win32/requester.cpp92
1 files changed, 66 insertions, 26 deletions
diff --git a/qga/vss-win32/requester.cpp b/qga/vss-win32/requester.cpp
index 3d9c9716c0..5378c55d23 100644
--- a/qga/vss-win32/requester.cpp
+++ b/qga/vss-win32/requester.cpp
@@ -234,7 +234,7 @@ out:
}
}
-void requester_freeze(int *num_vols, ErrorSet *errset)
+void requester_freeze(int *num_vols, void *mountpoints, ErrorSet *errset)
{
COMPointer<IVssAsync> pAsync;
HANDLE volume;
@@ -246,6 +246,7 @@ void requester_freeze(int *num_vols, ErrorSet *errset)
WCHAR short_volume_name[64], *display_name = short_volume_name;
DWORD wait_status;
int num_fixed_drives = 0, i;
+ int num_mount_points = 0;
if (vss_ctx.pVssbc) { /* already frozen */
*num_vols = 0;
@@ -337,39 +338,73 @@ void requester_freeze(int *num_vols, ErrorSet *errset)
goto out;
}
- volume = FindFirstVolumeW(short_volume_name, sizeof(short_volume_name));
- if (volume == INVALID_HANDLE_VALUE) {
- err_set(errset, hr, "failed to find first volume");
- goto out;
- }
- for (;;) {
- if (GetDriveTypeW(short_volume_name) == DRIVE_FIXED) {
+ if (mountpoints) {
+ PWCHAR volume_name_wchar;
+ for (volList *list = (volList *)mountpoints; list; list = list->next) {
+ size_t len = strlen(list->value) + 1;
+ size_t converted = 0;
VSS_ID pid;
- hr = vss_ctx.pVssbc->AddToSnapshotSet(short_volume_name,
+
+ volume_name_wchar = new wchar_t[len];
+ mbstowcs_s(&converted, volume_name_wchar, len,
+ list->value, _TRUNCATE);
+
+ hr = vss_ctx.pVssbc->AddToSnapshotSet(volume_name_wchar,
g_gProviderId, &pid);
if (FAILED(hr)) {
- WCHAR volume_path_name[PATH_MAX];
- if (GetVolumePathNamesForVolumeNameW(
- short_volume_name, volume_path_name,
- sizeof(volume_path_name), NULL) && *volume_path_name) {
- display_name = volume_path_name;
- }
err_set(errset, hr, "failed to add %S to snapshot set",
- display_name);
- FindVolumeClose(volume);
+ volume_name_wchar);
+ delete volume_name_wchar;
goto out;
}
- num_fixed_drives++;
+ num_mount_points++;
+
+ delete volume_name_wchar;
}
- if (!FindNextVolumeW(volume, short_volume_name,
- sizeof(short_volume_name))) {
- FindVolumeClose(volume);
- break;
+
+ if (num_mount_points == 0) {
+ /* If there is no valid mount points, just exit. */
+ goto out;
}
}
- if (num_fixed_drives == 0) {
- goto out; /* If there is no fixed drive, just exit. */
+ if (!mountpoints) {
+ volume = FindFirstVolumeW(short_volume_name, sizeof(short_volume_name));
+ if (volume == INVALID_HANDLE_VALUE) {
+ err_set(errset, hr, "failed to find first volume");
+ goto out;
+ }
+
+ for (;;) {
+ if (GetDriveTypeW(short_volume_name) == DRIVE_FIXED) {
+ VSS_ID pid;
+ hr = vss_ctx.pVssbc->AddToSnapshotSet(short_volume_name,
+ g_gProviderId, &pid);
+ if (FAILED(hr)) {
+ WCHAR volume_path_name[PATH_MAX];
+ if (GetVolumePathNamesForVolumeNameW(
+ short_volume_name, volume_path_name,
+ sizeof(volume_path_name), NULL) &&
+ *volume_path_name) {
+ display_name = volume_path_name;
+ }
+ err_set(errset, hr, "failed to add %S to snapshot set",
+ display_name);
+ FindVolumeClose(volume);
+ goto out;
+ }
+ num_fixed_drives++;
+ }
+ if (!FindNextVolumeW(volume, short_volume_name,
+ sizeof(short_volume_name))) {
+ FindVolumeClose(volume);
+ break;
+ }
+ }
+
+ if (num_fixed_drives == 0) {
+ goto out; /* If there is no fixed drive, just exit. */
+ }
}
hr = vss_ctx.pVssbc->PrepareForBackup(pAsync.replace());
@@ -435,7 +470,12 @@ void requester_freeze(int *num_vols, ErrorSet *errset)
goto out;
}
- *num_vols = vss_ctx.cFrozenVols = num_fixed_drives;
+ if (mountpoints) {
+ *num_vols = vss_ctx.cFrozenVols = num_mount_points;
+ } else {
+ *num_vols = vss_ctx.cFrozenVols = num_fixed_drives;
+ }
+
return;
out:
@@ -449,7 +489,7 @@ out1:
}
-void requester_thaw(int *num_vols, ErrorSet *errset)
+void requester_thaw(int *num_vols, void *mountpints, ErrorSet *errset)
{
COMPointer<IVssAsync> pAsync;