@@ -257,20 +257,28 @@ impl OpenedFile {
257
257
}
258
258
259
259
async fn read ( & mut self , offset : u64 , size : u32 ) -> Result < Bytes > {
260
+ let reader = self . reader . as_mut ( ) . ok_or ( Errno :: from ( libc:: EBADF ) ) ?;
261
+ let result = reader. read ( offset, size) . await ?;
262
+
263
+ // update the access time
260
264
self . file_stat . atime = Timestamp :: from ( SystemTime :: now ( ) ) ;
261
- self . reader . as_mut ( ) . unwrap ( ) . read ( offset, size) . await
265
+
266
+ Ok ( result)
262
267
}
263
268
264
269
async fn write ( & mut self , offset : u64 , data : & [ u8 ] ) -> Result < u32 > {
265
- let end = offset + data. len ( ) as u64 ;
270
+ let writer = self . writer . as_mut ( ) . ok_or ( Errno :: from ( libc:: EBADF ) ) ?;
271
+ let written = writer. write ( offset, data) . await ?;
266
272
273
+ // update the file size
274
+ let end = offset + data. len ( ) as u64 ;
267
275
if end > self . file_stat . size {
268
276
self . file_stat . size = end;
269
277
}
270
278
self . file_stat . atime = Timestamp :: from ( SystemTime :: now ( ) ) ;
271
279
self . file_stat . mtime = self . file_stat . atime ;
272
280
273
- self . writer . as_mut ( ) . unwrap ( ) . write ( offset , data ) . await
281
+ Ok ( written )
274
282
}
275
283
276
284
async fn close ( & mut self ) -> Result < ( ) > {
@@ -355,14 +363,14 @@ pub struct SimpleFileSystem<T: PathFileSystem> {
355
363
/// opened files
356
364
opened_file_manager : OpenedFileManager ,
357
365
/// inode id generator
358
- inode_id_generator : AtomicU64 ,
366
+ file_id_generator : AtomicU64 ,
359
367
360
368
/// real system
361
369
fs : T ,
362
370
}
363
371
364
372
impl < T : PathFileSystem > SimpleFileSystem < T > {
365
- const INITIAL_INODE_ID : u64 = 10000 ;
373
+ const INITIAL_FILE_ID : u64 = 10000 ;
366
374
const ROOT_DIR_PARENT_FILE_ID : u64 = 0 ;
367
375
const ROOT_DIR_FILE_ID : u64 = 1 ;
368
376
const ROOT_DIR_NAME : & ' static str = "" ;
@@ -371,25 +379,25 @@ impl<T: PathFileSystem> SimpleFileSystem<T> {
371
379
Self {
372
380
file_entry_manager : RwLock :: new ( FileEntryManager :: new ( ) ) ,
373
381
opened_file_manager : OpenedFileManager :: new ( ) ,
374
- inode_id_generator : AtomicU64 :: new ( Self :: INITIAL_INODE_ID ) ,
382
+ file_id_generator : AtomicU64 :: new ( Self :: INITIAL_FILE_ID ) ,
375
383
fs,
376
384
}
377
385
}
378
386
379
- fn next_inode_id ( & self ) -> u64 {
380
- self . inode_id_generator
387
+ fn next_file_id ( & self ) -> u64 {
388
+ self . file_id_generator
381
389
. fetch_add ( 1 , std:: sync:: atomic:: Ordering :: SeqCst )
382
390
}
383
391
384
- async fn get_file_node ( & self , file_id : u64 ) -> Result < FileEntry > {
392
+ async fn get_file_entry ( & self , file_id : u64 ) -> Result < FileEntry > {
385
393
self . file_entry_manager
386
394
. read ( )
387
395
. await
388
396
. get_file_by_id ( file_id)
389
397
. ok_or ( Errno :: from ( libc:: ENOENT ) )
390
398
}
391
399
392
- async fn get_file_node_by_path ( & self , path : & str ) -> Option < FileEntry > {
400
+ async fn get_file_entry_by_path ( & self , path : & str ) -> Option < FileEntry > {
393
401
self . file_entry_manager . read ( ) . await . get_file_by_name ( path)
394
402
}
395
403
@@ -398,7 +406,8 @@ impl<T: PathFileSystem> SimpleFileSystem<T> {
398
406
let file = file_manager. get_file_by_name ( & file_stat. path ) ;
399
407
match file {
400
408
None => {
401
- file_stat. set_file_id ( parent_file_id, self . next_inode_id ( ) ) ;
409
+ // allocate new file id
410
+ file_stat. set_file_id ( parent_file_id, self . next_file_id ( ) ) ;
402
411
file_manager. insert ( file_stat. parent_file_id , file_stat. file_id , & file_stat. path ) ;
403
412
}
404
413
Some ( file) => {
@@ -413,24 +422,24 @@ impl<T: PathFileSystem> SimpleFileSystem<T> {
413
422
flags : u32 ,
414
423
kind : FileType ,
415
424
) -> Result < FileHandle > {
416
- let file_node = self . get_file_node ( file_id) . await ?;
425
+ let file_entry = self . get_file_entry ( file_id) . await ?;
417
426
418
427
let mut file = {
419
428
match kind {
420
429
FileType :: Directory => {
421
430
self . fs
422
- . open_dir ( & file_node . file_name , OpenFileFlags ( flags) )
431
+ . open_dir ( & file_entry . file_name , OpenFileFlags ( flags) )
423
432
. await ?
424
433
}
425
434
FileType :: RegularFile => {
426
435
self . fs
427
- . open_file ( & file_node . file_name , OpenFileFlags ( flags) )
436
+ . open_file ( & file_entry . file_name , OpenFileFlags ( flags) )
428
437
. await ?
429
438
}
430
439
_ => return Err ( Errno :: from ( libc:: EINVAL ) ) ,
431
440
}
432
441
} ;
433
- file. set_file_id ( file_node . parent_file_id , file_id) ;
442
+ file. set_file_id ( file_entry . parent_file_id , file_id) ;
434
443
let file = self . opened_file_manager . put_file ( file) ;
435
444
let file = file. lock ( ) . await ;
436
445
Ok ( file. file_handle ( ) )
@@ -449,7 +458,7 @@ impl<T: PathFileSystem> RawFileSystem for SimpleFileSystem<T> {
449
458
}
450
459
451
460
async fn get_file_path ( & self , file_id : u64 ) -> String {
452
- let file = self . get_file_node ( file_id) . await ;
461
+ let file = self . get_file_entry ( file_id) . await ;
453
462
file. map ( |x| x. file_name ) . unwrap_or_else ( |_| "" . to_string ( ) )
454
463
}
455
464
@@ -469,24 +478,24 @@ impl<T: PathFileSystem> RawFileSystem for SimpleFileSystem<T> {
469
478
}
470
479
471
480
async fn stat ( & self , file_id : u64 ) -> Result < FileStat > {
472
- let file_node = self . get_file_node ( file_id) . await ?;
473
- let mut stat = self . fs . stat ( & file_node . file_name ) . await ?;
474
- stat. set_file_id ( file_node . parent_file_id , file_node . file_id ) ;
481
+ let file = self . get_file_entry ( file_id) . await ?;
482
+ let mut stat = self . fs . stat ( & file . file_name ) . await ?;
483
+ stat. set_file_id ( file . parent_file_id , file . file_id ) ;
475
484
Ok ( stat)
476
485
}
477
486
478
487
async fn lookup ( & self , parent_file_id : u64 , name : & str ) -> Result < FileStat > {
479
- let parent_file_node = self . get_file_node ( parent_file_id) . await ?;
480
- let mut stat = self . fs . lookup ( & parent_file_node . file_name , name) . await ?;
488
+ let parent_file = self . get_file_entry ( parent_file_id) . await ?;
489
+ let mut stat = self . fs . lookup ( & parent_file . file_name , name) . await ?;
481
490
self . fill_file_id ( & mut stat, parent_file_id) . await ;
482
491
Ok ( stat)
483
492
}
484
493
485
494
async fn read_dir ( & self , file_id : u64 ) -> Result < Vec < FileStat > > {
486
- let file_node = self . get_file_node ( file_id) . await ?;
487
- let mut files = self . fs . read_dir ( & file_node . file_name ) . await ?;
495
+ let file = self . get_file_entry ( file_id) . await ?;
496
+ let mut files = self . fs . read_dir ( & file . file_name ) . await ?;
488
497
for file in files. iter_mut ( ) {
489
- self . fill_file_id ( file, file_node . file_id ) . await ;
498
+ self . fill_file_id ( file, file . file_id ) . await ;
490
499
}
491
500
Ok ( files)
492
501
}
@@ -502,16 +511,16 @@ impl<T: PathFileSystem> RawFileSystem for SimpleFileSystem<T> {
502
511
}
503
512
504
513
async fn create_file ( & self , parent_file_id : u64 , name : & str , flags : u32 ) -> Result < FileHandle > {
505
- let parent_node = self . get_file_node ( parent_file_id) . await ?;
514
+ let parent = self . get_file_entry ( parent_file_id) . await ?;
506
515
let mut file = self
507
516
. fs
508
- . create_file ( & parent_node . file_name , name, OpenFileFlags ( flags) )
517
+ . create_file ( & parent . file_name , name, OpenFileFlags ( flags) )
509
518
. await ?;
510
519
511
- file. set_file_id ( parent_file_id, self . next_inode_id ( ) ) ;
520
+ file. set_file_id ( parent_file_id, self . next_file_id ( ) ) ;
512
521
{
513
- let mut file_node_manager = self . file_entry_manager . write ( ) . await ;
514
- file_node_manager . insert (
522
+ let mut file_manager = self . file_entry_manager . write ( ) . await ;
523
+ file_manager . insert (
515
524
file. file_stat . parent_file_id ,
516
525
file. file_stat . file_id ,
517
526
& file. file_stat . path ,
@@ -523,46 +532,40 @@ impl<T: PathFileSystem> RawFileSystem for SimpleFileSystem<T> {
523
532
}
524
533
525
534
async fn create_dir ( & self , parent_file_id : u64 , name : & str ) -> Result < u64 > {
526
- let parent_node = self . get_file_node ( parent_file_id) . await ?;
527
- let mut file = self . fs . create_dir ( & parent_node . file_name , name) . await ?;
535
+ let parent = self . get_file_entry ( parent_file_id) . await ?;
536
+ let mut file = self . fs . create_dir ( & parent . file_name , name) . await ?;
528
537
529
- file. set_file_id ( parent_file_id, self . next_inode_id ( ) ) ;
538
+ file. set_file_id ( parent_file_id, self . next_file_id ( ) ) ;
530
539
{
531
- let mut file_node_manager = self . file_entry_manager . write ( ) . await ;
532
- file_node_manager . insert ( file. parent_file_id , file. file_id , & file. path ) ;
540
+ let mut file_manager = self . file_entry_manager . write ( ) . await ;
541
+ file_manager . insert ( file. parent_file_id , file. file_id , & file. path ) ;
533
542
}
534
543
Ok ( file. file_id )
535
544
}
536
545
537
546
async fn set_attr ( & self , file_id : u64 , file_stat : & FileStat ) -> Result < ( ) > {
538
- let file_node = self . get_file_node ( file_id) . await ?;
539
- self . fs
540
- . set_attr ( & file_node. file_name , file_stat, true )
541
- . await
547
+ let file = self . get_file_entry ( file_id) . await ?;
548
+ self . fs . set_attr ( & file. file_name , file_stat, true ) . await
542
549
}
543
550
544
551
async fn remove_file ( & self , parent_file_id : u64 , name : & str ) -> Result < ( ) > {
545
- let parent_file_node = self . get_file_node ( parent_file_id) . await ?;
546
- self . fs
547
- . remove_file ( & parent_file_node. file_name , name)
548
- . await ?;
552
+ let parent_file = self . get_file_entry ( parent_file_id) . await ?;
553
+ self . fs . remove_file ( & parent_file. file_name , name) . await ?;
549
554
550
555
{
551
556
let mut file_id_manager = self . file_entry_manager . write ( ) . await ;
552
- file_id_manager. remove ( & join_file_path ( & parent_file_node . file_name , name) ) ;
557
+ file_id_manager. remove ( & join_file_path ( & parent_file . file_name , name) ) ;
553
558
}
554
559
Ok ( ( ) )
555
560
}
556
561
557
562
async fn remove_dir ( & self , parent_file_id : u64 , name : & str ) -> Result < ( ) > {
558
- let parent_file_node = self . get_file_node ( parent_file_id) . await ?;
559
- self . fs
560
- . remove_dir ( & parent_file_node. file_name , name)
561
- . await ?;
563
+ let parent_file = self . get_file_entry ( parent_file_id) . await ?;
564
+ self . fs . remove_dir ( & parent_file. file_name , name) . await ?;
562
565
563
566
{
564
567
let mut file_id_manager = self . file_entry_manager . write ( ) . await ;
565
- file_id_manager. remove ( & join_file_path ( & parent_file_node . file_name , name) ) ;
568
+ file_id_manager. remove ( & join_file_path ( & parent_file . file_name , name) ) ;
566
569
}
567
570
Ok ( ( ) )
568
571
}
@@ -645,18 +648,18 @@ impl FileEntryManager {
645
648
}
646
649
647
650
fn insert ( & mut self , parent_file_id : u64 , file_id : u64 , file_name : & str ) {
648
- let file_node = FileEntry {
651
+ let file = FileEntry {
649
652
file_id,
650
653
parent_file_id,
651
654
file_name : file_name. to_string ( ) ,
652
655
} ;
653
- self . file_id_map . insert ( file_id, file_node . clone ( ) ) ;
654
- self . file_name_map . insert ( file_name. to_string ( ) , file_node ) ;
656
+ self . file_id_map . insert ( file_id, file . clone ( ) ) ;
657
+ self . file_name_map . insert ( file_name. to_string ( ) , file ) ;
655
658
}
656
659
657
660
fn remove ( & mut self , file_name : & str ) {
658
- if let Some ( node ) = self . file_name_map . remove ( file_name) {
659
- self . file_id_map . remove ( & node . file_id ) ;
661
+ if let Some ( file ) = self . file_name_map . remove ( file_name) {
662
+ self . file_id_map . remove ( & file . file_id ) ;
660
663
}
661
664
}
662
665
}
0 commit comments