github libfuse/libfuse fuse-3.0.0
libfuse 3.0.0

latest releases: fuse-3.16.2, fuse-3.16.1, fuse-3.15.1...
7 years ago

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.

Changes (since FUSE 2.9)

  • Fixed test errors when running tests as root.

  • Made check for util-linux version more robust.

  • Added documentation for all fuse capability flags (FUSE_CAP_*) and struct fuse_conn_info fields.

  • fuse_loop(), fuse_loop_mt(), fuse_session_loop() and fuse_session_loop_mt() now return more detailed error codes instead of just -1. See the documentation of fuse_session_loop() for details.

  • The FUSE main loop is now aborted if the file-system requests capabilities that are not supported by the kernel. In this case, the session loop is exited with a return code of -EPROTO.

  • Most file-system capabilities that were opt-in in libfuse2 are now enabled by default. Filesystem developers are encouraged to review the documentation of the FUSE_CAP_* features to ensure that their filesystem is compatible with the new semantics. As before, a particular capability can still be disabled by unsetting the corresponding bit of fuse_conn_info.wants in the init() handler.

  • Added FUSE_CAP_PARALLEL_DIROPS and FUSE_CAP_POSIX_ACL, FUSE_HANDLE_KILLPRIV feature flags.

  • FUSE filesystems are now responsible for unsetting the setuid/setgid flags when a file is written, truncated, or its owner changed. Previously, this was handled by the kernel but subject to race conditions.

  • The fusermount and mount.fuse binaries have been renamed to fusermount3 and mount.fuse3 to allow co-installation of libfuse 2.x and 3.x

  • Added a max_read field to struct fuse_conn_info. For the time being, the maximum size of read requests has to be specified both there and passed to fuse_session_new() using the -o max_read=<n> mount option. At some point in the future, specifying the mount option will no longer be necessary.

  • Documentation: clarified that the fuse_argv structure that is passed to fuse_new() and fuse_lowlevel_new() must always contain at least one element.

  • The high-level init() handler now receives an additional struct fuse_config pointer that can be used to adjust high-level API specific configuration options.

  • The nopath_flag field of struct fuse_operations has been removed. Instead, a new nullpath_ok flag can now be set in struct fuse_config.

  • 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).

  • The help text generated by fuse_lowlevel_help(), fuse_new() (and indirectly fuse_main()) no longer includes options that are unlikely to be of interest to end-users. The full list of accepted options is now included in the respective function's documentation (located in the fuse.h/fuse_lowlevel.h and doc/html).

  • The -o nopath option has been dropped - it never actually did anything (since it is unconditionally overwritten with the value of the nopath flag in `struct fuse_operations).

  • The -o large_read mount 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.

  • The fuse_session_new function no longer accepts the -o clone_fd option. Instead, this has become a parameter of the fuse_session_loop_mt and ``fuse_loop_mt` functions.

  • For low-level file systems that implement the write_buf handler, the splice_read option is now enabled by default. As usual, this can be changed in the file system's init handler.

  • 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.

  • The async_read field in struct fuse_conn_info has been
    removed. To determine if the kernel supports asynchronous reads,
    file systems should check the FUSE_CAP_ASYNC_READ bit of the
    capable field. To enable/disable asynchronous reads, file systems
    should set the flag in the wanted field.

  • The fuse_parse_cmdline function no longer prints out help when the
    --verbose or --help flags are given. This needs to be done
    by the file system (e.g. using the fuse_cmdline_help() and
    fuse_lowlevel_help() functions).

  • Added example/cuse_client.c to test example/cuse.c.

  • Removed 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?

  • There are several new examples that demonstrate the use of
    the fuse_lowlevel_notify_* functions:

    • example/notify_store_retrieve.c
    • example/notify_inval_inode.c
    • example/notify_inval_entry.c
  • The -o big_writes mount 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.

  • The fuse_lowlevel_new function has been renamed to
    fuse_session_new and no longer interprets the --version or --help
    options. To print help or version information, use the new
    fuse_lowlevel_help and fuse_lowlevel_version functions.

  • The allow_other and allow_root mount options (accepted by
    fuse_session_new()) may now be specified together. In this case,
    allow_root takes precedence.

  • There are new fuse_session_unmount and fuse_session_mount
    functions that should be used in the low-level API. The fuse_mount
    and fuse_unmount functions should be used with the high-level API
    only.

  • Neither fuse_mount nor fuse_session_mount take struct fuse_opts
    parameters anymore. Mount options are parsed by fuse_new (for the
    high-level API) and fuse_session_new (for the low-level API)
    instead. To print help or version information, use the new
    fuse_mount_help and fuse_mount_version functions.

  • The 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);
    

    to ::

      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);
    

    to ::

      fuse = fuse_new(&args, op, op_size, user_data);
      se = fuse_get_session(fuse);
      fuse_set_signal_handlers(se);
      fuse_mount(se, mountpoint);
      fuse_daemonize(fg);
       if (mt)
          fuse_loop_mt(fuse);
      else
          fuse_loop(fuse);
      fuse_remove_signal_handlers(se);
      fuse_unmount(se);
      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.

  • Added clone_fd option. This creates a separate device file
    descriptor for each processing thread, which might improve
    performance.

  • Added writeback_cache option. With kernel 3.14 and newer this
    enables write-back caching which can significantly improve
    performance.

  • Added async_dio option. With kernel 3.13 and newer, this allows
    direct I/O to be done asynchronously.

  • The (high- and low-level) rename handlers now takes a flags
    parameter (with values corresponding to the renameat2 system call
    introduced in Linux 3.15).

  • The "ulockmgr_server" has been dropped.

  • There is a new (low-level) readdirplus handler, with a
    corresponding example in examples/fuse_lo-plus.c and a new
    fuse_add_direntry_plus API function.

  • The (high-level) readdir handler now takes a flags argument.

  • The (high-level) filler function passed to readdir now takes an
    additional flags argument.

  • The (high-level) getdir handler has been dropped.

  • The flag_nullpath_ok and flag_utime_omit_ok flags have been
    dropped.

  • The (high-level) utime handler has been dropped.

  • The fuse_invalidate function has been removed.

  • The fuse_is_lib_option function has been removed.

  • The fh_old member of struct fuse_file_info has been dropped.

  • The type of the writepage member of struct fuse_file_info was
    changed from int to unsigned int.

  • The struct fuse_file_info gained a new poll_events member.

  • There is a new fuse_pkgversion function.

  • The fuse_off_t and fuse_ino_t changed from unsigned long to
    uint64_t, i.e. they are now 64 bits also on 32-bit systems.

  • The type of the generation member of `struct fuse_entry_param*
    changed from unsigned to uint64_t.

  • The (low-level) setattr handler gained a FUSE_SET_ATTR_CTIME bit
    for its *to_set parameter.

  • The struct fuse_session_ops data structure has been dropped.

  • The documentation has been clarified and improved in many places.

Don't miss a new libfuse release

NewReleases is sending notifications on new releases.