refactor: use auto_inode in memfs,fat32
This commit is contained in:
parent
94c2fc3c82
commit
7e04b11da8
3
Cargo.lock
generated
3
Cargo.lock
generated
@ -45,6 +45,8 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
|
|||||||
name = "fat32"
|
name = "fat32"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"fs-macros",
|
||||||
|
"libsys",
|
||||||
"vfs",
|
"vfs",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -113,6 +115,7 @@ dependencies = [
|
|||||||
name = "memfs"
|
name = "memfs"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"fs-macros",
|
||||||
"libsys",
|
"libsys",
|
||||||
"vfs",
|
"vfs",
|
||||||
]
|
]
|
||||||
|
@ -7,3 +7,5 @@ edition = "2021"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
vfs = { path = "../vfs" }
|
vfs = { path = "../vfs" }
|
||||||
|
fs-macros = { path = "../macros" }
|
||||||
|
libsys = { path = "../../libsys" }
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use libcommon::{read_le16, read_le32};
|
use libsys::mem::{read_le16, read_le32};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Bpb {
|
pub struct Bpb {
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
use crate::{Bpb, FileInode};
|
use crate::{Bpb, FileInode};
|
||||||
use alloc::{borrow::ToOwned, boxed::Box, string::String};
|
use alloc::{borrow::ToOwned, boxed::Box, string::String};
|
||||||
use error::Errno;
|
use libsys::{
|
||||||
use libcommon::{read_le16, read_le32};
|
error::Errno,
|
||||||
|
ioctl::IoctlCmd,
|
||||||
|
mem::{read_le16, read_le32},
|
||||||
|
stat::{OpenFlags, Stat},
|
||||||
|
};
|
||||||
use vfs::{BlockDevice, Vnode, VnodeImpl, VnodeKind, VnodeRef};
|
use vfs::{BlockDevice, Vnode, VnodeImpl, VnodeKind, VnodeRef};
|
||||||
|
|
||||||
pub struct DirectoryInode {
|
pub struct DirectoryInode {
|
||||||
@ -26,20 +30,8 @@ pub struct Dirent {
|
|||||||
pub cluster: u32,
|
pub cluster: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[auto_inode]
|
||||||
impl VnodeImpl for DirectoryInode {
|
impl VnodeImpl for DirectoryInode {
|
||||||
fn create(
|
|
||||||
&mut self,
|
|
||||||
_parent: VnodeRef,
|
|
||||||
_name: &str,
|
|
||||||
_kind: VnodeKind,
|
|
||||||
) -> Result<VnodeRef, Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn remove(&mut self, _parent: VnodeRef, _name: &str) -> Result<(), Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn lookup(&mut self, parent: VnodeRef, name: &str) -> Result<VnodeRef, Errno> {
|
fn lookup(&mut self, parent: VnodeRef, name: &str) -> Result<VnodeRef, Errno> {
|
||||||
let fs = parent.fs().unwrap();
|
let fs = parent.fs().unwrap();
|
||||||
let dirent = {
|
let dirent = {
|
||||||
@ -72,30 +64,6 @@ impl VnodeImpl for DirectoryInode {
|
|||||||
}
|
}
|
||||||
Ok(vnode)
|
Ok(vnode)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn open(&mut self, _node: VnodeRef) -> Result<usize, Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn close(&mut self, _node: VnodeRef) -> Result<(), Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn read(&mut self, _node: VnodeRef, _pos: usize, _data: &mut [u8]) -> Result<usize, Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn write(&mut self, _node: VnodeRef, _pos: usize, _data: &[u8]) -> Result<usize, Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn truncate(&mut self, _node: VnodeRef, _size: usize) -> Result<(), Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn size(&mut self, _node: VnodeRef) -> Result<usize, Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Iterator for FatIterator<'_> {
|
impl Iterator for FatIterator<'_> {
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
use crate::Bpb;
|
use crate::Bpb;
|
||||||
use error::Errno;
|
use libsys::{
|
||||||
|
stat::{Stat, OpenFlags},
|
||||||
|
ioctl::IoctlCmd,
|
||||||
|
error::Errno
|
||||||
|
};
|
||||||
use vfs::{VnodeImpl, VnodeKind, VnodeRef};
|
use vfs::{VnodeImpl, VnodeKind, VnodeRef};
|
||||||
|
|
||||||
pub struct FileInode {
|
pub struct FileInode {
|
||||||
@ -7,27 +11,15 @@ pub struct FileInode {
|
|||||||
pub size: u32,
|
pub size: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[auto_inode]
|
||||||
impl VnodeImpl for FileInode {
|
impl VnodeImpl for FileInode {
|
||||||
fn create(&mut self, _at: VnodeRef, _name: &str, _kind: VnodeKind) -> Result<VnodeRef, Errno> {
|
fn open(&mut self, _node: VnodeRef, flags: OpenFlags) -> Result<usize, Errno> {
|
||||||
panic!()
|
if flags & OpenFlags::O_ACCESS != OpenFlags::O_RDONLY {
|
||||||
}
|
return Err(Errno::ReadOnly);
|
||||||
|
}
|
||||||
fn remove(&mut self, _parent: VnodeRef, _name: &str) -> Result<(), Errno> {
|
|
||||||
panic!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn lookup(&mut self, _parent: VnodeRef, _name: &str) -> Result<VnodeRef, Errno> {
|
|
||||||
panic!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn open(&mut self, _node: VnodeRef) -> Result<usize, Errno> {
|
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn close(&mut self, _node: VnodeRef) -> Result<(), Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn read(&mut self, node: VnodeRef, pos: usize, data: &mut [u8]) -> Result<usize, Errno> {
|
fn read(&mut self, node: VnodeRef, pos: usize, data: &mut [u8]) -> Result<usize, Errno> {
|
||||||
let size = self.size as usize;
|
let size = self.size as usize;
|
||||||
if pos >= size {
|
if pos >= size {
|
||||||
@ -60,16 +52,4 @@ impl VnodeImpl for FileInode {
|
|||||||
|
|
||||||
Ok(off)
|
Ok(off)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write(&mut self, _node: VnodeRef, _pos: usize, _data: &[u8]) -> Result<usize, Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn truncate(&mut self, _node: VnodeRef, _size: usize) -> Result<(), Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn size(&mut self, _node: VnodeRef) -> Result<usize, Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -4,13 +4,18 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate std;
|
extern crate std;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate fs_macros;
|
||||||
|
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
|
|
||||||
use alloc::{boxed::Box, rc::Rc};
|
use alloc::{boxed::Box, rc::Rc};
|
||||||
use core::any::Any;
|
use core::any::Any;
|
||||||
use core::cell::{Ref, RefCell};
|
use core::cell::{Ref, RefCell};
|
||||||
use error::Errno;
|
use libsys::{
|
||||||
use libcommon::read_le32;
|
mem::read_le32,
|
||||||
|
error::Errno,
|
||||||
|
};
|
||||||
use vfs::{BlockDevice, Filesystem, Vnode, VnodeKind, VnodeRef};
|
use vfs::{BlockDevice, Filesystem, Vnode, VnodeKind, VnodeRef};
|
||||||
|
|
||||||
pub mod dir;
|
pub mod dir;
|
||||||
|
@ -7,6 +7,7 @@ edition = "2021"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
vfs = { path = "../vfs" }
|
vfs = { path = "../vfs" }
|
||||||
|
fs-macros = { path = "../macros" }
|
||||||
libsys = { path = "../../libsys" }
|
libsys = { path = "../../libsys" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
@ -1,12 +1,17 @@
|
|||||||
use crate::{BlockAllocator, Bvec, FileInode};
|
use crate::{BlockAllocator, Bvec, FileInode};
|
||||||
use alloc::boxed::Box;
|
use alloc::boxed::Box;
|
||||||
use libsys::error::Errno;
|
use libsys::{
|
||||||
use vfs::{IoctlCmd, OpenFlags, Stat, Vnode, VnodeImpl, VnodeKind, VnodeRef};
|
error::Errno,
|
||||||
|
stat::{OpenFlags, Stat},
|
||||||
|
ioctl::IoctlCmd
|
||||||
|
};
|
||||||
|
use vfs::{Vnode, VnodeImpl, VnodeKind, VnodeRef};
|
||||||
|
|
||||||
pub struct DirInode<A: BlockAllocator + Copy + 'static> {
|
pub struct DirInode<A: BlockAllocator + Copy + 'static> {
|
||||||
alloc: A,
|
alloc: A,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[auto_inode]
|
||||||
impl<A: BlockAllocator + Copy + 'static> VnodeImpl for DirInode<A> {
|
impl<A: BlockAllocator + Copy + 'static> VnodeImpl for DirInode<A> {
|
||||||
fn create(
|
fn create(
|
||||||
&mut self,
|
&mut self,
|
||||||
@ -30,44 +35,6 @@ impl<A: BlockAllocator + Copy + 'static> VnodeImpl for DirInode<A> {
|
|||||||
fn remove(&mut self, _parent: VnodeRef, _name: &str) -> Result<(), Errno> {
|
fn remove(&mut self, _parent: VnodeRef, _name: &str) -> Result<(), Errno> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn open(&mut self, _node: VnodeRef, _flags: OpenFlags) -> Result<usize, Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn close(&mut self, _node: VnodeRef) -> Result<(), Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn read(&mut self, _node: VnodeRef, _pos: usize, _data: &mut [u8]) -> Result<usize, Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn write(&mut self, _node: VnodeRef, _pos: usize, _data: &[u8]) -> Result<usize, Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn truncate(&mut self, _node: VnodeRef, _size: usize) -> Result<(), Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn size(&mut self, _node: VnodeRef) -> Result<usize, Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn stat(&mut self, _node: VnodeRef, _stat: &mut Stat) -> Result<(), Errno> {
|
|
||||||
todo!();
|
|
||||||
}
|
|
||||||
|
|
||||||
fn ioctl(
|
|
||||||
&mut self,
|
|
||||||
node: VnodeRef,
|
|
||||||
cmd: IoctlCmd,
|
|
||||||
ptr: usize,
|
|
||||||
len: usize,
|
|
||||||
) -> Result<usize, Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<A: BlockAllocator + Copy + 'static> DirInode<A> {
|
impl<A: BlockAllocator + Copy + 'static> DirInode<A> {
|
||||||
|
@ -1,29 +1,17 @@
|
|||||||
use crate::{BlockAllocator, Bvec};
|
use crate::{BlockAllocator, Bvec};
|
||||||
use libsys::error::Errno;
|
use libsys::{
|
||||||
use vfs::{OpenFlags, Stat, VnodeImpl, VnodeKind, VnodeRef, IoctlCmd};
|
error::Errno,
|
||||||
|
stat::{OpenFlags, Stat},
|
||||||
|
ioctl::IoctlCmd
|
||||||
|
};
|
||||||
|
use vfs::{VnodeImpl, VnodeKind, VnodeRef};
|
||||||
|
|
||||||
pub struct FileInode<'a, A: BlockAllocator + Copy + 'static> {
|
pub struct FileInode<'a, A: BlockAllocator + Copy + 'static> {
|
||||||
data: Bvec<'a, A>,
|
data: Bvec<'a, A>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[auto_inode]
|
||||||
impl<'a, A: BlockAllocator + Copy + 'static> VnodeImpl for FileInode<'a, A> {
|
impl<'a, A: BlockAllocator + Copy + 'static> VnodeImpl for FileInode<'a, A> {
|
||||||
fn create(
|
|
||||||
&mut self,
|
|
||||||
_parent: VnodeRef,
|
|
||||||
_name: &str,
|
|
||||||
_kind: VnodeKind,
|
|
||||||
) -> Result<VnodeRef, Errno> {
|
|
||||||
panic!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn lookup(&mut self, _parent: VnodeRef, _name: &str) -> Result<VnodeRef, Errno> {
|
|
||||||
panic!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn remove(&mut self, _parent: VnodeRef, _name: &str) -> Result<(), Errno> {
|
|
||||||
panic!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn open(&mut self, _node: VnodeRef, _mode: OpenFlags) -> Result<usize, Errno> {
|
fn open(&mut self, _node: VnodeRef, _mode: OpenFlags) -> Result<usize, Errno> {
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
@ -54,16 +42,6 @@ impl<'a, A: BlockAllocator + Copy + 'static> VnodeImpl for FileInode<'a, A> {
|
|||||||
stat.mode = 0o755;
|
stat.mode = 0o755;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ioctl(
|
|
||||||
&mut self,
|
|
||||||
node: VnodeRef,
|
|
||||||
cmd: IoctlCmd,
|
|
||||||
ptr: usize,
|
|
||||||
len: usize,
|
|
||||||
) -> Result<usize, Errno> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, A: BlockAllocator + Copy + 'static> FileInode<'a, A> {
|
impl<'a, A: BlockAllocator + Copy + 'static> FileInode<'a, A> {
|
||||||
|
@ -11,14 +11,18 @@ extern crate alloc;
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate std;
|
extern crate std;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate fs_macros;
|
||||||
|
|
||||||
use alloc::{boxed::Box, rc::Rc};
|
use alloc::{boxed::Box, rc::Rc};
|
||||||
use core::any::Any;
|
use core::any::Any;
|
||||||
use core::cell::{Ref, RefCell};
|
use core::cell::{Ref, RefCell};
|
||||||
use libsys::{
|
use libsys::{
|
||||||
error::Errno,
|
error::Errno,
|
||||||
path::{path_component_right, path_component_left}
|
path::{path_component_left, path_component_right},
|
||||||
|
stat::FileMode,
|
||||||
};
|
};
|
||||||
use vfs::{BlockDevice, FileMode, Filesystem, Vnode, VnodeKind, VnodeRef};
|
use vfs::{BlockDevice, Filesystem, Vnode, VnodeKind, VnodeRef};
|
||||||
|
|
||||||
mod block;
|
mod block;
|
||||||
pub use block::{BlockAllocator, BlockRef};
|
pub use block::{BlockAllocator, BlockRef};
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
use crate::{OpenFlags, Stat, VnodeImpl, VnodeKind, VnodeRef, IoctlCmd};
|
use crate::{VnodeImpl, VnodeKind, VnodeRef};
|
||||||
use libsys::error::Errno;
|
use libsys::{
|
||||||
|
error::Errno,
|
||||||
|
stat::{OpenFlags, Stat},
|
||||||
|
ioctl::IoctlCmd
|
||||||
|
};
|
||||||
|
|
||||||
/// Generic character device trait
|
/// Generic character device trait
|
||||||
pub trait CharDevice {
|
pub trait CharDevice {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
use crate::{FileMode, FileRef, OpenFlags, VnodeKind, VnodeRef};
|
use crate::{FileRef, VnodeKind, VnodeRef};
|
||||||
use libsys::{
|
use libsys::{
|
||||||
error::Errno,
|
error::Errno,
|
||||||
|
stat::{OpenFlags, FileMode},
|
||||||
path::{path_component_left, path_component_right},
|
path::{path_component_left, path_component_right},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -12,8 +12,8 @@ extern crate fs_macros;
|
|||||||
|
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
|
|
||||||
pub use libsys::stat::{FileMode, OpenFlags, Stat};
|
// pub use libsys::stat::{FileMode, OpenFlags, Stat};
|
||||||
pub use libsys::ioctl::IoctlCmd;
|
// pub use libsys::ioctl::IoctlCmd;
|
||||||
|
|
||||||
mod block;
|
mod block;
|
||||||
pub use block::BlockDevice;
|
pub use block::BlockDevice;
|
||||||
|
@ -1,8 +1,12 @@
|
|||||||
use crate::{File, FileMode, FileRef, Filesystem, IoctlCmd, OpenFlags, Stat};
|
use crate::{File, FileRef, Filesystem};
|
||||||
use alloc::{borrow::ToOwned, boxed::Box, rc::Rc, string::String, vec::Vec};
|
use alloc::{borrow::ToOwned, boxed::Box, rc::Rc, string::String, vec::Vec};
|
||||||
use core::cell::{RefCell, RefMut};
|
use core::cell::{RefCell, RefMut};
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
use libsys::error::Errno;
|
use libsys::{
|
||||||
|
error::Errno,
|
||||||
|
ioctl::IoctlCmd,
|
||||||
|
stat::{FileMode, OpenFlags, Stat},
|
||||||
|
};
|
||||||
|
|
||||||
/// Convenience type alias for [Rc<Vnode>]
|
/// Convenience type alias for [Rc<Vnode>]
|
||||||
pub type VnodeRef = Rc<Vnode>;
|
pub type VnodeRef = Rc<Vnode>;
|
||||||
@ -405,7 +409,7 @@ impl fmt::Debug for Vnode {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
use libsys::{stat::OpenFlags, ioctl::IoctlCmd, stat::Stat};
|
use libsys::{ioctl::IoctlCmd, stat::OpenFlags, stat::Stat};
|
||||||
pub struct DummyInode;
|
pub struct DummyInode;
|
||||||
|
|
||||||
#[auto_inode]
|
#[auto_inode]
|
||||||
@ -447,10 +451,13 @@ mod tests {
|
|||||||
|
|
||||||
root.set_data(Box::new(DummyInode {}));
|
root.set_data(Box::new(DummyInode {}));
|
||||||
|
|
||||||
let node = root.create("test", FileMode::default_dir(), VnodeKind::Directory).unwrap();
|
let node = root
|
||||||
|
.create("test", FileMode::default_dir(), VnodeKind::Directory)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
root.create("test", FileMode::default_dir(), VnodeKind::Directory).unwrap_err(),
|
root.create("test", FileMode::default_dir(), VnodeKind::Directory)
|
||||||
|
.unwrap_err(),
|
||||||
Errno::AlreadyExists
|
Errno::AlreadyExists
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ use tock_registers::{
|
|||||||
register_bitfields, register_structs,
|
register_bitfields, register_structs,
|
||||||
registers::{ReadOnly, ReadWrite, WriteOnly},
|
registers::{ReadOnly, ReadWrite, WriteOnly},
|
||||||
};
|
};
|
||||||
use vfs::{CharDevice, IoctlCmd};
|
use vfs::CharDevice;
|
||||||
|
|
||||||
register_bitfields! {
|
register_bitfields! {
|
||||||
u32,
|
u32,
|
||||||
|
@ -5,7 +5,8 @@ use crate::fs::{devfs, MemfsBlockAlloc};
|
|||||||
use crate::mem;
|
use crate::mem;
|
||||||
use crate::proc::{elf, Process};
|
use crate::proc::{elf, Process};
|
||||||
use memfs::Ramfs;
|
use memfs::Ramfs;
|
||||||
use vfs::{Filesystem, Ioctx, OpenFlags};
|
use libsys::stat::OpenFlags;
|
||||||
|
use vfs::{Filesystem, Ioctx};
|
||||||
|
|
||||||
/// Kernel init process function
|
/// Kernel init process function
|
||||||
#[inline(never)]
|
#[inline(never)]
|
||||||
|
@ -9,10 +9,11 @@ use core::time::Duration;
|
|||||||
use libsys::{
|
use libsys::{
|
||||||
abi,
|
abi,
|
||||||
error::Errno,
|
error::Errno,
|
||||||
stat::{AT_EMPTY_PATH, AT_FDCWD},
|
ioctl::IoctlCmd,
|
||||||
|
stat::{FileMode, OpenFlags, Stat, AT_EMPTY_PATH, AT_FDCWD},
|
||||||
traits::{Read, Write},
|
traits::{Read, Write},
|
||||||
};
|
};
|
||||||
use vfs::{FileMode, IoctlCmd, OpenFlags, Stat, VnodeRef};
|
use vfs::VnodeRef;
|
||||||
|
|
||||||
pub mod arg;
|
pub mod arg;
|
||||||
pub use arg::*;
|
pub use arg::*;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user