@@ -19,10 +19,44 @@ use crate::abi::virtio_fs::{RemovemappingIn, RemovemappingOne, SetupmappingIn};
1919use crate :: api:: filesystem:: {
2020 DirEntry , Entry , FileSystem , GetxattrReply , IoctlData , ListxattrReply ,
2121} ;
22+ #[ cfg( feature = "fusedev" ) ]
23+ use crate :: transport:: FuseDevWriter ;
2224use crate :: transport:: { pagesize, FsCacheReqHandler , Reader , Writer } ;
2325use crate :: { bytes_to_cstr, encode_io_error_kind, BitmapSlice , Error , Result } ;
2426
2527impl < F : FileSystem + Sync > Server < F > {
28+ #[ cfg( feature = "fusedev" ) ]
29+ /// Use to send notify msg to kernel fuse
30+ pub fn notify_inval_entry < S : BitmapSlice > (
31+ & self ,
32+ mut w : FuseDevWriter < ' _ , S > ,
33+ parent : u64 ,
34+ name : & std:: ffi:: CStr ,
35+ ) -> Result < usize > {
36+ let mut buffer_writer = w. split_at ( 0 ) . map_err ( Error :: FailedToSplitWriter ) ?;
37+ let mut entry = NotifyInvalEntryOut :: default ( ) ;
38+ let mut header = OutHeader :: default ( ) ;
39+ let name_with_null = name. to_bytes_with_nul ( ) ;
40+ header. unique = 0 ;
41+ header. error = NotifyOpcode :: InvalEntry as i32 ;
42+ header. len = std:: mem:: size_of :: < OutHeader > ( ) as u32
43+ + std:: mem:: size_of :: < NotifyInvalEntryOut > ( ) as u32
44+ + name_with_null. len ( ) as u32 ;
45+ // the namelne don't contains the nul
46+ entry. namelen = ( name_with_null. len ( ) - 1 ) as u32 ;
47+ entry. parent = parent;
48+
49+ buffer_writer
50+ . write_obj ( header)
51+ . map_err ( Error :: FailedToWrite ) ?;
52+ buffer_writer
53+ . write_obj ( entry)
54+ . map_err ( Error :: FailedToWrite ) ?;
55+ buffer_writer
56+ . write ( name_with_null)
57+ . map_err ( Error :: FailedToWrite ) ?;
58+ buffer_writer. commit ( None ) . map_err ( Error :: InvalidMessage )
59+ }
2660 /// Main entrance to handle requests from the transport layer.
2761 ///
2862 /// It receives Fuse requests from transport layers, parses the request according to Fuse ABI,
0 commit comments