Skip to content

Commit

Permalink
Fix mountpoint issues on macOS (#9351)
Browse files Browse the repository at this point in the history
* [rust] update `fuser` to `0.15.1`

Fix #9173

* Make `setattr` always return file attr even if no attr where changed

Fix #8976, fix #8991

Co-authored-by: Emmanuel Leblond <[email protected]>

* [rust] Update `ruzstd` to `0.7.3`

* Ignore `RUSTSEC-2024-0398`

Related to #8990

---------

Co-authored-by: Emmanuel Leblond <[email protected]>
  • Loading branch information
FirelightFlagboy and touilleMan committed Jan 21, 2025
1 parent 56bf932 commit 9f3a2dd
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 15 deletions.
69 changes: 54 additions & 15 deletions libparsec/crates/platform_mountpoint/src/unix/filesystem.rs
Original file line number Diff line number Diff line change
Expand Up @@ -444,20 +444,11 @@ impl fuser::Filesystem for Filesystem {
.get_path_or_panic(ino);
let ops = self.ops.clone();
self.tokio_handle.spawn(async move {
match ops.stat_entry(&path).await {
Ok(stat) => reply
.manual()
.attr(&TTL, &entry_stat_to_file_attr(stat, ino, uid, gid)),
Err(err) => match err {
WorkspaceStatEntryError::EntryNotFound => reply.manual().error(libc::ENOENT),
WorkspaceStatEntryError::Offline => reply.manual().error(libc::EHOSTUNREACH),
WorkspaceStatEntryError::NoRealmAccess => reply.manual().error(libc::EPERM),
WorkspaceStatEntryError::Stopped
| WorkspaceStatEntryError::InvalidKeysBundle(_)
| WorkspaceStatEntryError::InvalidCertificate(_)
| WorkspaceStatEntryError::InvalidManifest(_)
| WorkspaceStatEntryError::Internal(_) => reply.manual().error(libc::EIO),
},
let res = getattr_from_path(&ops, path, ino, uid, gid).await;

match res {
Ok(stat) => reply.manual().attr(&TTL, &stat),
Err(errno) => reply.manual().error(errno),
}
});
}
Expand Down Expand Up @@ -1033,6 +1024,7 @@ impl fuser::Filesystem for Filesystem {

return;
} else {
// FIXME: Currently I'm only returning the file attributes without truncating the file
// Truncate file by path

let path = {
Expand Down Expand Up @@ -1121,7 +1113,26 @@ impl fuser::Filesystem for Filesystem {

// TODO: support atime/utime change ?

reply.manual().error(libc::ENOSYS);
// Nothing to set, just return the file attr
// Seems benign but it's important for `setattr` to return the file attributes even if
// nothing changed.
// Previously we where returning an error and that caused the issues #8976 and #8991

let path = {
let inodes_guard = self.inodes.lock().expect("Mutex is poisoned");
inodes_guard.get_path_or_panic(ino)
};

let ops = self.ops.clone();

self.tokio_handle.spawn(async move {
let res = getattr_from_path(&ops, path, ino, uid, gid).await;

match res {
Ok(attr) => reply.manual().attr(&TTL, &attr),
Err(errno) => reply.manual().error(errno),
}
});
}

fn read(
Expand Down Expand Up @@ -1636,3 +1647,31 @@ impl fuser::Filesystem for Filesystem {
// TODO: Fuser exposes a `copy_file_range` method for FUSE >= 7.28. This
// would speed up file copy a lot by reusing the same blocks !
}

async fn getattr_from_path(
ops: &WorkspaceOps,
path: FsPath,
ino: u64,
uid: u32,
gid: u32,
) -> Result<fuser::FileAttr, i32> {
match ops
.stat_entry(&path)
.await
.map(|stat| entry_stat_to_file_attr(stat, ino, uid, gid))
.inspect(|stat| log::trace!("File stat for {ino}: {stat:?}"))
.inspect_err(|e| log::trace!("File stat for {ino} result in error: {e:?}"))
{
Ok(stat) => Ok(stat),
Err(err) => match err {
WorkspaceStatEntryError::EntryNotFound => Err(libc::ENOENT),
WorkspaceStatEntryError::Offline => Err(libc::EHOSTUNREACH),
WorkspaceStatEntryError::NoRealmAccess => Err(libc::EPERM),
WorkspaceStatEntryError::Stopped
| WorkspaceStatEntryError::InvalidKeysBundle(_)
| WorkspaceStatEntryError::InvalidCertificate(_)
| WorkspaceStatEntryError::InvalidManifest(_)
| WorkspaceStatEntryError::Internal(_) => Err(libc::EIO),
},
}
}
1 change: 1 addition & 0 deletions newsfragments/8976.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix an issue when creating a new file from the mountpoint on macOS
1 change: 1 addition & 0 deletions newsfragments/8991.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix an issue when modifying a file using TextEdit on macOS
1 change: 1 addition & 0 deletions newsfragments/9173.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix a panic when copying a file using the mountpoint on macOS

0 comments on commit 9f3a2dd

Please sign in to comment.