1 /* INCLUDES ******************************************************************/
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>
12 #include <internal/debug.h>
14 /* GLOBALS *******************************************************************/
16 /* FUNCTIONS *****************************************************************/
18 /**********************************************************************
20 * CcMdlReadCompleteDev@8
32 * Used by CcMdlReadComplete@8 and FsRtl
35 CcMdlReadCompleteDev (IN PMDL MdlChain
,
36 IN PDEVICE_OBJECT DeviceObject
)
42 /**********************************************************************
54 * From Bo Branten's ntifs.h v13.
57 CcMdlReadComplete (IN PFILE_OBJECT FileObject
,
60 PDEVICE_OBJECT DeviceObject
= NULL
;
62 DeviceObject
= IoGetRelatedDeviceObject (FileObject
);
63 /* FIXME: try fast I/O first */
64 CcMdlReadCompleteDev (MdlChain
,
69 CcSetFileSizes (IN PFILE_OBJECT FileObject
,
70 IN PCC_FILE_SIZES FileSizes
)
74 PLIST_ENTRY current_entry
;
75 PCACHE_SEGMENT current
;
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
);
84 Bcb
= ((REACTOS_COMMON_FCB_HEADER
*)FileObject
->FsContext
)->Bcb
;
86 KeAcquireSpinLock(&Bcb
->BcbLock
, &oldirql
);
88 if (FileSizes
->AllocationSize
.QuadPart
< Bcb
->AllocationSize
.QuadPart
)
90 current_entry
= Bcb
->BcbSegmentListHead
.Flink
;
91 while (current_entry
!= &Bcb
->BcbSegmentListHead
)
93 current
= CONTAINING_RECORD(current_entry
, CACHE_SEGMENT
,
95 current_entry
= current_entry
->Flink
;
96 if (current
->FileOffset
> FileSizes
->AllocationSize
.QuadPart
)
98 CcRosFreeCacheSegment(Bcb
, current
);
102 Bcb
->AllocationSize
= FileSizes
->AllocationSize
;
103 Bcb
->FileSize
= FileSizes
->FileSize
;
104 KeReleaseSpinLock(&Bcb
->BcbLock
, oldirql
);