From e39e8bb5b2f08281bc1d91c9209a1a3f1b463af2 Mon Sep 17 00:00:00 2001 From: Peter Scott Date: Wed, 2 Nov 2011 19:25:36 -0400 Subject: [PATCH] Windows: remember when a reparse point is opened If the mount point or symlink is opened as a reparse point we must remember that in the Ccb so that later reparse point processing can be implemented properly. For now remember with the CCB_FLAG_MASK_OPENED_REPARSE_POINT flag. Change-Id: I32997a85701a95a5be1402cdcd3335a938395760 Reviewed-on: http://gerrit.openafs.org/5791 Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp | 28 +++++++++++++------ .../afsrdr/kernel/lib/Include/AFSDefines.h | 1 + 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp index bc1358f7e..a9b9ac949 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp @@ -145,6 +145,7 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject, ULONG ulParseFlags = 0; GUID stAuthGroup; ULONG ulNameProcessingFlags = 0; + BOOLEAN bOpenedReparsePoint = FALSE; __Enter { @@ -648,16 +649,22 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject, } if ( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT) && - pDirectoryCB != NULL && - !BooleanFlagOn( pDirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT)) + pDirectoryCB != NULL) { - AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, - AFS_TRACE_LEVEL_VERBOSE, - "AFSCommonCreate (%08lX) Reparse open request but attribute not set for %wZ Type %08lX\n", - Irp, - &uniFileName, - pDirectoryCB->ObjectInformation->FileType); + if( !BooleanFlagOn( pDirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT)) + { + AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSCommonCreate (%08lX) Reparse open request but attribute not set for %wZ Type %08lX\n", + Irp, + &uniFileName, + pDirectoryCB->ObjectInformation->FileType); + } + else + { + bOpenedReparsePoint = TRUE; + } } // @@ -1052,6 +1059,11 @@ try_exit: } } + if( bOpenedReparsePoint) + { + SetFlag( pCcb->Flags, CCB_FLAG_MASK_OPENED_REPARSE_POINT); + } + AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, "AFSCreate Count on %wZ DE %p Ccb %p Cnt %d\n", diff --git a/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h b/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h index 8107ea7a8..8f070c1c1 100644 --- a/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h +++ b/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h @@ -226,6 +226,7 @@ NTSTATUS #define CCB_FLAG_RETURN_RELATIVE_ENTRIES 0x00000010 #define CCB_FLAGS_DIRECTORY_QUERY_MAPPED 0x00000020 #define CCB_FLAG_MASK_PIOCTL_QUERY 0x00000040 +#define CCB_FLAG_MASK_OPENED_REPARSE_POINT 0x00000080 // // DirEntry flags -- 2.39.5