Write Hello, world! to a file and read it!

This commit is contained in:
Yifan Wu 2020-12-19 18:32:01 +08:00
parent 015a8b6407
commit 8713046a4a
3 changed files with 21 additions and 3 deletions

View file

@ -55,5 +55,16 @@ fn easy_fs_pack() -> std::io::Result<()> {
for name in root_inode.ls() { for name in root_inode.ls() {
println!("{}", name); println!("{}", name);
} }
{
let filea = root_inode.find("filea").unwrap();
println!("writing filea!");
filea.write_at(0, "Hello, world!".as_bytes());
}
{
let filea = root_inode.find("filea").unwrap();
let mut buffer = [0u8; 512];
let len = filea.read_at(0, &mut buffer);
println!("{}", core::str::from_utf8(&buffer[..len]).unwrap());
}
Ok(()) Ok(())
} }

View file

@ -276,4 +276,7 @@ impl DirEntry {
let len = (0usize..).find(|i| self.name[*i] == 0).unwrap(); let len = (0usize..).find(|i| self.name[*i] == 0).unwrap();
core::str::from_utf8(&self.name[..len]).unwrap() core::str::from_utf8(&self.name[..len]).unwrap()
} }
pub fn inode_number(&self) -> u32 {
self.inode_number
}
} }

View file

@ -12,6 +12,7 @@ use alloc::sync::Arc;
use alloc::string::String; use alloc::string::String;
use alloc::vec::Vec; use alloc::vec::Vec;
use spin::{Mutex, MutexGuard}; use spin::{Mutex, MutexGuard};
use crate::layout::DiskInodeType::Directory;
pub struct Inode { pub struct Inode {
inode_id: u32, inode_id: u32,
@ -41,11 +42,13 @@ impl Inode {
name: &str, name: &str,
inode: &Dirty<DiskInode>, inode: &Dirty<DiskInode>,
) -> Option<u32> { ) -> Option<u32> {
println!("into find_inode_id");
// assert it is a directory // assert it is a directory
assert!(inode.read(|inode| inode.is_dir())); assert!(inode.read(|inode| inode.is_dir()));
let file_count = inode.read(|inode| { let file_count = inode.read(|inode| {
inode.size as usize inode.size as usize
}) / DIRENT_SZ; }) / DIRENT_SZ;
println!("file_count = {}", file_count);
let mut dirent_space: DirentBytes = Default::default(); let mut dirent_space: DirentBytes = Default::default();
for i in 0..file_count { for i in 0..file_count {
assert_eq!( assert_eq!(
@ -58,8 +61,9 @@ impl Inode {
}), }),
DIRENT_SZ, DIRENT_SZ,
); );
if DirEntry::from_bytes(&dirent_space).name() == name { let dirent = DirEntry::from_bytes(&dirent_space);
return Some(i as u32); if dirent.name() == name {
return Some(dirent.inode_number() as u32);
} }
} }
None None
@ -184,7 +188,7 @@ impl Inode {
}) })
} }
pub fn write_at(&self, offset: usize, buf: &mut [u8]) -> usize { pub fn write_at(&self, offset: usize, buf: &[u8]) -> usize {
let mut fs = self.fs.lock(); let mut fs = self.fs.lock();
let mut inode = self.get_disk_inode(&mut fs); let mut inode = self.get_disk_inode(&mut fs);
self.increase_size((offset + buf.len()) as u32, &mut inode, &mut fs); self.increase_size((offset + buf.len()) as u32, &mut inode, &mut fs);