Dec-03-2019
Jan-25-2019
sfgather
command is now compatible with Apple’s Unified Logging API introduced in macOS Sierra.Add support for reusing a vnode after renaming the corresponding file system object by updating the original vnode’s parent and name after the rename is completed successfully. For details see #466, #553, and osxfuse/kext#11.
Work around a bug in ls
when the volicon module is used. ls
prints garbage data in case the extended attribute com.apple.FinderInfo
is associated with the volume’s root directory.
Update build scripts to support newer versions of git
.
Added experimental support for macOS 10.14 Mojave.
Added support for Xcode 10.
Perform user space directory loop check. This fixes a hang when renaming directory loops. For details see osxfuse/osxfuse#495.
Workaround for NULL
context in getattr
vnode operation. Third party kernel extensions might call getattr
with a NULL
context. As a workaround the kernel extension falls back to the current thread’s context. For details see osxfuse/osxfuse#510.
Fix bug when closing an already removed file. Open file handles need to be closed even if the corresponding vnode has already been revoked, otherwise the user space file system daemon will leak files. For details see osxfuse/osxfuse#488.
Minor code cleanup of kernel extension.
Add support for DEBUG
and DEVELOPMENT
kernels. Previous versions of the FUSE kernel extension did only support RELEASE
kernels.
Add support for O_APPEND
flag of open(2)
when running in direct_io
mode.
Add high-level support for invalidating files. To invalidate caches for a specific path and posting a file system event notifying subscribed processes, e.g. Finder, of remote file changes, call one of the following functions:
fuse_invalidate_path()
for high-level FUSE file systems-[GMUserFileSystem invalidateItemAtPath:error:]
for Objective-C or Swift file systemsFix file handle bug in exchangedata(2)
. Relying on vnode_update_identity()
resulted in open file handles pointing to the wrong file after calling exchangedata(2)
.
Fix vnode reclaim in progress
kernel panic.
Do not post unnecessary file system events because they might trigger file system operations. Especially expensive readdir(3)
calls should be avoided.
readdir(3)
loop when using the high level volicon module. Addresses osxfuse/osxfuse#434.Purge vnode from namecache when a FUSE_NOTIFY_DELETE
notification is received by the kernel extension and the file has been deleted and re-created in the meantime.
Apr-17-2018
Fix a bug in the high-level C API that resulted in the file system size being reported as 0 bytes when using file system modules. For details see osxfuse/osxfuse#414.
Add support for file systems with more than UINT32_MAX
blocks
By default struct statvfs is used to query file system statistics. Block counts are stored in struct statvfs
as 32 bit integer values. Starting with this release struct statfs
, which supports 64 bit block counts, can be used instead. For details see osxfuse/osxfuse#396.
For file systems using the low-level API use fuse_reply_statfs_x()
instead of fuse_reply_statfs()
to finish statfs()
callbacks.
For file systems using the high-level API implement the statfs_x()
callback instead of statfs()
.
For file systems using the Objective-C framework no change is required.
Add support for posting file system events on OS X 10.11 and later
Shared file systems need to notify the kernel about external changes. Starting with this release file system events will be posted, so that subscribed user-space applications, like Finder, can reflect remote changes instantly.
FUSE_NOTIFY_INVAL_INODE
, FUSE_NOTIFY_INVAL_ENTRY
, or FUSE_NOTIFY_DELETE
Add support for FUSE_NOTIFY_DELETE
notifications
File systems using the low-level API can call fuse_lowlevel_notify_delete()
to inform the kernel that a file or directory has been deleted remotely. The kernel will then invalidate the parent’s attributes and delete the corresponding directory entry. See fuse/fuse_lowlevel.h
for details.
Fix kernel panic when processing FUSE_NOTIFY_INVAL_INODE
notifications
Acquiring a look on a kernel thread and then unlocking it on a different thread can cause a kernel panic on macOS 10.13 when running a debug or development kernel.
Minor code cleanup of kernel extension
Add support for macOS 10.13 beta 3. The newest beta returns a different error code in case the kernel extension cannot be loaded because the user has not allowed it yet.
Fix a bug that prevented not-yet-alive volumes from being unmounted by calling fuse_unmount()
. For details see osxfuse/osxfuse#332.
Fix FUSE device leak when serving multiple volumes from a single process by making sure FUSE device handles are being closed in case a volume is unmounted externally. For details see osxfuse/osxfuse#385.
Restore EUID
after creating mount point. This fixes a race condition when two or more users on the same Mac are each mounting a FUSE volume within a few seconds (fast user switching).
Add experimental support for macOS 10.13. This fixes osxfuse/osxfuse#380.
On macOS 10.13 users need to explicitly consent before new kernel extensions can be loaded. The system alert explaining the process is only displayed once and lacks a button to open System Preferences.
Therefore FUSE will display its own alert containing a button to go to the Security & Privacy System Preferences pane and will post a kSANFUSENotLoadable
notification letting the file system daemon know that the kernel extension could not be loaded.
Add experimental support for Xcode 9.0
Fix an issue that can cause network file systems to be unmounted in case a file is removed and then re-created remotely.
If a file disappears behind our back
the corresponding vnode is soft-revoked. If a new file appears with the same inode number we need to make sure not to reuse the revoked vnode. For details see osxfuse/kext#7.
Fix return value of _PC_CASE_SENSITIVE
pathconf(2)
selector. Previous releases returned true even if the file system is case insensitive.
Add support for _PC_FILESIZEBITS
pathconf(2)
selector and NSURL’s NSURLVolumeMaximumFileSizeKey
resource key. For more information see osxfuse/osxfuse#369.
Improve compatibility with Core Services. Do not block calls from coreservicesd
(which is running as root) even if allow_root
and allow_other
are not set. For more information see osxfuse/osxfuse#369.
Fix race condition when using auto_xattr
causing setxattr(2)
to fail
The kernel’s fallback mechanism for managing extended attributes is not thread-safe. To address the issue FUSE will no longer set the O_EXCL
flag when creating Apple Double files. See osxfuse/osxfuse#354 for details.
Fix unresponsive 32 bit file systems on 64 bit Macs
FUSE uses a socket pair to pass the FUSE device file descriptor to the file system process. Control messages created using the CMSG macros in the Mac OS X 10.5 SDK are not properly aligned. This resulted in 32 bit file systems being unresponsive on 64 bit Macs.
Add support for nanosecond time resolution. Creation, modification, … times of files can now be specified with nanosecond time resolution. This addresses osxfuse/osxfuse#346.
Improve compatibility with Finder
Do not block open(2)
calls from syspolicyd
(which is running as root) even if allow_root
and allow_other
are not set.
Improve compatibility with Finder
Do not block listxattr(2) calls by root even if allow_root
and allow_other
are not set. For details see fuse_vnop_getxattr()
.
Add support for building release
target on macOS 10.12. This is the first release that has been built on macOS 10.12.
Add support for loading the FUSE kernel extension manually before mounting a volume. This can be useful if you need to alter one of the FUSE sysctls before actually mounting your file system. Run the following command to load the kernel extensions manually:
/path/to/sanfuse.fs/Contents/Resources/mount_sanfusefs.app/Contents/MacOS/Mounter --load
sfgather
command is not 100% compatible with Apple’s new Unified Logging API introduced in macOS Sierra 10.12.
Workaround: If you experience an issue while running SAN Fusion on macOS Sierra, a technician may instruct you to manually collect support information as opposed to running the sfgather
command or using the Collect Support Information option in the Help menu.Jan-11-2017
Fix bug in FUSE kernel extension that can trigger a kernel panic
Release biglock in fuse_vnop_write() before calling uiomove(). Not doing so can trigger a kernel panic when using the direct_io mount-time option. For details see osxfuse/osxfuse#330.
Fix rare file system deadlock when mounting a FUSE volume
In rare cases mount(2) performs file system operations. Calling mount_osxfuse synchronously from libosxfuse could result file system deadlocks.
Fall back to the setattr_x() callback if the file system does not implement the fsetattr_x() callback.
Fix volume icon support on macOS 10.12
Fixes an incompatibility on macOS 10.12, resulting in the volume icon not being displayed in Finder, when using mount-time options volicon, local, and extended_security at the same time.
Fix error when building the kernel extension loader with legacy SDKs
Starting with the Mac OS X 10.6 SDK libkern/OSKextLib.h tries to include System/libkern/OSReturn.h, which does not exist in the SDK. Apple fixed the issue in the OS X 10.11 SDK.
Fix generation of BridgeSupport files for Objective-C FUSE framework on Mac OS X 10.6. Addresses osxfuse/osxfuse#321.
Fix error when building FUSE mounter on Mac OS X 10.6. Addresses osxfuse/osxfuse#318.
Fix an interrupt handling issue on macOS 10.12 that can trigger file system hangs. See https://github.com/osxfuse/osxfuse/issues/314 for more details.
Fix mount option handling in the FUSE mount helper. Due to this bug some mount options have not been passed to the FUSE kernel extension in version 3.5.1.
Improve macOS 10.12 support by creating nonexistent mount points
In macOS 10.12 the permissions of the root-owned /Volumes directory have changed from 1777 (rwxrwxrwt) to 1755 (rwxr-xr-t). As a result admin privileges are required to create mount points in /Volumes.
In order to allow non-admin users to mount FUSE volumes in /Volumes FUSE will create non-existent mount points automatically.
Deprecate non-portable libfuse functions
File system binaries using these functions, will continue to work with FUSE for macOS 3.x. However, support will be dropped in the next major release. The following functions have been deprecated:
Revise mount status detection in Objective-C FUSE framework to remove dependency on the deprecated function fuse_device_fd_np()
Pass open flags to Objective-C FUSE framework based file systems
The GMUserFileSystemOperations delegate method createFileAtPath:attributes:userData:error: has been deprecated in favor of the new method createFileAtPath:attributes:flags:userData:error:, that allows passing open flags to the file system delegate. See open(2) for details.
File systems implementing the old delegate method, will continue to work with FUSE for macOS 3.x. However, support will be dropped in the next major release.
Add support for querying file system operation context information for Objective-C FUSE framework based file systems
The context of the current file system operation is only valid during a file system delegate callback. The NSDictionary returned by +[GMUserFileSystem currentContext] contains the following keys:
Update libfuse from version 2.9.6 to 2.9.7
Fix ..
path handling for delete lookups
Make sure to call fuse_vget_i() only after performing a FUSE_LOOKUP request. Calling it after a FUSE_GETATTR request will lead to a kernel panic.
Resolves osxfuse/osxfuse#298
Lock parent directory when removing entry
When removing a directory entry HFS and NFS lock the vnode that is to be removed and its parent directory vnode. However, Apple’s fallback implementation for non-thread-safe 32 bit file systems only locks the directory entry vnode.
The osxfuse locking mechanism is inspired by Apple’s fallback implementation. While it is not strictly required to lock the parent directory vnode as well, it seems to be good practice to do so.
Addresses osxfuse/osxfuse#299
Remove obsolete task working set cache handling
When mounting a volume with the noubc
option the kernel extension used to set the noexec
flag for the mount in order to also disable the task working set page cache on disk. However, since the task working set mechanism has been removed in Mac OS X 10.5 the noexec
flag is no longer needed.
Ignore vnode name cache hits when creating a file
See osxfuse/kext#4 for details.
Always set O_EXCL
for FUSE_CREATE
requests
The macOS kernel expects all create calls to return EEXIST
in case the file already exists, regardless of whether O_EXCL
was specified or not.
Resolves osxfuse/osxfuse#209
Add mount-time option excl_create
If the mount-time option excl_create
is specified, the O_EXCL
flag will only be set for truly
exclusive creates, i.e. create calls for which the initiator explicitly set the O_EXCL
flag. This allows distributed file systems to determine whether or not to acquire a potentially costly lock to prevent remote create races. Nonetheless, the file system still needs to make sure that there are no local create races.
Fix mount-time option parsing
Fixes the following error when using the daemon_timeout
mount-time option in combination with a volume name containing the word “union“.
mount_osxfuse: invalid value for argument daemon_timeout
Don’t kill the file system on short reads
A FUSE user space server receives file system requests from the FUSE device by allocating some memory and calling read(2)
. Obviously, the request must fit into that buffer. If it doesn’t, we used to kill the file system.
Linux FUSE handles short reads differently. Instead of killing the file system it returns EIO
or E2BIG
(in case of FUSE_SETXATTR
requests). This change aims to replicate the Linux behavior on macOS.
Addresses osxfuse/osxfuse#293
Remove callbacks for interrupted tickets
Make sure to remove a ticket’s callback when marking it as answered. Otherwise the ticket will be retained by the callback queue until the volume is unmounted.
Minor optimizations and code cleanup
sfgather
command is not 100% compatible with Apple’s new Unified Logging API introduced in macOS Sierra 10.12.
Workaround: If you experience an issue while running SAN Fusion on macOS Sierra, a technician may instruct you to manually collect support information as opposed to running the sfgather
command or using the Collect Support Information option in the Help menu.Jun-24-2016
Note: This release resolves an issue wherein workspaces hosted by StorNext 5.x metadata controllers would appear to be missing files from directories with many entries.
Fix issue when reading directory with many entries.
When called with option -o readdir_v2
the mounted sanfusefs volume will let libfuse manage readdir entries offset. This is a fallback in case the optimized VNODE_READDIR_EXTENDED mode fails
Fix crash on child side of fork pre-exec when using NFS as a backing-store
Update libosxfuse to version 2.9.5
Disable CUSE support in libosxfuse
The osxfuse kernel extension does not support the CUSE protocol.
Send interrupt request on daemon timeout
Send an interrupt request to give the file system daemon a chance to handle the timeout. If the daemon does not respond to the interrupt request within daemon_timeout seconds, the file system will be marked dead. Previous version of osxfuse deadened the volume right away without giving the daemon proper warning.
This addresses issue osxfuse/osxfuse#261.
Be more verbose in case vnop_readdir fails
Finder and ls have the nasty habit of ignoring errors returned by vnode operation readdir. This might result in files missing from directory listings or directories appearing empty, even though they are not. One way to trigger this issue is returning a file name longer than 255 bytes in the the FUSE_READDIR callback. Starting with this release readdir errors are logged in system log.
This addresses issue osxfuse/osxfuse#265.
Change admin group from 80(admin)
to 12(everyone)
. This allows non-admin users to use the allow_root
and allow_other
mount option.
Update libosxfuse from version 2.9.5 to 2.9.6
Bump number of FUSE devices to 64. Starting with this release 64 volumes can be mounted at the same time. Please note that depending on the file system and the used iosize, a single FUSE volume requires roughly 32 MB of RAM. 64 mounted FUSE volumes can require 2 GB of RAM.
Lower minimum file system block size to 128 bytes
Increase maximum file system block size from MAXPHYS (128 KiB) to MAXBSIZE (1 MiB)
Clean up vnop_exchange operation in kernel extension to use only public API
Use vnode_update_identity()
instead of fuse_kludge_exchange()
for updating the vnodes' names and parents.
This renders fuse_kludge_exchange()
obsolete.
Implement new style mount process
When mounting a FUSE volume on Linux, fusermount opens the FUSE device and passes the file descriptor back to libfuse.
However, on OS X libosxfuse used to be responsible for locating a free FUSE device, opening it, and then passing the file descriptor to mount_osxfuse. For this to work libosxfuse needs to be aware of low level implementation details like the number of registered FUSE devices.
In order to decouple libosxfuse from the FUSE kernel extension the mount process has been revised to match FUSE on Linux. mount_osxfuse will locate a free FUSE device, open it, and then pass the file descriptor back to libosxfuse.
Update mount_osxfuse environment variables
Remove unused FUSEDEVIOCSETIMPLEMENTEDBITS ioctl
Optimize VNODE_READDIR_EXTENDED mode
May-10-2016
Users can select and mount up-to 24 workspaces concurrently. Previous behavior forced the user to mount/unmount workspaces one-at-a-time.
Note: The mount and unmount buttons are automatically enabled/disabled depending on the selection’s mount status. Selecting multiple workspaces with mixed mount statuses is not supported.
access(2)
)Added the ability to append custom mount options to the default mount options using static configuration files.
Note: This feature should only be used when instructed to do so by support.
The kernel extension does no longer use the first free slot when registering FUSE character devices. In practice there are kernel internal devices that use absolute index values, which will stomp on free-slot based assignments that happen before them. Slot 12 is considered a safe starting index for Mac OS X 10.5 to 10.7, 24 for OS X 10.8 and later.
See bsd/kern/bsd_stubs.c for details.
Improve compatibility with Finder on OS X 10.11
Unless allow_root
or allow_other
is set we limit vnode operations to the user that mounted the file system. Starting with OS X 10.11 DesktopServicesHelper, which is running as root, calls access(2) on behalf of Finder when trying to delete a directory. Blocking this request results in Finder aborting the delete process. Therefore we are no longer enforcing allow_root
or allow_other
for vnop_access
Fix mount-init-unmount race condition
The volume might be unmounted before we are able to complete the asynchronous FUSE_INIT process. This could result in a trying to interlock destroyed mutex
kernel panic.
Fix mount-init-abi race condition
Wait until the FUSE session is initialized before generating user space requests. We do not know which ABI version to use until the initialization process is complete.
Issue: Some users have reported that files saved directly to the workspace’s document bundle appear to be missing when using Finder or ls
to list the file system’s mount point.
Workaround: In at least one case, after running In all cases, users who experienced files missing from directory listings indicated that reverting to SAN Fusion 1.0.6 corrected the issue.xattr -c -rsv
on the workspace’s document bundle, missing files appeared almost immediately.
If you should experience this issue, please generate a support dump as quickly as possible post file system event by running Help > Collection Support Information from the application’s main menu before contacting support. The support dump contains system logs and files that will assist our efforts to resolve this problem.
Mar-18-2016
readdir
introduced in version 2.3The FUSE kernel extension used to treat all signals received while waiting for the user space file system daemon to respond to a file system request as fatal. On OS X there is no supported way to block signals in kernel mode or to determine which signal caused an interrupt. This is why there have been only two options:
Before version 3.0.9 all signals were treated as fatal. Between those two options this one is the ‘safer’ one, as we do not want file systems to hang the whole system. The problem is that it can become virtually impossible to complete any I/O operation under high signal pressure on a high latency (network) file system.
In 3.0.9, if a process issuing a FUSE file system request is interrupted, the following will happen:
If the request is not yet sent to user space, then an ‘interrupted’ flag is set for the request. When the request has been successfully transferred to user space and this flag is set, an INTERRUPT request is queued.
If the request is already sent to user space, then an INTERRUPT request is queued.
If a file system request is not yet sent to user space and the process issuing the request is aborted (SIGKILL or unhandled fatal signal), then the request is marked as answered and returns immediately.
This fixes issue #213: Interruptible system calls
Improve support for sigaction(2) flag SA_RESTART.
This fixes issue #228: open(2) returns EINTR for files even when SA_RESTART is set
ls
to list the file system’s mount point.
Workaround: In at least one case, after running xattr -c -rsv
on the workspace’s document bundle, missing files appeared almost immediately. In all cases, users who experienced files missing from directory listings indicated that reverting to SAN Fusion 1.0.6 corrected the issue.Feb-08-2016
Dec-17-2015
RLIMIT_NOFILE
is set to the value returned by sysctl kern.maxfilesperproc
IOSIZE
from 256 KiB (262144 bytes) to 32 MiB (33554432 bytes)mount_helper
process [4]Improved compatibility with Finder. Starting with OS X 10.9 syspolicyd (which is running as root) calls getxattr(2) when opening items in Finder. Blocking these calls results in Finder displaying an error message. Therefore we are no longer blocking getxattr(2) calls by root even if allow_root or allow_other is not set.
Tracked as issue #162: “Preview sets quarantine attribute on all files it opens on an SSHFS volume.”
Fixed select(2) for FUSE devices on OS X 10.11. The issue was caused by a kernel private struct that has changed between OS X 10.10 and 10.11.
See “select(2) on channel fd hangs and makes system unstable on El Capitan” for details.
Fixed unified buffer cache invalidation error when expanding files. Unless the file did end on a page boundary we are now invalidating the last page of the file’s unified buffer cache manually.
Tracked as issue #237: “range invalidate to grow file sees zero content”
Various minor under-the-hood improvements
Note: SAN Fusion requires OS X 10.8.5 Mountain Lion or better.
mount_helper
process writes the name of the computer
to a temporary file at the root of the workspace bundle
once-every-second.mount_helper
process encounters a
EACCES
“Permission denied” error while trying to write
to the temporary file, the process will silently exit without
disturbing the file system process. However, if the
mount_helper
process encounters a ENOENT
“No such file or directory” error it will display an error to the
user before trying to remove any stale mounts and killing the file
system process.Jul-09-2015
Note: SAN Fusion requires Mac OS X 10.7 Lion or better.
Mar-10-2015
Note: SAN Fusion requires Mac OS X 10.6 Snow Leopard or better.
Feb-06-2015
Note: SAN Fusion requires Mac OS X 10.6 Snow Leopard or better.
Sep-04-2014
Note: SAN Fusion requires Mac OS X 10.6 Snow Leopard or better.
Aug-16-2013
Note: SAN Fusion requires Mac OS X 10.6 Snow Leopard or better.
Jul-25-2013
Note: SAN Fusion requires Mac OS X 10.6 Snow Leopard or better.
Apr-03-2013
Note: SAN Fusion requires Mac OS X 10.6 Snow Leopard or better.