AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
IN PIRP Irp)
{
-
+ UNREFERENCED_PARAMETER(LibDeviceObject);
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDeviceExt *pDeviceExt = NULL;
IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup Acquiring GlobalRoot lock %08lX EXCL %08lX\n",
+ "AFSCleanup Acquiring GlobalRoot lock %p EXCL %08lX\n",
&pFcb->NPFcb->Resource,
PsGetCurrentThread());
AFSAcquireExcl( &pFcb->NPFcb->Resource,
TRUE);
- ASSERT( pFcb->OpenHandleCount != 0);
+ FsRtlNotifyCleanup( pControlDeviceExt->Specific.Control.NotifySync,
+ &pControlDeviceExt->Specific.Control.DirNotifyList,
+ pCcb);
- AFSReleaseResource( &pFcb->NPFcb->Resource);
+ ASSERT( pFcb->OpenHandleCount != 0);
lCount = InterlockedDecrement( &pFcb->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup (RootAll) Decrement handle count on Fcb %08lX Cnt %d\n",
+ "AFSCleanup (RootAll) Decrement handle count on Fcb %p Cnt %d\n",
pFcb,
lCount);
- FsRtlNotifyCleanup( pControlDeviceExt->Specific.Control.NotifySync,
- &pControlDeviceExt->Specific.Control.DirNotifyList,
- pCcb);
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
break;
}
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup Acquiring PIOCtl lock %08lX EXCL %08lX\n",
+ "AFSCleanup Acquiring PIOCtl lock %p EXCL %08lX\n",
&pFcb->NPFcb->Resource,
PsGetCurrentThread());
lCount = InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup (IOCtl) Decrement child open handle count on Parent object %08lX Cnt %d\n",
+ "AFSCleanup (IOCtl) Decrement child open handle count on Parent object %p Cnt %d\n",
pObjectInfo->ParentObjectInformation,
lCount);
}
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup (IOCtl) Decrement handle count on Fcb %08lX Cnt %d\n",
+ "AFSCleanup (IOCtl) Decrement handle count on Fcb %p Cnt %d\n",
pFcb,
lCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+ "AFSCleanup Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
&pFcb->NPFcb->SectionObjectResource,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup Tearing down cache map for Fcb %08lX FileObject %08lX\n",
+ "AFSCleanup Tearing down cache map for Fcb %p FileObject %p\n",
pFcb,
pFileObject);
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+ "AFSCleanup Releasing Fcb SectionObject lock %p EXCL %08lX\n",
&pFcb->NPFcb->SectionObjectResource,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup Acquiring Fcb lock %08lX EXCL %08lX\n",
+ "AFSCleanup Acquiring Fcb lock %p EXCL %08lX\n",
&pFcb->NPFcb->Resource,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup Acquiring Fcb extents lock %08lX EXCL %08lX\n",
+ "AFSCleanup Acquiring Fcb extents lock %p EXCL %08lX\n",
&pFcb->NPFcb->Specific.File.ExtentsResource,
PsGetCurrentThread());
FALSE);
//
- // Before telling the server about the deleted file, tear down all extents for
- // the file
+ // The file has been deleted since the Link count is zero
//
- AFSTearDownFcbExtents( pFcb,
- &pCcb->AuthGroup);
+ AFSDeleteFcbExtents( pFcb);
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup Releasing Fcb extents lock %08lX EXCL %08lX\n",
+ "AFSCleanup Releasing Fcb extents lock %p EXCL %08lX\n",
&pFcb->NPFcb->Specific.File.ExtentsResource,
PsGetCurrentThread());
(ULONG)FILE_ACTION_MODIFIED);
}
+
//
- // Attempt to flush any dirty extents to the server. This may be a little
- // aggressive, to flush whenever the handle is closed, but it ensures
- // coherency.
+ // Whenever a handle with write access or the last handle is closed
+ // notify the service to FSync the file. If the redirector is holding
+ // dirty extents, flush them to the service. This is a bit aggressive
+ // but it ensures cache coherency.
//
- if( (pCcb->GrantedAccess & FILE_WRITE_DATA) &&
- pFcb->Specific.File.ExtentsDirtyCount != 0)
+ if( (pCcb->GrantedAccess & FILE_WRITE_DATA) || (pFcb->OpenHandleCount == 1))
{
- AFSFlushExtents( pFcb,
- &pCcb->AuthGroup);
+ if ( pFcb->Specific.File.ExtentsDirtyCount != 0)
+ {
+
+ AFSFlushExtents( pFcb,
+ &pCcb->AuthGroup);
+ }
ulNotificationFlags |= AFS_REQUEST_FLAG_FLUSH_FILE;
}
lCount = InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup (File) Decrement child open handle count on Parent object %08lX Cnt %d\n",
+ "AFSCleanup (File) Decrement child open handle count on Parent object %p Cnt %d\n",
pParentObjectInfo,
lCount);
}
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup (File) Decrement handle count on Fcb %08lX Cnt %d\n",
+ "AFSCleanup (File) Decrement handle count on Fcb %p Cnt %d\n",
pFcb,
lCount);
// The ObjectReferenceCount will be freed by AFSPerformObjectInvalidate
//
- AFSObjectInfoIncrement( pObjectInfo);
+ lCount = AFSObjectInfoIncrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanup Setting Purge on Close Increment count on object %p Cnt %d\n",
+ pObjectInfo,
+ lCount);
ClearFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup Acquiring Dcb lock %08lX EXCL %08lX\n",
+ "AFSCleanup Acquiring Dcb lock %p EXCL %08lX\n",
&pFcb->NPFcb->Resource,
PsGetCurrentThread());
lCount = InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup (Dir) Decrement child open handle count on Parent object %08lX Cnt %d\n",
+ "AFSCleanup (Dir) Decrement child open handle count on Parent object %p Cnt %d\n",
pParentObjectInfo,
lCount);
}
- AFSReleaseResource( &pFcb->NPFcb->Resource);
-
lCount = InterlockedDecrement( &pFcb->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup (Dir) Decrement handle count on Fcb %08lX Cnt %d\n",
+ "AFSCleanup (Dir) Decrement handle count on Fcb %p Cnt %d\n",
pFcb,
lCount);
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
break;
}
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup (MP/SL) Acquiring Dcb lock %08lX EXCL %08lX\n",
+ "AFSCleanup (MP/SL) Acquiring Dcb lock %p EXCL %08lX\n",
&pFcb->NPFcb->Resource,
PsGetCurrentThread());
lCount = InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup (MP/SL) Decrement child open handle count on Parent object %08lX Cnt %d\n",
+ "AFSCleanup (MP/SL) Decrement child open handle count on Parent object %p Cnt %d\n",
pParentObjectInfo,
lCount);
}
- AFSReleaseResource( &pFcb->NPFcb->Resource);
-
lCount = InterlockedDecrement( &pFcb->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup (MP/SL) Decrement handle count on Fcb %08lX Cnt %d\n",
+ "AFSCleanup (MP/SL) Decrement handle count on Fcb %p Cnt %d\n",
pFcb,
lCount);
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
break;
}
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup Acquiring SPECIAL SHARE lock %08lX EXCL %08lX\n",
+ "AFSCleanup Acquiring SPECIAL SHARE lock %p EXCL %08lX\n",
&pFcb->NPFcb->Resource,
PsGetCurrentThread());
lCount = InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup (Share) Decrement child open handle count on Parent object %08lX Cnt %d\n",
+ "AFSCleanup (Share) Decrement child open handle count on Parent object %p Cnt %d\n",
pParentObjectInfo,
lCount);
}
- AFSReleaseResource( &pFcb->NPFcb->Resource);
-
lCount = InterlockedDecrement( &pFcb->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup (Share) Decrement handle count on Fcb %08lX Cnt %d\n",
+ "AFSCleanup (Share) Decrement handle count on Fcb %p Cnt %d\n",
pFcb,
lCount);
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
break;
}
default:
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
+ AFS_TRACE_LEVEL_ERROR,
"AFSCleanup Processing unknown node type %d\n",
pFcb->Header.NodeTypeCode);