@@ -6,9 +6,12 @@ pub mod sync_io;
66
77use std:: fmt:: Debug ;
88use std:: fs:: File ;
9+ use libc:: { c_int, off64_t, FALLOC_FL_KEEP_SIZE , FALLOC_FL_PUNCH_HOLE } ;
10+ use std:: os:: unix:: io:: AsRawFd ;
911
1012pub use self :: async_io:: { AsyncFileEngine , AsyncIoError } ;
1113pub use self :: sync_io:: { SyncFileEngine , SyncIoError } ;
14+ use crate :: device_manager:: mmio:: MMIO_LEN ;
1215use crate :: devices:: virtio:: block:: virtio:: PendingRequest ;
1316use crate :: devices:: virtio:: block:: virtio:: device:: FileEngineType ;
1417use crate :: vstate:: memory:: { GuestAddress , GuestMemoryMmap } ;
@@ -75,7 +78,7 @@ impl FileEngine {
7578 Ok ( ( ) )
7679 }
7780
78- # [ cfg ( test ) ]
81+
7982 pub fn file ( & self ) -> & File {
8083 match self {
8184 FileEngine :: Async ( engine) => engine. file ( ) ,
@@ -172,6 +175,31 @@ impl FileEngine {
172175 FileEngine :: Sync ( engine) => engine. flush ( ) . map_err ( BlockIoError :: Sync ) ,
173176 }
174177 }
178+
179+ pub fn discard (
180+ & mut self ,
181+ offset : u64 ,
182+ count : u32 ,
183+ req : PendingRequest ,
184+ ) -> Result < FileEngineOk , RequestError < BlockIoError > > {
185+
186+ match self {
187+ FileEngine :: Async ( engine) => match engine. push_discard ( offset, count, req) {
188+ Ok ( _) => Ok ( FileEngineOk :: Submitted ) ,
189+ Err ( err) => Err ( RequestError {
190+ req : err. req ,
191+ error : BlockIoError :: Async ( err. error ) ,
192+ } ) ,
193+ } ,
194+ FileEngine :: Sync ( engine) => match engine. discard ( offset, count) {
195+ Ok ( count) => Ok ( FileEngineOk :: Executed ( RequestOk { req, count } ) ) ,
196+ Err ( err) => Err ( RequestError {
197+ req,
198+ error : BlockIoError :: Sync ( err) ,
199+ } ) ,
200+ } ,
201+ }
202+ }
175203}
176204
177205#[ cfg( test) ]
0 commit comments