0fbbbb9e52b12cb4e6240cae7d9be7b80b325d35
[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   DPRINT("Bcb 0x%.08x\n", Bcb);
87   
88   KeAcquireSpinLock(&Bcb->BcbLock, &oldirql);
89   
90   if (FileSizes->AllocationSize.QuadPart < Bcb->AllocationSize.QuadPart)
91     {
92       current_entry = Bcb->BcbSegmentListHead.Flink;
93       while (current_entry != &Bcb->BcbSegmentListHead)
94       {
95          current = CONTAINING_RECORD(current_entry, CACHE_SEGMENT, 
96                                      BcbSegmentListEntry);
97          current_entry = current_entry->Flink;
98          if (current->FileOffset > FileSizes->AllocationSize.QuadPart)
99          {
100             KeReleaseSpinLock(&Bcb->BcbLock, oldirql);
101             CcRosFreeCacheSegment(Bcb, current);
102             KeAcquireSpinLock(&Bcb->BcbLock, &oldirql);
103             current_entry = Bcb->BcbSegmentListHead.Flink;
104          }
105       }
106     }
107   Bcb->AllocationSize = FileSizes->AllocationSize;
108   Bcb->FileSize = FileSizes->FileSize;
109   KeReleaseSpinLock(&Bcb->BcbLock, oldirql);
110 }
111