Fix the wrong metadata blocks for ramfs
This commit is contained in:
parent
16b435e310
commit
ad76b0329a
|
|
@ -100,6 +100,22 @@ impl Inode_ {
|
|||
fs: Weak::default(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn inc_size(&mut self) {
|
||||
self.metadata.size += 1;
|
||||
self.metadata.blocks = (self.metadata.size + BLOCK_SIZE - 1) / BLOCK_SIZE;
|
||||
}
|
||||
|
||||
pub fn dec_size(&mut self) {
|
||||
debug_assert!(self.metadata.size > 0);
|
||||
self.metadata.size -= 1;
|
||||
self.metadata.blocks = (self.metadata.size + BLOCK_SIZE - 1) / BLOCK_SIZE;
|
||||
}
|
||||
|
||||
pub fn resize(&mut self, new_size: usize) {
|
||||
self.metadata.size = new_size;
|
||||
self.metadata.blocks = (new_size + BLOCK_SIZE - 1) / BLOCK_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
enum Inner {
|
||||
|
|
@ -304,7 +320,7 @@ impl Inode for RamInode {
|
|||
}
|
||||
|
||||
fn resize(&self, new_size: usize) {
|
||||
self.0.write().metadata.size = new_size;
|
||||
self.0.write().resize(new_size)
|
||||
}
|
||||
|
||||
fn atime(&self) -> Duration {
|
||||
|
|
@ -375,7 +391,7 @@ impl Inode for RamInode {
|
|||
.as_direntry_mut()
|
||||
.unwrap()
|
||||
.append_entry(name, new_inode.clone());
|
||||
self_inode.metadata.size += 1;
|
||||
self_inode.inc_size();
|
||||
Ok(new_inode)
|
||||
}
|
||||
|
||||
|
|
@ -412,7 +428,7 @@ impl Inode for RamInode {
|
|||
.as_direntry_mut()
|
||||
.unwrap()
|
||||
.append_entry(name, old.0.read().this.upgrade().unwrap());
|
||||
self_inode.metadata.size += 1;
|
||||
self_inode.inc_size();
|
||||
drop(self_inode);
|
||||
old.0.write().metadata.nlinks += 1;
|
||||
Ok(())
|
||||
|
|
@ -432,7 +448,7 @@ impl Inode for RamInode {
|
|||
return_errno_with_message!(Errno::EISDIR, "unlink on dir");
|
||||
}
|
||||
self_dir.remove_entry(idx);
|
||||
self_inode.metadata.size -= 1;
|
||||
self_inode.dec_size();
|
||||
drop(self_inode);
|
||||
target.0.write().metadata.nlinks -= 1;
|
||||
Ok(())
|
||||
|
|
@ -462,7 +478,7 @@ impl Inode for RamInode {
|
|||
return_errno_with_message!(Errno::ENOTEMPTY, "dir not empty");
|
||||
}
|
||||
self_dir.remove_entry(idx);
|
||||
self_inode.metadata.size -= 1;
|
||||
self_inode.dec_size();
|
||||
self_inode.metadata.nlinks -= 1;
|
||||
drop(self_inode);
|
||||
target.0.write().metadata.nlinks -= 2;
|
||||
|
|
@ -551,8 +567,8 @@ impl Inode for RamInode {
|
|||
.as_direntry_mut()
|
||||
.unwrap()
|
||||
.append_entry(new_name, src_inode.clone());
|
||||
self_inode.metadata.size -= 1;
|
||||
target_inode.metadata.size += 1;
|
||||
self_inode.dec_size();
|
||||
target_inode.inc_size();
|
||||
if src_inode.0.read().metadata.type_ == InodeType::Dir {
|
||||
self_inode.metadata.nlinks -= 1;
|
||||
target_inode.metadata.nlinks += 1;
|
||||
|
|
@ -588,6 +604,7 @@ impl Inode for RamInode {
|
|||
let mut self_inode = self.0.write();
|
||||
let link = self_inode.inner.as_symlink_mut().unwrap();
|
||||
*link = Str256::from(target);
|
||||
// Symlink's metadata.blocks should be 0, so just set the size.
|
||||
self_inode.metadata.size = target.len();
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ impl Metadata {
|
|||
ino,
|
||||
size: 2,
|
||||
blk_size: sb.bsize,
|
||||
blocks: 0,
|
||||
blocks: 1,
|
||||
atime: Default::default(),
|
||||
mtime: Default::default(),
|
||||
ctime: Default::default(),
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ impl From<Metadata> for Stat {
|
|||
st_rdev: 0,
|
||||
st_size: info.size as isize,
|
||||
st_blksize: info.blk_size as isize,
|
||||
st_blocks: info.blocks as isize,
|
||||
st_blocks: (info.blocks * (info.blk_size / 512)) as isize, // Number of 512B blocks
|
||||
st_atime: info.atime.into(),
|
||||
st_mtime: info.mtime.into(),
|
||||
st_ctime: info.ctime.into(),
|
||||
|
|
|
|||
Loading…
Reference in New Issue