* [Qemu-devel] [PATCH 1/3] qga: vss-win32: Use NULL as an invalid pointer for OpenEvent and CreateEvent
2014-01-13 17:25 [Qemu-devel] [PATCH 0/3] qga: vss-win32: Fix interference with other VSS requesters Tomoki Sekiyama
@ 2014-01-13 17:25 ` Tomoki Sekiyama
2014-01-14 8:32 ` Gal Hammer
2014-01-19 10:22 ` Yan Vugenfirer
2014-01-13 17:25 ` [Qemu-devel] [PATCH 2/3] qga: vss-win32: Fix interference with snapshot creation by other VSS requesters Tomoki Sekiyama
` (2 subsequent siblings)
3 siblings, 2 replies; 11+ messages in thread
From: Tomoki Sekiyama @ 2014-01-13 17:25 UTC (permalink / raw)
To: qemu-devel
Cc: ghammer, mdroth, lcapitulino, mitsuhiro.tanino, rhod, pbonzini,
seiji.aguchi, areis
OpenEvent and CreateEvent WinAPI return NULL when failed to open/create
events handles, instead of INVALID_HANDLE_VALUE (although their return
types are HANDLE).
This replaces INVALID_HANDLE_VALUE related to event handles with NULL.
Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com>
---
qga/vss-win32/provider.cpp | 6 +++---
qga/vss-win32/requester.cpp | 24 ++++++++++--------------
2 files changed, 13 insertions(+), 17 deletions(-)
diff --git a/qga/vss-win32/provider.cpp b/qga/vss-win32/provider.cpp
index bf42b5e..c3030d8 100644
--- a/qga/vss-win32/provider.cpp
+++ b/qga/vss-win32/provider.cpp
@@ -342,18 +342,18 @@ STDMETHODIMP CQGAVssProvider::CommitSnapshots(VSS_ID SnapshotSetId)
HANDLE hEventFrozen, hEventThaw, hEventTimeout;
hEventFrozen = OpenEvent(EVENT_ALL_ACCESS, FALSE, EVENT_NAME_FROZEN);
- if (hEventFrozen == INVALID_HANDLE_VALUE) {
+ if (!hEventFrozen) {
return E_FAIL;
}
hEventThaw = OpenEvent(EVENT_ALL_ACCESS, FALSE, EVENT_NAME_THAW);
- if (hEventThaw == INVALID_HANDLE_VALUE) {
+ if (!hEventThaw) {
CloseHandle(hEventFrozen);
return E_FAIL;
}
hEventTimeout = OpenEvent(EVENT_ALL_ACCESS, FALSE, EVENT_NAME_TIMEOUT);
- if (hEventTimeout == INVALID_HANDLE_VALUE) {
+ if (!hEventTimeout) {
CloseHandle(hEventFrozen);
CloseHandle(hEventThaw);
return E_FAIL;
diff --git a/qga/vss-win32/requester.cpp b/qga/vss-win32/requester.cpp
index 1e8dd3d..0a55447 100644
--- a/qga/vss-win32/requester.cpp
+++ b/qga/vss-win32/requester.cpp
@@ -50,10 +50,6 @@ static struct QGAVSSContext {
STDAPI requester_init(void)
{
- vss_ctx.hEventFrozen = INVALID_HANDLE_VALUE;
- vss_ctx.hEventThaw = INVALID_HANDLE_VALUE;
- vss_ctx.hEventTimeout = INVALID_HANDLE_VALUE;
-
COMInitializer initializer; /* to call CoInitializeSecurity */
HRESULT hr = CoInitializeSecurity(
NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
@@ -94,17 +90,17 @@ STDAPI requester_init(void)
static void requester_cleanup(void)
{
- if (vss_ctx.hEventFrozen != INVALID_HANDLE_VALUE) {
+ if (vss_ctx.hEventFrozen) {
CloseHandle(vss_ctx.hEventFrozen);
- vss_ctx.hEventFrozen = INVALID_HANDLE_VALUE;
+ vss_ctx.hEventFrozen = NULL;
}
- if (vss_ctx.hEventThaw != INVALID_HANDLE_VALUE) {
+ if (vss_ctx.hEventThaw) {
CloseHandle(vss_ctx.hEventThaw);
- vss_ctx.hEventThaw = INVALID_HANDLE_VALUE;
+ vss_ctx.hEventThaw = NULL;
}
- if (vss_ctx.hEventTimeout != INVALID_HANDLE_VALUE) {
+ if (vss_ctx.hEventTimeout) {
CloseHandle(vss_ctx.hEventTimeout);
- vss_ctx.hEventTimeout = INVALID_HANDLE_VALUE;
+ vss_ctx.hEventTimeout = NULL;
}
if (vss_ctx.pAsyncSnapshot) {
vss_ctx.pAsyncSnapshot->Release();
@@ -374,19 +370,19 @@ void requester_freeze(int *num_vols, ErrorSet *errset)
sa.bInheritHandle = FALSE;
vss_ctx.hEventFrozen = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_FROZEN);
- if (vss_ctx.hEventFrozen == INVALID_HANDLE_VALUE) {
+ if (!vss_ctx.hEventFrozen) {
err_set(errset, GetLastError(), "failed to create event %s",
EVENT_NAME_FROZEN);
goto out;
}
vss_ctx.hEventThaw = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_THAW);
- if (vss_ctx.hEventThaw == INVALID_HANDLE_VALUE) {
+ if (!vss_ctx.hEventThaw) {
err_set(errset, GetLastError(), "failed to create event %s",
EVENT_NAME_THAW);
goto out;
}
vss_ctx.hEventTimeout = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_TIMEOUT);
- if (vss_ctx.hEventTimeout == INVALID_HANDLE_VALUE) {
+ if (!vss_ctx.hEventTimeout) {
err_set(errset, GetLastError(), "failed to create event %s",
EVENT_NAME_TIMEOUT);
goto out;
@@ -443,7 +439,7 @@ void requester_thaw(int *num_vols, ErrorSet *errset)
{
COMPointer<IVssAsync> pAsync;
- if (vss_ctx.hEventThaw == INVALID_HANDLE_VALUE) {
+ if (!vss_ctx.hEventThaw) {
/*
* In this case, DoSnapshotSet is aborted or not started,
* and no volumes must be frozen. We return without an error.
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 1/3] qga: vss-win32: Use NULL as an invalid pointer for OpenEvent and CreateEvent
2014-01-13 17:25 ` [Qemu-devel] [PATCH 1/3] qga: vss-win32: Use NULL as an invalid pointer for OpenEvent and CreateEvent Tomoki Sekiyama
@ 2014-01-14 8:32 ` Gal Hammer
2014-01-19 10:22 ` Yan Vugenfirer
1 sibling, 0 replies; 11+ messages in thread
From: Gal Hammer @ 2014-01-14 8:32 UTC (permalink / raw)
To: Tomoki Sekiyama, qemu-devel
Cc: mdroth, lcapitulino, mitsuhiro.tanino, rhod, pbonzini,
seiji.aguchi, areis
On 13/01/2014 19:25, Tomoki Sekiyama wrote:
> OpenEvent and CreateEvent WinAPI return NULL when failed to open/create
> events handles, instead of INVALID_HANDLE_VALUE (although their return
> types are HANDLE).
> This replaces INVALID_HANDLE_VALUE related to event handles with NULL.
>
> Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com>
Reviewed-by: Gal Hammer <ghammer@redhat.com>
Gal.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 1/3] qga: vss-win32: Use NULL as an invalid pointer for OpenEvent and CreateEvent
2014-01-13 17:25 ` [Qemu-devel] [PATCH 1/3] qga: vss-win32: Use NULL as an invalid pointer for OpenEvent and CreateEvent Tomoki Sekiyama
2014-01-14 8:32 ` Gal Hammer
@ 2014-01-19 10:22 ` Yan Vugenfirer
1 sibling, 0 replies; 11+ messages in thread
From: Yan Vugenfirer @ 2014-01-19 10:22 UTC (permalink / raw)
To: Tomoki Sekiyama
Cc: mdroth, Gal Hammer, qemu-devel list, Luiz Capitulino,
mitsuhiro.tanino, Ronen Hod, Paolo Bonzini, Seiji Aguchi,
Ademar de Souza Reis Jr.
On Jan 13, 2014, at 7:25 PM, Tomoki Sekiyama <tomoki.sekiyama@hds.com> wrote:
> OpenEvent and CreateEvent WinAPI return NULL when failed to open/create
> events handles, instead of INVALID_HANDLE_VALUE (although their return
> types are HANDLE).
> This replaces INVALID_HANDLE_VALUE related to event handles with NULL.
>
> Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com>
> ---
> qga/vss-win32/provider.cpp | 6 +++---
> qga/vss-win32/requester.cpp | 24 ++++++++++--------------
> 2 files changed, 13 insertions(+), 17 deletions(-)
>
> diff --git a/qga/vss-win32/provider.cpp b/qga/vss-win32/provider.cpp
> index bf42b5e..c3030d8 100644
> --- a/qga/vss-win32/provider.cpp
> +++ b/qga/vss-win32/provider.cpp
> @@ -342,18 +342,18 @@ STDMETHODIMP CQGAVssProvider::CommitSnapshots(VSS_ID SnapshotSetId)
> HANDLE hEventFrozen, hEventThaw, hEventTimeout;
>
> hEventFrozen = OpenEvent(EVENT_ALL_ACCESS, FALSE, EVENT_NAME_FROZEN);
> - if (hEventFrozen == INVALID_HANDLE_VALUE) {
> + if (!hEventFrozen) {
> return E_FAIL;
> }
>
> hEventThaw = OpenEvent(EVENT_ALL_ACCESS, FALSE, EVENT_NAME_THAW);
> - if (hEventThaw == INVALID_HANDLE_VALUE) {
> + if (!hEventThaw) {
> CloseHandle(hEventFrozen);
> return E_FAIL;
> }
>
> hEventTimeout = OpenEvent(EVENT_ALL_ACCESS, FALSE, EVENT_NAME_TIMEOUT);
> - if (hEventTimeout == INVALID_HANDLE_VALUE) {
> + if (!hEventTimeout) {
> CloseHandle(hEventFrozen);
> CloseHandle(hEventThaw);
> return E_FAIL;
> diff --git a/qga/vss-win32/requester.cpp b/qga/vss-win32/requester.cpp
> index 1e8dd3d..0a55447 100644
> --- a/qga/vss-win32/requester.cpp
> +++ b/qga/vss-win32/requester.cpp
> @@ -50,10 +50,6 @@ static struct QGAVSSContext {
>
> STDAPI requester_init(void)
> {
> - vss_ctx.hEventFrozen = INVALID_HANDLE_VALUE;
> - vss_ctx.hEventThaw = INVALID_HANDLE_VALUE;
> - vss_ctx.hEventTimeout = INVALID_HANDLE_VALUE;
> -
> COMInitializer initializer; /* to call CoInitializeSecurity */
> HRESULT hr = CoInitializeSecurity(
> NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
> @@ -94,17 +90,17 @@ STDAPI requester_init(void)
>
> static void requester_cleanup(void)
> {
> - if (vss_ctx.hEventFrozen != INVALID_HANDLE_VALUE) {
> + if (vss_ctx.hEventFrozen) {
> CloseHandle(vss_ctx.hEventFrozen);
> - vss_ctx.hEventFrozen = INVALID_HANDLE_VALUE;
> + vss_ctx.hEventFrozen = NULL;
> }
> - if (vss_ctx.hEventThaw != INVALID_HANDLE_VALUE) {
> + if (vss_ctx.hEventThaw) {
> CloseHandle(vss_ctx.hEventThaw);
> - vss_ctx.hEventThaw = INVALID_HANDLE_VALUE;
> + vss_ctx.hEventThaw = NULL;
> }
> - if (vss_ctx.hEventTimeout != INVALID_HANDLE_VALUE) {
> + if (vss_ctx.hEventTimeout) {
> CloseHandle(vss_ctx.hEventTimeout);
> - vss_ctx.hEventTimeout = INVALID_HANDLE_VALUE;
> + vss_ctx.hEventTimeout = NULL;
> }
> if (vss_ctx.pAsyncSnapshot) {
> vss_ctx.pAsyncSnapshot->Release();
> @@ -374,19 +370,19 @@ void requester_freeze(int *num_vols, ErrorSet *errset)
> sa.bInheritHandle = FALSE;
>
> vss_ctx.hEventFrozen = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_FROZEN);
> - if (vss_ctx.hEventFrozen == INVALID_HANDLE_VALUE) {
> + if (!vss_ctx.hEventFrozen) {
> err_set(errset, GetLastError(), "failed to create event %s",
> EVENT_NAME_FROZEN);
> goto out;
> }
> vss_ctx.hEventThaw = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_THAW);
> - if (vss_ctx.hEventThaw == INVALID_HANDLE_VALUE) {
> + if (!vss_ctx.hEventThaw) {
> err_set(errset, GetLastError(), "failed to create event %s",
> EVENT_NAME_THAW);
> goto out;
> }
> vss_ctx.hEventTimeout = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_TIMEOUT);
> - if (vss_ctx.hEventTimeout == INVALID_HANDLE_VALUE) {
> + if (!vss_ctx.hEventTimeout) {
> err_set(errset, GetLastError(), "failed to create event %s",
> EVENT_NAME_TIMEOUT);
> goto out;
> @@ -443,7 +439,7 @@ void requester_thaw(int *num_vols, ErrorSet *errset)
> {
> COMPointer<IVssAsync> pAsync;
>
> - if (vss_ctx.hEventThaw == INVALID_HANDLE_VALUE) {
> + if (!vss_ctx.hEventThaw) {
> /*
> * In this case, DoSnapshotSet is aborted or not started,
> * and no volumes must be frozen. We return without an error.
>
>
Reviewed-by: Yan Vugenfirer <yvugenfi@redhat.com>
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 2/3] qga: vss-win32: Fix interference with snapshot creation by other VSS requesters
2014-01-13 17:25 [Qemu-devel] [PATCH 0/3] qga: vss-win32: Fix interference with other VSS requesters Tomoki Sekiyama
2014-01-13 17:25 ` [Qemu-devel] [PATCH 1/3] qga: vss-win32: Use NULL as an invalid pointer for OpenEvent and CreateEvent Tomoki Sekiyama
@ 2014-01-13 17:25 ` Tomoki Sekiyama
2014-01-14 8:33 ` Gal Hammer
2014-01-19 10:21 ` Yan Vugenfirer
2014-01-13 17:25 ` [Qemu-devel] [PATCH 3/3] qga: vss-win32: Fix interference with snapshot deletion by other VSS request Tomoki Sekiyama
2014-02-24 0:58 ` [Qemu-devel] [PATCH 0/3] qga: vss-win32: Fix interference with other VSS requesters Michael Roth
3 siblings, 2 replies; 11+ messages in thread
From: Tomoki Sekiyama @ 2014-01-13 17:25 UTC (permalink / raw)
To: qemu-devel
Cc: ghammer, mdroth, lcapitulino, mitsuhiro.tanino, rhod, pbonzini,
seiji.aguchi, areis
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>
---
qga/vss-win32/provider.cpp | 11 ++++++++-
qga/vss-win32/requester.cpp | 52 ++++++++++++++++++++++---------------------
2 files changed, 36 insertions(+), 27 deletions(-)
diff --git a/qga/vss-win32/provider.cpp b/qga/vss-win32/provider.cpp
index c3030d8..b233646 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;
}
diff --git a/qga/vss-win32/requester.cpp b/qga/vss-win32/requester.cpp
index 0a55447..922e74d 100644
--- a/qga/vss-win32/requester.cpp
+++ b/qga/vss-win32/requester.cpp
@@ -252,6 +252,32 @@ void requester_freeze(int *num_vols, ErrorSet *errset)
CoInitialize(NULL);
+ /* Allow unrestricted access to events */
+ InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
+ SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);
+ sa.nLength = sizeof(sa);
+ sa.lpSecurityDescriptor = &sd;
+ sa.bInheritHandle = FALSE;
+
+ vss_ctx.hEventFrozen = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_FROZEN);
+ if (!vss_ctx.hEventFrozen) {
+ err_set(errset, GetLastError(), "failed to create event %s",
+ EVENT_NAME_FROZEN);
+ goto out;
+ }
+ vss_ctx.hEventThaw = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_THAW);
+ if (!vss_ctx.hEventThaw) {
+ err_set(errset, GetLastError(), "failed to create event %s",
+ EVENT_NAME_THAW);
+ goto out;
+ }
+ vss_ctx.hEventTimeout = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_TIMEOUT);
+ if (!vss_ctx.hEventTimeout) {
+ err_set(errset, GetLastError(), "failed to create event %s",
+ EVENT_NAME_TIMEOUT);
+ goto out;
+ }
+
assert(pCreateVssBackupComponents != NULL);
hr = pCreateVssBackupComponents(&vss_ctx.pVssbc);
if (FAILED(hr)) {
@@ -362,32 +388,6 @@ void requester_freeze(int *num_vols, ErrorSet *errset)
goto out;
}
- /* Allow unrestricted access to events */
- InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
- SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);
- sa.nLength = sizeof(sa);
- sa.lpSecurityDescriptor = &sd;
- sa.bInheritHandle = FALSE;
-
- vss_ctx.hEventFrozen = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_FROZEN);
- if (!vss_ctx.hEventFrozen) {
- err_set(errset, GetLastError(), "failed to create event %s",
- EVENT_NAME_FROZEN);
- goto out;
- }
- vss_ctx.hEventThaw = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_THAW);
- if (!vss_ctx.hEventThaw) {
- err_set(errset, GetLastError(), "failed to create event %s",
- EVENT_NAME_THAW);
- goto out;
- }
- vss_ctx.hEventTimeout = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_TIMEOUT);
- if (!vss_ctx.hEventTimeout) {
- err_set(errset, GetLastError(), "failed to create event %s",
- EVENT_NAME_TIMEOUT);
- goto out;
- }
-
/*
* Start VSS quiescing operations.
* CQGAVssProvider::CommitSnapshots will kick vss_ctx.hEventFrozen
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 2/3] qga: vss-win32: Fix interference with snapshot creation by other VSS requesters
2014-01-13 17:25 ` [Qemu-devel] [PATCH 2/3] qga: vss-win32: Fix interference with snapshot creation by other VSS requesters Tomoki Sekiyama
@ 2014-01-14 8:33 ` Gal Hammer
2014-01-19 10:21 ` Yan Vugenfirer
1 sibling, 0 replies; 11+ messages in thread
From: Gal Hammer @ 2014-01-14 8:33 UTC (permalink / raw)
To: Tomoki Sekiyama, qemu-devel
Cc: mdroth, lcapitulino, mitsuhiro.tanino, rhod, pbonzini,
seiji.aguchi, areis
On 13/01/2014 19:25, Tomoki Sekiyama wrote:
> 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>
Gal.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 2/3] qga: vss-win32: Fix interference with snapshot creation by other VSS requesters
2014-01-13 17:25 ` [Qemu-devel] [PATCH 2/3] qga: vss-win32: Fix interference with snapshot creation by other VSS requesters Tomoki Sekiyama
2014-01-14 8:33 ` Gal Hammer
@ 2014-01-19 10:21 ` Yan Vugenfirer
1 sibling, 0 replies; 11+ messages in thread
From: Yan Vugenfirer @ 2014-01-19 10:21 UTC (permalink / raw)
To: Tomoki Sekiyama
Cc: mdroth, Gal Hammer, qemu-devel list, Luiz Capitulino,
mitsuhiro.tanino, Ronen Hod, Paolo Bonzini, Seiji Aguchi,
Ademar de Souza Reis Jr.
On Jan 13, 2014, at 7:25 PM, Tomoki Sekiyama <tomoki.sekiyama@hds.com> wrote:
> 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>
> ---
> qga/vss-win32/provider.cpp | 11 ++++++++-
> qga/vss-win32/requester.cpp | 52 ++++++++++++++++++++++---------------------
> 2 files changed, 36 insertions(+), 27 deletions(-)
>
> diff --git a/qga/vss-win32/provider.cpp b/qga/vss-win32/provider.cpp
> index c3030d8..b233646 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;
> }
>
> diff --git a/qga/vss-win32/requester.cpp b/qga/vss-win32/requester.cpp
> index 0a55447..922e74d 100644
> --- a/qga/vss-win32/requester.cpp
> +++ b/qga/vss-win32/requester.cpp
> @@ -252,6 +252,32 @@ void requester_freeze(int *num_vols, ErrorSet *errset)
>
> CoInitialize(NULL);
>
> + /* Allow unrestricted access to events */
> + InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
> + SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);
> + sa.nLength = sizeof(sa);
> + sa.lpSecurityDescriptor = &sd;
> + sa.bInheritHandle = FALSE;
> +
> + vss_ctx.hEventFrozen = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_FROZEN);
> + if (!vss_ctx.hEventFrozen) {
> + err_set(errset, GetLastError(), "failed to create event %s",
> + EVENT_NAME_FROZEN);
> + goto out;
> + }
> + vss_ctx.hEventThaw = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_THAW);
> + if (!vss_ctx.hEventThaw) {
> + err_set(errset, GetLastError(), "failed to create event %s",
> + EVENT_NAME_THAW);
> + goto out;
> + }
> + vss_ctx.hEventTimeout = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_TIMEOUT);
> + if (!vss_ctx.hEventTimeout) {
> + err_set(errset, GetLastError(), "failed to create event %s",
> + EVENT_NAME_TIMEOUT);
> + goto out;
> + }
> +
> assert(pCreateVssBackupComponents != NULL);
> hr = pCreateVssBackupComponents(&vss_ctx.pVssbc);
> if (FAILED(hr)) {
> @@ -362,32 +388,6 @@ void requester_freeze(int *num_vols, ErrorSet *errset)
> goto out;
> }
>
> - /* Allow unrestricted access to events */
> - InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
> - SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);
> - sa.nLength = sizeof(sa);
> - sa.lpSecurityDescriptor = &sd;
> - sa.bInheritHandle = FALSE;
> -
> - vss_ctx.hEventFrozen = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_FROZEN);
> - if (!vss_ctx.hEventFrozen) {
> - err_set(errset, GetLastError(), "failed to create event %s",
> - EVENT_NAME_FROZEN);
> - goto out;
> - }
> - vss_ctx.hEventThaw = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_THAW);
> - if (!vss_ctx.hEventThaw) {
> - err_set(errset, GetLastError(), "failed to create event %s",
> - EVENT_NAME_THAW);
> - goto out;
> - }
> - vss_ctx.hEventTimeout = CreateEvent(&sa, TRUE, FALSE, EVENT_NAME_TIMEOUT);
> - if (!vss_ctx.hEventTimeout) {
> - err_set(errset, GetLastError(), "failed to create event %s",
> - EVENT_NAME_TIMEOUT);
> - goto out;
> - }
> -
> /*
> * Start VSS quiescing operations.
> * CQGAVssProvider::CommitSnapshots will kick vss_ctx.hEventFrozen
>
>
Reviewed-by: Yan Vugenfirer <yvugenfi@redhat.com>
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 3/3] qga: vss-win32: Fix interference with snapshot deletion by other VSS request
2014-01-13 17:25 [Qemu-devel] [PATCH 0/3] qga: vss-win32: Fix interference with other VSS requesters Tomoki Sekiyama
2014-01-13 17:25 ` [Qemu-devel] [PATCH 1/3] qga: vss-win32: Use NULL as an invalid pointer for OpenEvent and CreateEvent Tomoki Sekiyama
2014-01-13 17:25 ` [Qemu-devel] [PATCH 2/3] qga: vss-win32: Fix interference with snapshot creation by other VSS requesters Tomoki Sekiyama
@ 2014-01-13 17:25 ` Tomoki Sekiyama
2014-01-14 8:34 ` Gal Hammer
2014-01-19 10:21 ` Yan Vugenfirer
2014-02-24 0:58 ` [Qemu-devel] [PATCH 0/3] qga: vss-win32: Fix interference with other VSS requesters Michael Roth
3 siblings, 2 replies; 11+ messages in thread
From: Tomoki Sekiyama @ 2014-01-13 17:25 UTC (permalink / raw)
To: qemu-devel
Cc: ghammer, mdroth, lcapitulino, mitsuhiro.tanino, rhod, pbonzini,
seiji.aguchi, areis
When a VSS requester such as vshadow.exe or diskshadow.exe requests to
delete snapshots, qemu-ga VSS provider's DeleteSnapshots() is also called
and returns E_NOTIMPL, that makes the deletion fail.
To avoid this issue, return S_OK and set values that represent no snapshots
are deleted by qemu-ga VSS provider.
Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com>
---
qga/vss-win32/provider.cpp | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/qga/vss-win32/provider.cpp b/qga/vss-win32/provider.cpp
index b233646..d5129f8 100644
--- a/qga/vss-win32/provider.cpp
+++ b/qga/vss-win32/provider.cpp
@@ -278,7 +278,9 @@ STDMETHODIMP CQGAVssProvider::DeleteSnapshots(
VSS_ID SourceObjectId, VSS_OBJECT_TYPE eSourceObjectType,
BOOL bForceDelete, LONG *plDeletedSnapshots, VSS_ID *pNondeletedSnapshotID)
{
- return E_NOTIMPL;
+ *plDeletedSnapshots = 0;
+ *pNondeletedSnapshotID = SourceObjectId;
+ return S_OK;
}
STDMETHODIMP CQGAVssProvider::BeginPrepareSnapshot(
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 3/3] qga: vss-win32: Fix interference with snapshot deletion by other VSS request
2014-01-13 17:25 ` [Qemu-devel] [PATCH 3/3] qga: vss-win32: Fix interference with snapshot deletion by other VSS request Tomoki Sekiyama
@ 2014-01-14 8:34 ` Gal Hammer
2014-01-19 10:21 ` Yan Vugenfirer
1 sibling, 0 replies; 11+ messages in thread
From: Gal Hammer @ 2014-01-14 8:34 UTC (permalink / raw)
To: Tomoki Sekiyama, qemu-devel
Cc: mdroth, lcapitulino, mitsuhiro.tanino, rhod, pbonzini,
seiji.aguchi, areis
On 13/01/2014 19:25, Tomoki Sekiyama wrote:
> When a VSS requester such as vshadow.exe or diskshadow.exe requests to
> delete snapshots, qemu-ga VSS provider's DeleteSnapshots() is also called
> and returns E_NOTIMPL, that makes the deletion fail.
> To avoid this issue, return S_OK and set values that represent no snapshots
> are deleted by qemu-ga VSS provider.
>
> Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com>
Reviewed-by: Gal Hammer <ghammer@redhat.com>
Gal.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 3/3] qga: vss-win32: Fix interference with snapshot deletion by other VSS request
2014-01-13 17:25 ` [Qemu-devel] [PATCH 3/3] qga: vss-win32: Fix interference with snapshot deletion by other VSS request Tomoki Sekiyama
2014-01-14 8:34 ` Gal Hammer
@ 2014-01-19 10:21 ` Yan Vugenfirer
1 sibling, 0 replies; 11+ messages in thread
From: Yan Vugenfirer @ 2014-01-19 10:21 UTC (permalink / raw)
To: Tomoki Sekiyama
Cc: mdroth, Gal Hammer, qemu-devel list, Luiz Capitulino,
mitsuhiro.tanino, Ronen Hod, Paolo Bonzini, Seiji Aguchi,
Ademar de Souza Reis Jr.
On Jan 13, 2014, at 7:25 PM, Tomoki Sekiyama <tomoki.sekiyama@hds.com> wrote:
> When a VSS requester such as vshadow.exe or diskshadow.exe requests to
> delete snapshots, qemu-ga VSS provider's DeleteSnapshots() is also called
> and returns E_NOTIMPL, that makes the deletion fail.
> To avoid this issue, return S_OK and set values that represent no snapshots
> are deleted by qemu-ga VSS provider.
>
> Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com>
> ---
> qga/vss-win32/provider.cpp | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/qga/vss-win32/provider.cpp b/qga/vss-win32/provider.cpp
> index b233646..d5129f8 100644
> --- a/qga/vss-win32/provider.cpp
> +++ b/qga/vss-win32/provider.cpp
> @@ -278,7 +278,9 @@ STDMETHODIMP CQGAVssProvider::DeleteSnapshots(
> VSS_ID SourceObjectId, VSS_OBJECT_TYPE eSourceObjectType,
> BOOL bForceDelete, LONG *plDeletedSnapshots, VSS_ID *pNondeletedSnapshotID)
> {
> - return E_NOTIMPL;
> + *plDeletedSnapshots = 0;
> + *pNondeletedSnapshotID = SourceObjectId;
> + return S_OK;
> }
>
> STDMETHODIMP CQGAVssProvider::BeginPrepareSnapshot(
>
>
Reviewed-by: Yan Vugenfirer <yvugenfi@redhat.com>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 0/3] qga: vss-win32: Fix interference with other VSS requesters
2014-01-13 17:25 [Qemu-devel] [PATCH 0/3] qga: vss-win32: Fix interference with other VSS requesters Tomoki Sekiyama
` (2 preceding siblings ...)
2014-01-13 17:25 ` [Qemu-devel] [PATCH 3/3] qga: vss-win32: Fix interference with snapshot deletion by other VSS request Tomoki Sekiyama
@ 2014-02-24 0:58 ` Michael Roth
3 siblings, 0 replies; 11+ messages in thread
From: Michael Roth @ 2014-02-24 0:58 UTC (permalink / raw)
To: Tomoki Sekiyama, qemu-devel
Cc: ghammer, lcapitulino, mitsuhiro.tanino, rhod, pbonzini,
seiji.aguchi, areis
Quoting Tomoki Sekiyama (2014-01-13 11:25:14)
> Current functionarity of qemu-ga VSS provider is limited to implement
> filesystems freeze, and doesn't support the creation of shadow copies
> within the guest.
> However, when no other hardware snapshot provider is installed, VSS may
> choose qemu-ga VSS provider to create shadow copies and fail with
> VSS_E_UNEXPECTED_PROVIDER_ERROR.
> Similar issue occurs when the requester deletes shadow copies.
>
> This patchset fix this issue by telling VSS that the volume is not
> supported by qemu-ga VSS provider when it is kicked by other requesters.
>
> It also fixes wrong error handling around OpenEvent/CreateEvent WinAPI,
> which returns NULL instead of INVALID_HANDLE_VALUE on errors.
>
> https://bugzilla.redhat.com/show_bug.cgi?id=1036341
>
> ---
> Tomoki Sekiyama (3):
> qga: vss-win32: Use NULL as an invalid pointer for OpenEvent and CreateEvent
> qga: vss-win32: Fix interference with snapshot creation by other VSS requesters
> qga: vss-win32: Fix interference with snapshot deletion by other VSS request
Thanks, applied to qga tree:
https://github.com/mdroth/qemu/commits/qga
>
>
> qga/vss-win32/provider.cpp | 21 ++++++++++---
> qga/vss-win32/requester.cpp | 70 ++++++++++++++++++++-----------------------
> 2 files changed, 49 insertions(+), 42 deletions(-)
>
> --
> Tomoki Sekiyama
^ permalink raw reply [flat|nested] 11+ messages in thread