pub struct FilesystemCore { /* private fields */ }Expand description
The main filesystem core. Owns the block store, crypto, codec, allocator, and transaction manager. Provides high-level filesystem operations.
Implementations§
Source§impl FilesystemCore
impl FilesystemCore
Sourcepub fn new(store: Arc<dyn BlockStore>, crypto: Arc<dyn CryptoEngine>) -> Self
pub fn new(store: Arc<dyn BlockStore>, crypto: Arc<dyn CryptoEngine>) -> Self
Create a new FilesystemCore backed by the given store and crypto engine.
Examples found in repository?
15fn main() {
16 let path = std::env::current_dir()
17 .unwrap()
18 .join("sample.dcfs")
19 .to_string_lossy()
20 .to_string();
21
22 // Remove leftover from a previous run, if any.
23 let _ = std::fs::remove_file(&path);
24
25 // 64 blocks × 64 KiB = 4 MiB image.
26 let total_blocks: u64 = 64;
27 let store = Arc::new(
28 DiskBlockStore::create(&path, DEFAULT_BLOCK_SIZE, total_blocks)
29 .expect("failed to create image file"),
30 );
31
32 let crypto = Arc::new(ChaChaEngine::generate().expect("failed to init crypto"));
33 let mut fs = FilesystemCore::new(store, crypto);
34
35 fs.init_filesystem().expect("init_filesystem failed");
36
37 // Create a text file.
38 fs.create_file("hello.txt").expect("create_file failed");
39 fs.write_file("hello.txt", 0, b"Hello, hex editor!")
40 .expect("write_file failed");
41
42 // Create a directory.
43 fs.create_directory("notes")
44 .expect("create_directory failed");
45
46 // Create a larger binary file so there's more to look at.
47 let pattern: Vec<u8> = (0..=255).cycle().take(200_000).collect();
48 fs.create_file("pattern.bin").expect("create_file failed");
49 fs.write_file("pattern.bin", 0, &pattern)
50 .expect("write_file failed");
51
52 fs.sync().expect("sync failed");
53
54 println!("Filesystem image written to:\n {path}");
55 println!(
56 " {} blocks × {} bytes = {} bytes total",
57 total_blocks,
58 DEFAULT_BLOCK_SIZE,
59 total_blocks as usize * DEFAULT_BLOCK_SIZE
60 );
61}Sourcepub fn init_filesystem(&mut self) -> FsResult<()>
pub fn init_filesystem(&mut self) -> FsResult<()>
Initialize a brand-new filesystem on the block store. Writes the storage header, creates the root directory, and commits.
Examples found in repository?
15fn main() {
16 let path = std::env::current_dir()
17 .unwrap()
18 .join("sample.dcfs")
19 .to_string_lossy()
20 .to_string();
21
22 // Remove leftover from a previous run, if any.
23 let _ = std::fs::remove_file(&path);
24
25 // 64 blocks × 64 KiB = 4 MiB image.
26 let total_blocks: u64 = 64;
27 let store = Arc::new(
28 DiskBlockStore::create(&path, DEFAULT_BLOCK_SIZE, total_blocks)
29 .expect("failed to create image file"),
30 );
31
32 let crypto = Arc::new(ChaChaEngine::generate().expect("failed to init crypto"));
33 let mut fs = FilesystemCore::new(store, crypto);
34
35 fs.init_filesystem().expect("init_filesystem failed");
36
37 // Create a text file.
38 fs.create_file("hello.txt").expect("create_file failed");
39 fs.write_file("hello.txt", 0, b"Hello, hex editor!")
40 .expect("write_file failed");
41
42 // Create a directory.
43 fs.create_directory("notes")
44 .expect("create_directory failed");
45
46 // Create a larger binary file so there's more to look at.
47 let pattern: Vec<u8> = (0..=255).cycle().take(200_000).collect();
48 fs.create_file("pattern.bin").expect("create_file failed");
49 fs.write_file("pattern.bin", 0, &pattern)
50 .expect("write_file failed");
51
52 fs.sync().expect("sync failed");
53
54 println!("Filesystem image written to:\n {path}");
55 println!(
56 " {} blocks × {} bytes = {} bytes total",
57 total_blocks,
58 DEFAULT_BLOCK_SIZE,
59 total_blocks as usize * DEFAULT_BLOCK_SIZE
60 );
61}Sourcepub fn open(&mut self) -> FsResult<()>
pub fn open(&mut self) -> FsResult<()>
Open / mount an existing filesystem by recovering the latest root pointer.
Sourcepub fn create_file(&mut self, name: &str) -> FsResult<()>
pub fn create_file(&mut self, name: &str) -> FsResult<()>
Create a new empty file in the given directory (by inode ref). For V1, only root directory is supported.
Examples found in repository?
15fn main() {
16 let path = std::env::current_dir()
17 .unwrap()
18 .join("sample.dcfs")
19 .to_string_lossy()
20 .to_string();
21
22 // Remove leftover from a previous run, if any.
23 let _ = std::fs::remove_file(&path);
24
25 // 64 blocks × 64 KiB = 4 MiB image.
26 let total_blocks: u64 = 64;
27 let store = Arc::new(
28 DiskBlockStore::create(&path, DEFAULT_BLOCK_SIZE, total_blocks)
29 .expect("failed to create image file"),
30 );
31
32 let crypto = Arc::new(ChaChaEngine::generate().expect("failed to init crypto"));
33 let mut fs = FilesystemCore::new(store, crypto);
34
35 fs.init_filesystem().expect("init_filesystem failed");
36
37 // Create a text file.
38 fs.create_file("hello.txt").expect("create_file failed");
39 fs.write_file("hello.txt", 0, b"Hello, hex editor!")
40 .expect("write_file failed");
41
42 // Create a directory.
43 fs.create_directory("notes")
44 .expect("create_directory failed");
45
46 // Create a larger binary file so there's more to look at.
47 let pattern: Vec<u8> = (0..=255).cycle().take(200_000).collect();
48 fs.create_file("pattern.bin").expect("create_file failed");
49 fs.write_file("pattern.bin", 0, &pattern)
50 .expect("write_file failed");
51
52 fs.sync().expect("sync failed");
53
54 println!("Filesystem image written to:\n {path}");
55 println!(
56 " {} blocks × {} bytes = {} bytes total",
57 total_blocks,
58 DEFAULT_BLOCK_SIZE,
59 total_blocks as usize * DEFAULT_BLOCK_SIZE
60 );
61}Sourcepub fn write_file(
&mut self,
name: &str,
offset: u64,
data: &[u8],
) -> FsResult<()>
pub fn write_file( &mut self, name: &str, offset: u64, data: &[u8], ) -> FsResult<()>
Write data to a file. For V1, this replaces the entire file content (single chunk only if it fits in one block).
Examples found in repository?
15fn main() {
16 let path = std::env::current_dir()
17 .unwrap()
18 .join("sample.dcfs")
19 .to_string_lossy()
20 .to_string();
21
22 // Remove leftover from a previous run, if any.
23 let _ = std::fs::remove_file(&path);
24
25 // 64 blocks × 64 KiB = 4 MiB image.
26 let total_blocks: u64 = 64;
27 let store = Arc::new(
28 DiskBlockStore::create(&path, DEFAULT_BLOCK_SIZE, total_blocks)
29 .expect("failed to create image file"),
30 );
31
32 let crypto = Arc::new(ChaChaEngine::generate().expect("failed to init crypto"));
33 let mut fs = FilesystemCore::new(store, crypto);
34
35 fs.init_filesystem().expect("init_filesystem failed");
36
37 // Create a text file.
38 fs.create_file("hello.txt").expect("create_file failed");
39 fs.write_file("hello.txt", 0, b"Hello, hex editor!")
40 .expect("write_file failed");
41
42 // Create a directory.
43 fs.create_directory("notes")
44 .expect("create_directory failed");
45
46 // Create a larger binary file so there's more to look at.
47 let pattern: Vec<u8> = (0..=255).cycle().take(200_000).collect();
48 fs.create_file("pattern.bin").expect("create_file failed");
49 fs.write_file("pattern.bin", 0, &pattern)
50 .expect("write_file failed");
51
52 fs.sync().expect("sync failed");
53
54 println!("Filesystem image written to:\n {path}");
55 println!(
56 " {} blocks × {} bytes = {} bytes total",
57 total_blocks,
58 DEFAULT_BLOCK_SIZE,
59 total_blocks as usize * DEFAULT_BLOCK_SIZE
60 );
61}Sourcepub fn read_file(
&self,
name: &str,
offset: u64,
len: usize,
) -> FsResult<Vec<u8>>
pub fn read_file( &self, name: &str, offset: u64, len: usize, ) -> FsResult<Vec<u8>>
Read file data. Returns the requested slice of the file.
Sourcepub fn list_directory(&self) -> FsResult<Vec<DirListEntry>>
pub fn list_directory(&self) -> FsResult<Vec<DirListEntry>>
List entries in the root directory.
Sourcepub fn create_directory(&mut self, name: &str) -> FsResult<()>
pub fn create_directory(&mut self, name: &str) -> FsResult<()>
Create a subdirectory in the root directory.
Examples found in repository?
15fn main() {
16 let path = std::env::current_dir()
17 .unwrap()
18 .join("sample.dcfs")
19 .to_string_lossy()
20 .to_string();
21
22 // Remove leftover from a previous run, if any.
23 let _ = std::fs::remove_file(&path);
24
25 // 64 blocks × 64 KiB = 4 MiB image.
26 let total_blocks: u64 = 64;
27 let store = Arc::new(
28 DiskBlockStore::create(&path, DEFAULT_BLOCK_SIZE, total_blocks)
29 .expect("failed to create image file"),
30 );
31
32 let crypto = Arc::new(ChaChaEngine::generate().expect("failed to init crypto"));
33 let mut fs = FilesystemCore::new(store, crypto);
34
35 fs.init_filesystem().expect("init_filesystem failed");
36
37 // Create a text file.
38 fs.create_file("hello.txt").expect("create_file failed");
39 fs.write_file("hello.txt", 0, b"Hello, hex editor!")
40 .expect("write_file failed");
41
42 // Create a directory.
43 fs.create_directory("notes")
44 .expect("create_directory failed");
45
46 // Create a larger binary file so there's more to look at.
47 let pattern: Vec<u8> = (0..=255).cycle().take(200_000).collect();
48 fs.create_file("pattern.bin").expect("create_file failed");
49 fs.write_file("pattern.bin", 0, &pattern)
50 .expect("write_file failed");
51
52 fs.sync().expect("sync failed");
53
54 println!("Filesystem image written to:\n {path}");
55 println!(
56 " {} blocks × {} bytes = {} bytes total",
57 total_blocks,
58 DEFAULT_BLOCK_SIZE,
59 total_blocks as usize * DEFAULT_BLOCK_SIZE
60 );
61}Sourcepub fn remove_file(&mut self, name: &str) -> FsResult<()>
pub fn remove_file(&mut self, name: &str) -> FsResult<()>
Remove a file from the root directory.
Sourcepub fn rename(&mut self, old_name: &str, new_name: &str) -> FsResult<()>
pub fn rename(&mut self, old_name: &str, new_name: &str) -> FsResult<()>
Rename a file or directory within the root directory.
Sourcepub fn sync(&self) -> FsResult<()>
pub fn sync(&self) -> FsResult<()>
Sync / flush. Calls through to the block store sync.
Examples found in repository?
15fn main() {
16 let path = std::env::current_dir()
17 .unwrap()
18 .join("sample.dcfs")
19 .to_string_lossy()
20 .to_string();
21
22 // Remove leftover from a previous run, if any.
23 let _ = std::fs::remove_file(&path);
24
25 // 64 blocks × 64 KiB = 4 MiB image.
26 let total_blocks: u64 = 64;
27 let store = Arc::new(
28 DiskBlockStore::create(&path, DEFAULT_BLOCK_SIZE, total_blocks)
29 .expect("failed to create image file"),
30 );
31
32 let crypto = Arc::new(ChaChaEngine::generate().expect("failed to init crypto"));
33 let mut fs = FilesystemCore::new(store, crypto);
34
35 fs.init_filesystem().expect("init_filesystem failed");
36
37 // Create a text file.
38 fs.create_file("hello.txt").expect("create_file failed");
39 fs.write_file("hello.txt", 0, b"Hello, hex editor!")
40 .expect("write_file failed");
41
42 // Create a directory.
43 fs.create_directory("notes")
44 .expect("create_directory failed");
45
46 // Create a larger binary file so there's more to look at.
47 let pattern: Vec<u8> = (0..=255).cycle().take(200_000).collect();
48 fs.create_file("pattern.bin").expect("create_file failed");
49 fs.write_file("pattern.bin", 0, &pattern)
50 .expect("write_file failed");
51
52 fs.sync().expect("sync failed");
53
54 println!("Filesystem image written to:\n {path}");
55 println!(
56 " {} blocks × {} bytes = {} bytes total",
57 total_blocks,
58 DEFAULT_BLOCK_SIZE,
59 total_blocks as usize * DEFAULT_BLOCK_SIZE
60 );
61}