--helpoption to fuse_new() must now process the
--helpoption internally and call fuse_lib_help() to print the help for generic FUSE options.
NOTE TO PACKAGERS:
libfuse 3 is designed to be co-installable with libfuse 2. However, some files will be installed by both libfuse 2 and libfuse 3 (e.g. /etc/fuse.conf, the udev and init scripts, and the mount.fuse(8) manpage). These files should be taken from libfuse 3. The format/content is guaranteed to remain backwards compatible with libfuse 2.
We recommend to ship libfuse2 and libfuse3 in three separate packages: a libfuse-common package that contains files shared by libfuse 2+3 (taken from the libfuse3 tarball), and libfuse2 and libfuse3 packages that contain the shared library and helper programs for the respective version.
-o max_read=<n>mount option. At some point in the future, specifying the mount option will no longer be necessary.
File systems that use the low-level API and support lookup requests for '.' and '..' should continue make sure to set the FUSE_CAP_EXPORT_SUPPORT bit in fuse_conn_info->want.
(This has actually always been the case, but was not very obvious from the documentation).
-o nopathoption has been dropped - it never actually did anything (since it is unconditionally overwritten with the value of the nopath flag in `struct fuse_operations).
-o large_readmount option has been dropped. Hopefully no one uses a Linux 2.4 kernel anymore.
The -o nonempty mount point has been removed, mounting over non-empty directories is now always allowed. This brings the behavior of FUSE file systems in-line with the behavior of the regular mount command.
File systems that do not want to allow mounting to non-empty directories should perform this check themselves before handing control to libfuse.
The chmod, chown, truncate, utimens and getattr handlers of the high-level API now all receive an additional struct fuse_file_info pointer (which, however, may be NULL even if the file is currently open).
The fgetattr and ftruncate handlers have become obsolete and have been removed.
-o clone_fdoption. Instead, this has become a parameter of the fuse_session_loop_mt and `fuse_loop_mt functions.
The treatment of low-level options has been made more consistent:
Options that can be set in the init() handler (via the fuse_conn_info parameter) can now be set only here, i.e. fuse_session_new() no longer accepts arguments that change the fuse_conn_info object before or after the call do init(). As a side effect, this removes the ambiguity where some options can be overwritten by init(), while others overwrite the choices made by init().
For file systems that wish to offer command line options for these settings, the new fuse_parse_conn_info_opts() and fuse_apply_conn_info_opts() functions are available.
Consequently, the fuse_lowlevel_help() method has been dropped.
--helpflags are given. This needs to be done by the file system (e.g. using the fuse_cmdline_help() and fuse_lowlevel_help() functions).
example/null.c. This has not been working for a while for unknown reasons -- maybe because it tries to treat the mountpoint as a file rather than a directory?
-o big_writesmount option has been removed. It is now always active. File systems that want to limit the size of write requests should use the
-o max_write=<N>option instead.
allow_rootmount options (accepted by fuse_session_new()) may now be specified together. In this case,
fuse_lowlevel_notify_*functions now all take a struct fuse_session parameter instead of a struct fuse_chan.
The channel interface (
fuse_chan_* functions) has been made private. As a result, the typical initialization sequence of a low-level file system has changed from :
ch = fuse_mount(mountpoint, &args); se = fuse_lowlevel_new(&args, &lo_oper, sizeof(lo_oper), &lo); fuse_set_signal_handlers(se); fuse_session_add_chan(se, ch); fuse_daemonize(fg); if (mt) fuse_session_loop_mt(se); else fuse_session_loop(se); fuse_remove_signal_handlers(se); fuse_session_remove_chan(ch); fuse_session_destroy(se); fuse_unmount(mountpoint, ch);
se = fuse_session_new(&args, &ll_ops, sizeof(ll_ops), NULL); fuse_set_signal_handlers(se); fuse_session_mount(se, mountpoint); fuse_daemonize(fg); if (mt) fuse_session_loop_mt(se); else fuse_session_loop(se); fuse_remove_signal_handlers(se); fuse_session_unmount(se); fuse_lowlevel_destroy(se);
The typical high-level setup has changed from :
ch = fuse_mount(*mountpoint, &args); fuse = fuse_new(ch, &args, op, op_size, user_data); se = fuse_get_session(fuse); fuse_set_signal_handlers(se); fuse_daemonize(fg); if (mt) fuse_loop_mt(fuse); else fuse_loop(fuse); fuse_remove_signal_handlers(se); fuse_unmount(mountpoint, ch); fuse_destroy(fuse);
fuse = fuse_new(&args, op, op_size, user_data); se = fuse_get_session(fuse); fuse_set_signal_handlers(se); fuse_mount(fuse, mountpoint); fuse_daemonize(fg); if (mt) fuse_loop_mt(fuse); else fuse_loop(fuse); fuse_remove_signal_handlers(se); fuse_unmount(fuse); fuse_destroy(fuse);
File systems that use fuse_main are not affected by this change.
For integration with custom event loops, the new fuse_session_fd function provides the file descriptor that's used for communication with the kernel.
examples/fuse_lo-plus.cand a new fuse_add_direntry_plus API function.
Please see Git history, e.g. at https://github.com/libfuse/libfuse/blob/fuse_2_9_3/ChangeLog.