What is new in 2.6

 - Improved read characteristics (asynchronous reads)

 - Support for aborting filesystem connection

What is new in 2.5

 - Merge library part of FreeBSD port

 - New atomic create+open, access and ftruncate operations

 - On filesystems implementing the new create+open operation, and
   running on Linux kernels 2.6.15 or later, the 'cp' operation will
   work correctly when copying read-only files.

 - New option parsing interface added to the library

 - Lots of minor improvements and fixes

What is new in 2.4

 - Simplify device opening.  Now '/dev/fuse' is a requirement

 - Allow module auto-loading if user has access to '/dev/fuse'

 - Allow mounting over a regular file for unprivileged users

 - Allow mounting of arbitrary FUSE filesystems from /etc/fstab

 - New mount options: 'umask=M', 'uid=N', 'gid=N'

 - Check for non-empty mountpoint, and refuse mount by default.  New
   mount option: 'nonempty'

 - Low level (inode based) API added

 - Allow 'direct_io' and 'keep_cache' options to be set on a
   case-by-case basis on open.

 - Add 'attr_timeout' and 'entry_timeout' mount options to the
   high-level library.  Until now these timeouts were fixed at 1 sec.

 - Some bugfixes

What is new in 2.3

 - Add new directory related operations: opendir(), readdir(),
   releasedir() and fsyncdir()

 - Add init() and destroy() operations which are called before the
   event loop is started and after it has exited

 - Update kernel ABI so that on dual architectures (e.g. AMD64) 32bit
   binaries work under a 64bit kernel

 - Bugfixes

What is new in 2.2

Userspace changes:

 - Add fuse_file_info structure to file operations, this allows the
   filesystem to return a file handle in open() which is passed to
   read(), write(), flush(), fsync() and release().

 - Add source compatibility with 2.1 and 1.4 releases

 - Binary compatibility with 2.1 release is retained

Kernel changes:

 - Make requests interruptible.  This prevents the filesystem to go
   into an unbreakable deadlock with itself.

 - Make readpages() synchronous.  Asynchronous requests are deadlock
   prone, since they cannot be interrupted (see above)

 - Remove shared-writeable mapping support, which could deadlock the
   machine

 - Remove INVALIDATE userspace initiated request

 - Update ABI to be independent of sizeof(long), so dual-size archs
   don't cause problems

 - Remove /sys/fs/fuse/version.  Version checking is now done through
   the fuse device

 - Replace directory reading method on the kernel interface.  Instead
   of passing an open file descriptor to the kernel, send data through
   the FUSE device, like all other operations.

============================================================================

What is new in 2.1

* Bug fixes

* Improved support for filesystems implementing a custom event-loop

* Add 'pkg-config' support

* Kernel module can be compiled separately

============================================================================

What is new in 1.9

* Lots of bugs fixed

* Minor modifications to the library API

* Improvements to the kernel/userspace interface

* Mounting by non-root made more secure

* Build shared library in addition to the static one

* Consolidated mount options

* Optimized reading under 2.6 kernels

* Direct I/O support

* Support file I/O on deleted files

* Extended attributes support

============================================================================

What is new in 1.3

* Thanks to user bugreports and stress testing with LTP and sfx-linux
a number of bugs were fixed, some quite serious.

* Fix compile problems with recent SuSE kernles

============================================================================

What is new in 1.2

* Fix mount problems on recent 2.6 kernels with SELinux enabled

* Fixed writing files lager than 2GBytes

* Other bugfixes

============================================================================

What is new in 1.1

* Support for the 2.6 kernels

* Support for exporting filesystem over NFS in 2.6 kernels

* Read efficiency improvements: read in 64k blocks instead of 4k
(Michael Grigoriev).  Can be turned on with '-l' option of fusermount

* Lazy automatic unmount

* Added 'fsync()' VFS call to the FUSE interface

* Bugfixes

============================================================================

What is new in 1.0

* Cleanups and bugfixes

* Added 'release()' VFS call to the FUSE interface

* 64 bit file offsets (handling of > 4 GByte files)

* libfuse is now under LGPL

* New 'statfs' call (Mark Glines)

* Cleaned up mount procedure (mostly by Mark Glines)

  NOTE: Binaries linked with with a previous version of libavfs may
  not work with the new version of the fusermount program.  In such
  case recompile the program after installing the new libavfs library.

* Fix for problems under linux kernel 2.4.19

============================================================================

What is new in 0.95

* Optimized read/write operations.  Raw throughput has increased to
about 60Mbyte/s on a Celeron/360

* Python bindings by Jeff Epler

* Perl bindings by Mark Glines

* Improved multithreaded operation

* Simplified library interface

* Bugfixes

============================================================================

What is new in 0.9:

* Everything
