| 2137 | |
| 2138 | |
| 2139 | NTSTATUS |
| 2140 | Ext2SupersedeOrOverWriteFile( |
| 2141 | IN PEXT2_IRP_CONTEXT IrpContext, |
| 2142 | IN PFILE_OBJECT FileObject, |
| 2143 | IN PEXT2_VCB Vcb, |
| 2144 | IN PEXT2_FCB Fcb, |
| 2145 | IN PLARGE_INTEGER AllocationSize, |
| 2146 | IN ULONG Disposition |
| 2147 | ) |
| 2148 | { |
| 2149 | LARGE_INTEGER CurrentTime; |
| 2150 | LARGE_INTEGER Size; |
| 2151 | |
| 2152 | KeQuerySystemTime(&CurrentTime); |
| 2153 | |
| 2154 | Size.QuadPart = 0; |
| 2155 | if (!MmCanFileBeTruncated(&(Fcb->SectionObject), &(Size))) { |
| 2156 | return STATUS_USER_MAPPED_FILE; |
| 2157 | } |
| 2158 | |
| 2159 | /* purge all file cache and shrink cache windows size */ |
| 2160 | CcPurgeCacheSection(&Fcb->SectionObject, NULL, 0, FALSE); |
| 2161 | Fcb->Header.AllocationSize.QuadPart = |
| 2162 | Fcb->Header.FileSize.QuadPart = |
| 2163 | Fcb->Header.ValidDataLength.QuadPart = 0; |
| 2164 | CcSetFileSizes(FileObject, |
| 2165 | (PCC_FILE_SIZES)&Fcb->Header.AllocationSize); |
| 2166 | |
| 2167 | Size.QuadPart = CEILING_ALIGNED(ULONGLONG, |
| 2168 | (ULONGLONG)AllocationSize->QuadPart, |
| 2169 | (ULONGLONG)BLOCK_SIZE); |
| 2170 | |
| 2171 | if ((loff_t)Size.QuadPart > Fcb->Inode->i_size) { |
| 2172 | Ext2ExpandFile(IrpContext, Vcb, Fcb->Mcb, &Size); |
| 2173 | } else { |
| 2174 | Ext2TruncateFile(IrpContext, Vcb, Fcb->Mcb, &Size); |
| 2175 | } |
| 2176 | |
| 2177 | Fcb->Header.AllocationSize = Size; |
| 2178 | if (Fcb->Header.AllocationSize.QuadPart > 0) { |
| 2179 | SetLongFlag(Fcb->Flags, FCB_ALLOC_IN_CREATE); |
| 2180 | CcSetFileSizes(FileObject, |
| 2181 | (PCC_FILE_SIZES)&Fcb->Header.AllocationSize ); |
| 2182 | } |
| 2183 | |
| 2184 | /* remove all extent mappings */ |
| 2185 | DEBUG(DL_EXT, ("Ext2SuperSede ...: %wZ\n", &Fcb->Mcb->FullName)); |
| 2186 | Fcb->Inode->i_size = 0; |
| 2187 | |
| 2188 | if (Disposition == FILE_SUPERSEDE) { |
| 2189 | Fcb->Inode->i_ctime = Ext2LinuxTime(CurrentTime); |
| 2190 | } |
| 2191 | Fcb->Inode->i_atime = |
| 2192 | Fcb->Inode->i_mtime = Ext2LinuxTime(CurrentTime); |
| 2193 | Ext2SaveInode(IrpContext, Vcb, Fcb->Inode); |
| 2194 | |
| 2195 | // See if we need to overwrite EA of the file |
| 2196 | return Ext2OverwriteEa(IrpContext, Vcb, Fcb, &IrpContext->Irp->IoStatus); |
no test coverage detected