SAN Fusion Changelog

What's new in SAN Fusion 1.5.6 Build 3298

Jun 25, 2018
  • Application UI:
  • Fixed an issue where the application would hang for an extended period of time after launch while trying to connect to the software update server
  • Added support for macOS 10.13 High Sierra
  • File System Driver (3.7.1):
  • 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.
  • The kernel will post file system events if it receives one of the following notifications: FUSE_NOTIFY_INVAL_INODE, FUSE_NOTIFY_INVAL_ENTRY, or FUSE_NOTIFY_DELETE
  • File system events will be posted in case remote changes are detected when loading vnode attributes
  • 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

New in SAN Fusion 1.5.5 Build 3297 (Jan 12, 2017)

  • Application UI:
  • Updated Sparkle software update framework to v1.15.1
  • Added support for macOS 10.12 Sierra
  • Dropped support for OS X 10.8.5 Mountain Lion
  • Package installer now prompts user to restart after a successful installation
  • Minor cosmetic changes
  • Minor optimizations and code cleanup
  • File System:
  • Added support for macOS 10.12 Sierra
  • Dropped support for OS X 10.8.5 Mountain Lion
  • New internal rate limiter that can be called as a custom mount option using static configuration files introduced in v1.5.3
  • File System Driver (3.4.1 -> 3.5.4)
  • 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.
  • 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.
  • 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.
  • 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.
  • 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
  • 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.
  • 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
  • Known Issues:
  • Issue: SAN Fusion’s 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.

New in SAN Fusion 1.5.4 Build 3277 (Jun 26, 2016)

  • File system:
  • Fix crash on child side of fork pre-exec when using NFS as a backing-store

New in SAN Fusion 1.5.4 (May 31, 2016)

  • FILE SYSTEM:
  • 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
  • FILE SYSTEM DRIVER (3.2.0 -> 3.3.2):
  • Update libosxfuse to version 2.9.5:
  • Fix possible memory leak
  • Minor under-the-hood clean up
  • 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.
  • 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.
  • 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.
  • 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 MOUNT_FUSEFS_SAFE
  • Rename MOUNT_FUSEFS_CALL_BY_LIB MOUNT_OSXFUSE_CALL_BY_LIB
  • 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)
  • Remove unused FUSEDEVIOCSETIMPLEMENTEDBITS ioctl
  • Optimize VNODE_READDIR_EXTENDED mode

New in SAN Fusion 1.5.3 (May 11, 2016)

  • APPLICATION UI:
  • 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.
  • FILE SYSTEM:
  • Extended attributes are now handled entirely through AppleDouble files
  • Permission checks are now deferred to file operations themselves
  • 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.
  • FILE SYSTEM DRIVER (3.1.0):
  • 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.