Author: mbosma Date: Sun Dec 31 19:43:40 2006 New Revision: 25255
URL: http://svn.reactos.org/svn/reactos?rev=25255&view=rev Log: Recommit changes from cc branch, without the hackish changes to create.c.
Modified: trunk/reactos/drivers/filesystems/vfat/cleanup.c trunk/reactos/drivers/filesystems/vfat/create.c
Modified: trunk/reactos/drivers/filesystems/vfat/cleanup.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/vfat/cl... ============================================================================== --- trunk/reactos/drivers/filesystems/vfat/cleanup.c (original) +++ trunk/reactos/drivers/filesystems/vfat/cleanup.c Sun Dec 31 19:43:40 2006 @@ -29,15 +29,40 @@ 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->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->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) { @@ -71,10 +96,21 @@ #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 +140,11 @@
ExReleaseResourceLite (&IrpContext->DeviceExt->DirResource);
+ if (Status == STATUS_PENDING) + { + return VfatQueueRequest(IrpContext); + } + ByeBye: IrpContext->Irp->IoStatus.Status = Status; IrpContext->Irp->IoStatus.Information = 0;
Modified: trunk/reactos/drivers/filesystems/vfat/create.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/vfat/cr... ============================================================================== --- trunk/reactos/drivers/filesystems/vfat/create.c (original) +++ trunk/reactos/drivers/filesystems/vfat/create.c Sun Dec 31 19:43:40 2006 @@ -656,7 +656,24 @@ 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: