Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
google
GitHub Repository: google/crosvm
Path: blob/main/base/src/sys/windows/write_zeroes.rs
5394 views
1
// Copyright 2022 The ChromiumOS Authors
2
// Use of this source code is governed by a BSD-style license that can be
3
// found in the LICENSE file.
4
5
use std::cmp::min;
6
use std::fs::File;
7
use std::io;
8
use std::os::windows::fs::FileExt;
9
10
use crate::PunchHole;
11
12
// TODO(b/195151495): Fix so that this will extend a file size if needed.
13
pub(crate) fn file_write_zeroes_at(file: &File, offset: u64, length: usize) -> io::Result<usize> {
14
// Try to punch a hole first.
15
if let Ok(()) = file.punch_hole(offset, length as u64) {
16
return Ok(length);
17
}
18
19
// fall back to write()
20
// punch_hole() failed; fall back to writing a buffer of zeroes
21
// until we have written up to length.
22
let buf_size = min(length, 0x10000);
23
let buf = vec![0u8; buf_size];
24
let mut nwritten: usize = 0;
25
while nwritten < length {
26
let remaining = length - nwritten;
27
let write_size = min(remaining, buf_size);
28
nwritten += file.seek_write(&buf[0..write_size], offset + nwritten as u64)?;
29
}
30
Ok(length)
31
}
32
33