Windows: Use %p for ptrs in redirector trace messages
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSClose.cpp
1 /*
2  * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3  * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
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,
14  *   this list of conditions and the following disclaimer in the
15  *   documentation
16  *   and/or other materials provided with the distribution.
17  * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
18  *   nor the names of their contributors may be used to endorse or promote
19  *   products derived from this software without specific prior written
20  *   permission from Kernel Drivers, LLC and Your File System, Inc.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
26  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34
35 //
36 // File: AFSClose.cpp
37 //
38
39 #include "AFSCommon.h"
40
41 //
42 // Function: AFSClose
43 //
44 // Description:
45 //
46 //      This function is the IRP_MJ_CLOSE dispatch handler
47 //
48 // Return:
49 //
50 //       A status is returned for the handling of this request
51 //
52
53 NTSTATUS
54 AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
55           IN PIRP Irp)
56 {
57     UNREFERENCED_PARAMETER(LibDeviceObject);
58     NTSTATUS ntStatus = STATUS_SUCCESS;
59     IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
60     AFSFcb *pFcb = NULL;
61     AFSDeviceExt *pDeviceExt = NULL;
62     AFSCcb *pCcb = NULL;
63     AFSObjectInfoCB *pObjectInfo = NULL;
64     AFSDirectoryCB *pDirCB = NULL;
65     LONG lCount;
66
67     __try
68     {
69
70         if( AFSRDRDeviceObject == NULL)
71         {
72
73             //
74             // Let this through, it's an close on the library control device
75             //
76
77             try_return( ntStatus);
78         }
79
80         pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
81
82         pIrpSp = IoGetCurrentIrpStackLocation( Irp);
83
84         pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
85
86         if( pFcb == NULL)
87         {
88             try_return( ntStatus);
89         }
90
91         pObjectInfo = pFcb->ObjectInformation;
92
93         //
94         // Perform the close functionality depending on the type of node it is
95         //
96
97         switch( pFcb->Header.NodeTypeCode)
98         {
99
100             case AFS_IOCTL_FCB:
101             {
102
103                 AFSPIOCtlOpenCloseRequestCB stPIOCtlClose;
104                 AFSFileID stParentFileId;
105
106                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
107                               AFS_TRACE_LEVEL_VERBOSE,
108                               "AFSClose Acquiring GlobalRoot lock %p EXCL %08lX\n",
109                               &pFcb->NPFcb->Resource,
110                               PsGetCurrentThread());
111
112                 AFSAcquireExcl( &pFcb->NPFcb->Resource,
113                                   TRUE);
114
115                 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
116
117                 //
118                 // Send the close to the CM
119                 //
120
121                 RtlZeroMemory( &stPIOCtlClose,
122                                sizeof( AFSPIOCtlOpenCloseRequestCB));
123
124                 stPIOCtlClose.RequestId = pCcb->RequestID;
125
126                 stPIOCtlClose.RootId = pObjectInfo->VolumeCB->ObjectInformation.FileId;
127
128                 RtlZeroMemory( &stParentFileId,
129                                sizeof( AFSFileID));
130
131                 stParentFileId = pObjectInfo->ParentObjectInformation->FileId;
132
133                 //
134                 // Issue the close request to the service
135                 //
136
137                 AFSProcessRequest( AFS_REQUEST_TYPE_PIOCTL_CLOSE,
138                                    AFS_REQUEST_FLAG_SYNCHRONOUS,
139                                    &pCcb->AuthGroup,
140                                    NULL,
141                                    &stParentFileId,
142                                    (void *)&stPIOCtlClose,
143                                    sizeof( AFSPIOCtlOpenCloseRequestCB),
144                                    NULL,
145                                    NULL);
146
147                 pDirCB = pCcb->DirectoryCB;
148
149                 //
150                 // Remove the Ccb and de-allocate it
151                 //
152
153                 ntStatus = AFSRemoveCcb( pFcb,
154                                          pCcb);
155
156                 if( !NT_SUCCESS( ntStatus))
157                 {
158
159                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
160                                   AFS_TRACE_LEVEL_WARNING,
161                                   "AFSClose Failed to remove Ccb from Fcb Status %08lX\n", ntStatus);
162
163                     //
164                     // We can't actually fail a close operation so reset the status
165                     //
166
167                     ntStatus = STATUS_SUCCESS;
168                 }
169
170                 lCount = InterlockedDecrement( &pDirCB->DirOpenReferenceCount);
171
172                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
173                               AFS_TRACE_LEVEL_VERBOSE,
174                               "AFSClose (IOCtl) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
175                               &pDirCB->NameInformation.FileName,
176                               pDirCB,
177                               pCcb,
178                               lCount);
179
180                 ASSERT( lCount >= 0);
181
182                 //
183                 // If this is not the root then decrement the open child reference count
184                 //
185
186                 if( pObjectInfo->ParentObjectInformation != NULL &&
187                     pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount > 0)
188                 {
189
190                     InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
191
192                     AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
193                                   AFS_TRACE_LEVEL_VERBOSE,
194                                   "AFSClose (IOCtl) Decrement child open ref count on Parent object %p Cnt %d\n",
195                                   pObjectInfo->ParentObjectInformation,
196                                   pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
197                 }
198
199                 AFSReleaseResource( &pFcb->NPFcb->Resource);
200
201                 lCount = InterlockedDecrement( &pFcb->OpenReferenceCount);
202
203                 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
204                               AFS_TRACE_LEVEL_VERBOSE,
205                               "AFSClose (IOCtl) Decrement count on Fcb %p Cnt %d\n",
206                               pFcb,
207                               lCount);
208
209                 ASSERT( lCount >= 0);
210
211                 break;
212             }
213
214             case AFS_ROOT_ALL:
215             {
216
217                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
218                               AFS_TRACE_LEVEL_VERBOSE,
219                               "AFSClose Acquiring Special Root ALL lock %p EXCL %08lX\n",
220                               &pFcb->NPFcb->Resource,
221                               PsGetCurrentThread());
222
223                 AFSAcquireExcl( &pFcb->NPFcb->Resource,
224                                 TRUE);
225
226                 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
227
228                 pDirCB = pCcb->DirectoryCB;
229
230                 //
231                 // Remove the Ccb and de-allocate it
232                 //
233
234                 ntStatus = AFSRemoveCcb( pFcb,
235                                          pCcb);
236
237                 if( !NT_SUCCESS( ntStatus))
238                 {
239
240                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
241                                   AFS_TRACE_LEVEL_WARNING,
242                                   "AFSClose Failed to remove Ccb from Fcb Status %08lX\n", ntStatus);
243
244                     //
245                     // We can't actually fail a close operation so reset the status
246                     //
247
248                     ntStatus = STATUS_SUCCESS;
249                 }
250
251                 lCount = InterlockedDecrement( &pDirCB->DirOpenReferenceCount);
252
253                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
254                               AFS_TRACE_LEVEL_VERBOSE,
255                               "AFSClose Decrement (Root ALL) count on %wZ DE %p Ccb %p Cnt %d\n",
256                               &pDirCB->NameInformation.FileName,
257                               pDirCB,
258                               pCcb,
259                               lCount);
260
261                 ASSERT( lCount >= 0);
262
263                 AFSReleaseResource( &pFcb->NPFcb->Resource);
264
265                 lCount = InterlockedDecrement( &pFcb->OpenReferenceCount);
266
267                 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
268                               AFS_TRACE_LEVEL_VERBOSE,
269                               "AFSClose (RootAll) Decrement count on Fcb %p Cnt %d\n",
270                               pFcb,
271                               lCount);
272
273                 ASSERT( lCount >= 0);
274
275                 break;
276             }
277
278             //
279             // Root, file or directory node
280             //
281
282             case AFS_FILE_FCB:
283             case AFS_ROOT_FCB:
284             case AFS_DIRECTORY_FCB:
285             case AFS_SYMBOLIC_LINK_FCB:
286             case AFS_MOUNT_POINT_FCB:
287             case AFS_DFS_LINK_FCB:
288             case AFS_INVALID_FCB:
289             {
290
291                 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
292
293                 //
294                 // We may be performing some cleanup on the Fcb so grab it exclusive to ensure no collisions
295                 //
296
297                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
298                               AFS_TRACE_LEVEL_VERBOSE,
299                               "AFSClose Acquiring Dcb lock %p EXCL %08lX\n",
300                               &pFcb->NPFcb->Resource,
301                               PsGetCurrentThread());
302
303                 AFSAcquireExcl( &pFcb->NPFcb->Resource,
304                                 TRUE);
305
306                 KeQueryTickCount( &pFcb->ObjectInformation->LastAccessCount);
307
308                 if( pFcb->OpenReferenceCount == 1 &&
309                     pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
310                 {
311
312                     SetFlag( pFcb->Flags, AFS_FCB_FILE_CLOSED);
313
314                     //
315                     // Attempt to tear down our extent list for the file
316                     // If there are remaining dirty extents then attempt to
317                     // flush them as well
318                     //
319
320                     if( pFcb->Specific.File.ExtentsDirtyCount)
321                     {
322
323                         AFSFlushExtents( pFcb,
324                                          &pCcb->AuthGroup);
325                     }
326
327                     //
328                     // Wait for any outstanding queued flushes to complete
329                     //
330
331                     AFSWaitOnQueuedFlushes( pFcb);
332
333                     ASSERT( pFcb->Specific.File.ExtentsDirtyCount == 0 &&
334                             pFcb->Specific.File.QueuedFlushCount == 0);
335
336                     AFSReleaseResource( &pFcb->NPFcb->Resource);
337
338                     //
339                     // Tear 'em down, we'll not be needing them again
340                     //
341
342                     AFSTearDownFcbExtents( pFcb,
343                                            &pCcb->AuthGroup);
344                 }
345                 else
346                 {
347
348                     if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB &&
349                         pFcb->Specific.File.ExtentsDirtyCount &&
350                         (pCcb->GrantedAccess & FILE_WRITE_DATA))
351                     {
352
353                         AFSFlushExtents( pFcb,
354                                          &pCcb->AuthGroup);
355                     }
356
357                     AFSReleaseResource( &pFcb->NPFcb->Resource);
358                 }
359
360                 pDirCB = pCcb->DirectoryCB;
361
362                 //
363                 // Remove the Ccb and de-allocate it
364                 //
365
366                 ntStatus = AFSRemoveCcb( pFcb,
367                                          pCcb);
368
369                 if( !NT_SUCCESS( ntStatus))
370                 {
371
372                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
373                                   AFS_TRACE_LEVEL_WARNING,
374                                   "AFSClose Failed to remove Ccb from Fcb Status %08lX\n",
375                                   ntStatus);
376
377                     //
378                     // We can't actually fail a close operation so reset the status
379                     //
380
381                     ntStatus = STATUS_SUCCESS;
382                 }
383
384                 //
385                 // If this entry is deleted then remove the object from the volume tree
386                 //
387
388                 if( BooleanFlagOn( pDirCB->Flags, AFS_DIR_ENTRY_DELETED))
389                 {
390
391                     if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB &&
392                         pObjectInfo->Links == 0)
393                     {
394
395                         //
396                         // Stop anything possibly in process
397                         //
398
399                         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
400                                       AFS_TRACE_LEVEL_VERBOSE,
401                                       "AFSClose Acquiring Fcb extents lock %p EXCL %08lX\n",
402                                       &pFcb->NPFcb->Specific.File.ExtentsResource,
403                                       PsGetCurrentThread());
404
405                         AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
406                                         TRUE);
407
408                         pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_FILE_DELETED;
409
410                         KeSetEvent( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
411                                     0,
412                                     FALSE);
413
414                         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
415                                       AFS_TRACE_LEVEL_VERBOSE,
416                                       "AFSClose Releasing Fcb extents lock %p EXCL %08lX\n",
417                                       &pFcb->NPFcb->Specific.File.ExtentsResource,
418                                       PsGetCurrentThread());
419
420                         AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
421                     }
422
423                     AFSAcquireExcl( pObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
424                                     TRUE);
425
426                     AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
427                                     TRUE);
428
429                     lCount = InterlockedDecrement( &pDirCB->DirOpenReferenceCount);
430
431                     AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
432                                   AFS_TRACE_LEVEL_VERBOSE,
433                                   "AFSClose (Other) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
434                                   &pDirCB->NameInformation.FileName,
435                                   pDirCB,
436                                   pCcb,
437                                   lCount);
438
439                     ASSERT( lCount >= 0);
440
441                     if( lCount == 0)
442                     {
443
444                         AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
445                                       AFS_TRACE_LEVEL_VERBOSE,
446                                       "AFSClose Deleting dir entry %p (%p) for %wZ  FID %08lX-%08lX-%08lX-%08lX\n",
447                                       pDirCB,
448                                       pObjectInfo,
449                                       &pDirCB->NameInformation.FileName,
450                                       pObjectInfo->FileId.Cell,
451                                       pObjectInfo->FileId.Volume,
452                                       pObjectInfo->FileId.Vnode,
453                                       pObjectInfo->FileId.Unique);
454
455                         //
456                         // Remove and delete the directory entry from the parent list
457                         //
458
459                         AFSDeleteDirEntry( pObjectInfo->ParentObjectInformation,
460                                            pDirCB);
461
462                         AFSAcquireShared( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
463                                           TRUE);
464
465                         if( pObjectInfo->ObjectReferenceCount <= 0)
466                         {
467
468                             if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
469                             {
470
471                                 AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
472                                               AFS_TRACE_LEVEL_VERBOSE,
473                                               "AFSClose Removing object %p from volume tree\n",
474                                               pObjectInfo);
475
476                                 AFSRemoveHashEntry( &pObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
477                                                     &pObjectInfo->TreeEntry);
478
479                                 ClearFlag( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
480                             }
481                         }
482
483                         AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
484                     }
485
486                     AFSReleaseResource( pObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
487
488                     AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
489                 }
490                 else
491                 {
492
493                     lCount = InterlockedDecrement( &pDirCB->DirOpenReferenceCount);
494
495                     AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
496                                   AFS_TRACE_LEVEL_VERBOSE,
497                                   "AFSClose (Other2) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
498                                   &pDirCB->NameInformation.FileName,
499                                   pDirCB,
500                                   pCcb,
501                                   lCount);
502
503                     ASSERT( lCount >= 0);
504                 }
505
506                 //
507                 // If this is not the root then decrement the open child reference count
508                 //
509
510                 if( pObjectInfo != NULL &&
511                     pObjectInfo->ParentObjectInformation != NULL &&
512                     pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount > 0)
513                 {
514
515                     InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
516
517                     AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
518                                   AFS_TRACE_LEVEL_VERBOSE,
519                                   "AFSClose Decrement child open ref count on Parent object %p Cnt %d\n",
520                                   pObjectInfo->ParentObjectInformation,
521                                   pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
522                 }
523
524                 //
525                 // Decrement the reference count on the Fcb. this is protecting it from teardown.
526                 //
527
528                 lCount = InterlockedDecrement( &pFcb->OpenReferenceCount);
529
530                 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
531                               AFS_TRACE_LEVEL_VERBOSE,
532                               "AFSClose Decrement count on Fcb %p Cnt %d\n",
533                               pFcb,
534                               lCount);
535
536                 ASSERT( lCount >= 0);
537
538                 break;
539             }
540
541             case AFS_SPECIAL_SHARE_FCB:
542             {
543
544                 AFSPipeOpenCloseRequestCB stPipeClose;
545
546                 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
547
548                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
549                               AFS_TRACE_LEVEL_VERBOSE,
550                               "AFSClose Acquiring Special Share lock %p EXCL %08lX\n",
551                               &pFcb->NPFcb->Resource,
552                               PsGetCurrentThread());
553
554                 AFSAcquireExcl( &pFcb->NPFcb->Resource,
555                                 TRUE);
556
557                 RtlZeroMemory( &stPipeClose,
558                                sizeof( AFSPipeOpenCloseRequestCB));
559
560                 stPipeClose.RequestId = pCcb->RequestID;
561
562                 stPipeClose.RootId = pObjectInfo->VolumeCB->ObjectInformation.FileId;
563
564                 //
565                 // Issue the open request to the service
566                 //
567
568                 /*
569                 AFSProcessRequest( AFS_REQUEST_TYPE_PIPE_CLOSE,
570                                    AFS_REQUEST_FLAG_SYNCHRONOUS,
571                                    &pFcb->AuthGroup,
572                                    &pDirCB->NameInformation.FileName,
573                                    NULL,
574                                    (void *)&stPipeClose,
575                                    sizeof( AFSPipeOpenCloseRequestCB),
576                                    NULL,
577                                    NULL);
578                 */
579
580                 pDirCB = pCcb->DirectoryCB;
581
582                 //
583                 // Remove the Ccb and de-allocate it
584                 //
585
586                 ntStatus = AFSRemoveCcb( pFcb,
587                                          pCcb);
588
589                 if( !NT_SUCCESS( ntStatus))
590                 {
591
592                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
593                                   AFS_TRACE_LEVEL_WARNING,
594                                   "AFSClose Failed to remove Ccb from Fcb Status %08lX\n", ntStatus);
595
596                     //
597                     // We can't actually fail a close operation so reset the status
598                     //
599
600                     ntStatus = STATUS_SUCCESS;
601                 }
602
603                 lCount = InterlockedDecrement( &pDirCB->DirOpenReferenceCount);
604
605                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
606                               AFS_TRACE_LEVEL_VERBOSE,
607                               "AFSClose (Share) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
608                               &pDirCB->NameInformation.FileName,
609                               pDirCB,
610                               pCcb,
611                               lCount);
612
613                 ASSERT( lCount >= 0);
614
615                 //
616                 // If this is not the root then decrement the open child reference count
617                 //
618
619                 if( pObjectInfo->ParentObjectInformation != NULL &&
620                     pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount > 0)
621                 {
622
623                     lCount = InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
624
625                     AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
626                                   AFS_TRACE_LEVEL_VERBOSE,
627                                   "AFSClose (Share) Decrement child open ref count on Parent object %p Cnt %d\n",
628                                   pObjectInfo->ParentObjectInformation,
629                                   lCount);
630                 }
631
632                 AFSReleaseResource( &pFcb->NPFcb->Resource);
633
634                 lCount = InterlockedDecrement( &pFcb->OpenReferenceCount);
635
636                 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
637                               AFS_TRACE_LEVEL_VERBOSE,
638                               "AFSClose (Share) Decrement count on Fcb %p Cnt %d\n",
639                               pFcb,
640                               lCount);
641
642                 ASSERT( lCount >= 0);
643
644                 break;
645             }
646
647             default:
648
649                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
650                               AFS_TRACE_LEVEL_ERROR,
651                               "AFSClose Processing unknown node type %d\n",
652                               pFcb->Header.NodeTypeCode);
653
654                 break;
655         }
656
657 try_exit:
658
659         //
660         // Complete the request
661         //
662
663         AFSCompleteRequest( Irp,
664                             ntStatus);
665     }
666     __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
667     {
668
669         AFSDbgLogMsg( 0,
670                       0,
671                       "EXCEPTION - AFSClose\n");
672
673         AFSDumpTraceFilesFnc();
674     }
675
676     return ntStatus;
677 }