mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-09 13:26:48 +00:00
Fix the issue of ramfs's size and nlinks
This commit is contained in:
parent
df12904c5a
commit
c16c01a33b
@ -298,7 +298,7 @@ impl Inode for RamInode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn write_at(&self, offset: usize, buf: &[u8]) -> Result<usize> {
|
fn write_at(&self, offset: usize, buf: &[u8]) -> Result<usize> {
|
||||||
return_errno_with_message!(Errno::EOPNOTSUPP, "direct read is not supported");
|
return_errno_with_message!(Errno::EOPNOTSUPP, "direct write is not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resize(&self, new_size: usize) -> Result<()> {
|
fn resize(&self, new_size: usize) -> Result<()> {
|
||||||
@ -339,6 +339,7 @@ impl Inode for RamInode {
|
|||||||
Arc::downgrade(&dir_inode),
|
Arc::downgrade(&dir_inode),
|
||||||
self_inode.inner.as_direntry().unwrap().this.clone(),
|
self_inode.inner.as_direntry().unwrap().this.clone(),
|
||||||
);
|
);
|
||||||
|
self_inode.metadata.nlinks += 1;
|
||||||
dir_inode
|
dir_inode
|
||||||
}
|
}
|
||||||
InodeType::SymLink => {
|
InodeType::SymLink => {
|
||||||
@ -360,6 +361,7 @@ impl Inode for RamInode {
|
|||||||
.as_direntry_mut()
|
.as_direntry_mut()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.append_entry(name, new_inode.clone());
|
.append_entry(name, new_inode.clone());
|
||||||
|
self_inode.metadata.size += 1;
|
||||||
Ok(new_inode)
|
Ok(new_inode)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -396,6 +398,9 @@ impl Inode for RamInode {
|
|||||||
.as_direntry_mut()
|
.as_direntry_mut()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.append_entry(name, old.0.read().this.upgrade().unwrap());
|
.append_entry(name, old.0.read().this.upgrade().unwrap());
|
||||||
|
self_inode.metadata.size += 1;
|
||||||
|
drop(self_inode);
|
||||||
|
old.0.write().metadata.nlinks += 1;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -408,12 +413,14 @@ impl Inode for RamInode {
|
|||||||
}
|
}
|
||||||
let mut self_inode = self.0.write();
|
let mut self_inode = self.0.write();
|
||||||
let self_dir = self_inode.inner.as_direntry_mut().unwrap();
|
let self_dir = self_inode.inner.as_direntry_mut().unwrap();
|
||||||
let (idx, other) = self_dir.get_entry(name).ok_or(Error::new(Errno::ENOENT))?;
|
let (idx, target) = self_dir.get_entry(name).ok_or(Error::new(Errno::ENOENT))?;
|
||||||
let other_inode = other.0.read();
|
if target.0.read().metadata.type_ == InodeType::Dir {
|
||||||
if other_inode.metadata.type_ == InodeType::Dir {
|
|
||||||
return_errno_with_message!(Errno::EISDIR, "unlink on dir");
|
return_errno_with_message!(Errno::EISDIR, "unlink on dir");
|
||||||
}
|
}
|
||||||
self_dir.remove_entry(idx);
|
self_dir.remove_entry(idx);
|
||||||
|
self_inode.metadata.size -= 1;
|
||||||
|
drop(self_inode);
|
||||||
|
target.0.write().metadata.nlinks -= 1;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -426,15 +433,25 @@ impl Inode for RamInode {
|
|||||||
}
|
}
|
||||||
let mut self_inode = self.0.write();
|
let mut self_inode = self.0.write();
|
||||||
let self_dir = self_inode.inner.as_direntry_mut().unwrap();
|
let self_dir = self_inode.inner.as_direntry_mut().unwrap();
|
||||||
let (idx, other) = self_dir.get_entry(name).ok_or(Error::new(Errno::ENOENT))?;
|
let (idx, target) = self_dir.get_entry(name).ok_or(Error::new(Errno::ENOENT))?;
|
||||||
let other_inode = other.0.read();
|
if target.0.read().metadata.type_ != InodeType::Dir {
|
||||||
if other_inode.metadata.type_ != InodeType::Dir {
|
|
||||||
return_errno_with_message!(Errno::ENOTDIR, "rmdir on not dir");
|
return_errno_with_message!(Errno::ENOTDIR, "rmdir on not dir");
|
||||||
}
|
}
|
||||||
if other_inode.inner.as_direntry().unwrap().is_empty_children() {
|
if target
|
||||||
|
.0
|
||||||
|
.read()
|
||||||
|
.inner
|
||||||
|
.as_direntry()
|
||||||
|
.unwrap()
|
||||||
|
.is_empty_children()
|
||||||
|
{
|
||||||
return_errno_with_message!(Errno::ENOTEMPTY, "dir not empty");
|
return_errno_with_message!(Errno::ENOTEMPTY, "dir not empty");
|
||||||
}
|
}
|
||||||
self_dir.remove_entry(idx);
|
self_dir.remove_entry(idx);
|
||||||
|
self_inode.metadata.size -= 1;
|
||||||
|
self_inode.metadata.nlinks -= 1;
|
||||||
|
drop(self_inode);
|
||||||
|
target.0.write().metadata.nlinks -= 2;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -520,9 +537,15 @@ impl Inode for RamInode {
|
|||||||
.as_direntry_mut()
|
.as_direntry_mut()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.append_entry(new_name, src_inode.clone());
|
.append_entry(new_name, src_inode.clone());
|
||||||
|
self_inode.metadata.size -= 1;
|
||||||
|
target_inode.metadata.size += 1;
|
||||||
|
if src_inode.0.read().metadata.type_ == InodeType::Dir {
|
||||||
|
self_inode.metadata.nlinks -= 1;
|
||||||
|
target_inode.metadata.nlinks += 1;
|
||||||
|
}
|
||||||
drop(self_inode);
|
drop(self_inode);
|
||||||
drop(target_inode);
|
drop(target_inode);
|
||||||
if src_inode.metadata().type_ == InodeType::Dir {
|
if src_inode.0.read().metadata.type_ == InodeType::Dir {
|
||||||
src_inode
|
src_inode
|
||||||
.0
|
.0
|
||||||
.write()
|
.write()
|
||||||
@ -551,6 +574,7 @@ impl Inode for RamInode {
|
|||||||
let mut self_inode = self.0.write();
|
let mut self_inode = self.0.write();
|
||||||
let link = self_inode.inner.as_symlink_mut().unwrap();
|
let link = self_inode.inner.as_symlink_mut().unwrap();
|
||||||
*link = Str256::from(target);
|
*link = Str256::from(target);
|
||||||
|
self_inode.metadata.size = target.len();
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user