:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / ntoskrnl / cc / misc.c
1 /* INCLUDES ******************************************************************/
2
3 #include <ddk/ntddk.h>
4 #include <ddk/ntifs.h>
5 #include <internal/mm.h>
6 #include <internal/cc.h>
7 #include <internal/pool.h>
8 #include <internal/io.h>
9 #include <ntos/minmax.h>
10
11 #define NDEBUG
12 #include <internal/debug.h>
13
14 /* GLOBALS *******************************************************************/
15
16 /* FUNCTIONS *****************************************************************/
17
18 /**********************************************************************
19  * NAME                                                 INTERNAL
20  *      CcMdlReadCompleteDev@8
21  *
22  * DESCRIPTION
23  *
24  * ARGUMENTS
25  *      MdlChain
26  *      DeviceObject
27  *      
28  * RETURN VALUE
29  *      None.
30  *
31  * NOTE
32  *      Used by CcMdlReadComplete@8 and FsRtl
33  */
34 VOID STDCALL
35 CcMdlReadCompleteDev (IN        PMDL            MdlChain,
36                       IN        PDEVICE_OBJECT  DeviceObject)
37 {
38   UNIMPLEMENTED;
39 }
40
41
42 /**********************************************************************
43  * NAME                                                 EXPORTED
44  *      CcMdlReadComplete@8
45  *
46  * DESCRIPTION
47  *
48  * ARGUMENTS
49  *
50  * RETURN VALUE
51  *      None.
52  *
53  * NOTE
54  *      From Bo Branten's ntifs.h v13.
55  */
56 VOID STDCALL
57 CcMdlReadComplete (IN   PFILE_OBJECT    FileObject,
58                    IN   PMDL            MdlChain)
59 {
60    PDEVICE_OBJECT       DeviceObject = NULL;
61    
62    DeviceObject = IoGetRelatedDeviceObject (FileObject);
63    /* FIXME: try fast I/O first */
64    CcMdlReadCompleteDev (MdlChain,
65                          DeviceObject);
66 }
67
68 VOID STDCALL
69 CcSetFileSizes (IN PFILE_OBJECT FileObject,
70                 IN PCC_FILE_SIZES FileSizes)
71 {
72   KIRQL oldirql;
73   PBCB Bcb;
74   PLIST_ENTRY current_entry;
75   PCACHE_SEGMENT current;
76
77   DPRINT("CcSetFileSizes(FileObject %x, FileSizes %x)\n", 
78          FileObject, FileSizes);
79   DPRINT("AllocationSize %d, FileSize %d, ValidDataLength %d\n",
80          (ULONG)FileSizes->AllocationSize.QuadPart,
81          (ULONG)FileSizes->FileSize.QuadPart,
82          (ULONG)FileSizes->ValidDataLength.QuadPart);
83
84   Bcb = ((REACTOS_COMMON_FCB_HEADER*)FileObject->FsContext)->Bcb;
85   
86   KeAcquireSpinLock(&Bcb->BcbLock, &oldirql);
87   
88   if (FileSizes->AllocationSize.QuadPart < Bcb->AllocationSize.QuadPart)
89     {
90       current_entry = Bcb->BcbSegmentListHead.Flink;
91       while (current_entry != &Bcb->BcbSegmentListHead)
92       {
93          current = CONTAINING_RECORD(current_entry, CACHE_SEGMENT, 
94                                      BcbSegmentListEntry);
95          current_entry = current_entry->Flink;
96          if (current->FileOffset > FileSizes->AllocationSize.QuadPart)
97          {
98             KeReleaseSpinLock(&Bcb->BcbLock, oldirql);
99             CcRosFreeCacheSegment(Bcb, current);
100             KeAcquireSpinLock(&Bcb->BcbLock, &oldirql);
101             current_entry = Bcb->BcbSegmentListHead.Flink;
102          }
103       }
104     }
105   Bcb->AllocationSize = FileSizes->AllocationSize;
106   Bcb->FileSize = FileSizes->FileSize;
107   KeReleaseSpinLock(&Bcb->BcbLock, oldirql);
108 }
109