|
@@ -893,9 +893,9 @@ mod private {
|
|
|
flags: u32,
|
|
|
// This is the second field of the `fuse_open_in` struct, which is currently unused
|
|
|
// by the kernel. (https://man7.org/linux/man-pages/man4/fuse.4.html)
|
|
|
- _fuse_flags: u32,
|
|
|
+ fuse_flags: u32,
|
|
|
) -> io::Result<(Option<Self::Handle>, OpenOptions)> {
|
|
|
- debug!("Blocktree::open called on inode {inode}");
|
|
|
+ debug!("Blocktree::open, inode {inode}, flags {flags}, fuse_flags {fuse_flags}");
|
|
|
let flags: i32 = flags.try_into().box_err()?;
|
|
|
if flags & libc::O_APPEND != 0 {
|
|
|
return Self::unsupported_flag("O_APPEND");
|
|
@@ -930,7 +930,7 @@ mod private {
|
|
|
_flock_release: bool,
|
|
|
_lock_owner: Option<u64>,
|
|
|
) -> io::Result<()> {
|
|
|
- debug!("Blocktree::release called on inode {inode}");
|
|
|
+ debug!("Blocktree::release, inode {inode}, handle {handle}, flush {flush}");
|
|
|
self.access_value_mut(inode, |value| {
|
|
|
if flush {
|
|
|
value.access_block_mut(handle, |block| block.flush().bterr())?;
|
|
@@ -947,13 +947,14 @@ mod private {
|
|
|
inode: Self::Inode,
|
|
|
_flags: u32,
|
|
|
) -> io::Result<(Option<Self::Handle>, OpenOptions)> {
|
|
|
- debug!("Blocktree::opendir called on inode {inode}");
|
|
|
+ debug!("Blocktree::opendir, inode {inode}");
|
|
|
let handle = self.access_value_mut(inode, |value| {
|
|
|
self.authorizer.exec_allowed(ctx, value.block().meta())?;
|
|
|
let handle = value.new_handle()?;
|
|
|
value.convert_to_dir(handle)?;
|
|
|
Ok(handle)
|
|
|
})?;
|
|
|
+ debug!("Blockree::opendir, returning handle {handle}");
|
|
|
Ok((Some(handle), OpenOptions::empty()))
|
|
|
}
|
|
|
|
|
@@ -964,7 +965,7 @@ mod private {
|
|
|
_flags: u32,
|
|
|
handle: Self::Handle,
|
|
|
) -> io::Result<()> {
|
|
|
- debug!("Blocktree::releasedir called for inode {inode}");
|
|
|
+ debug!("Blocktree::releasedir, inode {inode}, handle {handle}");
|
|
|
self.access_value_mut(inode, |value| {
|
|
|
value.forget_handle(handle);
|
|
|
Ok(())
|
|
@@ -979,12 +980,16 @@ mod private {
|
|
|
name: &CStr,
|
|
|
args: CreateIn,
|
|
|
) -> std::io::Result<(Entry, Option<Self::Handle>, OpenOptions)> {
|
|
|
- debug!("Blocktree::create called on parent {parent}");
|
|
|
-
|
|
|
- let name = name
|
|
|
- .to_str()
|
|
|
- .map_err(|err| io::Error::new(io::ErrorKind::InvalidInput, err))?
|
|
|
- .to_owned();
|
|
|
+ let name = match name.to_str() {
|
|
|
+ Ok(name) => {
|
|
|
+ debug!("Blocktree::create, parent {parent}, name '{name}'");
|
|
|
+ name.to_owned()
|
|
|
+ }
|
|
|
+ Err(err) => {
|
|
|
+ debug!("Blocktree::create, parent {parent}");
|
|
|
+ return Err(io::Error::new(io::ErrorKind::InvalidInput, err));
|
|
|
+ }
|
|
|
+ };
|
|
|
|
|
|
// Reserve a free inode.
|
|
|
let inode = self.next_inode()?;
|
|
@@ -1040,7 +1045,7 @@ mod private {
|
|
|
flags: u32,
|
|
|
_fuse_flags: u32,
|
|
|
) -> io::Result<usize> {
|
|
|
- debug!("Blocktree::write called called on inode {inode}");
|
|
|
+ debug!("Blocktree::write, inode {inode}, handle {handle}, offset {offset}, size {size}, flags {flags}");
|
|
|
if flags as libc::c_int == libc::O_RDONLY {
|
|
|
return Err(io::Error::new(
|
|
|
io::ErrorKind::PermissionDenied,
|
|
@@ -1065,7 +1070,7 @@ mod private {
|
|
|
handle: Self::Handle,
|
|
|
_lock_owner: u64,
|
|
|
) -> io::Result<()> {
|
|
|
- debug!("Blocktree::flush called for inode {inode}");
|
|
|
+ debug!("Blocktree::flush, inode {inode}, handle {handle}");
|
|
|
self.access_block_mut(inode, handle, |block| block.flush().bterr())
|
|
|
.io_err()
|
|
|
}
|
|
@@ -1081,7 +1086,7 @@ mod private {
|
|
|
_lock_owner: Option<u64>,
|
|
|
flags: u32,
|
|
|
) -> io::Result<usize> {
|
|
|
- debug!("Blocktree::read, inode {inode}, handle {handle}, offset {offset}, size {size}");
|
|
|
+ debug!("Blocktree::read, inode {inode}, handle {handle}, offset {offset}, size {size}, flags {flags}");
|
|
|
if (flags as libc::c_int & libc::O_WRONLY) != 0 {
|
|
|
return Err(io::Error::new(
|
|
|
io::ErrorKind::PermissionDenied,
|
|
@@ -1134,7 +1139,9 @@ mod private {
|
|
|
fuse_backend_rs::api::filesystem::DirEntry,
|
|
|
) -> io::Result<usize>,
|
|
|
) -> io::Result<()> {
|
|
|
- debug!("Blocktree::readdir called on inode {inode}");
|
|
|
+ debug!(
|
|
|
+ "Blocktree::readdir, inode {inode}, handle {handle}, size {size}, offset {offset}"
|
|
|
+ );
|
|
|
let mut size: usize = size.try_into().box_err()?;
|
|
|
self.access_value(inode, |value| {
|
|
|
let dir = value
|
|
@@ -1173,7 +1180,7 @@ mod private {
|
|
|
inode: Self::Inode,
|
|
|
handle: Option<Self::Handle>,
|
|
|
) -> io::Result<(stat64, Duration)> {
|
|
|
- debug!("Blocktree::getattr called for inode {inode}");
|
|
|
+ debug!("Blocktree::getattr, inode {inode}, handle {:?}", handle);
|
|
|
let stat = if let Some(handle) = handle {
|
|
|
self.access_block(inode, handle, |block| block.meta_body().secrets()?.stat())?
|
|
|
} else {
|
|
@@ -1183,7 +1190,7 @@ mod private {
|
|
|
}
|
|
|
|
|
|
fn forget(&self, _ctx: &Context, inode: Self::Inode, count: u64) {
|
|
|
- debug!("Blocktree::forget called for inode {inode}");
|
|
|
+ debug!("Blocktree::forget, inode {inode}, count {count}");
|
|
|
let mut inodes = match self.inodes.write() {
|
|
|
Ok(inodes) => inodes,
|
|
|
Err(err) => {
|
|
@@ -1223,15 +1230,23 @@ mod private {
|
|
|
offset: u64,
|
|
|
whence: u32,
|
|
|
) -> io::Result<u64> {
|
|
|
- debug!("Blocktree::lseek called for inode {inode}");
|
|
|
+ debug!("Blocktree::lseek, inode {inode}, handle {handle}, offset {offset}, whence {whence}");
|
|
|
let seek_from = SeekFrom::whence_offset(whence, offset)?;
|
|
|
self.access_block_mut(inode, handle, |block| block.seek(seek_from).bterr())
|
|
|
.io_err()
|
|
|
}
|
|
|
|
|
|
fn unlink(&self, ctx: &Context, parent: Self::Inode, name: &CStr) -> io::Result<()> {
|
|
|
- debug!("Blocktree::unlink called on parent {parent}");
|
|
|
- let name = name.to_str().box_err()?;
|
|
|
+ let name = match name.to_str().box_err() {
|
|
|
+ Ok(name) => {
|
|
|
+ debug!("Blocktree::unlink, parent {parent}, name '{name}'");
|
|
|
+ name
|
|
|
+ }
|
|
|
+ Err(err) => {
|
|
|
+ debug!("Blocktree::unlink, parent {parent}");
|
|
|
+ return Err(err);
|
|
|
+ }
|
|
|
+ };
|
|
|
let (block_path, inode) = self.borrow_block_mut(parent, |block| {
|
|
|
self.authorizer.write_allowed(ctx, block.meta())?;
|
|
|
|
|
@@ -1273,8 +1288,18 @@ mod private {
|
|
|
newparent: Self::Inode,
|
|
|
newname: &CStr,
|
|
|
) -> io::Result<Entry> {
|
|
|
- debug!("Blocktree::link called for inode {inode}");
|
|
|
- let newname = newname.to_str().box_err()?;
|
|
|
+ let newname = match newname.to_str().box_err() {
|
|
|
+ Ok(newname) => {
|
|
|
+ debug!(
|
|
|
+ "Blocktree::link, inode {inode}, newparent {newparent}, newname {newname}"
|
|
|
+ );
|
|
|
+ newname
|
|
|
+ }
|
|
|
+ Err(err) => {
|
|
|
+ debug!("Blocktree::link, inode {inode}, newparent {newparent}");
|
|
|
+ return Err(err);
|
|
|
+ }
|
|
|
+ };
|
|
|
self.borrow_block_mut(newparent, |block| {
|
|
|
self.authorizer.write_allowed(ctx, block.meta())?;
|
|
|
|
|
@@ -1314,7 +1339,7 @@ mod private {
|
|
|
handle: Option<Self::Handle>,
|
|
|
valid: SetattrValid,
|
|
|
) -> io::Result<(stat64, Duration)> {
|
|
|
- debug!("Blocktree::setattr called for inode {inode}");
|
|
|
+ debug!("Blocktree::setattr, inode {inode}, handle {:?}", handle);
|
|
|
let cb = |block: &mut FileBlock<C>| {
|
|
|
self.authorizer.write_allowed(ctx, block.meta())?;
|
|
|
|
|
@@ -1376,8 +1401,17 @@ mod private {
|
|
|
mode: u32,
|
|
|
umask: u32,
|
|
|
) -> io::Result<Entry> {
|
|
|
- debug!("Blocktree::mkdir called");
|
|
|
- let name = name.to_str().box_err()?.to_owned();
|
|
|
+ debug!("Blocktree::mkdir, parent {parent}");
|
|
|
+ let name = match name.to_str().box_err() {
|
|
|
+ Ok(name) => {
|
|
|
+ debug!("Blocktree::mkdir, parent {parent}, mode {mode}, umask {umask}, name '{name}'");
|
|
|
+ name.to_owned()
|
|
|
+ }
|
|
|
+ Err(err) => {
|
|
|
+ debug!("Blocktree::mkdir, parent {parent}, mode {mode}, umask {umask}");
|
|
|
+ return Err(err);
|
|
|
+ }
|
|
|
+ };
|
|
|
let (inode, mut block_path) = self.borrow_block_mut(parent, |block| {
|
|
|
self.authorizer.write_allowed(ctx, block.meta())?;
|
|
|
|
|
@@ -1414,8 +1448,16 @@ mod private {
|
|
|
}
|
|
|
|
|
|
fn rmdir(&self, ctx: &Context, parent: Self::Inode, name: &CStr) -> io::Result<()> {
|
|
|
- debug!("Blocktree::rmdir called on parent {parent}");
|
|
|
- let name = name.to_str().box_err()?.to_owned();
|
|
|
+ let name = match name.to_str().box_err() {
|
|
|
+ Ok(name) => {
|
|
|
+ debug!("Blocktree::rmdir, parent {parent}, name '{name}'");
|
|
|
+ name.to_owned()
|
|
|
+ }
|
|
|
+ Err(err) => {
|
|
|
+ debug!("Blocktree::rmdir, parent {parent}");
|
|
|
+ return Err(err);
|
|
|
+ }
|
|
|
+ };
|
|
|
self.borrow_block_mut(parent, |block| {
|
|
|
self.authorizer.write_allowed(ctx, block.meta())?;
|
|
|
|