Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • redox-os/redoxfs
  • jD91mZM2/redoxfs
  • microcolonel/redoxfs
  • rm-dr/redoxfs
  • deepaksirone/redoxfs
  • sevenEng/redoxfs
  • mortona/redoxfs
  • potatogim/redoxfs
  • 4lDO2/redoxfs
  • malandrakisgeo/redoxfs
  • ssd/redoxfs
  • dahc/redoxfs
  • ashton/redoxfs
  • usapmz/redoxfs
  • vadorovsky/redoxfs
  • bjorn3/redoxfs
  • rw_van/redoxfs
  • mkroening/redoxfs
  • emaxx-g/redoxfs
  • CILP/redoxfs
  • AnandSMain/redoxfs
  • aaronjanse/redoxfs
  • liamnprg/redoxfs
  • coolreader18/redoxfs
  • freewilll/redoxfs
  • adi-g15/redoxfs
  • andrey.turkin/redoxfs
  • matlik/redoxfs
28 results
Show changes
Commits on Source (2)
...@@ -14,8 +14,8 @@ else ...@@ -14,8 +14,8 @@ else
endif endif
image.bin: image.bin:
dd if=/dev/zero of=image.bin bs=1048576 count=1024
cargo build --release --bin redoxfs-mkfs cargo build --release --bin redoxfs-mkfs
dd if=/dev/zero of=image.bin bs=1048576 count=1024
target/release/redoxfs-mkfs image.bin target/release/redoxfs-mkfs image.bin
mount: image.bin FORCE mount: image.bin FORCE
......
use alloc::{boxed::Box, vec}; use alloc::{boxed::Box, vec};
use core::{mem, ops, slice, str}; use core::{mem, ops, slice, str};
use crate::{BlockLevel, BlockTrait, Node, TreePtr, RECORD_LEVEL}; use crate::{BlockLevel, BlockTrait, Node, TreePtr, RECORD_LEVEL, DIR_ENTRY_MAX_LENGTH};
#[repr(packed)] #[repr(packed)]
pub struct DirEntry { pub struct DirEntry {
node_ptr: TreePtr<Node>, node_ptr: TreePtr<Node>,
name: [u8; 252], name: [u8; DIR_ENTRY_MAX_LENGTH],
} }
impl DirEntry { impl DirEntry {
pub fn new(node_ptr: TreePtr<Node>, name: &str) -> Option<DirEntry> { pub fn new(node_ptr: TreePtr<Node>, name: &str) -> DirEntry {
let mut entry = DirEntry { let mut entry = DirEntry {
node_ptr, node_ptr,
..Default::default() ..Default::default()
}; };
if name.len() > entry.name.len() {
return None;
}
entry.name[..name.len()].copy_from_slice(name.as_bytes()); entry.name[..name.len()].copy_from_slice(name.as_bytes());
Some(entry) entry
} }
pub fn node_ptr(&self) -> TreePtr<Node> { pub fn node_ptr(&self) -> TreePtr<Node> {
...@@ -54,7 +50,7 @@ impl Default for DirEntry { ...@@ -54,7 +50,7 @@ impl Default for DirEntry {
fn default() -> Self { fn default() -> Self {
Self { Self {
node_ptr: TreePtr::default(), node_ptr: TreePtr::default(),
name: [0; 252], name: [0; DIR_ENTRY_MAX_LENGTH],
} }
} }
} }
......
...@@ -14,6 +14,8 @@ pub const RECORD_LEVEL: usize = 5; ...@@ -14,6 +14,8 @@ pub const RECORD_LEVEL: usize = 5;
pub const RECORD_SIZE: u64 = BLOCK_SIZE << RECORD_LEVEL; pub const RECORD_SIZE: u64 = BLOCK_SIZE << RECORD_LEVEL;
pub const SIGNATURE: &[u8; 8] = b"RedoxFS\0"; pub const SIGNATURE: &[u8; 8] = b"RedoxFS\0";
pub const VERSION: u64 = 6; pub const VERSION: u64 = 6;
pub const DIR_ENTRY_MAX_LENGTH: usize = 252;
pub static IS_UMT: AtomicUsize = AtomicUsize::new(0); pub static IS_UMT: AtomicUsize = AtomicUsize::new(0);
pub use self::allocator::{AllocEntry, AllocList, Allocator, ALLOC_LIST_ENTRIES}; pub use self::allocator::{AllocEntry, AllocList, Allocator, ALLOC_LIST_ENTRIES};
......
...@@ -12,11 +12,7 @@ use syscall::error::{ ...@@ -12,11 +12,7 @@ use syscall::error::{
Error, Result, EEXIST, EINVAL, EIO, EISDIR, ENOENT, ENOSPC, ENOTDIR, ENOTEMPTY, ERANGE, Error, Result, EEXIST, EINVAL, EIO, EISDIR, ENOENT, ENOSPC, ENOTDIR, ENOTEMPTY, ERANGE,
}; };
use crate::{ use crate::{AllocEntry, AllocList, Allocator, BlockAddr, BlockData, BlockLevel, BlockPtr, BlockTrait, DirEntry, DirList, Disk, FileSystem, Header, Node, NodeLevel, RecordRaw, TreeData, TreePtr, ALLOC_LIST_ENTRIES, HEADER_RING, DIR_ENTRY_MAX_LENGTH};
AllocEntry, AllocList, Allocator, BlockAddr, BlockData, BlockLevel, BlockPtr, BlockTrait,
DirEntry, DirList, Disk, FileSystem, Header, Node, NodeLevel, RecordRaw, TreeData, TreePtr,
ALLOC_LIST_ENTRIES, HEADER_RING,
};
pub struct Transaction<'a, D: Disk> { pub struct Transaction<'a, D: Disk> {
fs: &'a mut FileSystem<D>, fs: &'a mut FileSystem<D>,
...@@ -605,13 +601,11 @@ impl<'a, D: Disk> Transaction<'a, D> { ...@@ -605,13 +601,11 @@ impl<'a, D: Disk> Transaction<'a, D> {
name: &str, name: &str,
node_ptr: TreePtr<Node>, node_ptr: TreePtr<Node>,
) -> Result<()> { ) -> Result<()> {
if name.contains(':') { if let Err(err) = self.check_name(&parent_ptr, &name){
return Err(Error::new(EINVAL)); return Err(err);
} }
if self.find_node(parent_ptr, name).is_ok() { let entry = DirEntry::new(node_ptr, name);
return Err(Error::new(EEXIST));
}
let mut parent = self.read_tree(parent_ptr)?; let mut parent = self.read_tree(parent_ptr)?;
...@@ -619,8 +613,6 @@ impl<'a, D: Disk> Transaction<'a, D> { ...@@ -619,8 +613,6 @@ impl<'a, D: Disk> Transaction<'a, D> {
let links = node.data().links(); let links = node.data().links();
node.data_mut().set_links(links + 1); node.data_mut().set_links(links + 1);
let entry = DirEntry::new(node_ptr, name).ok_or(Error::new(EINVAL))?;
let record_level = parent.data().record_level(); let record_level = parent.data().record_level();
let record_end = parent.data().size() / record_level.bytes(); let record_end = parent.data().size() / record_level.bytes();
for record_offset in 0..record_end { for record_offset in 0..record_end {
...@@ -795,6 +787,24 @@ impl<'a, D: Disk> Transaction<'a, D> { ...@@ -795,6 +787,24 @@ impl<'a, D: Disk> Transaction<'a, D> {
Ok(()) Ok(())
} }
fn check_name(&mut self,
parent_ptr: &TreePtr<Node>,
name: &str) -> Result<()> {
if name.contains(':') {
return Err(Error::new(EINVAL));
}
if name.len() > DIR_ENTRY_MAX_LENGTH {
return Err(Error::new(EINVAL));
}
if self.find_node(parent_ptr.clone(), name).is_ok() {
return Err(Error::new(EEXIST));
}
Ok(())
}
fn node_record_ptr( fn node_record_ptr(
&mut self, &mut self,
node: &TreeData<Node>, node: &TreeData<Node>,
......