diff options
Diffstat (limited to 'src/VBox/VMM/PDMAsyncCompletionFile.cpp')
-rw-r--r-- | src/VBox/VMM/PDMAsyncCompletionFile.cpp | 28 |
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; |