:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / drivers / fs / vfat / close.c
1 /* $Id$
2  *
3  * COPYRIGHT:        See COPYING in the top level directory
4  * PROJECT:          ReactOS kernel
5  * FILE:             services/fs/vfat/close.c
6  * PURPOSE:          VFAT Filesystem
7  * PROGRAMMER:       Jason Filby (jasonfilby@yahoo.com)
8  */
9
10 /* INCLUDES *****************************************************************/
11
12 #include <ddk/ntddk.h>
13
14 #define NDEBUG
15 #include <debug.h>
16
17 #include "vfat.h"
18
19 /* FUNCTIONS ****************************************************************/
20
21 NTSTATUS
22 VfatCloseFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
23 /*
24  * FUNCTION: Closes a file
25  */
26 {
27   PVFATFCB pFcb;
28   PVFATCCB pCcb;
29   NTSTATUS Status = STATUS_SUCCESS;
30
31   DPRINT ("VfatCloseFile(DeviceExt %x, FileObject %x)\n",
32           DeviceExt, FileObject);
33
34   /* FIXME : update entry in directory? */
35   pCcb = (PVFATCCB) (FileObject->FsContext2);
36
37   DPRINT ("pCcb %x\n", pCcb);
38   if (pCcb == NULL)
39   {
40     return  STATUS_SUCCESS;
41   }
42   pFcb = pCcb->pFcb;
43   if (pFcb->Flags & FCB_IS_VOLUME)
44   {
45      DPRINT1("Volume\n");
46      pFcb->RefCount--;
47      FileObject->FsContext2 = NULL;
48   }
49   else if (FileObject->FileName.Buffer)
50   {
51     // This a FO, that was created outside from FSD.
52     // Some FO's are created with IoCreateStreamFileObject() insid from FSD.
53     // This FO's haven't a FileName.
54     if (FileObject->DeletePending)
55     {
56       if (pFcb->Flags & FCB_DELETE_PENDING)
57       {
58         delEntry (DeviceExt, FileObject);
59         pFcb->Flags &= ~FCB_UPDATE_DIRENTRY;
60       }
61       else
62        Status = STATUS_DELETE_PENDING;
63     }
64     if (pFcb->Flags & FCB_UPDATE_DIRENTRY)
65     {
66        VfatUpdateEntry (DeviceExt, FileObject);
67        pFcb->Flags &= ~FCB_UPDATE_DIRENTRY;
68     }
69     FileObject->FsContext2 = NULL;
70     vfatReleaseFCB (DeviceExt, pFcb);
71   }
72   else
73     FileObject->FsContext2 = NULL;
74
75   if (pCcb->DirectorySearchPattern)
76     ExFreePool(pCcb->DirectorySearchPattern);
77   ExFreePool (pCcb);
78
79   return  Status;
80 }
81
82 NTSTATUS VfatClose (PVFAT_IRP_CONTEXT IrpContext)
83 /*
84  * FUNCTION: Closes a file
85  */
86 {
87   NTSTATUS Status;
88
89   DPRINT ("VfatClose(DeviceObject %x, Irp %x)\n", DeviceObject, Irp);
90
91   if (IrpContext->DeviceObject == VfatGlobalData->DeviceObject)
92     {
93       DPRINT("Closing file system\n");
94       Status = STATUS_SUCCESS;
95       goto ByeBye;
96     }
97
98   if (!ExAcquireResourceExclusiveLite (&IrpContext->DeviceExt->DirResource, IrpContext->Flags & IRPCONTEXT_CANWAIT))
99   {
100      return VfatQueueRequest (IrpContext);
101   }
102
103   Status = VfatCloseFile (IrpContext->DeviceExt, IrpContext->FileObject);
104   ExReleaseResourceLite (&IrpContext->DeviceExt->DirResource);
105
106 ByeBye:
107   IrpContext->Irp->IoStatus.Status = Status;
108   IrpContext->Irp->IoStatus.Information = 0;
109   IoCompleteRequest (IrpContext->Irp, IO_NO_INCREMENT);
110   VfatFreeIrpContext(IrpContext);
111
112   return (Status);
113 }
114
115 /* EOF */