mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-30 19:48:38 -05:00 
			
		
		
		
	sys: FSP_FILE_NODE/FSP_FILE_DESC: improve DeleteOnClose/DeletePending handling
This commit is contained in:
		| @@ -451,7 +451,6 @@ NTSTATUS FspFsvolCreateComplete( | ||||
|     FSP_FILE_NODE *FileNode = FileDesc->FileNode; | ||||
|     FSP_FILE_NODE *OpenedFileNode; | ||||
|     UNICODE_STRING ReparseFileName; | ||||
|     BOOLEAN DeleteOnClose; | ||||
|  | ||||
|     if (FspFsctlTransactCreateKind == Request->Kind) | ||||
|     { | ||||
| @@ -526,13 +525,11 @@ NTSTATUS FspFsvolCreateComplete( | ||||
|         FileNode->IsDirectory = BooleanFlagOn(Response->Rsp.Create.Opened.FileInfo.FileAttributes, | ||||
|             FILE_ATTRIBUTE_DIRECTORY); | ||||
|         FileDesc->UserContext2 = Response->Rsp.Create.Opened.UserContext2; | ||||
|  | ||||
|         DeleteOnClose = BooleanFlagOn(IrpSp->Parameters.Create.Options, FILE_DELETE_ON_CLOSE); | ||||
|         FileDesc->DeleteOnClose = BooleanFlagOn(IrpSp->Parameters.Create.Options, FILE_DELETE_ON_CLOSE); | ||||
|  | ||||
|         /* open the FileNode */ | ||||
|         OpenedFileNode = FspFileNodeOpen(FileNode, FileObject, | ||||
|             Response->Rsp.Create.Opened.GrantedAccess, IrpSp->Parameters.Create.ShareAccess, | ||||
|             DeleteOnClose, | ||||
|             &Result); | ||||
|         if (0 == OpenedFileNode) | ||||
|         { | ||||
| @@ -572,7 +569,7 @@ NTSTATUS FspFsvolCreateComplete( | ||||
|             BOOLEAN FlushImage = | ||||
|                 !FlagOn(Response->Rsp.Create.Opened.FileInfo.FileAttributes, FILE_ATTRIBUTE_DIRECTORY) && | ||||
|                 (FlagOn(Response->Rsp.Create.Opened.GrantedAccess, FILE_WRITE_DATA) || | ||||
|                 DeleteOnClose); | ||||
|                 BooleanFlagOn(IrpSp->Parameters.Create.Options, FILE_DELETE_ON_CLOSE)); | ||||
|  | ||||
|             Result = FspFsvolCreateTryOpen(Irp, Response, FileNode, FileDesc, FileObject, FlushImage); | ||||
|         } | ||||
|   | ||||
| @@ -562,14 +562,10 @@ typedef struct | ||||
|     FSP_FILE_NODE_NONPAGED *NonPaged; | ||||
|     /* interlocked access */ | ||||
|     LONG RefCount; | ||||
|     UINT32 DeletePending; | ||||
|     /* locked access (ContextTable lock) */ | ||||
|     LONG OpenCount; | ||||
|     SHARE_ACCESS ShareAccess; | ||||
|     struct | ||||
|     { | ||||
|         UINT32 DeleteOnClose:1; | ||||
|         UINT32 DeletePending:1; | ||||
|     } Flags; | ||||
|     /* locked under Header.Resource */ | ||||
|     UINT64 InfoExpirationTime; | ||||
|     UINT32 FileAttributes; | ||||
| @@ -592,6 +588,7 @@ typedef struct | ||||
| { | ||||
|     FSP_FILE_NODE *FileNode; | ||||
|     UINT64 UserContext2; | ||||
|     BOOLEAN DeleteOnClose; | ||||
| } FSP_FILE_DESC; | ||||
| NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject, | ||||
|     ULONG ExtraSize, FSP_FILE_NODE **PFileNode); | ||||
| @@ -616,7 +613,7 @@ VOID FspFileNodeSetOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner); | ||||
| VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags); | ||||
| VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner); | ||||
| FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, | ||||
|     UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult); | ||||
|     UINT32 GrantedAccess, UINT32 ShareAccess, NTSTATUS *PResult); | ||||
| VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, | ||||
|     PBOOLEAN PDeletePending); | ||||
| VOID FspFileNodeGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo); | ||||
|   | ||||
| @@ -17,7 +17,7 @@ VOID FspFileNodeSetOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner); | ||||
| VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags); | ||||
| VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner); | ||||
| FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, | ||||
|     UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult); | ||||
|     UINT32 GrantedAccess, UINT32 ShareAccess, NTSTATUS *PResult); | ||||
| VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, | ||||
|     PBOOLEAN PDeletePending); | ||||
| VOID FspFileNodeGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo); | ||||
| @@ -228,7 +228,7 @@ VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner) | ||||
| } | ||||
|  | ||||
| FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, | ||||
|     UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult) | ||||
|     UINT32 GrantedAccess, UINT32 ShareAccess, NTSTATUS *PResult) | ||||
| { | ||||
|     /* | ||||
|      * Attempt to insert our FileNode into the volume device's generic table. | ||||
| @@ -240,7 +240,7 @@ FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, | ||||
|  | ||||
|     PDEVICE_OBJECT FsvolDeviceObject = FileNode->FsvolDeviceObject; | ||||
|     FSP_FILE_NODE *OpenedFileNode; | ||||
|     BOOLEAN Inserted; | ||||
|     BOOLEAN Inserted, DeletePending; | ||||
|     NTSTATUS Result; | ||||
|  | ||||
|     FspFsvolDeviceLockContextTable(FsvolDeviceObject); | ||||
| @@ -269,7 +269,9 @@ FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, | ||||
|          */ | ||||
|         ASSERT(OpenedFileNode != FileNode); | ||||
|  | ||||
|         if (OpenedFileNode->Flags.DeletePending) | ||||
|         DeletePending = 0 != OpenedFileNode->DeletePending; | ||||
|         MemoryBarrier(); | ||||
|         if (DeletePending) | ||||
|         { | ||||
|             Result = STATUS_DELETE_PENDING; | ||||
|             goto exit; | ||||
| @@ -310,9 +312,6 @@ FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, | ||||
|     { | ||||
|         FspFileNodeReference(OpenedFileNode); | ||||
|         OpenedFileNode->OpenCount++; | ||||
|  | ||||
|         if (DeleteOnClose) | ||||
|             OpenedFileNode->Flags.DeleteOnClose = TRUE; | ||||
|     } | ||||
|  | ||||
|     FspFsvolDeviceUnlockContextTable(FsvolDeviceObject); | ||||
| @@ -331,13 +330,15 @@ VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, | ||||
|     PAGED_CODE(); | ||||
|  | ||||
|     PDEVICE_OBJECT FsvolDeviceObject = FileNode->FsvolDeviceObject; | ||||
|     FSP_FILE_DESC *FileDesc = FileObject->FsContext2; | ||||
|     BOOLEAN Deleted = FALSE, DeletePending; | ||||
|  | ||||
|     FspFsvolDeviceLockContextTable(FsvolDeviceObject); | ||||
|  | ||||
|     if (FileNode->Flags.DeleteOnClose) | ||||
|         FileNode->Flags.DeletePending = TRUE; | ||||
|     DeletePending = 0 != FileNode->Flags.DeletePending; | ||||
|     if (FileDesc->DeleteOnClose) | ||||
|         FileNode->DeletePending = TRUE; | ||||
|     DeletePending = 0 != FileNode->DeletePending; | ||||
|     MemoryBarrier(); | ||||
|  | ||||
|     IoRemoveShareAccess(FileObject, &FileNode->ShareAccess); | ||||
|     if (0 == --FileNode->OpenCount) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user