aboutsummaryrefslogtreecommitdiff
path: root/qga/vss-win32/provider.cpp
diff options
context:
space:
mode:
authorTomoki Sekiyama <tomoki.sekiyama@hds.com>2014-01-13 12:25:29 -0500
committerMichael Roth <mdroth@linux.vnet.ibm.com>2014-02-23 13:11:26 -0600
commitff8adbcfdbbd9c0f2b01ff8a32bc75082fdd9844 (patch)
tree5471f51bee348167b44832e72b41513f9623fde4 /qga/vss-win32/provider.cpp
parent4c1b8f1e8357d85c613d779596e4079cc581d74f (diff)
qga: vss-win32: Fix interference with snapshot creation by other VSS requesters
When a VSS requester such as vshadow.exe or diskshadow.exe requests to create disk snapshots, Windows may choose qemu-ga VSS provider if it is only provider registered on the system. However, because it provides only a function to freeze the filesystem, the snapshotting fails. This patch adds a check into CQGAVssProvider::IsVolumeSupported() to reject the request from other VSS requesters, so that the other provider is chosen. The check of requester is done by confirming event channels between qemu-ga's requester and provider established. To ensure that the events are initialized when CQGAVssProvider::IsVolumeSupported() is called, it moves the initialization earlier. Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com> Reviewed-by: Gal Hammer <ghammer@redhat.com> Reviewed-by: Yan Vugenfirer <yvugenfi@redhat.com> Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Diffstat (limited to 'qga/vss-win32/provider.cpp')
-rw-r--r--qga/vss-win32/provider.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/qga/vss-win32/provider.cpp b/qga/vss-win32/provider.cpp
index c3030d8e55..b2336465ac 100644
--- a/qga/vss-win32/provider.cpp
+++ b/qga/vss-win32/provider.cpp
@@ -291,8 +291,17 @@ STDMETHODIMP CQGAVssProvider::BeginPrepareSnapshot(
STDMETHODIMP CQGAVssProvider::IsVolumeSupported(
VSS_PWSZ pwszVolumeName, BOOL *pbSupportedByThisProvider)
{
- *pbSupportedByThisProvider = TRUE;
+ HANDLE hEventFrozen;
+
+ /* Check if a requester is qemu-ga by whether an event is created */
+ hEventFrozen = OpenEvent(EVENT_ALL_ACCESS, FALSE, EVENT_NAME_FROZEN);
+ if (!hEventFrozen) {
+ *pbSupportedByThisProvider = FALSE;
+ return S_OK;
+ }
+ CloseHandle(hEventFrozen);
+ *pbSupportedByThisProvider = TRUE;
return S_OK;
}