From f01a075e09c70977431deb179f4c71294f1ec443 Mon Sep 17 00:00:00 2001 From: Maarten Bosma Date: Sat, 30 Dec 2006 00:37:52 +0000 Subject: [PATCH] Add changes from cc rewrite brunch. The driver still works under the old cc because it makes use of the USE_ROS_CC_AND_FS define. svn path=/trunk/; revision=25243 --- reactos/drivers/filesystems/vfat/cleanup.c | 80 +++++++++++++++++----- reactos/drivers/filesystems/vfat/close.c | 5 +- reactos/drivers/filesystems/vfat/create.c | 19 ++++- 3 files changed, 82 insertions(+), 22 deletions(-) diff --git a/reactos/drivers/filesystems/vfat/cleanup.c b/reactos/drivers/filesystems/vfat/cleanup.c index e9909bdc1d5..8c9109fb4fc 100644 --- a/reactos/drivers/filesystems/vfat/cleanup.c +++ b/reactos/drivers/filesystems/vfat/cleanup.c @@ -29,24 +29,50 @@ VfatCleanupFile(PVFAT_IRP_CONTEXT IrpContext) pFcb = (PVFATFCB) FileObject->FsContext; if (pFcb) { - if (!(*pFcb->Attributes & FILE_ATTRIBUTE_DIRECTORY) && - FsRtlAreThereCurrentFileLocks(&pFcb->FileLock)) - { - /* remove all locks this process have on this file */ - FsRtlFastUnlockAll(&pFcb->FileLock, - FileObject, - IoGetRequestorProcess(IrpContext->Irp), - NULL); - } + if (pFcb->Flags & FCB_IS_VOLUME) + { + pFcb->OpenHandleCount--; - if (pFcb->Flags & FCB_IS_DIRTY) - { - VfatUpdateEntry (pFcb); - } + if (pFcb->OpenHandleCount != 0) + { + IoRemoveShareAccess(FileObject, &pFcb->FCBShareAccess); + } + } + else + { + if(!ExAcquireResourceExclusiveLite (&pFcb->MainResource, + (BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT))) + { + return STATUS_PENDING; + } + if(!ExAcquireResourceExclusiveLite (&pFcb->PagingIoResource, + (BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT))) + { + ExReleaseResourceLite (&pFcb->MainResource); + return STATUS_PENDING; + } + + pFcb->OpenHandleCount--; - if (pFcb->Flags & FCB_DELETE_PENDING && - pFcb->OpenHandleCount == 1) - { + if (!(*pFcb->Attributes & FILE_ATTRIBUTE_DIRECTORY) && + FsRtlAreThereCurrentFileLocks(&pFcb->FileLock)) + { + /* remove all locks this process have on this file */ + FsRtlFastUnlockAll(&pFcb->FileLock, + FileObject, + IoGetRequestorProcess(IrpContext->Irp), + NULL); + } + + if (pFcb->Flags & FCB_IS_DIRTY) + { + VfatUpdateEntry (pFcb); + } + + if (pFcb->Flags & FCB_DELETE_PENDING && + pFcb->OpenHandleCount == 0) + { + DPRINT("'%wZ'\n", &pFcb->PathNameU); PFILE_OBJECT tmpFileObject; tmpFileObject = pFcb->FileObject; if (tmpFileObject != NULL) @@ -71,10 +97,21 @@ VfatCleanupFile(PVFAT_IRP_CONTEXT IrpContext) #ifdef USE_ROS_CC_AND_FS CcRosReleaseFileCache (FileObject); #else - CcUninitializeCacheMap (FileObject, NULL, NULL); + if (FileObject->SectionObjectPointer->SharedCacheMap) + { + CcUninitializeCacheMap (FileObject, &pFcb->RFCB.FileSize, NULL); + } #endif - pFcb->OpenHandleCount--; - IoRemoveShareAccess(FileObject, &pFcb->FCBShareAccess); + if (pFcb->OpenHandleCount != 0) + { + IoRemoveShareAccess(FileObject, &pFcb->FCBShareAccess); + } + + FileObject->Flags |= FO_CLEANUP_COMPLETE; + + ExReleaseResourceLite (&pFcb->PagingIoResource); + ExReleaseResourceLite (&pFcb->MainResource); + } } return STATUS_SUCCESS; } @@ -104,6 +141,11 @@ NTSTATUS VfatCleanup (PVFAT_IRP_CONTEXT IrpContext) ExReleaseResourceLite (&IrpContext->DeviceExt->DirResource); + if (Status == STATUS_PENDING) + { + return VfatQueueRequest(IrpContext); + } + ByeBye: IrpContext->Irp->IoStatus.Status = Status; IrpContext->Irp->IoStatus.Information = 0; diff --git a/reactos/drivers/filesystems/vfat/close.c b/reactos/drivers/filesystems/vfat/close.c index b7d2a18a547..c37cb6ec391 100644 --- a/reactos/drivers/filesystems/vfat/close.c +++ b/reactos/drivers/filesystems/vfat/close.c @@ -30,6 +30,8 @@ VfatCloseFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject) pCcb = (PVFATCCB) (FileObject->FsContext2); pFcb = (PVFATFCB) (FileObject->FsContext); + FileObject->FsContext2 = NULL; + if (pFcb == NULL) { return STATUS_SUCCESS; @@ -43,7 +45,7 @@ VfatCloseFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject) } else { - if (FileObject->DeletePending) +// if (FileObject->DeletePending) { if (pFcb->Flags & FCB_DELETE_PENDING) { @@ -57,7 +59,6 @@ VfatCloseFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject) vfatReleaseFCB (DeviceExt, pFcb); } - FileObject->FsContext2 = NULL; FileObject->FsContext = NULL; FileObject->SectionObjectPointer = NULL; diff --git a/reactos/drivers/filesystems/vfat/create.c b/reactos/drivers/filesystems/vfat/create.c index acc2ac116ce..6d570d821fd 100644 --- a/reactos/drivers/filesystems/vfat/create.c +++ b/reactos/drivers/filesystems/vfat/create.c @@ -656,7 +656,24 @@ VfatCreateFile ( PDEVICE_OBJECT DeviceObject, PIRP Irp ) VfatCloseFile (DeviceExt, FileObject); return(STATUS_NOT_A_DIRECTORY); } - +#ifndef USE_ROS_CC_AND_FS + if (!(*pFcb->Attributes & FILE_ATTRIBUTE_DIRECTORY)) + { + if (Stack->Parameters.Create.SecurityContext->DesiredAccess & FILE_WRITE_DATA || + RequestedDisposition == FILE_OVERWRITE || + RequestedDisposition == FILE_OVERWRITE_IF) + { + if (!MmFlushImageSection(&pFcb->SectionObjectPointers, MmFlushForWrite)) + { + DPRINT1("%wZ\n", &pFcb->PathNameU); + DPRINT1("%d %d %d\n", Stack->Parameters.Create.SecurityContext->DesiredAccess & FILE_WRITE_DATA, + RequestedDisposition == FILE_OVERWRITE, RequestedDisposition == FILE_OVERWRITE_IF); + VfatCloseFile (DeviceExt, FileObject); + return STATUS_SHARING_VIOLATION; + } + } + } +#endif if (PagingFileCreate) { /* FIXME: