@@ -54,6 +54,8 @@ pub trait RawFileSystem: Send + Sync {
54
54
55
55
async fn open_file ( & self , file_id : u64 , flags : u32 ) -> Result < FileHandle > ;
56
56
57
+ async fn open_dir ( & self , file_id : u64 , flags : u32 ) -> Result < FileHandle > ;
58
+
57
59
async fn create_file ( & self , parent_file_id : u64 , name : & str , flags : u32 ) -> Result < FileHandle > ;
58
60
59
61
async fn create_dir ( & self , parent_file_id : u64 , name : & str ) -> Result < FileHandle > ;
@@ -85,6 +87,8 @@ pub trait PathFileSystem: Send + Sync {
85
87
86
88
async fn open_file ( & self , name : & str , flags : OpenFileFlags ) -> Result < OpenedFile > ;
87
89
90
+ async fn open_dir ( & self , name : & str , flags : OpenFileFlags ) -> Result < OpenedFile > ;
91
+
88
92
async fn create_file (
89
93
& self ,
90
94
parent : & str ,
@@ -250,6 +254,24 @@ impl OpenedFile {
250
254
self . writer . as_mut ( ) . unwrap ( ) . write ( offset, data) . await
251
255
}
252
256
257
+ async fn close ( & mut self ) -> Result < ( ) > {
258
+ if let Some ( mut reader) = self . reader . take ( ) {
259
+ reader. close ( ) . await ?;
260
+ }
261
+ if let Some ( mut writer) = self . writer . take ( ) {
262
+ self . flush ( ) . await ?;
263
+ writer. close ( ) . await ?
264
+ }
265
+ Ok ( ( ) )
266
+ }
267
+
268
+ async fn flush ( & mut self ) -> Result < ( ) > {
269
+ if let Some ( writer) = & mut self . writer {
270
+ writer. flush ( ) . await ?;
271
+ }
272
+ Ok ( ( ) )
273
+ }
274
+
253
275
fn file_handle ( & self ) -> FileHandle {
254
276
FileHandle {
255
277
file_id : self . file_stat . inode ,
@@ -266,12 +288,21 @@ impl OpenedFile {
266
288
#[ async_trait]
267
289
pub trait FileReader : Sync + Send {
268
290
async fn read ( & mut self , offset : u64 , size : u32 ) -> Result < Bytes > ;
291
+ async fn close ( & mut self ) -> Result < ( ) > {
292
+ Ok ( ( ) )
293
+ }
269
294
}
270
295
271
296
/// File writer interface for write file content
272
297
#[ async_trait]
273
298
pub trait FileWriter : Sync + Send {
274
299
async fn write ( & mut self , offset : u64 , data : & [ u8 ] ) -> Result < u32 > ;
300
+ async fn close ( & mut self ) -> Result < ( ) > {
301
+ Ok ( ( ) )
302
+ }
303
+ async fn flush ( & mut self ) -> Result < ( ) > {
304
+ Ok ( ( ) )
305
+ }
275
306
}
276
307
277
308
#[ derive( Debug , Clone ) ]
@@ -409,6 +440,35 @@ impl<T: PathFileSystem> SimpleFileSystem<T> {
409
440
let file = file. lock ( ) . await ;
410
441
Ok ( file. file_handle ( ) )
411
442
}
443
+
444
+ async fn open_file_internal (
445
+ & self ,
446
+ file_id : u64 ,
447
+ flags : u32 ,
448
+ kind : FileType ,
449
+ ) -> Result < FileHandle > {
450
+ let file_node = self . get_file_node ( file_id) ?;
451
+
452
+ let mut file = {
453
+ match kind {
454
+ FileType :: Directory => {
455
+ self . fs
456
+ . open_dir ( & file_node. file_name , OpenFileFlags ( flags) )
457
+ . await ?
458
+ }
459
+ FileType :: RegularFile => {
460
+ self . fs
461
+ . open_file ( & file_node. file_name , OpenFileFlags ( flags) )
462
+ . await ?
463
+ }
464
+ _ => return Err ( Errno :: from ( libc:: EINVAL ) ) ,
465
+ }
466
+ } ;
467
+ file. set_inode ( file_node. parent_file_id , file_id) ;
468
+ let file = self . opened_file_manager . put_file ( file) ;
469
+ let file = file. lock ( ) . await ;
470
+ Ok ( file. file_handle ( ) )
471
+ }
412
472
}
413
473
414
474
#[ async_trait]
@@ -467,15 +527,13 @@ impl<T: PathFileSystem> RawFileSystem for SimpleFileSystem<T> {
467
527
}
468
528
469
529
async fn open_file ( & self , file_id : u64 , flags : u32 ) -> Result < FileHandle > {
470
- let file_node = self . get_file_node ( file_id) ?;
471
- let mut file = self
472
- . fs
473
- . open_file ( & file_node. file_name , OpenFileFlags ( flags) )
474
- . await ?;
475
- file. set_inode ( file_node. parent_file_id , file_id) ;
476
- let file = self . opened_file_manager . put_file ( file) ;
477
- let file = file. lock ( ) . await ;
478
- Ok ( file. file_handle ( ) )
530
+ self . open_file_internal ( file_id, flags, FileType :: RegularFile )
531
+ . await
532
+ }
533
+
534
+ async fn open_dir ( & self , file_id : u64 , flags : u32 ) -> Result < FileHandle > {
535
+ self . open_file_internal ( file_id, flags, FileType :: Directory )
536
+ . await
479
537
}
480
538
481
539
async fn create_file ( & self , parent_file_id : u64 , name : & str , flags : u32 ) -> Result < FileHandle > {
@@ -522,7 +580,12 @@ impl<T: PathFileSystem> RawFileSystem for SimpleFileSystem<T> {
522
580
}
523
581
524
582
async fn close_file ( & self , _file_id : u64 , fh : u64 ) -> Result < ( ) > {
525
- self . opened_file_manager . remove_file ( fh) ;
583
+ let file = self
584
+ . opened_file_manager
585
+ . remove_file ( fh)
586
+ . ok_or ( Errno :: from ( libc:: EBADF ) ) ?;
587
+ let mut file = file. lock ( ) . await ;
588
+ file. close ( ) . await ?;
526
589
Ok ( ( ) )
527
590
}
528
591
0 commit comments