summaryrefslogtreecommitdiff
path: root/src/VBox/VMM/PDMAsyncCompletionFile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/VMM/PDMAsyncCompletionFile.cpp')
-rw-r--r--src/VBox/VMM/PDMAsyncCompletionFile.cpp28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/VBox/VMM/PDMAsyncCompletionFile.cpp b/src/VBox/VMM/PDMAsyncCompletionFile.cpp
index 94a55cb42..2eb7fbafa 100644
--- a/src/VBox/VMM/PDMAsyncCompletionFile.cpp
+++ b/src/VBox/VMM/PDMAsyncCompletionFile.cpp
@@ -794,12 +794,32 @@ static int pdmacFileEpInitialize(PPDMASYNCCOMPLETIONENDPOINT pEndpoint,
PDMACEPFILEMGRTYPE enmMgrType = pEpClassFile->enmMgrTypeOverride;
PDMACFILEEPBACKEND enmEpBackend = pEpClassFile->enmEpBackendDefault;
- AssertMsgReturn((fFlags & ~(PDMACEP_FILE_FLAGS_READ_ONLY | PDMACEP_FILE_FLAGS_CACHING)) == 0,
+ AssertMsgReturn((fFlags & ~(PDMACEP_FILE_FLAGS_READ_ONLY | PDMACEP_FILE_FLAGS_CACHING | PDMACEP_FILE_FLAGS_DONT_LOCK)) == 0,
("PDMAsyncCompletion: Invalid flag specified\n"), VERR_INVALID_PARAMETER);
- unsigned fFileFlags = fFlags & PDMACEP_FILE_FLAGS_READ_ONLY
- ? RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE
- : RTFILE_O_READWRITE | RTFILE_O_OPEN | RTFILE_O_DENY_WRITE;
+ unsigned fFileFlags = RTFILE_O_OPEN;
+
+ if (fFlags & PDMACEP_FILE_FLAGS_READ_ONLY)
+ fFileFlags |= RTFILE_O_READ | RTFILE_O_DENY_NONE;
+ else
+ {
+ fFileFlags |= RTFILE_O_READWRITE;
+
+ /*
+ * Opened in read/write mode. Check whether the caller wants to
+ * avoid the lock. Return an error in case caching is enabled
+ * because this can lead to data corruption.
+ */
+ if (fFlags & PDMACEP_FILE_FLAGS_DONT_LOCK)
+ {
+ if (fFlags & PDMACEP_FILE_FLAGS_CACHING)
+ return VERR_NOT_SUPPORTED;
+ else
+ fFileFlags |= RTFILE_O_DENY_NONE;
+ }
+ else
+ fFileFlags |= RTFILE_O_DENY_WRITE;
+ }
if (enmMgrType == PDMACEPFILEMGRTYPE_ASYNC)
fFileFlags |= RTFILE_O_ASYNC_IO;