diff --git a/examples/passthrough.rs b/examples/passthrough.rs index bd865c3c..a7277430 100644 --- a/examples/passthrough.rs +++ b/examples/passthrough.rs @@ -172,7 +172,7 @@ impl Filesystem for PassthroughFs { let (fh, id) = self .backing_cache .get_or(ino, || { - let file = File::open("/etc/os-release")?; + let file = File::open("/etc/profile")?; reply.open_backing(file) }) .unwrap(); diff --git a/examples/simple.rs b/examples/simple.rs index 0679bfd2..eb9c7bc5 100644 --- a/examples/simple.rs +++ b/examples/simple.rs @@ -33,7 +33,7 @@ use std::sync::atomic::{AtomicU64, Ordering}; use std::time::{Duration, SystemTime, UNIX_EPOCH}; use std::{env, fs, io}; -const BLOCK_SIZE: u64 = 512; +const BLOCK_SIZE: u32 = 512; const MAX_NAME_LENGTH: u32 = 255; const MAX_FILE_SIZE: u64 = 1024 * 1024 * 1024 * 1024; @@ -221,7 +221,7 @@ impl From for fuser::FileAttr { fuser::FileAttr { ino: attrs.inode, size: attrs.size, - blocks: attrs.size.div_ceil(BLOCK_SIZE), + blocks: attrs.size.div_ceil(u64::from(BLOCK_SIZE)), atime: system_time_from_time(attrs.last_accessed.0, attrs.last_accessed.1), mtime: system_time_from_time(attrs.last_modified.0, attrs.last_modified.1), ctime: system_time_from_time( @@ -235,7 +235,7 @@ impl From for fuser::FileAttr { uid: attrs.uid, gid: attrs.gid, rdev: 0, - blksize: BLOCK_SIZE as u32, + blksize: BLOCK_SIZE, flags: 0, } } @@ -316,11 +316,11 @@ impl SimpleFS { fh } - fn check_file_handle_read(&self, file_handle: u64) -> bool { + fn check_file_handle_read(file_handle: u64) -> bool { (file_handle & FILE_HANDLE_READ_BIT) != 0 } - fn check_file_handle_write(&self, file_handle: u64) -> bool { + fn check_file_handle_write(file_handle: u64) -> bool { (file_handle & FILE_HANDLE_WRITE_BIT) != 0 } @@ -340,7 +340,7 @@ impl SimpleFS { } } - fn write_directory_content(&self, inode: Inode, entries: DirectoryDescriptor) { + fn write_directory_content(&self, inode: Inode, entries: &DirectoryDescriptor) { let path = Path::new(&self.data_dir) .join("contents") .join(inode.to_string()); @@ -466,7 +466,7 @@ impl SimpleFS { let mut entries = self.get_directory_content(parent).unwrap(); entries.insert(name.as_bytes().to_vec(), (inode, kind)); - self.write_directory_content(parent, entries); + self.write_directory_content(parent, &entries); Ok(()) } @@ -502,7 +502,7 @@ impl Filesystem for SimpleFS { self.write_inode(&root); let mut entries = BTreeMap::new(); entries.insert(b".".to_vec(), (FUSE_ROOT_ID, FileKind::Directory)); - self.write_directory_content(FUSE_ROOT_ID, entries); + self.write_directory_content(FUSE_ROOT_ID, &entries); } Ok(()) } @@ -653,7 +653,7 @@ impl Filesystem for SimpleFS { // This is important as it preserves the semantic that a file handle opened // with W_OK will never fail to truncate, even if the file has been subsequently // chmod'ed - if self.check_file_handle_write(handle) { + if Self::check_file_handle_write(handle) { if let Err(error_code) = self.truncate(inode, size, 0, 0) { reply.error(error_code); return; @@ -840,12 +840,12 @@ impl Filesystem for SimpleFS { let mut entries = BTreeMap::new(); entries.insert(b".".to_vec(), (inode, FileKind::Directory)); entries.insert(b"..".to_vec(), (parent, FileKind::Directory)); - self.write_directory_content(inode, entries); + self.write_directory_content(inode, &entries); } let mut entries = self.get_directory_content(parent).unwrap(); entries.insert(name.as_bytes().to_vec(), (inode, attrs.kind)); - self.write_directory_content(parent, entries); + self.write_directory_content(parent, &entries); // TODO: implement flags reply.entry(&Duration::new(0, 0), &attrs.into(), 0); @@ -900,7 +900,7 @@ impl Filesystem for SimpleFS { let attrs = InodeAttributes { inode, open_file_handles: 0, - size: BLOCK_SIZE, + size: u64::from(BLOCK_SIZE), last_accessed: time_now(), last_modified: time_now(), last_metadata_changed: time_now(), @@ -916,11 +916,11 @@ impl Filesystem for SimpleFS { let mut entries = BTreeMap::new(); entries.insert(b".".to_vec(), (inode, FileKind::Directory)); entries.insert(b"..".to_vec(), (parent, FileKind::Directory)); - self.write_directory_content(inode, entries); + self.write_directory_content(inode, &entries); let mut entries = self.get_directory_content(parent).unwrap(); entries.insert(name.as_bytes().to_vec(), (inode, FileKind::Directory)); - self.write_directory_content(parent, entries); + self.write_directory_content(parent, &entries); reply.entry(&Duration::new(0, 0), &attrs.into(), 0); } @@ -977,7 +977,7 @@ impl Filesystem for SimpleFS { let mut entries = self.get_directory_content(parent).unwrap(); entries.remove(name.as_bytes()); - self.write_directory_content(parent, entries); + self.write_directory_content(parent, &entries); reply.ok(); } @@ -1038,7 +1038,7 @@ impl Filesystem for SimpleFS { let mut entries = self.get_directory_content(parent).unwrap(); entries.remove(name.as_bytes()); - self.write_directory_content(parent, entries); + self.write_directory_content(parent, &entries); reply.ok(); } @@ -1210,14 +1210,14 @@ impl Filesystem for SimpleFS { new_name.as_bytes().to_vec(), (inode_attrs.inode, inode_attrs.kind), ); - self.write_directory_content(new_parent, entries); + self.write_directory_content(new_parent, &entries); let mut entries = self.get_directory_content(parent).unwrap(); entries.insert( name.as_bytes().to_vec(), (new_inode_attrs.inode, new_inode_attrs.kind), ); - self.write_directory_content(parent, entries); + self.write_directory_content(parent, &entries); parent_attrs.last_metadata_changed = time_now(); parent_attrs.last_modified = time_now(); @@ -1233,12 +1233,12 @@ impl Filesystem for SimpleFS { if inode_attrs.kind == FileKind::Directory { let mut entries = self.get_directory_content(inode_attrs.inode).unwrap(); entries.insert(b"..".to_vec(), (new_parent, FileKind::Directory)); - self.write_directory_content(inode_attrs.inode, entries); + self.write_directory_content(inode_attrs.inode, &entries); } if new_inode_attrs.kind == FileKind::Directory { let mut entries = self.get_directory_content(new_inode_attrs.inode).unwrap(); entries.insert(b"..".to_vec(), (parent, FileKind::Directory)); - self.write_directory_content(new_inode_attrs.inode, entries); + self.write_directory_content(new_inode_attrs.inode, &entries); } reply.ok(); @@ -1280,7 +1280,7 @@ impl Filesystem for SimpleFS { if let Ok(mut existing_inode_attrs) = self.lookup_name(new_parent, new_name) { let mut entries = self.get_directory_content(new_parent).unwrap(); entries.remove(new_name.as_bytes()); - self.write_directory_content(new_parent, entries); + self.write_directory_content(new_parent, &entries); if existing_inode_attrs.kind == FileKind::Directory { existing_inode_attrs.hardlinks = 0; @@ -1294,14 +1294,14 @@ impl Filesystem for SimpleFS { let mut entries = self.get_directory_content(parent).unwrap(); entries.remove(name.as_bytes()); - self.write_directory_content(parent, entries); + self.write_directory_content(parent, &entries); let mut entries = self.get_directory_content(new_parent).unwrap(); entries.insert( new_name.as_bytes().to_vec(), (inode_attrs.inode, inode_attrs.kind), ); - self.write_directory_content(new_parent, entries); + self.write_directory_content(new_parent, &entries); parent_attrs.last_metadata_changed = time_now(); parent_attrs.last_modified = time_now(); @@ -1315,7 +1315,7 @@ impl Filesystem for SimpleFS { if inode_attrs.kind == FileKind::Directory { let mut entries = self.get_directory_content(inode_attrs.inode).unwrap(); entries.insert(b"..".to_vec(), (new_parent, FileKind::Directory)); - self.write_directory_content(inode_attrs.inode, entries); + self.write_directory_content(inode_attrs.inode, &entries); } reply.ok(); @@ -1408,7 +1408,7 @@ impl Filesystem for SimpleFS { ) { debug!("read() called on {inode:?} offset={offset:?} size={size:?}"); assert!(offset >= 0); - if !self.check_file_handle_read(fh) { + if !Self::check_file_handle_read(fh) { reply.error(libc::EACCES); return; } @@ -1444,7 +1444,7 @@ impl Filesystem for SimpleFS { ) { debug!("write() called with {:?} size={:?}", inode, data.len()); assert!(offset >= 0); - if !self.check_file_handle_write(fh) { + if !Self::check_file_handle_write(fh) { reply.error(libc::EACCES); return; } @@ -1596,9 +1596,9 @@ impl Filesystem for SimpleFS { 10_000, 1, 10_000, - BLOCK_SIZE as u32, + BLOCK_SIZE, MAX_NAME_LENGTH, - BLOCK_SIZE as u32, + BLOCK_SIZE, ); } @@ -1805,12 +1805,12 @@ impl Filesystem for SimpleFS { let mut entries = BTreeMap::new(); entries.insert(b".".to_vec(), (inode, FileKind::Directory)); entries.insert(b"..".to_vec(), (parent, FileKind::Directory)); - self.write_directory_content(inode, entries); + self.write_directory_content(inode, &entries); } let mut entries = self.get_directory_content(parent).unwrap(); entries.insert(name.as_bytes().to_vec(), (inode, attrs.kind)); - self.write_directory_content(parent, entries); + self.write_directory_content(parent, &entries); // TODO: implement flags reply.created( @@ -1872,11 +1872,11 @@ impl Filesystem for SimpleFS { debug!( "copy_file_range() called with src=({src_fh}, {src_inode}, {src_offset}) dest=({dest_fh}, {dest_inode}, {dest_offset}) size={size}" ); - if !self.check_file_handle_read(src_fh) { + if !Self::check_file_handle_read(src_fh) { reply.error(libc::EACCES); return; } - if !self.check_file_handle_write(dest_fh) { + if !Self::check_file_handle_write(dest_fh) { reply.error(libc::EACCES); return; } diff --git a/src/ll/mod.rs b/src/ll/mod.rs index 6545288b..624b01c2 100644 --- a/src/ll/mod.rs +++ b/src/ll/mod.rs @@ -4,7 +4,7 @@ mod argument; pub mod fuse_abi; pub(crate) mod notify; pub(crate) mod reply; -mod request; +pub(crate) mod request; use std::{convert::TryInto, num::NonZeroI32, time::SystemTime}; diff --git a/src/ll/reply.rs b/src/ll/reply.rs index c8e95f83..204fa34f 100644 --- a/src/ll/reply.rs +++ b/src/ll/reply.rs @@ -247,7 +247,7 @@ impl<'a> Response<'a> { Self::from_struct(&r) } - fn new_directory(list: EntListBuf) -> Self { + pub(crate) fn new_directory(list: EntListBuf) -> Self { assert!(list.buf.len() <= list.max_size); Self::Data(list.buf) } @@ -262,7 +262,7 @@ impl<'a> Response<'a> { Self::from_struct(&r) } - fn from_struct(data: &T) -> Self { + pub(crate) fn from_struct(data: &T) -> Self { Self::Data(SmallVec::from_slice(data.as_bytes())) } } @@ -349,12 +349,13 @@ impl From for Attr { } #[derive(Debug)] -struct EntListBuf { +/// A generic data buffer +pub(crate) struct EntListBuf { max_size: usize, buf: ResponseBuf, } impl EntListBuf { - fn new(max_size: usize) -> Self { + pub(crate) fn new(max_size: usize) -> Self { Self { max_size, buf: ResponseBuf::new(), @@ -365,7 +366,7 @@ impl EntListBuf { /// A transparent offset value can be provided for each entry. The kernel uses these /// value to request the next entries in further readdir calls #[must_use] - fn push(&mut self, ent: [&[u8]; 2]) -> bool { + pub(crate) fn push(&mut self, ent: [&[u8]; 2]) -> bool { let entlen = ent[0].len() + ent[1].len(); let entsize = (entlen + size_of::() - 1) & !(size_of::() - 1); // 64bit align if self.buf.len() + entsize > self.max_size { diff --git a/src/passthrough.rs b/src/passthrough.rs index 6376d5ff..24b283c0 100644 --- a/src/passthrough.rs +++ b/src/passthrough.rs @@ -45,7 +45,7 @@ nix::ioctl_write_ptr!( /// make that call (if the channel hasn't already been closed). #[derive(Debug)] pub struct BackingId { - channel: Weak, + pub(crate) channel: Weak, /// The `backing_id` field passed to and from the kernel pub(crate) backing_id: u32, } diff --git a/tests/test_passthrough.sh b/tests/test_passthrough.sh index 0224af33..111be92b 100755 --- a/tests/test_passthrough.sh +++ b/tests/test_passthrough.sh @@ -34,7 +34,7 @@ for x in $(seq 10); do sleep 1 done -expected="$(sha256sum - < /usr/lib/os-release)" +expected="$(sha256sum - < /etc/profile)" # Check that it's equal to the underlying file test "$(sha256sum - < "${mnt}/passthrough")" = "${expected}"