sys: FspFileNode acquire/release

This commit is contained in:
Bill Zissimopoulos 2016-01-18 17:16:28 -08:00
parent 512d7dc950
commit efe3d6656b
3 changed files with 131 additions and 62 deletions

View File

@ -373,8 +373,8 @@ NTSTATUS FspFsvolCreatePrepare(
FileNode = FspIopRequestContext(Request, RequestFileNode); FileNode = FspIopRequestContext(Request, RequestFileNode);
FileObject = FspIopRequestContext(Request, RequestFileObject); FileObject = FspIopRequestContext(Request, RequestFileObject);
/* lock the FileNode for Paging IO */ /* lock the FileNode for overwriting */
Success = FspFileNodePgioTryAcquireExclusive(FileNode); Success = FspFileNodeTryAcquireExclusive(FileNode, Both);
if (!Success) if (!Success)
{ {
/* repost the IRP to retry later */ /* repost the IRP to retry later */
@ -392,7 +392,7 @@ NTSTATUS FspFsvolCreatePrepare(
Success = MmCanFileBeTruncated(&FileNode->NonPaged->SectionObjectPointers, &Zero); Success = MmCanFileBeTruncated(&FileNode->NonPaged->SectionObjectPointers, &Zero);
if (!Success) if (!Success)
{ {
FspFileNodePgioRelease(FileNode); FspFileNodeRelease(FileNode, Both);
FspFsvolCreatePostClose(FileNode, (UINT_PTR)FileObject->FsContext2); FspFsvolCreatePostClose(FileNode, (UINT_PTR)FileObject->FsContext2);
FspFileNodeClose(FileNode, FileObject, 0); FspFileNodeClose(FileNode, FileObject, 0);
@ -612,7 +612,7 @@ VOID FspFsvolCreateComplete(
/* did the user-mode file system sent us a failure code? */ /* did the user-mode file system sent us a failure code? */
if (!NT_SUCCESS(Response->IoStatus.Status)) if (!NT_SUCCESS(Response->IoStatus.Status))
{ {
FspFileNodePgioRelease(FileNode); FspFileNodeRelease(FileNode, Both);
FspFileNodeClose(FileNode, FileObject, 0); FspFileNodeClose(FileNode, FileObject, 0);
@ -626,7 +626,7 @@ VOID FspFsvolCreateComplete(
FileNode->Header.FileSize.QuadPart = Response->Rsp.Overwrite.FileSize; FileNode->Header.FileSize.QuadPart = Response->Rsp.Overwrite.FileSize;
CcSetFileSizes(FileObject, (PCC_FILE_SIZES)&FileNode->Header.AllocationSize); CcSetFileSizes(FileObject, (PCC_FILE_SIZES)&FileNode->Header.AllocationSize);
FspFileNodePgioRelease(FileNode); FspFileNodeRelease(FileNode, Both);
/* SUCCESS! */ /* SUCCESS! */
FspIopRequestContext(Request, RequestFileNode) = 0; FspIopRequestContext(Request, RequestFileNode) = 0;

View File

@ -507,12 +507,18 @@ NTSTATUS FspVolumeWork(
/* file objects */ /* file objects */
#define FspFileNodeKind(FileNode) \ #define FspFileNodeKind(FileNode) \
(((FSP_FILE_NODE *)FileNode)->Header.NodeTypeCode) (((FSP_FILE_NODE *)FileNode)->Header.NodeTypeCode)
#define FspFileNodeIsValid(FileNode)\ #define FspFileNodeIsValid(FileNode) \
(0 != (FileNode) && FspFileNodeFileKind == ((FSP_FILE_NODE *)FileNode)->Header.NodeTypeCode) (0 != (FileNode) && FspFileNodeFileKind == ((FSP_FILE_NODE *)FileNode)->Header.NodeTypeCode)
enum enum
{ {
FspFileNodeFileKind = 'BZ', FspFileNodeFileKind = 'BZ',
}; };
enum
{
FspFileNodeAcquireMain = 1,
FspFileNodeAcquirePgio = 2,
FspFileNodeAcquireBoth = 3,
};
typedef struct typedef struct
{ {
ERESOURCE Resource; ERESOURCE Resource;
@ -544,10 +550,6 @@ typedef struct
NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject, NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject,
ULONG ExtraSize, FSP_FILE_NODE **PFileNode); ULONG ExtraSize, FSP_FILE_NODE **PFileNode);
VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode); VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode);
FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult);
VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
PBOOLEAN PDeletePending);
static inline static inline
VOID FspFileNodeReference(FSP_FILE_NODE *FileNode) VOID FspFileNodeReference(FSP_FILE_NODE *FileNode)
{ {
@ -560,56 +562,20 @@ VOID FspFileNodeDereference(FSP_FILE_NODE *FileNode)
if (0 == RefCount) if (0 == RefCount)
FspFileNodeDelete(FileNode); FspFileNodeDelete(FileNode);
} }
static inline VOID FspFileNodeAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags);
VOID FspFileNodeAcquireShared(FSP_FILE_NODE *FileNode) BOOLEAN FspFileNodeTryAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags);
{ VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags);
ExAcquireResourceSharedLite(FileNode->Header.Resource, TRUE); BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags);
} VOID FspFileNodeRelease(FSP_FILE_NODE *FileNode, ULONG Flags);
static inline FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
BOOLEAN FspFileNodeTryAcquireShared(FSP_FILE_NODE *FileNode) DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult);
{ VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
return ExAcquireResourceSharedLite(FileNode->Header.Resource, FALSE); PBOOLEAN PDeletePending);
} #define FspFileNodeAcquireShared(N,F) FspFileNodeAcquireShared(N, FspFileNodeAcquire ## F)
static inline #define FspFileNodeTryAcquireShared(N,F) FspFileNodeTryAcquireShared(N, FspFileNodeAcquire ## F)
VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode) #define FspFileNodeAcquireExclusive(N,F) FspFileNodeAcquireExclusive(N, FspFileNodeAcquire ## F)
{ #define FspFileNodeTryAcquireExclusive(N,F) FspFileNodeTryAcquireExclusive(N, FspFileNodeAcquire ## F)
ExAcquireResourceExclusiveLite(FileNode->Header.Resource, TRUE); #define FspFileNodeRelease(N,F) FspFileNodeRelease(N, FspFileNodeAcquire ## F)
}
static inline
BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode)
{
return ExAcquireResourceExclusiveLite(FileNode->Header.Resource, FALSE);
}
static inline
VOID FspFileNodeRelease(FSP_FILE_NODE *FileNode)
{
ExReleaseResourceLite(FileNode->Header.Resource);
}
static inline
VOID FspFileNodePgioAcquireShared(FSP_FILE_NODE *FileNode)
{
ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, TRUE);
}
static inline
BOOLEAN FspFileNodePgioTryAcquireShared(FSP_FILE_NODE *FileNode)
{
return ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, FALSE);
}
static inline
VOID FspFileNodePgioAcquireExclusive(FSP_FILE_NODE *FileNode)
{
ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, TRUE);
}
static inline
BOOLEAN FspFileNodePgioTryAcquireExclusive(FSP_FILE_NODE *FileNode)
{
return ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, FALSE);
}
static inline
VOID FspFileNodePgioRelease(FSP_FILE_NODE *FileNode)
{
ExReleaseResourceLite(FileNode->Header.PagingIoResource);
}
/* debug */ /* debug */
#if DBG #if DBG

View File

@ -6,9 +6,20 @@
#include <sys/driver.h> #include <sys/driver.h>
#undef FspFileNodeAcquireShared
#undef FspFileNodeTryAcquireShared
#undef FspFileNodeAcquireExclusive
#undef FspFileNodeTryAcquireExclusive
#undef FspFileNodeRelease
NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject, NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject,
ULONG ExtraSize, FSP_FILE_NODE **PFileNode); ULONG ExtraSize, FSP_FILE_NODE **PFileNode);
VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode); VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode);
VOID FspFileNodeAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags);
BOOLEAN FspFileNodeTryAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags);
VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags);
BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags);
VOID FspFileNodeRelease(FSP_FILE_NODE *FileNode, ULONG Flags);
FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult); DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult);
VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
@ -17,6 +28,11 @@ VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
#ifdef ALLOC_PRAGMA #ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, FspFileNodeCreate) #pragma alloc_text(PAGE, FspFileNodeCreate)
#pragma alloc_text(PAGE, FspFileNodeDelete) #pragma alloc_text(PAGE, FspFileNodeDelete)
#pragma alloc_text(PAGE, FspFileNodeAcquireShared)
#pragma alloc_text(PAGE, FspFileNodeTryAcquireShared)
#pragma alloc_text(PAGE, FspFileNodeAcquireExclusive)
#pragma alloc_text(PAGE, FspFileNodeTryAcquireExclusive)
#pragma alloc_text(PAGE, FspFileNodeRelease)
#pragma alloc_text(PAGE, FspFileNodeOpen) #pragma alloc_text(PAGE, FspFileNodeOpen)
#pragma alloc_text(PAGE, FspFileNodeClose) #pragma alloc_text(PAGE, FspFileNodeClose)
#endif #endif
@ -79,6 +95,93 @@ VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode)
FspFree(FileNode); FspFree(FileNode);
} }
VOID FspFileNodeAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags)
{
PAGED_CODE();
if (Flags & FspFileNodeAcquireMain)
ExAcquireResourceSharedLite(FileNode->Header.Resource, TRUE);
if (Flags & FspFileNodeAcquirePgio)
ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, TRUE);
}
BOOLEAN FspFileNodeTryAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags)
{
PAGED_CODE();
BOOLEAN Result = FALSE;
if (Flags & FspFileNodeAcquireMain)
{
Result = ExAcquireResourceSharedLite(FileNode->Header.Resource, FALSE);
if (!Result)
return FALSE;
}
if (Flags & FspFileNodeAcquirePgio)
{
Result = ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, FALSE);
if (!Result)
{
if (Flags & FspFileNodeAcquireMain)
ExReleaseResourceLite(FileNode->Header.Resource);
return FALSE;
}
}
return Result;
}
VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags)
{
PAGED_CODE();
if (Flags & FspFileNodeAcquireMain)
ExAcquireResourceExclusiveLite(FileNode->Header.Resource, TRUE);
if (Flags & FspFileNodeAcquirePgio)
ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, TRUE);
}
BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags)
{
PAGED_CODE();
BOOLEAN Result = FALSE;
if (Flags & FspFileNodeAcquireMain)
{
Result = ExAcquireResourceExclusiveLite(FileNode->Header.Resource, FALSE);
if (!Result)
return FALSE;
}
if (Flags & FspFileNodeAcquirePgio)
{
Result = ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, FALSE);
if (!Result)
{
if (Flags & FspFileNodeAcquireMain)
ExReleaseResourceLite(FileNode->Header.Resource);
return FALSE;
}
}
return Result;
}
VOID FspFileNodeRelease(FSP_FILE_NODE *FileNode, ULONG Flags)
{
PAGED_CODE();
if (Flags & FspFileNodeAcquirePgio)
ExReleaseResourceLite(FileNode->Header.PagingIoResource);
if (Flags & FspFileNodeAcquireMain)
ExReleaseResourceLite(FileNode->Header.Resource);
}
FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult) DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult)
{ {