File tree Expand file tree Collapse file tree 3 files changed +28
-8
lines changed Expand file tree Collapse file tree 3 files changed +28
-8
lines changed Original file line number Diff line number Diff line change @@ -87,8 +87,26 @@ impl VfsNodeOps for FileWrapper<'static> {
87
87
88
88
fn truncate ( & self , size : u64 ) -> VfsResult {
89
89
let mut file = self . 0 . lock ( ) ;
90
- file. seek ( SeekFrom :: Start ( size) ) . map_err ( as_vfs_err) ?; // TODO: more efficient
91
- file. truncate ( ) . map_err ( as_vfs_err)
90
+ let current_size = file. seek ( SeekFrom :: End ( 0 ) ) . map_err ( as_vfs_err) ?;
91
+
92
+ if size <= current_size {
93
+ // If the target size is smaller than the current size,
94
+ // perform a standard truncation operation
95
+ file. seek ( SeekFrom :: Start ( size) ) . map_err ( as_vfs_err) ?; // TODO: more efficient
96
+ file. truncate ( ) . map_err ( as_vfs_err)
97
+ } else {
98
+ // Calculate the number of bytes to fill
99
+ let mut zeros_needed = size - current_size;
100
+ // Create a buffer of zeros
101
+ let zeros = [ 0u8 ; 4096 ] ;
102
+ while zeros_needed > 0 {
103
+ let to_write = core:: cmp:: min ( zeros_needed, zeros. len ( ) as u64 ) ;
104
+ let write_buf = & zeros[ ..to_write as usize ] ;
105
+ file. write ( write_buf) . map_err ( as_vfs_err) ?;
106
+ zeros_needed -= to_write;
107
+ }
108
+ Ok ( ( ) )
109
+ }
92
110
}
93
111
}
94
112
Original file line number Diff line number Diff line change @@ -7,11 +7,13 @@ use crate::fs;
7
7
pub ( crate ) fn devfs ( ) -> Arc < fs:: devfs:: DeviceFileSystem > {
8
8
let null = fs:: devfs:: NullDev ;
9
9
let zero = fs:: devfs:: ZeroDev ;
10
+ let urandom = fs:: devfs:: UrandomDev :: default ( ) ;
10
11
let bar = fs:: devfs:: ZeroDev ;
11
12
let devfs = fs:: devfs:: DeviceFileSystem :: new ( ) ;
12
13
let foo_dir = devfs. mkdir ( "foo" ) ;
13
14
devfs. add ( "null" , Arc :: new ( null) ) ;
14
15
devfs. add ( "zero" , Arc :: new ( zero) ) ;
16
+ devfs. add ( "urandom" , Arc :: new ( urandom) ) ;
15
17
foo_dir. add ( "bar" , Arc :: new ( bar) ) ;
16
18
Arc :: new ( devfs)
17
19
}
You can’t perform that action at this time.
0 commit comments