From: Jeffrey Altman Date: Sat, 17 Aug 2013 16:51:06 +0000 (-0400) Subject: Windows: Delay MP Target evaluation until required X-Git-Tag: upstream/1.8.0_pre1^2~1036 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=0cd5c63ebeef7567c9965e1ded7f10c6f452f0c3;p=packages%2Fo%2Fopenafs.git Windows: Delay MP Target evaluation until required Do not evaluate the Target FID of a mount point until such time as the target directory must be accessed. Change-Id: I8aa0da50256cacc4433fad6c7675ca8bd3bd5eb7 Reviewed-on: http://gerrit.openafs.org/10154 Tested-by: BuildBot Reviewed-by: Jeffrey Altman --- diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp index e661ce8f2..4a70c1dd5 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp @@ -1347,6 +1347,7 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject, pVolumeCB, pParentDirectoryCB, pDirectoryCB, + bOpenedReparsePoint, &pFcb, &pCcb); @@ -2824,6 +2825,7 @@ AFSProcessOpen( IN PIRP Irp, IN AFSVolumeCB *VolumeCB, IN AFSDirectoryCB *ParentDirCB, IN AFSDirectoryCB *DirectoryCB, + IN BOOLEAN bOpenedReparsePoint, OUT AFSFcb **Fcb, OUT AFSCcb **Ccb) { @@ -2890,7 +2892,7 @@ AFSProcessOpen( IN PIRP Irp, ntStatus = AFSValidateEntry( DirectoryCB, AuthGroup, - FALSE, + bOpenedReparsePoint, TRUE); if( !NT_SUCCESS( ntStatus)) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSDirControl.cpp b/src/WINNT/afsrdr/kernel/lib/AFSDirControl.cpp index 27f1690ed..cc8b41e29 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSDirControl.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSDirControl.cpp @@ -491,7 +491,8 @@ AFSQueryDirectory( IN PIRP Irp) pFcb->ObjectInformation->FileId.Unique)); ntStatus = AFSVerifyEntry( &pCcb->AuthGroup, - pCcb->DirectoryCB); + pCcb->DirectoryCB, + FALSE); if( !NT_SUCCESS( ntStatus)) { @@ -886,7 +887,7 @@ AFSQueryDirectory( IN PIRP Irp) ntStatus = AFSValidateEntry( pDirEntry, &pCcb->AuthGroup, - FALSE, + TRUE, FALSE); if ( NT_SUCCESS( ntStatus)) { diff --git a/src/WINNT/afsrdr/kernel/lib/AFSFSControl.cpp b/src/WINNT/afsrdr/kernel/lib/AFSFSControl.cpp index 0557e1e2a..d56f90d40 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSFSControl.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSFSControl.cpp @@ -410,7 +410,8 @@ AFSProcessUserFsRequest( IN PIRP Irp) pFcb->ObjectInformation->FileId.Unique)); ntStatus = AFSVerifyEntry( &pCcb->AuthGroup, - pCcb->DirectoryCB); + pCcb->DirectoryCB, + FALSE); if( !NT_SUCCESS( ntStatus)) { diff --git a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp index 363e8181c..18eafc359 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp @@ -103,7 +103,8 @@ AFSQueryFileInfo( IN PDEVICE_OBJECT LibDeviceObject, &stAuthGroup); ntStatus = AFSVerifyEntry( &stAuthGroup, - pCcb->DirectoryCB); + pCcb->DirectoryCB, + FALSE); if ( NT_SUCCESS( ntStatus)) { diff --git a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp index 85e762561..129f93d94 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp @@ -2883,7 +2883,8 @@ AFSInvalidateAllVolumes( VOID) NTSTATUS AFSVerifyEntry( IN GUID *AuthGroup, - IN AFSDirectoryCB *DirEntry) + IN AFSDirectoryCB *DirEntry, + IN BOOLEAN bFollowMountPoint) { NTSTATUS ntStatus = STATUS_SUCCESS; @@ -2905,7 +2906,7 @@ AFSVerifyEntry( IN GUID *AuthGroup, ntStatus = AFSEvaluateTargetByID( pObjectInfo, AuthGroup, - FALSE, + bFollowMountPoint ? FALSE : TRUE, &pDirEnumEntry); if( !NT_SUCCESS( ntStatus)) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp index b0a6ae0e1..a32de1d17 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp @@ -258,7 +258,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup, TRUE); ntStatus = AFSVerifyEntry( AuthGroup, - pDirEntry); + pDirEntry, + FALSE); AFSReleaseResource( pCurrentObject->Specific.Directory.DirectoryNodeHdr.TreeLock); @@ -438,7 +439,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup, // ntStatus = AFSVerifyEntry( AuthGroup, - pDirEntry); + pDirEntry, + FALSE); AFSReleaseResource( pCurrentObject->Specific.Directory.DirectoryNodeHdr.TreeLock); @@ -1879,7 +1881,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup, TRUE); ntStatus = AFSVerifyEntry( AuthGroup, - pParentDirEntry); + pParentDirEntry, + FALSE); AFSReleaseResource( pParentDirEntry->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock); @@ -2451,7 +2454,8 @@ AFSCreateDirEntry( IN GUID *AuthGroup, ParentObjectInfo->FileId.Unique)); ntStatus = AFSVerifyEntry( AuthGroup, - ParentDirCB); + ParentDirCB, + FALSE); if( !NT_SUCCESS( ntStatus)) { @@ -3236,7 +3240,8 @@ AFSParseName( IN PIRP Irp, TRUE); ntStatus = AFSVerifyEntry( AuthGroup, - pDirEntry); + pDirEntry, + FALSE); AFSReleaseResource( pDirEntry->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock); diff --git a/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h b/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h index 45a135842..34bee1e98 100644 --- a/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h +++ b/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h @@ -326,6 +326,7 @@ AFSProcessOpen( IN PIRP Irp, IN AFSVolumeCB *VolumeCB, IN AFSDirectoryCB *ParentDirCB, IN AFSDirectoryCB *DirectoryCB, + IN BOOLEAN bOpenedReparsePoint, OUT AFSFcb **Fcb, OUT AFSCcb **Ccb); @@ -1233,7 +1234,8 @@ AFSInvalidateAllVolumes( VOID); NTSTATUS AFSVerifyEntry( IN GUID *AuthGroup, - IN AFSDirectoryCB *DirectoryCB); + IN AFSDirectoryCB *DirectoryCB, + IN BOOLEAN bFollowMountPoint); NTSTATUS AFSSetVolumeState( IN AFSVolumeStatusCB *VolumeStatus); diff --git a/src/WINNT/afsrdr/user/RDRFunction.c b/src/WINNT/afsrdr/user/RDRFunction.c index 690930acf..764635bf2 100644 --- a/src/WINNT/afsrdr/user/RDRFunction.c +++ b/src/WINNT/afsrdr/user/RDRFunction.c @@ -1277,7 +1277,8 @@ RDR_EvaluateNodeByName( IN cm_user_t *userp, dscp, scp, userp, &req, FileName, shortName, (bWow64 ? RDR_POP_WOW64 : 0) | - (bNoFollow ? 0 : (RDR_POP_FOLLOW_MOUNTPOINTS | RDR_POP_EVALUATE_SYMLINKS)), + (bNoFollow ? 0 : RDR_POP_FOLLOW_MOUNTPOINTS) | + RDR_POP_EVALUATE_SYMLINKS, 0, NULL, &dwRemaining); if (bHoldFid) RDR_FlagScpInUse( scp, FALSE ); @@ -1433,7 +1434,8 @@ RDR_EvaluateNodeByID( IN cm_user_t *userp, code = RDR_PopulateCurrentEntry(pCurrentEntry, dwRemaining, dscp, scp, userp, &req, NULL, NULL, (bWow64 ? RDR_POP_WOW64 : 0) | - (bNoFollow ? 0 : (RDR_POP_FOLLOW_MOUNTPOINTS | RDR_POP_EVALUATE_SYMLINKS)), + (bNoFollow ? 0 : RDR_POP_FOLLOW_MOUNTPOINTS) | + RDR_POP_EVALUATE_SYMLINKS, 0, NULL, &dwRemaining); if (bHoldFid)