From 6cb05c35a25828d8e1c6185296d9057e6a086fb7 Mon Sep 17 00:00:00 2001 From: gaotianyu1350 Date: Thu, 11 Apr 2019 14:48:13 +0800 Subject: [PATCH] add inode impl link --- rcore-fs-sfs/src/lib.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/rcore-fs-sfs/src/lib.rs b/rcore-fs-sfs/src/lib.rs index bb7b0fa..cd414ab 100644 --- a/rcore-fs-sfs/src/lib.rs +++ b/rcore-fs-sfs/src/lib.rs @@ -377,6 +377,35 @@ impl INodeImpl { assert!(disk_inode.nlinks > 0); disk_inode.nlinks -= 1; } + + pub fn link_inodeimpl(&self, name: &str, other: &Arc) -> vfs::Result<()> { + let info = self.metadata()?; + if info.type_ != vfs::FileType::Dir { + return Err(FsError::NotDir); + } + if info.nlinks <= 0 { + return Err(FsError::DirRemoved); + } + if !self.get_file_inode_id(name).is_none() { + return Err(FsError::EntryExist); + } + let child = other; + if !Arc::ptr_eq(&self.fs, &child.fs) { + return Err(FsError::NotSameFs); + } + if child.metadata()?.type_ == vfs::FileType::Dir { + return Err(FsError::IsDir); + } + let entry = DiskEntry { + id: child.id as u32, + name: Str256::from(name), + }; + let old_size = self._size(); + self._resize(old_size + BLKSIZE)?; + self._write_at(old_size, entry.as_buf()).unwrap(); + child.nlinks_inc(); + Ok(()) + } } impl vfs::INode for INodeImpl { @@ -803,6 +832,17 @@ impl SimpleFileSystem { trace!("free block {:#x}", block_id); } + pub fn new_device_inode(&self, device_inode_id: usize, device_inode: Arc) { + self.device_inodes.write().insert(device_inode_id, device_inode); + } + + pub fn get_device_inode(&self, device_inode_id: usize) -> vfs::Result> { + match self.device_inodes.read().get(&device_inode_id) { + Some(x) => Ok(Arc::clone(x)), + None => Err(FsError::DeviceError) + } + } + /// Create a new INode struct, then insert it to self.inodes /// Private used for load or create INode fn _new_inode(&self, id: INodeId, disk_inode: Dirty) -> Arc {