mirror of
https://github.com/reactos/reactos.git
synced 2024-09-28 05:26:58 +00:00
Recommit changes from cc branch, without the hackish changes to create.c.
svn path=/trunk/; revision=25255
This commit is contained in:
parent
6da9503d34
commit
bd3f56c61d
|
@ -29,15 +29,40 @@ 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->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 @@ 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 +140,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;
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in a new issue