mirror of
https://github.com/rcore-os/rCore.git
synced 2024-11-23 00:16:17 +04:00
update fs. impl sys_sync, sys_rmdir. fix sys_unlink.
This commit is contained in:
parent
56f8f128ba
commit
b9a7888290
4
kernel/Cargo.lock
generated
4
kernel/Cargo.lock
generated
@ -337,12 +337,12 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "rcore-fs"
|
name = "rcore-fs"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/rcore-os/rcore-fs?branch=sefs#0eba40886d36311b28d42ff2a27a0f4292e2ad9f"
|
source = "git+https://github.com/rcore-os/rcore-fs?branch=sefs#38dab25178eb25abaab8e6d929af354a56158d5f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rcore-fs-sfs"
|
name = "rcore-fs-sfs"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/rcore-os/rcore-fs?branch=sefs#0eba40886d36311b28d42ff2a27a0f4292e2ad9f"
|
source = "git+https://github.com/rcore-os/rcore-fs?branch=sefs#38dab25178eb25abaab8e6d929af354a56158d5f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitvec 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bitvec 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -36,10 +36,7 @@ impl FileHandle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
|
pub fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
|
||||||
if !self.options.read {
|
let len = self.read_at(self.offset as usize, buf)?;
|
||||||
return Err(FsError::InvalidParam); // FIXME: => EBADF
|
|
||||||
}
|
|
||||||
let len = self.inode.read_at(self.offset as usize, buf)?;
|
|
||||||
self.offset += len as u64;
|
self.offset += len as u64;
|
||||||
Ok(len)
|
Ok(len)
|
||||||
}
|
}
|
||||||
@ -53,15 +50,12 @@ impl FileHandle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn write(&mut self, buf: &[u8]) -> Result<usize> {
|
pub fn write(&mut self, buf: &[u8]) -> Result<usize> {
|
||||||
if !self.options.write {
|
let offset = match self.options.append {
|
||||||
return Err(FsError::InvalidParam); // FIXME: => EBADF
|
true => self.inode.metadata()?.size as u64,
|
||||||
}
|
false => self.offset,
|
||||||
if self.options.append {
|
} as usize;
|
||||||
let info = self.inode.metadata()?;
|
let len = self.write_at(offset, buf)?;
|
||||||
self.offset = info.size as u64;
|
self.offset = (offset + len) as u64;
|
||||||
}
|
|
||||||
let len = self.inode.write_at(self.offset as usize, buf)?;
|
|
||||||
self.offset += len as u64;
|
|
||||||
Ok(len)
|
Ok(len)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,12 +85,11 @@ impl FileHandle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn sync_all(&mut self) -> Result<()> {
|
pub fn sync_all(&mut self) -> Result<()> {
|
||||||
self.inode.sync()
|
self.inode.sync_all()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn sync_data(&mut self) -> Result<()> {
|
pub fn sync_data(&mut self) -> Result<()> {
|
||||||
// TODO: add sync_data to VFS
|
self.inode.sync_data()
|
||||||
self.inode.sync()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn metadata(&self) -> Result<Metadata> {
|
pub fn metadata(&self) -> Result<Metadata> {
|
||||||
|
@ -58,12 +58,12 @@ impl Pipe {
|
|||||||
macro_rules! impl_inode {
|
macro_rules! impl_inode {
|
||||||
() => {
|
() => {
|
||||||
fn metadata(&self) -> Result<Metadata> { Err(FsError::NotSupported) }
|
fn metadata(&self) -> Result<Metadata> { Err(FsError::NotSupported) }
|
||||||
fn sync(&self) -> Result<()> { Ok(()) }
|
fn sync_all(&self) -> Result<()> { Ok(()) }
|
||||||
|
fn sync_data(&self) -> Result<()> { Ok(()) }
|
||||||
fn resize(&self, _len: usize) -> Result<()> { Err(FsError::NotSupported) }
|
fn resize(&self, _len: usize) -> Result<()> { Err(FsError::NotSupported) }
|
||||||
fn create(&self, _name: &str, _type_: FileType, _mode: u32) -> Result<Arc<INode>> { Err(FsError::NotDir) }
|
fn create(&self, _name: &str, _type_: FileType, _mode: u32) -> Result<Arc<INode>> { Err(FsError::NotDir) }
|
||||||
fn unlink(&self, _name: &str) -> Result<()> { Err(FsError::NotDir) }
|
fn unlink(&self, _name: &str) -> Result<()> { Err(FsError::NotDir) }
|
||||||
fn link(&self, _name: &str, _other: &Arc<INode>) -> Result<()> { Err(FsError::NotDir) }
|
fn link(&self, _name: &str, _other: &Arc<INode>) -> Result<()> { Err(FsError::NotDir) }
|
||||||
fn rename(&self, _old_name: &str, _new_name: &str) -> Result<()> { Err(FsError::NotDir) }
|
|
||||||
fn move_(&self, _old_name: &str, _target: &Arc<INode>, _new_name: &str) -> Result<()> { Err(FsError::NotDir) }
|
fn move_(&self, _old_name: &str, _target: &Arc<INode>, _new_name: &str) -> Result<()> { Err(FsError::NotDir) }
|
||||||
fn find(&self, _name: &str) -> Result<Arc<INode>> { Err(FsError::NotDir) }
|
fn find(&self, _name: &str) -> Result<Arc<INode>> { Err(FsError::NotDir) }
|
||||||
fn get_entry(&self, _id: usize) -> Result<String> { Err(FsError::NotDir) }
|
fn get_entry(&self, _id: usize) -> Result<String> { Err(FsError::NotDir) }
|
||||||
|
@ -53,12 +53,12 @@ lazy_static! {
|
|||||||
macro_rules! impl_inode {
|
macro_rules! impl_inode {
|
||||||
() => {
|
() => {
|
||||||
fn metadata(&self) -> Result<Metadata> { Err(FsError::NotSupported) }
|
fn metadata(&self) -> Result<Metadata> { Err(FsError::NotSupported) }
|
||||||
fn sync(&self) -> Result<()> { Ok(()) }
|
fn sync_all(&self) -> Result<()> { Ok(()) }
|
||||||
|
fn sync_data(&self) -> Result<()> { Ok(()) }
|
||||||
fn resize(&self, _len: usize) -> Result<()> { Err(FsError::NotSupported) }
|
fn resize(&self, _len: usize) -> Result<()> { Err(FsError::NotSupported) }
|
||||||
fn create(&self, _name: &str, _type_: FileType, _mode: u32) -> Result<Arc<INode>> { Err(FsError::NotDir) }
|
fn create(&self, _name: &str, _type_: FileType, _mode: u32) -> Result<Arc<INode>> { Err(FsError::NotDir) }
|
||||||
fn unlink(&self, _name: &str) -> Result<()> { Err(FsError::NotDir) }
|
fn unlink(&self, _name: &str) -> Result<()> { Err(FsError::NotDir) }
|
||||||
fn link(&self, _name: &str, _other: &Arc<INode>) -> Result<()> { Err(FsError::NotDir) }
|
fn link(&self, _name: &str, _other: &Arc<INode>) -> Result<()> { Err(FsError::NotDir) }
|
||||||
fn rename(&self, _old_name: &str, _new_name: &str) -> Result<()> { Err(FsError::NotDir) }
|
|
||||||
fn move_(&self, _old_name: &str, _target: &Arc<INode>, _new_name: &str) -> Result<()> { Err(FsError::NotDir) }
|
fn move_(&self, _old_name: &str, _target: &Arc<INode>, _new_name: &str) -> Result<()> { Err(FsError::NotDir) }
|
||||||
fn find(&self, _name: &str) -> Result<Arc<INode>> { Err(FsError::NotDir) }
|
fn find(&self, _name: &str) -> Result<Arc<INode>> { Err(FsError::NotDir) }
|
||||||
fn get_entry(&self, _id: usize) -> Result<String> { Err(FsError::NotDir) }
|
fn get_entry(&self, _id: usize) -> Result<String> { Err(FsError::NotDir) }
|
||||||
|
@ -319,12 +319,7 @@ pub fn sys_open(path: *const u8, flags: usize, mode: usize) -> SysResult {
|
|||||||
Err(e) => return Err(SysError::from(e)),
|
Err(e) => return Err(SysError::from(e)),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// TODO: remove "stdin:" "stdout:"
|
proc.lookup_inode(&path)?
|
||||||
match path.as_str() {
|
|
||||||
"stdin:" => crate::fs::STDIN.clone() as Arc<INode>,
|
|
||||||
"stdout:" => crate::fs::STDOUT.clone() as Arc<INode>,
|
|
||||||
_ => proc.lookup_inode(&path)?,
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let fd = proc.get_free_fd();
|
let fd = proc.get_free_fd();
|
||||||
@ -502,12 +497,7 @@ pub fn sys_rename(oldpath: *const u8, newpath: *const u8) -> SysResult {
|
|||||||
let (new_dir_path, new_file_name) = split_path(&newpath);
|
let (new_dir_path, new_file_name) = split_path(&newpath);
|
||||||
let old_dir_inode = proc.lookup_inode(old_dir_path)?;
|
let old_dir_inode = proc.lookup_inode(old_dir_path)?;
|
||||||
let new_dir_inode = proc.lookup_inode(new_dir_path)?;
|
let new_dir_inode = proc.lookup_inode(new_dir_path)?;
|
||||||
// TODO: merge `rename` and `move` in VFS
|
old_dir_inode.move_(old_file_name, &new_dir_inode, new_file_name)?;
|
||||||
if Arc::ptr_eq(&old_dir_inode, &new_dir_inode) {
|
|
||||||
old_dir_inode.rename(old_file_name, new_file_name)?;
|
|
||||||
} else {
|
|
||||||
old_dir_inode.move_(old_file_name, &new_dir_inode, new_file_name)?;
|
|
||||||
}
|
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -526,6 +516,21 @@ pub fn sys_mkdir(path: *const u8, mode: usize) -> SysResult {
|
|||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn sys_rmdir(path: *const u8) -> SysResult {
|
||||||
|
let proc = process();
|
||||||
|
let path = unsafe { proc.memory_set.check_and_clone_cstr(path)? };
|
||||||
|
info!("rmdir: path: {:?}", path);
|
||||||
|
|
||||||
|
let (dir_path, file_name) = split_path(&path);
|
||||||
|
let dir_inode = proc.lookup_inode(dir_path)?;
|
||||||
|
let file_inode = dir_inode.find(file_name)?;
|
||||||
|
if file_inode.metadata()?.type_ != FileType::Dir {
|
||||||
|
return Err(SysError::ENOTDIR);
|
||||||
|
}
|
||||||
|
dir_inode.unlink(file_name)?;
|
||||||
|
Ok(0)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn sys_link(oldpath: *const u8, newpath: *const u8) -> SysResult {
|
pub fn sys_link(oldpath: *const u8, newpath: *const u8) -> SysResult {
|
||||||
let proc = process();
|
let proc = process();
|
||||||
let oldpath = unsafe { proc.memory_set.check_and_clone_cstr(oldpath)? };
|
let oldpath = unsafe { proc.memory_set.check_and_clone_cstr(oldpath)? };
|
||||||
@ -546,6 +551,10 @@ pub fn sys_unlink(path: *const u8) -> SysResult {
|
|||||||
|
|
||||||
let (dir_path, file_name) = split_path(&path);
|
let (dir_path, file_name) = split_path(&path);
|
||||||
let dir_inode = proc.lookup_inode(dir_path)?;
|
let dir_inode = proc.lookup_inode(dir_path)?;
|
||||||
|
let file_inode = dir_inode.find(file_name)?;
|
||||||
|
if file_inode.metadata()?.type_ == FileType::Dir {
|
||||||
|
return Err(SysError::EISDIR);
|
||||||
|
}
|
||||||
dir_inode.unlink(file_name)?;
|
dir_inode.unlink(file_name)?;
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
@ -556,7 +565,6 @@ pub fn sys_pipe(fds: *mut u32) -> SysResult {
|
|||||||
let mut proc = process();
|
let mut proc = process();
|
||||||
proc.memory_set.check_mut_array(fds, 2)?;
|
proc.memory_set.check_mut_array(fds, 2)?;
|
||||||
let (read, write) = Pipe::create_pair();
|
let (read, write) = Pipe::create_pair();
|
||||||
let read_fd = proc.get_free_fd();
|
|
||||||
|
|
||||||
let read_fd = proc.get_free_fd();
|
let read_fd = proc.get_free_fd();
|
||||||
proc.files.insert(read_fd, FileLike::File(FileHandle::new(Arc::new(read), OpenOptions { read: true, write: false, append: false })));
|
proc.files.insert(read_fd, FileLike::File(FileHandle::new(Arc::new(read), OpenOptions { read: true, write: false, append: false })));
|
||||||
@ -574,6 +582,11 @@ pub fn sys_pipe(fds: *mut u32) -> SysResult {
|
|||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn sys_sync() -> SysResult {
|
||||||
|
ROOT_INODE.fs().sync()?;
|
||||||
|
Ok(0)
|
||||||
|
}
|
||||||
|
|
||||||
impl Process {
|
impl Process {
|
||||||
fn get_file(&mut self, fd: usize) -> Result<&mut FileHandle, SysError> {
|
fn get_file(&mut self, fd: usize) -> Result<&mut FileHandle, SysError> {
|
||||||
self.files.get_mut(&fd).ok_or(SysError::EBADF).and_then(|f| {
|
self.files.get_mut(&fd).ok_or(SysError::EBADF).and_then(|f| {
|
||||||
@ -856,7 +869,6 @@ impl StatMode {
|
|||||||
FileType::BlockDevice => StatMode::BLOCK,
|
FileType::BlockDevice => StatMode::BLOCK,
|
||||||
FileType::Socket => StatMode::SOCKET,
|
FileType::Socket => StatMode::SOCKET,
|
||||||
FileType::NamedPipe => StatMode::FIFO,
|
FileType::NamedPipe => StatMode::FIFO,
|
||||||
_ => StatMode::NULL,
|
|
||||||
};
|
};
|
||||||
let mode = StatMode::from_bits_truncate(mode as u32);
|
let mode = StatMode::from_bits_truncate(mode as u32);
|
||||||
type_ | mode
|
type_ | mode
|
||||||
|
@ -99,7 +99,7 @@ pub fn syscall(id: usize, args: [usize; 6], tf: &mut TrapFrame) -> isize {
|
|||||||
SYS_GETPPID => sys_getppid(),
|
SYS_GETPPID => sys_getppid(),
|
||||||
SYS_SETPRIORITY => sys_set_priority(args[0]),
|
SYS_SETPRIORITY => sys_set_priority(args[0]),
|
||||||
// SYS_SETRLIMIT => sys_setrlimit(),
|
// SYS_SETRLIMIT => sys_setrlimit(),
|
||||||
// SYS_SYNC => sys_sync(),
|
SYS_SYNC => sys_sync(),
|
||||||
SYS_REBOOT => sys_reboot(args[0] as u32, args[1] as u32, args[2] as u32, args[3] as *const u8),
|
SYS_REBOOT => sys_reboot(args[0] as u32, args[1] as u32, args[2] as u32, args[3] as *const u8),
|
||||||
SYS_GETTID => sys_gettid(),
|
SYS_GETTID => sys_gettid(),
|
||||||
SYS_FUTEX => sys_futex(args[0], args[1] as u32, args[2] as i32, args[3] as *const TimeSpec),
|
SYS_FUTEX => sys_futex(args[0], args[1] as u32, args[2] as i32, args[3] as *const TimeSpec),
|
||||||
@ -183,10 +183,6 @@ pub fn syscall(id: usize, args: [usize; 6], tf: &mut TrapFrame) -> isize {
|
|||||||
warn!("sys_sigaltstack is unimplemented");
|
warn!("sys_sigaltstack is unimplemented");
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
SYS_SYNC => {
|
|
||||||
warn!("sys_sync is unimplemented");
|
|
||||||
Ok(0)
|
|
||||||
}
|
|
||||||
SYS_SET_TID_ADDRESS => {
|
SYS_SET_TID_ADDRESS => {
|
||||||
warn!("sys_set_tid_address is unimplemented");
|
warn!("sys_set_tid_address is unimplemented");
|
||||||
Ok(thread::current().id())
|
Ok(thread::current().id())
|
||||||
@ -243,6 +239,7 @@ fn x86_64_syscall(id: usize, args: [usize; 6], tf: &mut TrapFrame) -> Option<Sys
|
|||||||
SYS_VFORK => sys_fork(tf),
|
SYS_VFORK => sys_fork(tf),
|
||||||
SYS_RENAME => sys_rename(args[0] as *const u8, args[1] as *const u8),
|
SYS_RENAME => sys_rename(args[0] as *const u8, args[1] as *const u8),
|
||||||
SYS_MKDIR => sys_mkdir(args[0] as *const u8, args[1]),
|
SYS_MKDIR => sys_mkdir(args[0] as *const u8, args[1]),
|
||||||
|
SYS_RMDIR => sys_rmdir(args[0] as *const u8),
|
||||||
SYS_LINK => sys_link(args[0] as *const u8, args[1] as *const u8),
|
SYS_LINK => sys_link(args[0] as *const u8, args[1] as *const u8),
|
||||||
SYS_UNLINK => sys_unlink(args[0] as *const u8),
|
SYS_UNLINK => sys_unlink(args[0] as *const u8),
|
||||||
SYS_ARCH_PRCTL => sys_arch_prctl(args[0] as i32, args[1], tf),
|
SYS_ARCH_PRCTL => sys_arch_prctl(args[0] as i32, args[1], tf),
|
||||||
|
Loading…
Reference in New Issue
Block a user