@@ -19,10 +19,44 @@ use crate::abi::virtio_fs::{RemovemappingIn, RemovemappingOne, SetupmappingIn};
19
19
use crate :: api:: filesystem:: {
20
20
DirEntry , Entry , FileSystem , GetxattrReply , IoctlData , ListxattrReply ,
21
21
} ;
22
+ #[ cfg( feature = "fusedev" ) ]
23
+ use crate :: transport:: FuseDevWriter ;
22
24
use crate :: transport:: { pagesize, FsCacheReqHandler , Reader , Writer } ;
23
25
use crate :: { bytes_to_cstr, encode_io_error_kind, BitmapSlice , Error , Result } ;
24
26
25
27
impl < 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
+ }
26
60
/// Main entrance to handle requests from the transport layer.
27
61
///
28
62
/// It receives Fuse requests from transport layers, parses the request according to Fuse ABI,
0 commit comments