| 167 | } |
| 168 | |
| 169 | BOOLEAN |
| 170 | Ext2ZeroData ( |
| 171 | IN PEXT2_IRP_CONTEXT IrpContext, |
| 172 | IN PEXT2_VCB Vcb, |
| 173 | IN PFILE_OBJECT FileObject, |
| 174 | IN PLARGE_INTEGER Start, |
| 175 | IN PLARGE_INTEGER End |
| 176 | ) |
| 177 | { |
| 178 | PEXT2_FCB Fcb; |
| 179 | PBCB Bcb; |
| 180 | PVOID Ptr; |
| 181 | ULONG Size; |
| 182 | BOOLEAN rc = TRUE; |
| 183 | |
| 184 | ASSERT (End && Start && End->QuadPart > Start->QuadPart); |
| 185 | Fcb = (PEXT2_FCB) FileObject->FsContext; |
| 186 | |
| 187 | /* skip data zero if we've already tracked unwritten part */ |
| 188 | if (0 == ( End->LowPart & (BLOCK_SIZE -1)) && |
| 189 | 0 == (Start->LowPart & (BLOCK_SIZE -1))) { |
| 190 | |
| 191 | if (INODE_HAS_EXTENT(Fcb->Inode)) { |
| 192 | return TRUE; |
| 193 | } else { |
| 194 | #if !EXT2_PRE_ALLOCATION_SUPPORT |
| 195 | return TRUE; |
| 196 | #endif |
| 197 | } |
| 198 | } |
| 199 | |
| 200 | /* clear data in range [Start, End) */ |
| 201 | __try { |
| 202 | rc = CcZeroData(FileObject, Start, End, Ext2CanIWait()); |
| 203 | } __except (EXCEPTION_EXECUTE_HANDLER) { |
| 204 | DbgBreak(); |
| 205 | } |
| 206 | |
| 207 | return rc; |
| 208 | } |
| 209 | |
| 210 | VOID |
| 211 | Ext2DeferWrite(IN PEXT2_IRP_CONTEXT IrpContext, PIRP Irp) |