mirror of
https://github.com/winfsp/winfsp.git
synced 2025-07-03 17:32:57 -05:00
Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
7985827c73 | |||
13146e4854 | |||
84e0744c28 | |||
20e19cb0fc | |||
2326521ef8 | |||
0296502f24 | |||
5d0b10d0b6 |
@ -1,6 +1,25 @@
|
|||||||
= Changelog
|
= Changelog
|
||||||
|
|
||||||
|
|
||||||
|
v1.8B2 (2020.2 B2)::
|
||||||
|
|
||||||
|
Changes since v1.7:
|
||||||
|
|
||||||
|
* [FSD] WinFsp now supports Windows containers. See the link:doc/WinFsp-Container-Support.asciidoc[WinFsp Container Support] document for details.
|
||||||
|
|
||||||
|
* [FSD] The `FSP_FSCTL_QUERY_WINFSP` code provides a simple method to determine if
|
||||||
|
the file system backing a file is a WinFsp file system. To use issue a
|
||||||
|
+
|
||||||
|
----
|
||||||
|
DeviceIoControl(Handle, FSP_FSCTL_QUERY_WINFSP, 0, 0, 0, 0, &Bytes, 0)
|
||||||
|
----
|
||||||
|
+
|
||||||
|
If the return value is TRUE this is a WinFsp file system.
|
||||||
|
|
||||||
|
* [FSD] A fix regarding concurrency of READs on the same file: WinFsp was supposed to allow concurrent READ requests on the same file (e.g. two concurrent overlapped `ReadFile` requests on the same `HANDLE`) to be handled concurrently by the file system; unfortunately due to a problem in recent versions of WinFsp READ requests on the same file were serialized. This problem has now been fixed. See GitHub issue #291 for more details.
|
||||||
|
** *NOTE*: It may be that some file system was inadvertently relying on WinFsp's implicit serialization of READs in this case. Please test your file system thoroughly against this version, especially with regard to READ serialization. Related XKCD: https://imgs.xkcd.com/comics/workflow.png
|
||||||
|
|
||||||
|
|
||||||
v1.8B1 (2020.2 B1)::
|
v1.8B1 (2020.2 B1)::
|
||||||
|
|
||||||
Changes since v1.7:
|
Changes since v1.7:
|
||||||
@ -16,6 +35,20 @@ DeviceIoControl(Handle, FSP_FSCTL_QUERY_WINFSP, 0, 0, 0, 0, &Bytes, 0)
|
|||||||
If the return value is TRUE this is a WinFsp file system.
|
If the return value is TRUE this is a WinFsp file system.
|
||||||
|
|
||||||
|
|
||||||
|
v1.7 (2020.1)::
|
||||||
|
|
||||||
|
Changes since v1.6:
|
||||||
|
|
||||||
|
* [FUSE] FUSE invalid directory entries no longer break the entire directory listing. Such invalid directory entries are logged. (GitHub PR #292.)
|
||||||
|
* [LAUNCH] The Launcher can now restart file systems that have crashed. Set `Recovery=1` in the file system's registry entry.
|
||||||
|
* [LAUNCH] The Launcher can now redirect file system standard error output. Set `Stderr=PATH` in the file system's registry entry.
|
||||||
|
* [FIX] Work around a problem in CreateProcess/CreateSection that allowed a faulty or malicious file system to bugcheck Windows.
|
||||||
|
* [FIX] Work around an incompatibility with Avast Antivirus.
|
||||||
|
** Native and .NET file systems that experience this problem should set the flag `RejectIrpPriorToTransact0` in `FSP_FSCTL_VOLUME_PARAMS` to `1`. This is only required when mounting on a directory with Avast Antivirus present.
|
||||||
|
** FUSE file systems do not need to do anything special as this flag is always enabled.
|
||||||
|
* [FIX] Fix junction (mount point reparse point) handling. (GitHub issue #269.)
|
||||||
|
|
||||||
|
|
||||||
v1.7B2 (2020.1 B2)::
|
v1.7B2 (2020.1 B2)::
|
||||||
|
|
||||||
Changes since v1.6:
|
Changes since v1.6:
|
||||||
|
@ -35,8 +35,8 @@ build_script:
|
|||||||
# build cygfuse
|
# build cygfuse
|
||||||
- C:\cygwin64\setup-x86_64.exe -qnNd -P cygport
|
- C:\cygwin64\setup-x86_64.exe -qnNd -P cygport
|
||||||
- C:\cygwin64\bin\bash --login -c "make -C '%CD%\opt\cygfuse' dist"
|
- C:\cygwin64\bin\bash --login -c "make -C '%CD%\opt\cygfuse' dist"
|
||||||
- C:\cygwin\setup-x86.exe -qnNd -P cygport
|
#- C:\cygwin\setup-x86.exe -qnNd -P cygport
|
||||||
- C:\cygwin\bin\bash --login -c "make -C '%CD%\opt\cygfuse' dist"
|
#- C:\cygwin\bin\bash --login -c "make -C '%CD%\opt\cygfuse' dist"
|
||||||
# build winfsp
|
# build winfsp
|
||||||
- tools\build.bat %CONFIGURATION%
|
- tools\build.bat %CONFIGURATION%
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
<MyCanonicalVersion>1.8</MyCanonicalVersion>
|
<MyCanonicalVersion>1.8</MyCanonicalVersion>
|
||||||
|
|
||||||
<MyProductVersion>2020.2 Beta1</MyProductVersion>
|
<MyProductVersion>2020.2 Beta2</MyProductVersion>
|
||||||
<MyProductStage>Beta</MyProductStage>
|
<MyProductStage>Beta</MyProductStage>
|
||||||
|
|
||||||
<MyVersion>$(MyCanonicalVersion).$(MyBuildNumber)</MyVersion>
|
<MyVersion>$(MyCanonicalVersion).$(MyBuildNumber)</MyVersion>
|
||||||
|
@ -249,9 +249,9 @@ static NTSTATUS FspFsvolReadNonCached(
|
|||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return Result;
|
return Result;
|
||||||
|
|
||||||
/* acquire FileNode exclusive Full */
|
/* acquire FileNode shared Full */
|
||||||
Success = DEBUGTEST(90) &&
|
Success = DEBUGTEST(90) &&
|
||||||
FspFileNodeTryAcquireExclusiveF(FileNode, FspFileNodeAcquireFull, CanWait);
|
FspFileNodeTryAcquireSharedF(FileNode, FspFileNodeAcquireFull, CanWait);
|
||||||
if (!Success)
|
if (!Success)
|
||||||
return FspWqRepostIrpWorkItem(Irp, FspFsvolReadNonCached, 0);
|
return FspWqRepostIrpWorkItem(Irp, FspFsvolReadNonCached, 0);
|
||||||
|
|
||||||
@ -280,21 +280,21 @@ static NTSTATUS FspFsvolReadNonCached(
|
|||||||
/* if this is a non-cached transfer on a cached file then flush the file */
|
/* if this is a non-cached transfer on a cached file then flush the file */
|
||||||
if (!PagingIo && 0 != FileObject->SectionObjectPointer->DataSectionObject)
|
if (!PagingIo && 0 != FileObject->SectionObjectPointer->DataSectionObject)
|
||||||
{
|
{
|
||||||
|
FspFileNodeRelease(FileNode, Full);
|
||||||
if (!CanWait)
|
if (!CanWait)
|
||||||
{
|
|
||||||
FspFileNodeRelease(FileNode, Full);
|
|
||||||
return FspWqRepostIrpWorkItem(Irp, FspFsvolReadNonCached, 0);
|
return FspWqRepostIrpWorkItem(Irp, FspFsvolReadNonCached, 0);
|
||||||
}
|
|
||||||
|
|
||||||
|
/* need to acquire exclusive for flushing */
|
||||||
|
FspFileNodeAcquireExclusive(FileNode, Full);
|
||||||
Result = FspFileNodeFlushAndPurgeCache(FileNode,
|
Result = FspFileNodeFlushAndPurgeCache(FileNode,
|
||||||
IrpSp->Parameters.Read.ByteOffset.QuadPart,
|
IrpSp->Parameters.Read.ByteOffset.QuadPart,
|
||||||
IrpSp->Parameters.Read.Length,
|
IrpSp->Parameters.Read.Length,
|
||||||
FALSE);
|
FALSE);
|
||||||
|
FspFileNodeRelease(FileNode, Full);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
{
|
|
||||||
FspFileNodeRelease(FileNode, Full);
|
|
||||||
return Result;
|
return Result;
|
||||||
}
|
|
||||||
|
FspFileNodeAcquireShared(FileNode, Full);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* trim ReadLength during CreateProcess; resolve bugcheck for filesystem that reports incorrect size */
|
/* trim ReadLength during CreateProcess; resolve bugcheck for filesystem that reports incorrect size */
|
||||||
@ -310,9 +310,6 @@ static NTSTATUS FspFsvolReadNonCached(
|
|||||||
ReadLength = (ULONG)(FileInfo.FileSize - ReadOffset.QuadPart);
|
ReadLength = (ULONG)(FileInfo.FileSize - ReadOffset.QuadPart);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* convert FileNode to shared */
|
|
||||||
FspFileNodeConvertExclusiveToShared(FileNode, Full);
|
|
||||||
|
|
||||||
Request = FspIrpRequest(Irp);
|
Request = FspIrpRequest(Irp);
|
||||||
if (0 == Request)
|
if (0 == Request)
|
||||||
{
|
{
|
||||||
|
@ -965,6 +965,7 @@ NTSTATUS FspVolumeTransact(
|
|||||||
if (0 != InternalBuffer)
|
if (0 != InternalBuffer)
|
||||||
{
|
{
|
||||||
ASSERT(FSP_FSCTL_TRANSACT_INTERNAL == ControlCode);
|
ASSERT(FSP_FSCTL_TRANSACT_INTERNAL == ControlCode);
|
||||||
|
*(PVOID *)OutputBuffer = 0;
|
||||||
FspFree(InternalBuffer);
|
FspFree(InternalBuffer);
|
||||||
}
|
}
|
||||||
FspIopCompleteCanceledIrp(PendingIrp);
|
FspIopCompleteCanceledIrp(PendingIrp);
|
||||||
|
Reference in New Issue
Block a user