Skip to content

Commit 97e066d

Browse files
committed
Update
1 parent f025216 commit 97e066d

File tree

1 file changed

+56
-53
lines changed

1 file changed

+56
-53
lines changed

clients/filesystem-fuse/src/filesystem.rs

+56-53
Original file line numberDiff line numberDiff line change
@@ -257,20 +257,28 @@ impl OpenedFile {
257257
}
258258

259259
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
260264
self.file_stat.atime = Timestamp::from(SystemTime::now());
261-
self.reader.as_mut().unwrap().read(offset, size).await
265+
266+
Ok(result)
262267
}
263268

264269
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?;
266272

273+
// update the file size
274+
let end = offset + data.len() as u64;
267275
if end > self.file_stat.size {
268276
self.file_stat.size = end;
269277
}
270278
self.file_stat.atime = Timestamp::from(SystemTime::now());
271279
self.file_stat.mtime = self.file_stat.atime;
272280

273-
self.writer.as_mut().unwrap().write(offset, data).await
281+
Ok(written)
274282
}
275283

276284
async fn close(&mut self) -> Result<()> {
@@ -355,14 +363,14 @@ pub struct SimpleFileSystem<T: PathFileSystem> {
355363
/// opened files
356364
opened_file_manager: OpenedFileManager,
357365
/// inode id generator
358-
inode_id_generator: AtomicU64,
366+
file_id_generator: AtomicU64,
359367

360368
/// real system
361369
fs: T,
362370
}
363371

364372
impl<T: PathFileSystem> SimpleFileSystem<T> {
365-
const INITIAL_INODE_ID: u64 = 10000;
373+
const INITIAL_FILE_ID: u64 = 10000;
366374
const ROOT_DIR_PARENT_FILE_ID: u64 = 0;
367375
const ROOT_DIR_FILE_ID: u64 = 1;
368376
const ROOT_DIR_NAME: &'static str = "";
@@ -371,25 +379,25 @@ impl<T: PathFileSystem> SimpleFileSystem<T> {
371379
Self {
372380
file_entry_manager: RwLock::new(FileEntryManager::new()),
373381
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),
375383
fs,
376384
}
377385
}
378386

379-
fn next_inode_id(&self) -> u64 {
380-
self.inode_id_generator
387+
fn next_file_id(&self) -> u64 {
388+
self.file_id_generator
381389
.fetch_add(1, std::sync::atomic::Ordering::SeqCst)
382390
}
383391

384-
async fn get_file_node(&self, file_id: u64) -> Result<FileEntry> {
392+
async fn get_file_entry(&self, file_id: u64) -> Result<FileEntry> {
385393
self.file_entry_manager
386394
.read()
387395
.await
388396
.get_file_by_id(file_id)
389397
.ok_or(Errno::from(libc::ENOENT))
390398
}
391399

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> {
393401
self.file_entry_manager.read().await.get_file_by_name(path)
394402
}
395403

@@ -398,7 +406,8 @@ impl<T: PathFileSystem> SimpleFileSystem<T> {
398406
let file = file_manager.get_file_by_name(&file_stat.path);
399407
match file {
400408
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());
402411
file_manager.insert(file_stat.parent_file_id, file_stat.file_id, &file_stat.path);
403412
}
404413
Some(file) => {
@@ -413,24 +422,24 @@ impl<T: PathFileSystem> SimpleFileSystem<T> {
413422
flags: u32,
414423
kind: FileType,
415424
) -> Result<FileHandle> {
416-
let file_node = self.get_file_node(file_id).await?;
425+
let file_entry = self.get_file_entry(file_id).await?;
417426

418427
let mut file = {
419428
match kind {
420429
FileType::Directory => {
421430
self.fs
422-
.open_dir(&file_node.file_name, OpenFileFlags(flags))
431+
.open_dir(&file_entry.file_name, OpenFileFlags(flags))
423432
.await?
424433
}
425434
FileType::RegularFile => {
426435
self.fs
427-
.open_file(&file_node.file_name, OpenFileFlags(flags))
436+
.open_file(&file_entry.file_name, OpenFileFlags(flags))
428437
.await?
429438
}
430439
_ => return Err(Errno::from(libc::EINVAL)),
431440
}
432441
};
433-
file.set_file_id(file_node.parent_file_id, file_id);
442+
file.set_file_id(file_entry.parent_file_id, file_id);
434443
let file = self.opened_file_manager.put_file(file);
435444
let file = file.lock().await;
436445
Ok(file.file_handle())
@@ -449,7 +458,7 @@ impl<T: PathFileSystem> RawFileSystem for SimpleFileSystem<T> {
449458
}
450459

451460
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;
453462
file.map(|x| x.file_name).unwrap_or_else(|_| "".to_string())
454463
}
455464

@@ -469,24 +478,24 @@ impl<T: PathFileSystem> RawFileSystem for SimpleFileSystem<T> {
469478
}
470479

471480
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);
475484
Ok(stat)
476485
}
477486

478487
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?;
481490
self.fill_file_id(&mut stat, parent_file_id).await;
482491
Ok(stat)
483492
}
484493

485494
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?;
488497
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;
490499
}
491500
Ok(files)
492501
}
@@ -502,16 +511,16 @@ impl<T: PathFileSystem> RawFileSystem for SimpleFileSystem<T> {
502511
}
503512

504513
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?;
506515
let mut file = self
507516
.fs
508-
.create_file(&parent_node.file_name, name, OpenFileFlags(flags))
517+
.create_file(&parent.file_name, name, OpenFileFlags(flags))
509518
.await?;
510519

511-
file.set_file_id(parent_file_id, self.next_inode_id());
520+
file.set_file_id(parent_file_id, self.next_file_id());
512521
{
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(
515524
file.file_stat.parent_file_id,
516525
file.file_stat.file_id,
517526
&file.file_stat.path,
@@ -523,46 +532,40 @@ impl<T: PathFileSystem> RawFileSystem for SimpleFileSystem<T> {
523532
}
524533

525534
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?;
528537

529-
file.set_file_id(parent_file_id, self.next_inode_id());
538+
file.set_file_id(parent_file_id, self.next_file_id());
530539
{
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);
533542
}
534543
Ok(file.file_id)
535544
}
536545

537546
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
542549
}
543550

544551
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?;
549554

550555
{
551556
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));
553558
}
554559
Ok(())
555560
}
556561

557562
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?;
562565

563566
{
564567
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));
566569
}
567570
Ok(())
568571
}
@@ -645,18 +648,18 @@ impl FileEntryManager {
645648
}
646649

647650
fn insert(&mut self, parent_file_id: u64, file_id: u64, file_name: &str) {
648-
let file_node = FileEntry {
651+
let file = FileEntry {
649652
file_id,
650653
parent_file_id,
651654
file_name: file_name.to_string(),
652655
};
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);
655658
}
656659

657660
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);
660663
}
661664
}
662665
}

0 commit comments

Comments
 (0)