2 * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3 * Copyright (c) 2009, 2010, 2011, 2012, 2013 Your File System, Inc.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * - Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
16 * nor the names of their contributors may be used to endorse or promote
17 * products derived from this software without specific prior written
18 * permission from Kernel Drivers, LLC and Your File System, Inc.
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
23 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
24 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 // File: AFSNameArray.cpp
37 #include "AFSCommon.h"
40 AFSInitNameArray( IN AFSDirectoryCB *DirectoryCB,
41 IN ULONG InitialElementCount)
44 AFSNameArrayHdr *pNameArray = NULL;
45 AFSNameArrayCB *pCurrentElement = NULL;
46 AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
52 if( InitialElementCount == 0)
55 InitialElementCount = pDevExt->Specific.RDR.NameArrayLength;
58 pNameArray = (AFSNameArrayHdr *)AFSExAllocatePoolWithTag( PagedPool,
59 sizeof( AFSNameArrayHdr) +
60 (InitialElementCount * sizeof( AFSNameArrayCB)),
63 if( pNameArray == NULL)
66 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
67 AFS_TRACE_LEVEL_ERROR,
68 "AFSInitNameArray Failed to allocate name array\n"));
70 try_return( pNameArray);
73 RtlZeroMemory( pNameArray,
74 sizeof( AFSNameArrayHdr) +
75 (InitialElementCount * sizeof( AFSNameArrayCB)));
77 pNameArray->MaxElementCount = InitialElementCount;
79 if( DirectoryCB != NULL)
82 pCurrentElement = &pNameArray->ElementArray[ 0];
84 pNameArray->CurrentEntry = pCurrentElement;
86 pNameArray->Count = 1;
88 pNameArray->LinkCount = 0;
90 lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
92 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
93 AFS_TRACE_LEVEL_VERBOSE,
94 "AFSInitNameArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
96 &DirectoryCB->NameInformation.FileName,
100 pCurrentElement->DirectoryCB = DirectoryCB;
102 pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
104 pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
106 if( pCurrentElement->FileId.Vnode == 1)
109 SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
112 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
113 AFS_TRACE_LEVEL_VERBOSE,
114 "AFSInitNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
116 pCurrentElement->DirectoryCB,
117 pCurrentElement->FileId.Cell,
118 pCurrentElement->FileId.Volume,
119 pCurrentElement->FileId.Vnode,
120 pCurrentElement->FileId.Unique,
121 &pCurrentElement->DirectoryCB->NameInformation.FileName,
122 pCurrentElement->DirectoryCB->ObjectInformation->FileType));
134 AFSPopulateNameArray( IN AFSNameArrayHdr *NameArray,
135 IN UNICODE_STRING *Path,
136 IN AFSDirectoryCB *DirectoryCB)
139 NTSTATUS ntStatus = STATUS_SUCCESS;
140 AFSNameArrayCB *pCurrentElement = NULL;
146 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
147 AFS_TRACE_LEVEL_VERBOSE,
148 "AFSPopulateNameArray [NA:%p] passed Path %wZ DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
152 DirectoryCB->ObjectInformation->FileId.Cell,
153 DirectoryCB->ObjectInformation->FileId.Volume,
154 DirectoryCB->ObjectInformation->FileId.Vnode,
155 DirectoryCB->ObjectInformation->FileId.Unique,
156 &DirectoryCB->NameInformation.FileName,
157 DirectoryCB->ObjectInformation->FileType));
160 // Init some info in the header
163 pCurrentElement = &NameArray->ElementArray[ 0];
165 NameArray->CurrentEntry = pCurrentElement;
168 // The first entry points at the root
171 pCurrentElement->DirectoryCB = DirectoryCB->ObjectInformation->VolumeCB->DirectoryCB;
173 lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
175 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
176 AFS_TRACE_LEVEL_VERBOSE,
177 "AFSPopulateNameArray [NA:%p] Increment count on volume %wZ DE %p Cnt %d\n",
179 &pCurrentElement->DirectoryCB->NameInformation.FileName,
180 pCurrentElement->DirectoryCB,
183 pCurrentElement->Component = DirectoryCB->ObjectInformation->VolumeCB->DirectoryCB->NameInformation.FileName;
185 pCurrentElement->FileId = DirectoryCB->ObjectInformation->VolumeCB->ObjectInformation.FileId;
187 pCurrentElement->Flags = 0;
189 if( pCurrentElement->FileId.Vnode == 1)
192 SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
195 NameArray->Count = 1;
197 NameArray->LinkCount = 0;
199 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
200 AFS_TRACE_LEVEL_VERBOSE,
201 "AFSPopulateNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
203 pCurrentElement->DirectoryCB,
204 pCurrentElement->FileId.Cell,
205 pCurrentElement->FileId.Volume,
206 pCurrentElement->FileId.Vnode,
207 pCurrentElement->FileId.Unique,
208 &pCurrentElement->DirectoryCB->NameInformation.FileName,
209 pCurrentElement->DirectoryCB->ObjectInformation->FileType));
212 // If the root is the parent then we are done ...
215 if( &DirectoryCB->ObjectInformation->VolumeCB->ObjectInformation == DirectoryCB->ObjectInformation)
217 try_return( ntStatus);
229 AFSPopulateNameArrayFromRelatedArray( IN AFSNameArrayHdr *NameArray,
230 IN AFSNameArrayHdr *RelatedNameArray,
231 IN AFSDirectoryCB *DirectoryCB)
234 NTSTATUS ntStatus = STATUS_SUCCESS;
235 AFSNameArrayCB *pCurrentElement = NULL, *pCurrentRelatedElement = NULL;
244 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
245 AFS_TRACE_LEVEL_VERBOSE,
246 "AFSPopulateNameArray [NA:%p] passed RelatedNameArray %p DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
250 DirectoryCB->ObjectInformation->FileId.Cell,
251 DirectoryCB->ObjectInformation->FileId.Volume,
252 DirectoryCB->ObjectInformation->FileId.Vnode,
253 DirectoryCB->ObjectInformation->FileId.Unique,
254 &DirectoryCB->NameInformation.FileName,
255 DirectoryCB->ObjectInformation->FileType));
260 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
261 AFS_TRACE_LEVEL_VERBOSE,
262 "AFSPopulateNameArray [NA:%p] passed RelatedNameArray %p DE NULL\n",
268 // Init some info in the header
271 pCurrentElement = &NameArray->ElementArray[ 0];
273 pCurrentRelatedElement = &RelatedNameArray->ElementArray[ 0];
275 NameArray->Count = 0;
277 NameArray->LinkCount = RelatedNameArray->LinkCount;
280 // Populate the name array with the data from the related array
286 pCurrentElement->DirectoryCB = pCurrentRelatedElement->DirectoryCB;
288 pCurrentElement->Component = pCurrentRelatedElement->DirectoryCB->NameInformation.FileName;
290 pCurrentElement->FileId = pCurrentElement->DirectoryCB->ObjectInformation->FileId;
292 pCurrentElement->Flags = 0;
294 if( pCurrentElement->FileId.Vnode == 1)
297 SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
300 lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
302 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
303 AFS_TRACE_LEVEL_VERBOSE,
304 "AFSPopulateNameArrayFromRelatedArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
306 &pCurrentElement->DirectoryCB->NameInformation.FileName,
307 pCurrentElement->DirectoryCB,
310 lCount = InterlockedIncrement( &NameArray->Count);
312 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
313 AFS_TRACE_LEVEL_VERBOSE,
314 "AFSPopulateNameArrayFromRelatedArray [NA:%p] Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
317 pCurrentElement->DirectoryCB,
318 pCurrentElement->FileId.Cell,
319 pCurrentElement->FileId.Volume,
320 pCurrentElement->FileId.Vnode,
321 pCurrentElement->FileId.Unique,
322 &pCurrentElement->DirectoryCB->NameInformation.FileName,
323 pCurrentElement->DirectoryCB->ObjectInformation->FileType));
325 if( pCurrentElement->DirectoryCB == DirectoryCB ||
326 NameArray->Count == RelatedNameArray->Count)
338 pCurrentRelatedElement++;
341 NameArray->CurrentEntry = NameArray->Count > 0 ? pCurrentElement : NULL;
348 AFSFreeNameArray( IN AFSNameArrayHdr *NameArray)
351 NTSTATUS ntStatus = STATUS_SUCCESS;
352 AFSNameArrayCB *pCurrentElement = NULL;
353 LONG lCount, lElement;
358 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
359 AFS_TRACE_LEVEL_VERBOSE,
360 "AFSFreeNameArray [NA:%p]\n",
363 for ( lElement = 0; lElement < NameArray->Count; lElement++)
366 pCurrentElement = &NameArray->ElementArray[ lElement];
368 lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
370 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
371 AFS_TRACE_LEVEL_VERBOSE,
372 "AFSFreeNameArray [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
374 &pCurrentElement->DirectoryCB->NameInformation.FileName,
375 pCurrentElement->DirectoryCB,
378 ASSERT( lCount >= 0);
381 AFSExFreePoolWithTag( NameArray, AFS_NAME_ARRAY_TAG);
388 AFSInsertNextElement( IN AFSNameArrayHdr *NameArray,
389 IN AFSDirectoryCB *DirectoryCB)
392 NTSTATUS ntStatus = STATUS_SUCCESS;
393 AFSNameArrayCB *pCurrentElement = NULL;
399 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
400 AFS_TRACE_LEVEL_VERBOSE,
401 "AFSInsertNextElement [NA:%p] passed DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
404 DirectoryCB->ObjectInformation->FileId.Cell,
405 DirectoryCB->ObjectInformation->FileId.Volume,
406 DirectoryCB->ObjectInformation->FileId.Vnode,
407 DirectoryCB->ObjectInformation->FileId.Unique,
408 &DirectoryCB->NameInformation.FileName,
409 DirectoryCB->ObjectInformation->FileType));
411 if( NameArray->Count == (LONG) NameArray->MaxElementCount)
414 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
415 AFS_TRACE_LEVEL_ERROR,
416 "AFSInsertNextElement [NA:%p] Name has reached Maximum Size\n",
419 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
422 for ( lCount = 0; lCount < NameArray->Count; lCount++)
425 if ( AFSIsEqualFID( &NameArray->ElementArray[ lCount].FileId,
426 &DirectoryCB->ObjectInformation->FileId) )
429 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
430 AFS_TRACE_LEVEL_WARNING,
431 "AFSInsertNextElement [NA:%p] DE %p recursion Status %08X\n",
434 STATUS_ACCESS_DENIED));
436 try_return( ntStatus = STATUS_ACCESS_DENIED);
440 if( NameArray->Count > 0)
443 NameArray->CurrentEntry++;
447 NameArray->CurrentEntry = &NameArray->ElementArray[ 0];
450 pCurrentElement = NameArray->CurrentEntry;
452 lCount = InterlockedIncrement( &NameArray->Count);
454 lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
456 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
457 AFS_TRACE_LEVEL_VERBOSE,
458 "AFSInsertNextElement [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
460 &DirectoryCB->NameInformation.FileName,
466 pCurrentElement->DirectoryCB = DirectoryCB;
468 pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
470 pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
472 pCurrentElement->Flags = 0;
474 if( pCurrentElement->FileId.Vnode == 1)
477 SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
480 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
481 AFS_TRACE_LEVEL_VERBOSE,
482 "AFSInsertNextElement [NA:%p] Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
484 NameArray->Count - 1,
485 pCurrentElement->DirectoryCB,
486 pCurrentElement->FileId.Cell,
487 pCurrentElement->FileId.Volume,
488 pCurrentElement->FileId.Vnode,
489 pCurrentElement->FileId.Unique,
490 &pCurrentElement->DirectoryCB->NameInformation.FileName,
491 pCurrentElement->DirectoryCB->ObjectInformation->FileType));
502 AFSBackupEntry( IN AFSNameArrayHdr *NameArray)
505 AFSDirectoryCB *pDirectoryCB = NULL;
506 AFSNameArrayCB *pCurrentElement = NULL;
507 BOOLEAN bVolumeRoot = FALSE;
513 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
514 AFS_TRACE_LEVEL_VERBOSE,
515 "AFSBackupEntry [NA:%p]\n",
518 if( NameArray->Count == 0)
521 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
522 AFS_TRACE_LEVEL_ERROR,
523 "AFSBackupEntry [NA:%p] No more entries\n",
526 try_return( pCurrentElement);
529 lCount = InterlockedDecrement( &NameArray->CurrentEntry->DirectoryCB->NameArrayReferenceCount);
531 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
532 AFS_TRACE_LEVEL_VERBOSE,
533 "AFSBackupEntry [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
535 &NameArray->CurrentEntry->DirectoryCB->NameInformation.FileName,
536 NameArray->CurrentEntry->DirectoryCB,
539 ASSERT( lCount >= 0);
541 NameArray->CurrentEntry->DirectoryCB = NULL;
543 lCount = InterlockedDecrement( &NameArray->Count);
547 NameArray->CurrentEntry = NULL;
549 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
550 AFS_TRACE_LEVEL_ERROR,
551 "AFSBackupEntry [NA:%p] No more entries\n",
557 bVolumeRoot = BooleanFlagOn( NameArray->CurrentEntry->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
559 NameArray->CurrentEntry--;
561 pCurrentElement = NameArray->CurrentEntry;
563 pDirectoryCB = pCurrentElement->DirectoryCB;
565 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
566 AFS_TRACE_LEVEL_VERBOSE,
567 "AFSBackupEntry [NA:%p] Returning Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
569 NameArray->Count - 1,
570 pCurrentElement->DirectoryCB,
571 pCurrentElement->FileId.Cell,
572 pCurrentElement->FileId.Volume,
573 pCurrentElement->FileId.Vnode,
574 pCurrentElement->FileId.Unique,
575 &pCurrentElement->DirectoryCB->NameInformation.FileName,
576 pCurrentElement->DirectoryCB->ObjectInformation->FileType));
579 // If the entry we are removing is a volume root,
580 // we must remove the mount point entry as well.
581 // If the NameArray was constructed by checking the
582 // share name via the service, the name array can
583 // contain two volume roots in sequence without a
584 // mount point separating them.
588 !BooleanFlagOn( NameArray->CurrentEntry->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT))
591 pDirectoryCB = AFSBackupEntry( NameArray);
605 AFSGetParentEntry( IN AFSNameArrayHdr *NameArray)
608 AFSDirectoryCB *pDirEntry = NULL;
609 AFSNameArrayCB *pElement = NULL;
614 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
615 AFS_TRACE_LEVEL_VERBOSE,
616 "AFSGetParentEntry [NA:%p]\n",
619 if( NameArray->Count == 0 ||
620 NameArray->Count == 1)
623 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
624 AFS_TRACE_LEVEL_ERROR,
625 "AFSGetParentEntry [NA:%p] No more entries\n",
628 try_return( pDirEntry = NULL);
631 pElement = &NameArray->ElementArray[ NameArray->Count - 2];
633 pDirEntry = pElement->DirectoryCB;
635 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
636 AFS_TRACE_LEVEL_VERBOSE,
637 "AFSGetParentEntry [NA:%p] Returning Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
639 NameArray->Count - 2,
640 pElement->DirectoryCB,
641 pElement->FileId.Cell,
642 pElement->FileId.Volume,
643 pElement->FileId.Vnode,
644 pElement->FileId.Unique,
645 &pElement->DirectoryCB->NameInformation.FileName,
646 pElement->DirectoryCB->ObjectInformation->FileType));
657 AFSResetNameArray( IN AFSNameArrayHdr *NameArray,
658 IN AFSDirectoryCB *DirectoryCB)
661 AFSNameArrayCB *pCurrentElement = NULL;
662 AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
663 LONG lCount, lElement;
668 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
669 AFS_TRACE_LEVEL_VERBOSE,
670 "AFSResetNameArray [NA:%p] passed DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
673 DirectoryCB->ObjectInformation->FileId.Cell,
674 DirectoryCB->ObjectInformation->FileId.Volume,
675 DirectoryCB->ObjectInformation->FileId.Vnode,
676 DirectoryCB->ObjectInformation->FileId.Unique,
677 &DirectoryCB->NameInformation.FileName,
678 DirectoryCB->ObjectInformation->FileType));
681 // Dereference previous name array contents
684 for ( lElement = 0; lElement < NameArray->Count; lElement++)
687 pCurrentElement = &NameArray->ElementArray[ lElement];
689 lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
691 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
692 AFS_TRACE_LEVEL_VERBOSE,
693 "AFSResetNameArray [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
695 &pCurrentElement->DirectoryCB->NameInformation.FileName,
696 pCurrentElement->DirectoryCB,
699 ASSERT( lCount >= 0);
702 RtlZeroMemory( NameArray,
703 sizeof( AFSNameArrayHdr) +
704 ((pDevExt->Specific.RDR.NameArrayLength - 1) * sizeof( AFSNameArrayCB)));
706 NameArray->MaxElementCount = pDevExt->Specific.RDR.NameArrayLength;
708 if( DirectoryCB != NULL)
711 pCurrentElement = &NameArray->ElementArray[ 0];
713 NameArray->CurrentEntry = pCurrentElement;
715 NameArray->Count = 1;
717 NameArray->LinkCount = 0;
719 lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
721 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
722 AFS_TRACE_LEVEL_VERBOSE,
723 "AFSResetNameArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
725 &DirectoryCB->NameInformation.FileName,
729 pCurrentElement->DirectoryCB = DirectoryCB;
731 pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
733 pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
735 pCurrentElement->Flags = 0;
737 if( pCurrentElement->FileId.Vnode == 1)
740 SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
743 AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
744 AFS_TRACE_LEVEL_VERBOSE,
745 "AFSResetNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
747 pCurrentElement->DirectoryCB,
748 pCurrentElement->FileId.Cell,
749 pCurrentElement->FileId.Volume,
750 pCurrentElement->FileId.Vnode,
751 pCurrentElement->FileId.Unique,
752 &pCurrentElement->DirectoryCB->NameInformation.FileName,
753 pCurrentElement->DirectoryCB->ObjectInformation->FileType));
761 AFSDumpNameArray( IN AFSNameArrayHdr *NameArray)
764 AFSNameArrayCB *pCurrentElement = NULL;
766 pCurrentElement = &NameArray->ElementArray[ 0];
768 AFSPrint("AFSDumpNameArray Start (%d)\n", NameArray->Count);
770 while( pCurrentElement->DirectoryCB != NULL)
773 AFSPrint("FID %08lX-%08lX-%08lX-%08lX %wZ\n",
774 pCurrentElement->FileId.Cell,
775 pCurrentElement->FileId.Volume,
776 pCurrentElement->FileId.Vnode,
777 pCurrentElement->FileId.Unique,
778 &pCurrentElement->DirectoryCB->NameInformation.FileName);
783 AFSPrint("AFSDumpNameArray End\n\n");