fuse: Update to 2.9.4

Change-Id: I0877c624531286f47da29a7ab16c7ff3cfac0090
diff --git a/fuse/AUTHORS b/fuse/AUTHORS
new file mode 100644
index 0000000..8c1e88f
--- /dev/null
+++ b/fuse/AUTHORS
@@ -0,0 +1,9 @@
+FUSE
+----
+
+Miklos Szeredi <miklos@szeredi.hu>
+
+CUSE
+----
+
+Tejun Heo <teheo@suse.de>
diff --git a/fuse/Android.mk b/fuse/Android.mk
index f531426..5260e14 100644
--- a/fuse/Android.mk
+++ b/fuse/Android.mk
@@ -17,6 +17,7 @@
 include $(CLEAR_VARS)
 
 LOCAL_SRC_FILES := \
+	android/statvfs.c \
 	buffer.c \
 	cuse_lowlevel.c \
 	fuse.c \
@@ -33,10 +34,11 @@
 	ulockmgr.c
 
 LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/android \
 	$(LOCAL_PATH)/include
 
 LOCAL_SHARED_LIBRARIES := \
-	libutils libdl
+	libutils
 
 LOCAL_CFLAGS := \
 	-D_FILE_OFFSET_BITS=64 \
@@ -47,24 +49,3 @@
 LOCAL_MODULE_TAGS := optional
 
 include $(BUILD_STATIC_LIBRARY)
-#include $(BUILD_SHARED_LIBRARY)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
-	fusexmp.c
-
-LOCAL_C_INCLUDES := \
-	$(LOCAL_PATH)/include
-
-LOCAL_CFLAGS := -D_FILE_OFFSET_BITS=64
-
-LOCAL_MODULE := fusexmp
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_STATIC_LIBRARIES := libfusetwrp
-
-LOCAL_SHARED_LIBRARIES := \
-	libutils libdl
-
-include $(BUILD_EXECUTABLE)
diff --git a/fuse/COPYING b/fuse/COPYING
new file mode 100644
index 0000000..d159169
--- /dev/null
+++ b/fuse/COPYING
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/fuse/COPYING.LIB b/fuse/COPYING.LIB
new file mode 100644
index 0000000..4362b49
--- /dev/null
+++ b/fuse/COPYING.LIB
@@ -0,0 +1,502 @@
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/fuse/ChangeLog b/fuse/ChangeLog
new file mode 100644
index 0000000..f2e5d02
--- /dev/null
+++ b/fuse/ChangeLog
@@ -0,0 +1,3535 @@
+2015-05-22  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.9.4
+
+2015-05-22  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: fix exec environment for mount and umount.  Found by
+	Tavis Ormandy (CVE-2015-3202).
+
+2015-02-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: fix fuse_remove_signal_handlers() to properly restore
+	the default signal handler.  Reported by: Chris Johnson
+
+2014-07-21  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: highlevel API: fix directory file handle passed to
+	ioctl() method.  Reported by Eric Biggers
+
+2014-07-15  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: document deadlock avoidance for
+	fuse_notify_inval_entry() and fuse_notify_delete()
+
+	* fusermount, libfuse: send value as unsigned in "user_id=" and
+	"group_id=" options.  Uids/gids larger than 2147483647 would
+	result in EINVAL when mounting the filesystem.  This also needs a
+	fix in the kernel.
+
+2014-03-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Initilaize stat buffer passed to ->getattr() and ->fgetattr() to
+	zero in all cases.  Reported by Daniel Iwan
+
+2013-08-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: Add missing includes.  This allows compiling fuse with
+	musl.  Patch by Daniel Thau
+
+2013-07-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.9.3
+
+2013-06-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: fix multiple close of device fd.  Reported by Dan
+	Greenfield
+
+2013-03-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: fix thread cancel race.  Exiting a worker my race with
+	cancelling that same worker.  This caused a segmenation
+	fault. Reported and tested by Anatol Pomozov
+
+2013-02-04  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: fix crash in unlock_path().  Patch by Ratna Manoj
+
+	* libfuse: fix the 'remember' option.  The lru list was not
+	initialized for the "/" path.  This resulted in remove_node_lru()
+	crashing on LOOKUP-DOTDOT.  Patch by Madan Valluri
+
+	* libfuse: configure: detect new util-linux
+
+	* libfuse: Use AC_CONFIG_HEADERS instead of AM_CONFIG_HEADER.
+	Patch by Anatol Pomozov
+
+	* libfuse: rename ./configure.in to ./configure.ac.  Patch by
+	Anatol Pomozov
+
+2012-10-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.9.2
+
+2012-10-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix deadlock in libfuse.  Running "svn update" on a fuse
+	filesystem could deadlock because of a bug in the way the paths
+	are locked.  Reported by Kazuaki Anami
+
+2012-08-23  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix missing config.h in buffer.c.  Reported by Matthew Gabeler-Lee
+
+2012-08-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Not unhashing the name in forget (commit on 2011-12-09) broke
+	the forget logic in a subtle way, resulting in "fuse internal
+	error: node NNN not found" and causing the filesystem daemon to
+	abort.  Fix by incrementing the node refcount if nlookup goes from
+	zero to one.  Reported by Kyle Lippincott
+
+2012-08-13  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix linking against GNU libiconv.  Patch by Natanael Copa
+
+2012-07-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.9.1
+
+2012-07-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix crash caused by freeing a stack address.  Reported by Itay
+	Perl
+
+2012-07-04  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix install of mount.fuse from out-of-tree build.  Patch by
+	Olivier Blin
+
+	* Fix build with automake >= 1.12.1.  Patch by Olivier Blin
+
+2012-04-24  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add fallocate operation.  Only works on linux kernels 3.5 or
+	later.  Patch by Anatol Pomozov
+
+2012-05-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Linking to a library that uses threads requires the application
+	to be linked with -pthreads otherwise some pthread functions will
+	be linked to stubs in glibc.  So move -pthread from Libs.private
+	to Libs in fuse.pc.  Reported by Werner Fink
+
+	* Fix the compile command in the examples. Reported by Luciano
+	Dalle Ore
+
+2012-04-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.9.0
+
+2012-04-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add missing fuse_fs_flock to fuse_versionscript
+
+2012-04-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Check protocol version before sending notifications and return
+	-ENOSYS if a particular notification is not supported.
+
+	* Add 'flag_utime_omit_ok' flag to fuse_operations.  If the
+	filesystem sets this flag then ->utimens() will receive UTIME_OMIT
+	and UTIME_NOW values as specified in utimensat(2).
+
+2012-01-27  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Interpret octal escape codes in options.  Requested by Jan
+	Engelhardt
+
+2012-01-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add man pages for fusermount, mount.fuse and ulockmgr_server.
+	Lifted from the Debian package.  The man pages were written by
+	Daniel Baumann and Bastien Roucaries
+
+2012-01-13  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Disable symbol versions on MacOSX.  Patch by Anatol Pomozov
+
+2012-01-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Remove unnecessary mutex unlock at the end of multithreaded
+	event loop.
+
+2011-12-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix hang in wait_on_path().  Reported by Ville Silventoinen
+
+	* Don't unhash name in FORGET.  This resulted in ENOENT being
+	returned for unlinked but still open files if the kernel sent a
+	FORGET request for the parent directory.
+
+	* Free request in fuse_reply_data().
+
+2011-12-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix build if FUSE_NODE_SLAB is not defined.  Patch by Emmanuel
+	Dreyfus
+
+	* Check for availability of utimensat() function.  Patch by
+	Emmanuel Dreyfus
+
+2011-12-07  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add fuse_lowlevel_notify_delete() which tells the kernel that a
+	file or directory is deleted.  Patch by John Muir
+
+2011-12-06  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Update retrieve_reply() method
+
+2011-12-05  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Low level API: lock argument of fuse_reply_lock should have a
+	'const' qualifier.  Reported by Shachar Sharon
+
+	* Add support for ioctl on directories.  Reported by Antonio SJ
+	Musumeci
+
+2011-10-13  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Reply to request with ENOMEM in case of failure to allocate
+	request structure.  Otherwise the task issuing the request will
+	just freeze up until the filesystem daemon is killed.  Reported by
+	Stephan Kulow
+
+2011-09-23  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Replace daemon() function with fork().  Patch by Anatol Pomozov
+
+2011-08-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* If configured with --disable-mtab then don't call mount(8) from
+	libfuse to update the mtab.  Reported by: James Sierp
+
+2011-08-24  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Use LRU list for cleaning up the cache if the "remember=T"
+	option was given.  Patch by therealneworld@gmail.com
+
+2011-07-06  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add ->flock() operation to low and high level interfaces.  This
+	fixes problems with emulating flock() with POSIX locking.
+	Reported by Sebastian Pipping.  As with lock/setlk/getlk most
+	filesystems don't need to implement this, as the kernel takes care
+	of file locking.  The only reason to implement locking operations
+	is for network filesystems which want file locking to work between
+	clients.
+
+2011-07-02  Sebastian Pipping <sebastian@pipping.org>
+
+	* Make xmp_utimens of examples "fusexmp" and "fusexmp_fh"
+	not follow symlinks as other layers do that already.
+
+2011-06-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add "remember" option.  This works similar to "noforget" except
+	that eventually the node will be allowed to expire from the cache.
+	Patch by therealneworld@gmail.com
+
+2011-05-27  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Check if splice/vmsplice are supported
+
+2011-05-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Remove -lrt -ldl from fuse.pc for dynamic linking since
+	libfuse.so is already linked with these libraries.  Reported by:
+	Nikolaus Rath
+
+2011-05-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Cleaner build output.  Patch by Reuben Hawkins
+
+2011-05-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Disable splice by default, add "splice_read", "splice_write" and
+	"splice_move" options.  Keep the "no_splice_*" variants, which can
+	disable splice even if the filesystem explicitly enables it.
+
+2011-04-15  Max Krasnyansky <maxk@kernel.org>
+	* Added support for "auto_unmount" option which unmounts the
+	filesystem automatically on process exit (or crash).
+
+2011-03-30  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Patches by Laszlo Papp fixing various issues found by the
+	Coverity checker
+
+2011-03-11  Miklos Szeredi <miklos@szeredi.hu>
+
+	* In case of failure to add to /etc/mtab don't umount.  Reported
+	by Marc Deslauriers
+
+2011-02-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: In fuse_session_loop_mt() don't pause when exiting the
+	worker threads.  The pause() was added in 2.2.1 to prevent
+	segfault on pthread_cancel() on an exited, detached thread.  Now
+	worker threads are not detached and pthread_cancel() should work
+	fine even after the thread exited.  Reported by Boris Protopopov
+
+2011-01-31  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fusermount: chdir to / before performing mount/umount
+
+	* fusermount: only allow mount and umount if util-linux supports
+	--no-canonicalize
+
+2010-12-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Highlevel lib: allow hash tables to shrink
+
+	* Highlevel lib: add slab allocation for node cache.  This will
+	allow the memory used by the filesystem to grow and shrink
+	depending on how many inodes are currently cached.
+
+2010-12-13  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Highlevel lib: use dynamically resized hash table for looking up
+	by name and node ID.
+
+2010-12-07  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Allow batching of forget requests.  This allows forget requests
+	to be processed faster and doesn't require a modification to fuse
+	filesystems.  Reported by Terje Malmedal
+
+	* Add ->forget_multi() operation to the lowlevel API.  The
+	filesystem may implement this to process multiple forget requests
+	in one call
+
+	* Fix the ambiguity of ioctl ABI on the kernel/userspace boundary
+	for 32bit vs. 64bit userspace
+
+2010-11-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add new write_buf() method to the highlevel API.  Similarly to
+	the lowlevel write_buf() method, this allows implementing zero
+	copy writes.
+
+	* Add a new read_buf() method to the highlevel API.  This allows
+	returning a generic buffer from the read method, which in turn
+	allows zero copy reads.
+
+	* In fusexmp_fh implement the ->read_buf() and ->write_buf()
+	methods.  Leave the ->read() and ->write() implementations for
+	reference, even though they are not necessary.
+
+2010-11-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix check for read-only fs in mtab update
+
+	* Open /dev/null for write instead of read for redirecting stdout
+	and stderr
+
+	* If umount(8) supports --fake and --no-canonicalize (util-linux-ng
+	version 2.18 or later), and umount(2) supports the
+	UMOUNT_NOFOLLOW flag (linux kernel version 2.6.35 or later)  then,
+	"fusermount -u" will call the umount(2) system call and use
+	"umount --fake ..." to update /etc/mtab
+
+	* Added --disable-legacy-umount option to configure.  This
+	disables the runtime checking of umount(8) version.  When built
+	with this option then "fusermount -u" will fail if umount(8)
+	doesn't support the --fake and --no-canonicalize options.
+
+	* Fix fuse_buf_copy() if already at the end of the buffers
+
+	* Add new ->write_buf() method to low level interface.  This
+	allows passig a generic buffer, either containing a memory buffer
+	or a file descriptor.  This allows implementing zero copy writes.
+
+	* Add fuse_session_receive_buf() and fuse_session_process_buf()
+	which may be used in event loop implementations to replace
+	fuse_chan_recv() and fuse_session_process() respectively.
+
+	* Remove unnecessary restoring of current working directory in
+	"fusermount -u"
+
+	* Add ctx->pid to debug output
+
+	* Fix st_nlink value in high level lib if file is unlinked but
+	still open
+
+	* libfuse: add store request.  Request data to be stored in the
+	kernel buffers for a given inode.
+
+	* libfuse: add retrieve request.  Retrieve data stored in the
+	kernel buffers for a given inode.
+
+2010-10-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Use LTLIBICONV when linking libfuse.  This fixes building against
+	uclibc + libiconv.  Patch by Natanael Copa
+
+2010-10-05  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add missing argument check in ulockmgr.c to prevent calling
+	ulockmgr_server with illegal arguments. This would cause an ever
+	growing list of ulockmgr_server processes with an endless list of
+	open files which finally exceeds the open file handle limit.
+	Patch by Markus Ammer
+
+2010-09-28  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix ambiguous symbol version for fuse_chan_new.
+	fuse_versionscript included fuse_chan_new in both FUSE_2.4 and
+	FUSE_2.6.  Remove the FUSE_2.4, which is invalid.
+
+2010-09-28  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix option escaping for fusermount.  If the "fsname=" option
+	contained a comma then the option parser in fusermount was
+	confused (Novell bugzilla #641480).  Fix by escaping commas when
+	passing them over to fusermount.  Reported by Jan Engelhardt
+
+2010-08-27  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add NetBSD support.  Patch from Emmanuel Dreyfus
+
+2010-07-12  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: add buffer interface.  Add a generic buffer interface
+	for use with I/O.  Buffer vectors are supplied and each buffer in
+	the vector may be a memory pointer or a file descriptor.
+
+	* The fuse_reply_fd() interface is converted to using buffers.
+
+2010-06-23  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Make the number of max background requests and congestion
+	threshold tunable.  New options are "max_background" and
+	"congestion_threshold".  Only effective on linux kernel versions
+	2.6.32 or greater.  Patch by Csaba Henk
+
+2010-06-17  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add fuse_reply_fd() reply function to the low level interface.
+	On linux version 2.6.35 or greater this will use splice() to move
+	data directly from a file descriptor to the fuse device without
+	needing to go though a userspace buffer.  With the
+	FUSE_REPLY_FD_MOVE flag the kernel will attempt to move the data
+	directly into the filesystem's cache.  On earlier kernels it will
+	fall back to an intermediate buffer.  The options
+	"no_splice_write" and "no_splice_move" can be used to disable
+	splicing and moving respectively.
+ 
+2010-06-15  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix out-of-source build.  Patch by Jörg Faschingbauer
+
+	* Add a "nopath" option and flag, indicating that path argument
+	need not be calculated for the following operations: read, write,
+	flush, release, fsync, readdir, releasedir, fsyncdir, ftruncate,
+	fgetattr, lock, ioctl and poll.
+
+2010-05-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Remove "chmod root" from install of fusermount.  Reported by
+	Lucas C. Villa Real
+
+2010-04-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.8.4
+
+2010-04-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix checking for symlinks in umount from /tmp.  Reported by Al
+	Viro
+
+	* Fix umounting if /tmp is a symlink.  Reported by Franco Broi
+
+2010-02-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix definition of FUSE_OPT_END for C++.  Reported by Tim
+	Bruylants
+
+2010-02-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix stack alignment for clone()
+
+2010-02-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.8.3
+
+2010-02-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Using "--no-canonicalize" with umount(8) conflicts with the race
+	fix, sinceit assumes the supplied path is absolute, while the race
+	fix relies on the path being relative to the current directory.
+	Reported by Tom Rindborg
+
+2010-01-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.8.2
+
+2010-01-21  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix race if two "fusermount -u" instances are run in parallel.
+	Reported by Dan Rosenberg
+
+	* Make sure that the path to be unmounted doesn't refer to a
+	symlink
+
+2010-01-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix compile error on FreeBSD.  Patch by Jay Sullivan
+
+2009-12-17  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Use '--no-canonicalize' option of mount(8) (available in
+	util-linux-ng version 2.17 or greater) to avoid calling
+	readling(2) on the newly mounted filesystem before the mount
+	procedure is finished.  This has caused a deadlock if "audit" was
+	enabled in the kernel.  Also use '--no-canonicalize' for umount to
+	avoid touching the mounted filesystem.
+
+2009-09-11  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.8.1
+
+2009-08-25  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix missing versioned symbol fuse_get_context@FUSE_2.2
+
+2009-08-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.8.0
+
+2009-08-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add missing fuse_session_data to versionscript
+
+	* Make sure all global symbols are prefixed with "fuse_" or "cuse_"
+
+2009-07-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Clarify how the protocol version should be negotiated between
+	kernel and userspace.  Notably libfuse didn't correctly handle the
+	case when the supported major versions didn't match
+
+	* Add missing pthread link for libulockmgr.  Patch by  Petr Salinger
+
+2009-07-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* The context is extended with a 'umask' field.  The umask is sent
+	for mknod, mkdir and create requests by linux kernel version
+	2.6.31 or later, otherwise the umask is set to zero.  Also
+	introduce a new feature flag: FUSE_CAP_DONT_MASK.  If the kernel
+	supports this feature, then this flag will be set in conn->capable
+	in the ->init() method.  If the filesystem sets this flag in in
+	conn->want, then the create modes will not be masked.
+
+	* Add low level interfaces for lookup cache and attribute
+	invalidation.  This feature is available in linux kernels 2.6.31
+	or later.  Patch by John Muir
+
+	* Kernel interface version is now 7.12
+
+	* fusermount: Do not silently ignore command line arguments.
+	Patch by Sebastian Harl
+
+2009-06-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.8.0-pre3
+
+2009-06-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add fuse_getgroups (high level lib) and fuse_req_getgroups (low
+	level lib) functions to query the supplementary group IDs for the
+	current request.  Currently this is implemented on Linux by
+	reading from the /proc filesystem.
+
+2009-06-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add "noforget" option to high level lib to prevent ESTALE errors
+	on NFS exported filesystems.  This result in paths being cached
+	forever, resulting in ever growing memory usage.  Use with care.
+
+	* Add "no_remote_lock" option to disable remote file locking even
+	if the filesystem implements it.  With this option locking
+	primitives (flock, lockf, fcntl(F_SETLK)) will still work, but
+	will ignore remotely locked files.
+
+	* CUSE patches from Tejun Heo:
+
+	* Unrestricted ioctl support left some debris.  Clean them up:
+	  o No reason to pass around pointer to flags.  Pass flags directly.
+	  o Clean up comment and prototype parameter names.
+	  o fuse_lib_ioctl() didn't reply when get_path() failed.  Fix it.
+	  o Remove unused variables {in|out}_iov from fuse_lib_ioctl().
+
+	* Add fuse_reply_ioctl_iov()
+
+	* Move fuse_session, fuse_req and fuse_ll definitions to fuse_i.h
+	and make send_reply_iov() and fuse_setup_common() global (also in
+	fuse_i.h).  These will be used by CUSE support.
+
+	* Restructure fuse_ll_process()
+
+	* Implement libfuse side of CUSE support.  CUSE uses subset of FUSE
+	operations as dir operations don't make sense for CUSE where one
+	instance implements single character device.
+
+	CUSE support comes with its own cuse_lowevel_ops and related
+	initialization and helper functions.  Except for initialization, it
+	usage is basically identical to FUSE.
+
+	This patch also adds example/cusexmp.c which can create a character
+	device with name and device number specified on command line.  The
+	created device itself is pretty boring.  It's a bit bucket supporting
+	read, write and access via ioctl.
+
+2009-06-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add missing fuse_reply_bmap to versionscript.  Debian
+	Bug#531329.  Reported by Goswin Brederlow
+
+2009-05-27  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Don't call forget_node() if the lookup was negative and write()
+	for the reply returned ENOENT.  Reported by John Haxby
+
+2009-05-25  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add FUSE_CAP_EXPORT_SUPPORT to fuse_common.h
+
+2009-05-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix missing newlines in some printfs
+
+	* Fix 'make install-strip'.  Reported by Dominick Layfield
+
+2009-01-05  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.8.0-pre2
+
+2008-12-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Implement poll support.  Patch by Tejun Heo
+
+	* Add missing setattr flags to <fuse_lowlevel.h>.
+
+	* Only pass valid flags to ->setattr().
+
+2008-12-05  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Implement ioctl support.  On high level interface only
+	"restricted" ioctls are supported (which are defined with the
+	_IO(), _IOR(), _IOW() or _IOWR() macros).  Unrestricted ioctls
+	will only be allwed to CUSE (Character Device in Userspace)
+	servers.  Patch by Tejun Heo
+
+2008-11-28  Miklos Szeredi <miklos@szeredi.hu>
+
+	* If open sets fi->nonseekable, libfuse will tell the kernel that
+	the file is not seekable.  Patch by Tejun Heo
+
+2008-11-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lowlevel lib: fix deadlock if fuse_reply_* is called from the
+	interrupt handling function.  Reported by Tero Marttila
+
+2008-10-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Allow commas in options to be escaped with a backslash
+
+	* Add new function: fuse_opt_add_opt_escaped()
+
+	* Add missing fuse_reply_bmap() to the version script
+
+2008-10-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Pass current file flags to read and write operations
+
+2008-07-24  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Clean up debug output in highlevel lib
+
+2008-07-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.8.0-pre1
+
+2008-06-27  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix handling of (no)suid and (no)dev options if filesystem is
+	mounted from /etc/fstab or via mount(8).  Reported by Jan Ondrej.
+
+	* Skip calling mount(8) if /etc/mtab doesn't exist or if it's on a
+	read-only filesystem.  This works around issues with certain mount
+	implementations.  Reported by Szabolcs Szakacsits.
+
+2008-06-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Remove fuse kernel module sources.  Linux 2.6.27 will support
+	NFS exporting.
+
+2008-06-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix theoretical infinite loops in libfuse.  Reported by Szabolcs
+	Szakacsits
+
+	* Fix missing <sys/param.h> include for PATH_MAX.  Reported by
+	Szabolcs Szakacsits
+
+2008-05-23  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix mounting over symlink.  Reported by Szabolcs Szakacsits
+
+2008-05-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Don't allow bigger than 4kB writes by default on 2.6.26 and
+	later kernels, so that filesystems not expecting this are not
+	broken on a kernel upgrade.  Provide a 'big_writes' mount option
+	to enable this feature.  In future API revisions this may become
+	the default.
+
+2008-04-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Update warning message for missing newline at end of fuse.conf
+
+	* Update debug message for successful operation to not include the
+	string "error:"
+
+2008-04-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Update error message for missing mountpoint parameter.  Reported
+	by Allen Pulsifer
+
+2008-04-04  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Print library version information to debug output
+
+	* Highlevel lib: don't limit paths to 4095 characters
+
+2008-03-25  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix memory leaks on mount.  Patch by Szabolcs Szakacsits
+
+2008-03-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix missing pthread_mutex_destroy in error path of
+	fuse_lib_opendir().  Patch by Szabolcs Szakacsits
+
+2008-03-07  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add queuing on contention to per-node lock algorithm, to avoid
+	starvation.
+
+	* Only enable cancelation when reading a request, otherwise
+	cancellation could happen with a mutex held, which could hang the
+	process on umount
+
+2008-02-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Block SIGCHLD when executing mount and umount
+
+	* fusexmp_fh: avoid unnecessary seeking in readdir
+
+	* Update kernel interface to 7.9:
+
+	* Support receiving file handle from kernel in GETATTR request
+
+	* Allow operations with a NULL path argument, if the filesystem
+	supports it
+
+	* Add support atomic open(O_TRUNC)
+
+	* Support the st_blksize field in struct stat
+
+	* If the "FUSE_THREAD_STACK" environment is set, initialize the
+	stack size of threads by this value.  Patch by Florin Malita
+
+	* Add per-node locking, instead of a global tree lock to protect
+	the path from changing during operations.  Original patch by
+	Rodrigo Castro
+
+2008-02-03  Csaba Henk <csaba.henk@creo.hu>
+
+	* lib/mount_bsd.c:
+	- string formatting fixes
+	- exit if mounting has failed
+	  (in FreeBSD a mount failure is not critical per se, as the daemon
+	  still could be mounted externally, but waiting for such an event
+	  is more confusing than fruitful)
+	- ditch the kvm(8) stuff and simply use forced unmount which just
+	  won't block
+	- prettify option specifications
+	- add "-onosync_unmount" kernel option
+
+2008-01-07  Csaba Henk <csaba.henk@creo.hu>
+
+	* lib/mount_bsd.c:
+	- refine device closing in a race-free way
+	- add support for "-osubtype" on FreeBSD
+
+	* makeconf.sh: make it work under FreeBSD
+
+2008-01-03  Csaba Henk <csaba.henk@creo.hu>
+
+	* lib/mount_bsd.c: close device before unmount
+	(cf. lib/mount.c rev. 1.43) and fix some warnings 
+
+2007-12-23  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix './configure --disable-static'.  Patch from Ismail Dönmez
+
+2007-12-17  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.7.2
+
+2007-12-12  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix kernel module compile for 2.6.24
+
+	* Invalidate attributes of parent directory after create(), since
+	the modification time changes.  Invalidate attributes on rename,
+	since some filesystems may update st_ctime.  Reported by Szabolcs
+	Szakacsits
+
+	* Fix NFS exporting to handle 64bit node IDs
+
+	* Disable old symbol versions if __UCLIBC__ is defined.  If a
+	symbol in a library has multiple versions, the runtime linker in
+	uClibc seems to randomly choose between them.
+
+	* Remove erroneous 'fuse_opt_insert_arg@FUSE_2_5' from
+	fuse_version_script.  fuse_opt_free_args() was added in fuse-2.6.
+
+	* Close fuse device file descriptor before calling umount(),
+	preventing a deadlock when umount is synchronous.  Reported by
+	Szabolcs Szakacsits
+
+2007-11-12  Miklos Szeredi <miklos@szeredi.hu>
+
+	* 'fusermount -u' did not umount the filesystem if /etc/mtab was a
+	symlink.  This bug was introduced in 2.7.1 by "Don't call
+	/bin/[u]mount if /etc/mtab is a symlink".  Found by robertsong.
+
+2007-10-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.7.1
+
+2007-10-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Clarify licence version to be "LGPLv2" for the library
+
+	* kernel fixes:
+
+	* After mount set nlink attribute for the root inode to 1
+
+	* Fix wake up of task waiting for a reserved request
+
+	* Fix allowing setattr, listxattr and statfs for other users
+
+2007-09-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add missing context initialization in fuse_fs_chmod().  Bug
+	found by "iohead"
+
+	* Fix kernel module compilation for 2.6.23.  Based on patch by
+	Marian Marinov
+
+2007-09-04  Philippe Elie  <phil.el@wanadoo.fr>
+
+	* lib/fuse_lowlevel.c: fix a fuse_req leak in do_forget()
+
+2007-07-31  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Work around hotplug issue, that it calls filesystem with file
+	descriptors 0, 1 and 2 not open.  Tracked down by Leif Johnson
+
+2007-07-25  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Don't call /bin/[u]mount if /etc/mtab is a symlink.  Reported by
+	Tomas M
+
+	* Also don't touch /etc/mtab if it is within the mounted
+	filesystem.  Suggested by Jeffrey Law
+
+2007-07-12  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Reset args->argc in fuse_opt_free_args().  Patch by Lucas
+	C. Villa Real
+
+2007-07-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.7.0
+
+2007-07-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Accept a NULL "op" for fuse_main(), etc.  This is useful if
+	filesystem is only invoking fuse to print a help message, or
+	version.  Fixes RedHat bugzilla #217343
+
+2007-06-22  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: fix locking when loading a filesystem module
+
+2007-06-21  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add fs subtype support to mount.fuse
+
+2007-06-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add fs subtype support to libfuse and fusermount
+
+2007-06-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: sync with mainline (2.6.22)
+
+2007-06-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Send debug output to stderr instead of stdout.  Patch by Jan
+	Engelhardt
+
+2007-06-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libulockmgr: Work around a kernel bug in recv(), causing it to
+	sometimes return zero even if data was available on the socket.
+
+2007-05-29  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: optimization: store parent pointer in node instead of
+	parent id
+
+2007-05-25  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: don't create new thread for each FORGET request.  FORGET
+	messages sometimes caused so many threads to be created, that
+	process virtual memory space ran out.  Reported by Chris AtLee
+
+2007-05-24  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: fix memory leak on thread creation failure in multithreaded
+	event loop.  Found by Chris AtLee
+
+2007-05-23  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lowlevel lib: add fuse_reply_iov function, which is similar to
+	fuse_reply_buf, but accepts a vector of buffers.  Patch by Roger
+	Willcocks
+
+2007-05-21  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix Oops or error if a regular file is created with mknod(2) on
+	a fuse filesystem.  Kernels 2.6.18 onward are affected.  Thanks to
+	J. Cameijo Cerdeira for the report
+
+2007-05-11  Csaba Henk <csaba.henk@creo.hu>
+
+	* libfuse: fix return value of fuse_loop()/fuse_loop_mt().
+	Error reported by Csaba Henk, fix by Miklos Szeredi
+
+	* libfuse: fix unlock in flush
+
+	* libfuse: do unlocking on RELEASE+FLUSH
+ 
+2007-05-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.7.0-rc1
+
+2007-05-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: sync with mainline:
+
+	* Use invalidate_mapping_pages() if available
+
+	* Fix BUG when invalid file type is supplied in mount. Patch by
+	Timo Savola
+
+2007-04-27  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: call umount(8) directly instead of fusermount if
+	possible
+
+	* Clean up init script, make it LSB compliant
+
+2007-04-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* In multithreaded loop, use a semaphore instead of SIGHUP to wake
+	up the main thread on umount.  This is more elegant, and works
+	even if signals are blocked.
+
+2007-04-25  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Improve mounting support in libfuse:
+	 - check non-empty mountpoint
+	 - only fall back to fusermount when necessary
+
+2007-04-23  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Don't chdir to "/" in foreground mode, it causes more trouble
+	than it's worth
+
+2007-04-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Replace utils/mount.fuse "sh" script with a "C" program
+
+2007-04-15  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add -lulockmgr to compilation comment in fusexmp_fh.c
+
+2007-04-05  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Check for iconv.  Patch by Csaba Henk
+
+	* Add direct umounting
+
+	* Use "fusectl" as the device for the fusectl filesystem.  Debian
+	Bug#417945.  Reported by Laurent Bonnaud
+
+2007-04-01  Csaba Henk <csaba.henk@creo.hu>
+
+	* Fix some FreeBSD related macros.
+
+2007-03-30  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add support for direct mounting by libfuse.  Fall back on
+	calling fusermount if it doesn't work
+
+2007-03-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.7.0-pre1
+
+2007-03-05  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Correctly handle O_APPEND in direct IO mode.  Reported by Greg
+	Bruno
+
+	* mount.fuse should use /bin/bash.  Debian Bug#413403.  Reported
+	by Thomas Weinbrenner
+
+2007-02-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix detection of installed fuse in init script.  Reported and
+	fix suggested by Davide Canova
+
+2007-02-05  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix 2.6.9 RHEL kernels, which have compatibility mutex.h, but
+	don't define mutex_destroy(), bummer.  Patch from Phil Schwan
+
+2007-02-04  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Compile fuseblk for kernels which don't have an option to turn
+	off the block layer (CONFIG_BLOCK).  Reported by Szakacsits
+	Szabolcs
+
+2007-02-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add filesystem stacking support to high level API.  Filesystem
+	modules can be built into libfuse or loaded from shared object
+	(.so) files
+
+	* Add 'subdir' and 'iconv' built in modules
+
+	* lib/fuse.c: Fix locking for the reply code in create and open
+
+2007-02-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: make it compile on "strange" kernels which have emulated
+	mutexes via <linux/mutex.h> but no i_mutex.  Reported by Tomasz
+	Mateja
+
+2007-01-28  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: fix BUG in control filesystem if it is umounted and
+	mounted again, while some fuse filesystems are present.
+	Bugreport from Florent Mertens
+
+	* kernel: sync with mainline, support 2.6.20
+
+2007-01-22  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib/Makefile.am: actually link libfuse against libfuse_libs
+
+2007-01-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Build fix for 2.6.16 vanila and 2.6.15 FC5 kernels.  Patch from
+	Ian Abbott
+
+2007-01-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix abort in fuse_new() compatibility API for opts == NULL case.
+	Novell bugzilla #233870.  Patch from Takashi Iwai.
+
+2007-01-13  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix option parsing in mount.fuse.  Patch from Jens M. Noedler
+
+2007-01-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix unaligned access in file desctriptor passing in libfuse,
+	fusermount and ulockmgr.  Debian bug ID: 404904.  Reported and
+	tested by Sebastian Fontius
+
+2006-12-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: don't keep unreferenced inodes in the icache.
+
+2006-12-15  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fusermount: Fix detection of fuseblk.  Reported by Szakacsits
+	Szabolcs
+
+	* lib: Fix use after free in fuse_flush().  Reported by Ron
+	Lindman
+
+2006-12-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* mount.fuse: add "setuid=USER" option which does a "su - USER"
+	for the filesystem
+
+	* fusermount: use "/bin/mount -f" to add entry to /etc/mtab, and
+	"/bin/umount" to remove entry from /etc/mtab.  This gets rid of
+	the ugly code dealing with mtab, as well as a possible race
+	between fusermount and mount trying to modify /etc/mtab at the
+	same time
+
+	* Fix "buffer size too small: 4" warning for users of the
+	fuse_loop_mt_proc() function.
+
+2006-12-04  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix warnings with gcc-4.1 on 64bit archs.  Report from
+	Harshavardhana
+
+	* Add extra warning options, and fix resulting warnings
+
+	* Really fix fuse_teardown problem
+
+2006-12-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add -lrt to fuse.pc (if needed) to fix static linking against
+	libfuse.  Reported by Szakacsits Szabolcs
+
+2006-12-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.6.1
+
+2006-11-30  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix API version 21 and 22 compatibility for fuse_teardown.
+	Reported by Bgs
+
+2006-11-29  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fusermount: Print a more helpful message in case the kernel
+	doesn't support the 'fuseblk' filesystem type.  This has been
+	biting ntfs-3g users.  Reported by Yura Pakhuchiy
+
+	* kernel: fix build problem for "make -C ...".  Reported by
+	Stephen Bryant
+
+2006-11-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix bug in certain error paths of lookup routines.  The request
+	object was reused for sending FORGET, which is illegal.  This bug
+	could cause an Oops in linux-2.6.18 or in fuse-2.6.0, and might
+	silently corrupt memory in earlier versions.  Report and test
+	program by Russ Cox
+
+2006-11-11  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Print an error if an incompatible kernel interface version is
+	detected in INIT.  This will only show if filesystem is started
+	with -d or -f
+
+	* Fix order of fuse_destroy()/fuse_unmount() in error cleanup of
+	fuse_setup_common().  Reported by Szakacsits Szabolcs
+
+2006-11-06  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix recursive locking in fuse_create().  Thanks to Takuya
+	Ishibashi for the bug report
+
+2006-10-28  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix automake problem.  Patch from Nix
+
+2006-10-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix mount.fuse to use /bin/sh instead of /bin/bash, which is not
+	always available on embedded systems.  Patch from Paul Smith
+
+	* Fix util/Makefile.am, so that failure to run update-rc.d or
+	device creation doesn't cause make to fail.  Reported by Paul
+	Smith
+
+2006-10-21  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.6.0
+
+2006-10-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fusermount: don't try to create a lock file if /etc/mtab is a
+	symlink.  Report and patch from Alexei Sheplyakov (debian bug
+	#393693)
+
+2006-10-17  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Minor changes, sync with mainline tree
+
+2006-10-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.6.0-rc3
+
+2006-10-15  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: cleanups
+
+2006-10-13  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: Fix compilation on patched 2.6.18 (fc6) and 2.6.19.
+	Report from David Shaw
+
+	* lib: Fix lost error on renaming a file. Report from David Shaw
+
+	* lib: Fix lost error on hiding open files (renaming to
+	.fuse_hiddenXXXX)
+
+	* kernel: Fix a rare hang on SMP/32bit on heavy filesystem
+	activity.  The cause of the bug was that some calls to
+	i_size_write() were not protected by a lock, and hence
+	i_size_seqcount could become corrupted.  This caused subsequent
+	calls to i_size_read() to spin forever.  This is a long standing
+	bug was probably introduced in version 2.2, and thought to be
+	related to NFS exporting (it's not).  It was reported by various
+	people, but Dana Henriksen has finally helped me to track it down,
+	so big thanks to him
+
+	* kernel: Protect against truncation of a swapfile
+
+2006-10-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: Check for signature of super_operations->umount_begin().
+	Ubuntu kernel 2.6.17 seems to use the new signature found in
+	2.6.18.  Thanks to Florent Mertens for the report
+
+2006-10-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Make sure inode numers wrap around at 2^32.  This is needed on
+	dual 64bit/32bit architectures, because 32bit applications using
+	the non-largefile interface would otherwise break (EOVERFLOW error
+	would be returned by the stat() system call family)
+
+	* ulockmgr: handle the case, when a locking operation fails
+	because no more file desctriptors are available in
+	ulockmgr_server.  Also work around a Linux kernel bug (known to
+	exist for all Linux kernel versions <= 2.6.18) which may cause
+	sent file descriptors to be lost in the above case
+
+	* ulockmgr: optimize file descriptor use
+
+	* restore needed cpp flags to util/Makefile.am
+
+	* Install udev rules as 99-fuse.rules instead of 60-fuse.rules
+
+	* Minor clean up of udev rules
+
+	* Add a synchronous DESTROY message to kernel interface.  This is
+	invoked from umount, when the final instance of the filesystem is
+	released.  It is only sent for filesystems mounted with the
+	'blkdev' option for security reasons.
+
+	* If the DESTROY message is received, call the filesystem's
+	->destroy() method.  In this case it's not called from session
+	destruction as it would be otherwise.
+
+2006-10-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.6.0-rc2
+
+2006-10-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add support for FLUSH+RELEASE operation for FreeBSD.  Original
+	patch by Csaba Henk
+
+	* Add init script to insert fuse module and mount the control
+	filesystem.  The script is installed as /etc/init.d/fuse and on
+	debian based systems (where update-rc.d is available) symlinks
+	from /etc/rc*.d/ are also installed.
+
+	* Include '#define FUSE_USE_VERSION=XX' into examples so they
+	become more self contained.
+
+2006-09-30  Miklos Szeredi <miklos@szeredi.hu>
+
+	* API changes:
+
+	* Move lock_owner from a separate argument into fuse_file_info
+
+	* Add a flag to fuse_file_info indicating (1) a highlevel lock
+	operation (unlock all) was initiated by a flush, (2) a lowlevel
+	release operation should perform a flush as well.
+
+	* fusermount: revert modprobe change (2006-08-18) since it
+	doesn't work reliably with udev
+
+	* Add support for block device backed filesystems.  This mode is
+	selected with the 'blkdev' option, which is privileged.
+
+	* Add support for the bmap (FIBMAP ioctl) operation on block
+	device backed filesystems.  This allows swapon and lilo to work on
+	such filesystems.
+
+	* kernel changes:
+
+	* Drop support for kernels earlier than 2.6.9.  Kernel module from
+	previous (2.5.x) release can be used with library from this
+	release
+
+	* In fuse_dentry_revalidate() use dget_parent() instead of
+	dereferencing d_parent, since there's no protection against parent
+	changing and going away
+
+	* Protect nlookup from concurrent updates
+
+	* In lookup if a directory alias exists but is unused,
+	then get rid of it, otherwise return -EBUSY.
+
+	* In mkdir if a directory alias exists, return success, but leave
+	dentry negative.  In reality this could happen if a remote rename
+	immediately followed the mkdir.
+
+	* Don't BUG in fuse_iget() if multiple retries are needed to get a
+	good inode.  This could happen if several lookups are racing for
+	the same inode.
+
+2006-09-29  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix compilation on 2.6.9.  Report from Troy Ayers
+
+2006-09-27  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix Oops in fuse_readpages().  Reported by David Shaw
+
+2006-09-24  Csaba Henk <csaba.henk@creo.hu>
+
+	* Add support for nanosec times on FreeBSD
+
+	* Fix FreeBSD compatibility issues
+
+2006-09-23  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix one more compatibility bug.  Thanks to Ricardo Correia
+
+	* Fix utimens compilation with uClibc.  Patch from Jamie Guinan
+
+2006-09-22  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fixed several compatibility bugs in low level interface.
+	Reported by Ricardo Correia
+
+	* Add workaround for ARM caching bug
+
+2006-09-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Rename new utimes() method to more logical utimens()
+
+2006-09-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fuse tried to unlink already unlinked hidden files.  Bug
+	reported by Milan Svoboda
+
+2006-09-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.6.0-rc1
+
+2006-09-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: Fix unlock on close for kernels < 2.6.18
+
+	* Add ulockmgr library & server.  This can be used for handling
+	file locking requests either directly from libfuse or over a
+	network, etc.  This first version is not optimized and the number
+	of file descriptors it uses may get out of hand
+
+2006-09-07  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: Add interrupt support to high level library, which may be
+	enabled with the 'intr' mount option.
+
+	* When an operation is interrupted the thread handling that
+	operation will receive SIGUSR1 (or other signal specified with the
+	'intr_signal=N' option).  The library installs a no-op signal
+	handler for this signal, unless there's already a handler
+	installed.
+
+	* The filesystem may query interrupt status (regardless of 'intr')
+	with the fuse_interrupted() function.
+
+	* mount.fuse: initialize $HOME if not set.  Report from Sven Goldt
+
+2006-09-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: Multithreaded loop now allows unlimited number of threads.
+	This is needed for locking operations which may block
+	indefinitely.  Also the kernel now doesn't limit the number of
+	outstanding requests so the library shouldn't do so either.
+
+2006-09-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix recursive lock bug in interrupt handling
+
+	* Add utimes() method to highlevel interface, which supports
+	setting times with nanosecond resolution
+
+2006-08-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: fix page leak if fuse_readpages() failed in it's
+	initialization.  Bug found and original patch from Alexander
+	Zarochentsev
+
+	* For linux kernels >=2.6.18 (2.6.19 if using the fuse module from
+	the kernel tree) the statfs method will receive the path within
+	the filesystem on which the stat(v)fs syscall was called
+
+	* fusermount: try to modprobe fuse module if invoked by root and
+	unable to open device.  This is needed with udev, since the device
+	node will be created only when the module is inserted, hence
+	module autoloading won't work.  Reported by Szakacsits Szabolcs
+
+2006-07-30  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fusermount: if selinux is active, restore the original file's
+	security context in unmount_rename().  Redhat bugzilla id 188561.
+	Patch from Yves Perrenoud
+
+	* Add POSIX file locking operation to high level library
+
+	* Initialize context for unlink of hidden files on umount.  Bug
+	reported by Tim Stoakes
+
+2006-07-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Multiple release() calls can race with each other, resulting in
+	the hidden file being deleted before the last release finishes.
+	Bug found and patch tested by Mark Huijgen
+
+2006-07-05  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fusermount: if /dev/fuse doesn't exist, suggest modprobing fuse;
+	this makes sense on systems using udev.  Reported by Szakacsits
+	Szabolcs
+
+2006-06-29  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.6.0-pre3
+
+2006-06-29  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Support in kernel module for file locking and interruption.  The
+	same functionality is available in official kernels >= 2.6.18
+
+2006-06-28  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add POSIX file locking support
+
+	* Add request interruption
+
+2006-06-06  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add missing pthread_rwlock_destroy().  Patch from Remy Blank
+
+2006-06-05  Remy Blank <remy.blank@pobox.com>
+
+	* lib: canonicalize mount point in fuse_helper_opt_proc() so that
+	unmounting succeeds even if mount point was relative.
+
+2006-06-04  Csaba Henk <csaba.henk@creo.hu>
+
+	* lib: fix emergency umount in helper.c when malloc fails.
+	(The way it was done would end up in a segfault.)
+
+2006-06-01  Csaba Henk <csaba.henk@creo.hu>
+
+	* lib: adjust threading related compiler flags.
+	Switch to "-pthread" from "-lpthread" as that's the preferred
+	one on several platforms. Consulted with Terrence Cole and
+	Miklos Szeredi
+
+2006-05-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: search fusermount in installation directory (bindir) as
+	well as in PATH.
+
+2006-05-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: fix compilation if CLOCK_MONOTONIC is not defined.
+	Reported by Christian Magnusson
+
+2006-04-23  Csaba Henk <csaba.henk@creo.hu>
+
+	* lib: make FreeBSD mount routine recognize if kernel features
+        backgrounded init and if it does, run the mount util in foreground
+        (similarly to Linux)
+
+2006-04-21  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: fix fput deadlock fix, the lockless solution could lead
+	to "VFS: busy inodes after umount..."
+
+	* kernel: fix race between checking and setting file->private_data
+	for the device.  Found by Al Viro
+
+2006-04-11  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: remove request pool, instead allocate requests on
+	demand.  Account the number of background requests, and if they go
+	over a limit, block the allocation of new requests.
+
+	* kernel: fix deadlock if backgrounded request holds the last
+	reference to the super block
+
+	* kernel: don't use fuse_reset_request() during direct I/O
+
+2006-04-06  Csaba Henk <csaba.henk@creo.hu>
+
+	* lib: Let FreeBSD mount option parsing routine recognize "no"
+	prefixes for FUSE specific options as well
+
+2006-04-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: Add missing rwlock initialization.  Patch by Ryan Bradetich
+
+2006-03-17  Miklos Szeredi <miklos@szeredi.hu>
+
+	* API changes:
+
+	* fuse_main(), fuse_setup() and fuse_new() have an additionl
+	user_data parameter
+
+	* fuse_mount() returns a 'struct fuse_chan' pointer instead of a
+	file descriptor
+
+	* fuse_unmount() receives a 'struct fuse_chan' pointer.  It
+	destroys the given channel
+
+	* fuse_teardown() no longer has a file descriptor parameter
+
+	* new exported functions: fuse_session_remove_chan(),
+	fuse_get_session(), fuse_daemonize()
+
+	* fuse_chan_recv() may now return a new channel which will be used
+	to send the reply
+
+2006-03-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.6.0-pre2
+
+2006-03-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Don't unmount if already unmounted.  This fixes a problem seen
+	in the following situation: Lazy unmount a busy filesystem; Mount
+	a new one in top; When the first finally unmounts, the second also
+	unmounts.  Reported by Franco Broi
+
+2006-03-15  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lowlevel lib: use indirect function calls instead of a
+	switch/case construct.  Besides increased efficiency it helps
+	maintainability & readability too.  Patch from Florin Malita
+
+2006-03-13  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: replace global spinlock with a per-connection spinlock
+
+2006-03-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix source compatibility breakage for fuse_unmount().  Report
+	from Yura Pakhuchiy
+
+2006-03-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix O_ASYNC handling in fuse_dev_release().  From Jeff Dike
+
+2006-03-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add O_ASYNC and O_NONBLOCK support to FUSE device.  Patch by
+	Jeff Dike
+
+	* Renamed fuse_chan_receive() to fuse_chan_recv() and changed
+	interface to return -errno in case of error.
+
+2006-03-01  Csaba Henk <csaba.henk@creo.hu>
+
+	* libfuse: pass device file descriptor to fuse_unmount(), rewrite
+	FreeBSD implementation so that it uses libc (sysctl backed) instead
+	of an embdedded script (kmem backed). Adjust the control flow of
+	hello_ll so that device doesn't get closed before unmount attempt.
+
+2006-02-25  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Lowlevel lib: return all-zero statvfs data if filesystem doesn't
+	implement method.  This is needed on FreeBSD, and nicer on Linux
+	too.  Highlevel lib already did this.  Reported by Csaba Henk
+
+	* Fix negative entry handling.  There was a bug, that negative
+	lookups with timeouts (nodeid == 0) returned -EIO.
+
+2006-02-23  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix race between RELEASE and UNLINK, which might leave
+	.fuse_hidden* files around
+
+2006-02-21  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fusexmp_fh: implement flush() method and call close() on the
+	open file descriptor.  This is needed if used on an NFS
+	filesystem, which buffers data until file is closed.  Franco Broi
+	spotted the situation when 'cp -p' failed to set the modification
+	time because of this.
+
+2006-02-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.6.0-pre1
+
+2006-02-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: fix use-after-free bug in interruptred reply_entry().
+	Patch from John Muir
+
+	* libfuse: fix wrong symbol versioning for fuse_mount.  Debian bug
+	ID: 352631.  Found by Stéphane Rosi
+
+2006-02-17  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Lowlevel lib: Unify fuse_dirent_size() and fuse_add_dirent()
+	into a single function fuse_add_direntry().  This cleans up the
+	interface and makes it possible to do stacking.
+
+2006-02-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix rare race betweeen abort and release caused by failed iget()
+	in fuse_create_open().
+
+	* Add 'ac_attr_timeout' option e.g. for filesystems which do their
+	own attribute caching.
+
+2006-02-15  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Work around FreeBSD runtime linker "feature" which binds an old
+	version of a symbol to internal references if the symbol has more
+	than one version.  This resulted in infinite recursion in
+	fuse_lowlevel_new_compat25().
+
+2006-02-10  Csaba Henk <csaba.henk@creo.hu>
+
+	* Refine clock_gettime() querying so that linker options
+	shall be set as it's appropriate for the target platform.
+
+2006-02-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix udev rule syntax.  Reported by Nix
+
+2006-02-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* In some cases udev rule seems to be ineffective when installed
+	as 40-fuse.rules but work as 60-fuse.rules.  Reported by John Hunt
+
+2006-02-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix compilation when build directory is different from source
+	directory.  Reported by Frédéric L. W. Meunier
+
+2006-02-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix even bigger bug introduced in fix for request_end() on
+	2006-01-14.  Reported by Gal Rosen
+
+2006-01-30  Miklos Szeredi <miklos@szeredi.hu>
+
+	* highlevel-lib: add 'auto_cache' option.  This caches file data
+	based on modification time and size
+
+2006-01-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Sanitize storage type and help message in mount_bsd.c.  Patch
+	from Csaba Henk
+
+	* fuse_opt: add new helper constants FUSE_OPT_KEY_KEEP and
+	FUSE_OPT_KEY_DISCARD
+
+	* Add options 'max_readahead', 'sync_read' and 'async_read'
+
+	* Kernel ABI version 7.6:
+
+	* Negotiate the 'max_readahead' value and 'async_read' flags with
+	userspace in the INIT method
+
+	* Add connection info to ->init() methods to both lowlevel and
+	highlevel API
+
+	* Fall back to synchronous read() behavior if either library or
+	userspace filesystem is using the old interface version.  This is
+	needed so non-updated filesystems won't be confused by the
+	different read() behavior
+
+2006-01-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: if "fsname=" option was given, pass it to fusermount
+
+	* fuse_opt: add new fuse_opt_insert_arg() function, which is
+	needed by filesystems to implement some argument manipulations
+	correctly
+
+	* fuse_opt: fix memory leak in handling "--" option
+
+2006-01-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: fix detection of case when fuse is not configured into
+	the kernel either as module or built-in
+
+	* fuse_opt.h: fix incompatibility with C++ compilers by renaming
+	'template' structure member to 'templ'.  Reported by Takashi Iwai
+
+	* fuse.h: fix compatibility bugs.  Patch by Yura Pakhuchiy
+
+	* kernel: support version 2.6.16 (i_sem -> i_mutex)
+
+2006-01-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Added (again) asynchronous readpages support
+
+	* Each connection now shows up under /sys/fs/fuse/connections
+
+	* Connection attributes exported to sysfs: 'waiting' number of
+	waiting requests; 'abort' abort the connection
+
+	* Connection may be aborted through either the sysfs interface or
+	with 'umount -f mountpoint'
+
+2006-01-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.5.0
+
+2006-01-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: fix a couple of bugs
+
+	* Order of request_end() and fuse_copy_finish() was wrong.
+	Posthumous note: Franco Broi managed to exploit this, though it
+	seemed quite impossible
+
+	* request_end() used request pointer after decrementing refcount
+
+	* Clearing ->connected or ->mounted connection flags could race
+	with setting other bitfields not protected with a lock
+
+2006-01-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: add necessary compile flags for 2.4.X/x86_64.
+	Report from Sean Ziegeler
+
+2006-01-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.5.0-pre2
+
+2006-01-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Applied patch from Csaba Henk, to update mount_bsd to new
+	fuse_mount() semantics
+
+	* Ignore auto,noauto,... options in mount.fuse.  Reported by Frank
+	Steiner and Don Taber
+
+	* fusermount: add 'dirsync' mount option
+
+2006-01-07  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Improved help reporting and added version reporting to library
+
+2006-01-06  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Change working directory to "/" even if running in the
+	foreground.  Patch from Jonathan Brandmeyer
+
+	* Changed lots of functions to use 'struct fuse_args' instead of
+	separate argc and argv
+
+	* Added fuse_parse_cmdline(), fuse_set_signal_handlers() and
+	fuse_remove_signal_handlers() functions, so that it's now pretty
+	easy to get all the functionality of fuse_main() with a filesystem
+	using the lowlevel API.
+
+2006-01-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* mount.fuse: the 'user' option should be ignored. Report and
+	solution from Mattd.
+
+	* mount.fuse: export PATH in the right place. Report and patch
+	from Hannes Schweizer
+
+2005-12-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Clean up the option parsing interface slightly, by creating an
+	"argument list" structure, that contains the argument vector and
+	count
+
+2005-12-15  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fusermount: check if /mnt/mtab is a symlink and don't modify it
+	in that case
+
+	* kernel: simplify request size limiting. INIT only contains
+	maximum write size, maximum path component size remains fixed at
+	1024 bytes, and maximum xattr size depends on read buffer.
+
+2005-12-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix readdir() failure on x86_64, of 32bit programs compiled
+	without largefile support.  Bug report and help from Anthony
+	Kolasny
+
+	* If lookup returns invalid mode, return -EIO instead of creating
+	a regular file
+
+	* Add current output argument vector to option processing
+	function
+
+2005-12-12  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix stale code in ifdef FreeBSD.  Patch from Csaba Henk
+
+2005-12-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.5.0-pre1
+
+2005-12-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: added option parsing interface, defined in
+	<fuse_opt.h>.
+
+2005-12-07  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Return EIO for file operations (read, write, fsync, flush) on
+	open files whose inode has become "bad".  Inodes will be marked
+	"bad" if their type changes.  Bug report by Csaba Henk
+
+2005-12-06  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Use bigger request buffer size.  write() did not work on archs
+	with > 4k page size, Bug report by Mark Haney
+
+	* ABI version 7.5:
+
+	* Extend INIT reply with data size limits
+
+2005-12-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix memory leak in fuse_read_cmd()/fuse_process_cmd().  Bug
+	reported by Vincenzo Ciancia
+
+	* Handle exit-by-umount in fuse_read_cmd()
+
+2005-11-29  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Check if '-msoft-float' option is supported by compiler when
+	configuring for a 2.4.x kernel.  Bug report by Mark Haney
+
+	* In multithreaded loop send a TERM signal to the main thread if
+	one of the other threads exit.  Needed on FreeBSD for a clean exit
+	on umount.  Should not cause any harm on Linux either
+
+2005-11-28  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix bug in 32-bit file handle compatibility
+
+2005-11-27  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Block TERM, INT, HUP and QUIT signals in all but the main
+	thread.  According to POSIX it's not specified which thread will
+	receive these signals.
+
+	* Kernel changes:
+
+	* Check for directory aliasing on mkdir, not just on lookup
+
+	* Check for special node ID values in create+open operation
+
+	* Sync with -mm: readv, writev, aio_read and aio_write methods
+	added to file operations
+
+	* Cleanups: lookup code, page offset calculation
+
+	* ABI stepped to 7.4, changes:
+
+	* frsize member added to fuse_kstatfs structure
+
+	* added support for negative entry caching: on lowlevel API if
+	fuse_entry_param::ino is set to zero in reply to a lookup request,
+	the kernel will cache the dentry for the specified amount of time.
+
+	* libfuse: added 'negative_timeout' option: specifies how much
+	negative entries should be cached.  Default is zero, to be
+	compatible with prior versions
+
+2005-11-22  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add detection of mainline FUSE code in running kernel
+
+2005-11-21  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Don't use async cancelation in multithreaded loop.  This makes
+	it more portable to systems where read() is not async cancel safe.
+	Report from Andriy Gapon
+
+2005-11-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Warn if API version 11 compatibility is requested
+
+2005-11-17  Miklos Szeredi <miklos@szeredi.hu>
+
+	* More FreeBSD merge
+
+	* fusermount: don't allow mountpoints with '\n', '\t', or '\\' in
+	them, because it corrupts /etc/mtab.  Found by Thomas Biege
+	CVE-2005-3531
+
+	* libfuse: don't use system() to invoke 'fusermount -u ...'
+	because it breaks mountpoints with spaces in them into multiple
+	arguments
+
+2005-11-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Merge library part of FreeBSD port.  Patch by Csaba Henk
+
+2005-11-11  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Use 64bit type for file handle, so the full range supported by
+	the kernel interface is available to applications
+
+2005-11-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Moved mountpoint argument checking from fuse_parse_cmdline() to
+	fuse_mount() in preparation to FreeBSD merge.
+
+2005-11-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Remove unneeded close() from fuse_teardown().  Spotted by Csaba
+	Henk.
+
+2005-11-07  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Make the statfs change backwards compatible.
+
+2005-11-06  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Change ->statfs() method to use 'struct statvfs' instead of
+	'struct statfs'.  This makes the API more portable since statvfs()
+	is defined by POSIX.
+
+2005-10-28  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add fgetattr() method, which currently will only be called after
+	a successful call to a create() method.
+
+2005-10-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Change kernel ABI version to 7.3
+
+	* Add ACCESS operation.  This is called from the access() system
+	call if 'default_permissions' mount option is not given, and is
+	not called on kernels 2.4.*
+
+	* Add atomic CREATE+OPEN operation.  This will only work with
+	2.6.15 (presumably) or later Linux kernels.
+
+	* Add ftruncate() method.  This will only work with 2.6.15
+	(presumably) or later Linux kernels.
+
+	* Fix kernel module compile if kernel source and build directories
+	differ.  Report and initial patch by John Eastman
+
+2005-10-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: optimize buffer reallocation in fill_dir.
+
+2005-10-17  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.4.1
+
+2005-10-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: add debug for write result (by Shaun Jackman) and
+	warnings for too large read/write result
+
+2005-10-11  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Spelling fixes, thanks to Ioannis Barkas
+
+2005-10-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fuse_common.h: use extern "C".  Thanks to Valient Gough for the
+	patch
+
+2005-10-07  Miklos Szeredi <miklos@szeredi.hu>
+
+	* highlevel-lib: init() and destroy() methods didn't have an
+	initialized fuse_context.  Bug reported by Tim Stoakes
+
+2005-10-04  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.4.0
+
+2005-10-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add documentation to fuse_lowlevel.h
+
+	* API cleanups:
+
+	* Remove definitions of unused FATTR_CTIME / FUSE_SET_ATTR_CTIME
+
+	* Move fuse_mount() and fuse_unmount() to fuse_common.h
+
+	* Change the return type of fuse_reply_none() from int to void.
+
+2005-09-30  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: NFS exporting leaked dentries.  Bug found and fixed by
+	Akshat Aranya.
+
+2005-09-29  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fusermount: fix error message, when unable to open /dev/fuse.
+	Report by Balázs Pozsár
+
+2005-09-28  Miklos Szeredi <miklos@szeredi.hu>
+
+	* UClibc fixes from Christian Magnusson
+
+2005-09-27  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Added NAME="%k" to util/udev.rules.  Fix by Mattias Wadman.
+
+2005-09-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.4.0-rc1
+
+2005-09-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fusermount: allow user umount in the case when /etc/mtab is a
+	symlink to /proc/mounts.  Reported by Balázs Pozsár.
+
+2005-09-23  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Check for special node ID values in lookup and creation
+
+2005-09-22  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Slight optimization in returning EINVAL error in case of an open
+	with O_DIRECT flag.
+
+2005-09-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Remove '--enable-auto-modprobe' configure flag.  Module
+	auto-loading is now handled by the kernel.
+
+2005-09-15  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Install UDEV rule file, so /dev/fuse is created with mode 0666.
+	Help from Jens M. Noedler.
+
+2005-09-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add memory cleanup on thread exit
+
+2005-09-13  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Set umask to zero in fusexmp and fusexmp_fh, so that
+	files/directories are created with the requested mode.
+
+2005-09-12  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Don't ignore read error in multithreaded loop
+
+2005-09-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.4.0-pre2
+
+2005-09-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Revert lock and access operations.  Postpone these until 2.5.
+
+2005-09-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix compile warning on 2.6.13 and later
+
+	* Fix compilation on old kernels
+
+2005-08-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: always refresh directory contents after rewinddir() to
+	conform to SUS.  Bug found by John Muir.
+
+2005-08-15  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.4.0-pre1
+
+2005-08-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: cleaned up (or messed up, depending on your POV) the low
+	level library API.  Hopefully this is close to the final form.
+
+2005-08-05  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fusermount: don't allow empty mountpoint argument, which defeats
+	automatic umounting in fuse_main().  Bugreport by Václav Jůza
+
+2005-08-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fix warnings in fuse.h and fuse_lowlevel.h if -Wshadow compiler
+	option is used (Paul Alfille).
+
+2005-08-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* highlevel-lib: added mount options "attr_timeout" and
+	"entry_timeout".  These options control the length of time file
+	attributes and entries (names) are cached.  Both default to 1.0
+	second.
+
+	* kernel: correctly handle zero timeout for attributes and entries
+
+2005-08-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Added missing symbols to versionscript (Joshua J. Berry)
+
+	* kernel: implement two flags, open can set: 'direct_io' and
+	'keep_cache'.  These correspond exactly to mount options
+	'direct_io' and 'kernel_cache', but allow a per-open setting.
+
+	* Move 'direct_io' and 'kernel_cache' mount option handling to
+	userspace.  For both mount options, if the option is given, then
+	the respective open flag is set, otherwise the open flag is left
+	unmodified (so the filesystem can set it).
+
+	* lib (highlevel): make open method optional
+
+2005-07-28  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: invalidate attributes for read/readdir/readlink
+	operations
+
+	* kernel: detect newer UML kernels
+
+2005-07-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Make the installation path of fuse.ko and mount.fuse
+	configurable through INSTALL_MOD_PATH and MOUNT_FUSE_PATH
+	environment variables.  Requirement and help from Csaba Henk.
+
+2005-07-22  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix bug, that causes filesystem requests to hang when unique
+	request counter becomes negative.  This happens after
+	2,147,483,648 operations, so most people won't care.  Thanks to
+	Franco Broi for the report and testing.
+
+2005-07-21  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Don't change mtime/ctime/atime to local time on read/write.
+	Bug reported by Ben Grimm
+
+	* Install fuse_common.h and fuse_lowlevel.h.  Report by Christian
+	Magnusson
+
+	* fusermount: use getopt_long() for option parsing.  It allows the
+	use of '--' to stop argument scanning, so fusermount can now
+	operate on directories whose names begin with a '-'.  Patch by
+	Adam Connell
+
+2005-07-15  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fusermount: add '-v', '--version' and '--help' options
+
+	* add inode based API
+
+2005-07-12  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: don't block signals in worker threads.  Problem noticed by
+	Usarin Heininga
+
+2005-07-07  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: don't allow both 'allow_other' and 'allow_root' options to
+	be given
+
+2005-07-06  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fusermount: check if mountpoint is empty (only '.' and '..' for
+	directories, and size = 0 for regular files).  If "nonempty"
+	option is given, omit this check.  This is useful, so users don't
+	accidentally hide data (e.g. from backup programs).  Thanks to
+	Frank van Maarseveen for pointing this out.
+
+	* kernel: check if mandatory mount options ('fd', 'rootmode',
+	'user_id', 'group_id') are all given
+
+	* lib: simplify 'readdir_ino' handling
+
+	* lib: add mount options 'umask=M', 'uid=N', 'gid=N'
+
+2005-07-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: clean up 'direct_io' code
+
+2005-06-28  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add 'mount.fuse' written by Petr Klima
+
+	* '/dev/fuse' is created by 'make install' if does not yet exist
+
+2005-06-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix UCLIBC compile error.  Patch by Christian Magnusson
+
+2005-06-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Enable the auto-loading of the module via access to the
+	corresponding device file.  Patch by Takashi Iwai.
+
+	* Allow mounting a regular file (over a regular file) for
+	unprivleged users.
+
+	* Do not create temporary device file.  Require "/dev/fuse" to
+	exist, and be readable/writable by the mounting user.
+
+2005-06-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.3.0
+
+2005-06-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix serious information leak: if the filesystem returns a short
+	byte count to a read request, and there are non-zero number of
+	pages which are not filled at all, these pages will not be zeroed.
+	Hence the user can read out previous memory contents.  Found by
+	Sven Tantau.
+
+2005-05-27  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add "readdir_ino" mount option, which tries to fill in the d_ino
+	field in struct dirent.  This mount option is ignored if "use_ino"
+	is used.  It helps some programs (e.g. 'pwd' used over NFS from a
+	non-Linux OS).  Patch by David Shaw.
+
+2005-05-12  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.3-rc1
+
+2005-05-12  Miklos Szeredi <miklos@szeredi.hu>
+
+	* File save in krusader and other editors doesn't work with sshfs,
+	because open() is interrupted by a periodic signal, and open()
+	restarts forever, without any progress.  This could just be fixed
+	in open(), but the problem is more generic: if signals are
+	received more often than the filesystem can get the request to
+	userspace, it will never finish.  This is probably only a
+	theoretical problem, nevertheless I'm removing the possibility to
+	interrupt requests with anything other than SIGKILL, even before
+	being sent to userspace.  Bugreport by Eduard Czimbalmos.
+
+2005-05-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: add "tree_lock" rwlock, that is locked for write in
+	rename, unlink and rmdir, and locked for read in all other
+	operations.  This should fix the rename/release race reported by
+	Valient Gough and others.  The solution is very coarse, a finer
+	grained locking scheme could be implemented, but it would be much
+	more complex.  Let's see whether this is good enough.
+
+2005-05-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.3-pre7
+
+2005-05-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Better fix for out of order FORGET messages.  Now the
+	LOOKUP/FORGET messages are balanced exactly (one FORGET can
+	balance many lookups), so the order no longer matters.  This
+	changes the kernel ABI slightly, but the library remains backward
+	compatible.
+
+2005-05-06  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix abort for out of order FORGET messages.  Again.  Spotted by
+	Franco Broi again.  Sorry :)
+
+2005-04-29  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.3-pre6
+
+2005-04-29  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Make fusermount work with fuse kernel modules not yet supporting
+	the "group_id" option (added for the purpose of stricter
+	permission checking).
+
+2005-04-28  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Check for hard-linked directories in lookup.  This could cause
+	problems in the VFS, which assumes that such objects never exist.
+
+	* Make checking of permission for other users more strict.  Now
+	the same privilege is required for the mount owner as for ptrace
+	on the process performing the filesystem operation.
+
+2005-04-23  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.3-pre5
+
+2005-04-22  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add -msoft-float to kernel module compile flags for 2.4.X.  This
+	is needed on certain architectures.  Report from Chris Kirby
+
+	* Fix buggy behavior of open(..., O_CREAT|O_EXCL) if interrupted.
+	Reported by David Shaw
+
+	* Remove "allow_root" option from kernel module, and implement
+	it's functionality in the library
+
+	* Fix Oops caused by premature release of fuse_conn.  Clean up
+	related code, to be more readable
+
+	* Sendfile should not use page cache if "direct_io" mount option
+	is given
+
+2005-04-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix Oops in case of nfs export.  Spotted by David Shaw
+
+	* Fix another Oops in case of write over nfs with direct_io turned
+	on.  Again spotted by David Shaw
+
+2005-04-07  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.3-pre4
+
+2005-04-07  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: finalized new readdir() interface, which now supersedes the
+	getdir() method.
+
+2005-04-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.3-pre3
+
+2005-04-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Implement backward compatibility with version 5 kernel ABI
+
+2005-04-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.3-pre2
+
+2005-04-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: fix dirent offset handling
+
+	* lib: add readdir and releasedir methods
+
+	* lib: use fh field of fuse_file_info in opendir, readdir,
+	releasedir and fsyncdir methods
+
+	* lib: check kernel API version and bail out of it's old.  This
+	will be properly fixed in the next release
+
+2005-03-31  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.3-pre1
+
+2005-03-31  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel API: add padding to structures, so 64bit and 32bit
+	compiler will return the same size
+
+	* kernel API: add offset field to fuse_dirent.  This will allow
+	more sophisticated readdir interface for userspace
+
+	* kernel API: change major number to 6
+
+	* kernel: fix warnings on 64bit archs
+
+	* kernel: in case of API version mismatch, return ECONNREFUSED
+
+2005-03-24  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: trivial cleanups
+
+2005-03-21  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add fsyncdir() operation
+
+2005-03-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: add locking to background list (fixes previous fix)
+
+2005-03-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: fix bug which could cause leave busy inodes after
+	unmount, and Oops.
+
+2005-03-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* examples: add -lpthread to link flags to work around valgrind
+	quirk
+
+	* lib: don't exit threads, so cancelation doesn't cause segfault
+
+2005-03-04  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: fix nasty bug which could cause an Oops under certain
+	situations.  Found by Magnus Johansson
+
+2005-02-28  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: added opendir() method.  This can be used in case
+	permission checking in getdir() is too late.  Thanks to Usarin
+	Heininga for pointing out this deficiency
+
+	* libfuse: added init() and destroy() methods to fuse_operations
+
+	* kernel: llseek() method for files and directories made explicit
+
+	* kernel: fixed inode leak in NFS export in case of nodeid
+	wrapping
+
+2005-02-15  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse: clean up some unitialized memory found with valgrind
+
+	* Add -lpthread to Libs in fuse.pc.  Valgrind seems to need an
+	explicitly linked libpthread for applications
+
+2005-02-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fusermount: set umask, otherwise /etc/mtab will have
+	unpredictable permission.  Spotted by Jindrich Kolorenc
+
+	* fusermount: set owner and group of /etc/mtab to original values
+	on unmount
+
+	* libfuse: add 'use_ino' option to help.  Patch by Valient Gough
+
+2005-02-07  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Cleaned up directory reading (temporary file is not used)
+
+2005-02-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.2
+
+2005-02-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix possible race when operation is interrupted
+
+2005-01-28  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix compilation on 2.6.7
+
+2005-01-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.2-pre6
+
+2005-01-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix bug in link() operation which caused the wrong path to be
+	passed as the first argument.  Found by Anton Altaparmakov
+
+2005-01-21  Miklos Szeredi <miklos@szeredi.hu>
+
+	* LIB: fix double reply in readdir operation
+
+	* fusermount: fix uid checking bug.  Patch by Adam Connell
+
+	* KERNEL: fix compile on various RedHat patched 2.4 kernels.
+	Patch by Keshava Gowda
+
+2005-01-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* KERNEL: provide correct llseek semantics for fuse device (fixes
+	a bug on Progeny 2.4.20 kernel).  Reported by Valient Gough
+
+2005-01-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.2-pre5 (matches kernel 2.6.11-rc1-mm2)
+
+2005-01-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* KERNEL ABI: remove GETDIR operation, and add OPENDIR, READDIR
+	and RELEASEDIR.  This ends the ugly hack of passing a file
+	descriptor to the kernel, and actually makes the code simpler.
+
+2005-01-17  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.2-pre4
+
+2005-01-17  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fusermount: remove capability setting, which was the cause of
+	problems for some users.  It seems that FS related capabilities
+	are removed by setfsuid(), so this isn't even needed.
+
+2005-01-15  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fix compilation on 2.4 kernels (reported by Valient Gough)
+
+	* fix failure to unmount bug (found by David Shaw)
+
+	* fusermount: improve parsing of /etc/fuse.conf
+
+2005-01-13  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Remove 'mount_max' and 'user_allow_other' module options.  These
+	are now checked by fusermount, and can be set in /etc/fuse.conf
+
+	* KERNEL: change check for fsid == 0 to capable(CAP_DAC_OVERRIDE)
+
+2005-01-11  Miklos Szeredi <miklos@szeredi.hu>
+
+	* KERNEL: fix possible inode allocation problem, where
+	sizeof(struct inode) is not aligned (found by Mike Waychison)
+
+	* KERNEL: use new follow_link/put_link methods
+
+	* KERNEL: cosmetic fixes
+
+2005-01-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.2-pre3
+
+2005-01-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add missing code that was accidently left out
+
+2005-01-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.2-pre2
+
+2005-01-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Change "uid" mount option to "user_id" to avoid confusion with a
+	mount option "uid" commonly used by many filesystems
+
+2005-01-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.2-pre1
+
+2005-01-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* If FUSE is configured in the kernel, don't build it by default
+
+2005-01-07  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Compile fix by Christian Magnusson
+
+2005-01-05  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix compilation for 2.6.{0-5} kernels
+
+2005-01-04  Miklos Szeredi <miklos@szeredi.hu>
+
+	* KERNEL: if request is interrupted, still keep reference to used
+	inode(s) and file, so that FORGET and RELEASE are not sent until
+	userspace finishes the request.
+
+	* remove /{sys,proc}/fs/fuse/version, and instead add an INIT
+	request with the same information, which is more flexible,
+	simpler, works on embedded systems.
+
+2004-12-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* KERNEL ABI: update interface to make it independent of type
+	sizes.  This will help on 64 bit architectures which can run
+	legacy 32 bit applications.
+
+	* KERNEL ABI: add "len" field to request headers.  This will allow
+	sending/receiving requests in multiple chunks.
+
+	* KERNEL: handle file type change more intelligently
+
+	* LIB: "-o debug" option should disable backgrounding (fix by
+	Fabien Reygrobellet)
+
+2004-12-13  Miklos Szeredi <miklos@szeredi.hu>
+
+	* KERNEL: invalidate dentry/attributes if interrupted request
+	could leave filesystem in an unknown state.
+
+2004-12-12  Miklos Szeredi <miklos@szeredi.hu>
+
+	* KERNEL: lots of cleanups related to avoiding possible deadlocks.
+	These will cause some regressions, but stability is considered
+	more important.  If any of these features turns out to be
+	important, it can be readded with the deadlock problems addressed.
+
+	* Make all requests interruptible (only with SIGKILL currently).
+	This can be used to break any deadlock produced by the userspace
+	filesystem accessing it's own exported files.  The RELEASE request
+	is special, because if it's interrupted before sending it to
+	userspace it is still sent, but the reply is not awaited.
+
+	* If request is interrupted before being sent to userspace, and if
+	it hasn't yet got any side effects, it is always restarted,
+	regardless of the SA_RESTART flag.  This makes these interruptions
+	transparent to the process.
+
+	* Remove shared-writable mmap support, which was prone to an
+	out-of-memory deadlock situation
+
+	* Remove INVALIDATE userspace initiated request
+
+	* Make readpages() synchronous.  Asynchronous requests are
+	deadlock prone, since they cannot be interrupted.
+
+	* Add readv/writev support to fuse device operations
+
+	* Remove some printks, which userspace FS can use for a DoS
+	against syslog
+
+	* Remove 'large_read' mount option from 2.6 in kernel, check it in
+	fusermount instead
+
+	* LIB: improve compatibility with a fuse.h header installed in
+	${prefix}/include which in turn includes the real header.
+
+	* LIB: improve compatibility by defining fuse_main() (which is now
+	not used), so old configure scripts find it.
+
+2004-12-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* When mounting on a subdirectory of / don't duplicate slashes at
+	the beggining of path (spotted by David Shaw)
+
+2004-12-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix bug causing garbage in mount options (spotted by David Shaw)
+
+2004-12-07  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add 'writepage' flag to 'fuse_file_info'.
+
+	* More comments in fuse.h
+
+	* Get rid of double underscores
+
+2004-12-04  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add -D_FILE_OFFSET_BITS=64 to cflags provided by pkg-config
+
+	* helper.c: add -ho option, which only displays the options not
+	the usage header.  This can be used by filesystems which have
+	their own options.
+
+2004-12-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add source compatibility to 2.1 and 1.1 APIs.  To select betwen
+	versions simply define FUSE_USE_VERSION to 22, 21 or 11 before
+	including the fuse header
+
+	* Add binary compatibility to 2.1 version of library with symbol
+	versioning
+
+2004-12-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.1
+
+2004-12-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: clean up writing functions
+
+	* kernel: no allocation on write in direct_io mode
+
+	* move linux/fuse.h to fuse_kernel.h
+
+2004-11-30  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: clean up reading functions
+
+2004-11-29  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel: make readpage() uninterruptible
+
+	* kernel: check readonly filesystem flag in fuse_permission
+
+	* lib: don't die if version file not found and new style device
+	exists
+
+	* lib: add '-r' option, which is short for '-o ro'
+
+	* fusermount: simplify device opening
+
+	* kernel: when direct_io is turend on, copy data directly to
+	destination without itermediate buffer.  More efficient and safer,
+	since no allocation is done.
+
+	* fusermount: fix warning if fuse module is not loaded
+
+	* kernel: use /dev/fuse on 2.4 too
+
+2004-11-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* libfuse API change: open, read, write, flush, fsync and release
+	are passed a 'struct fuse_file_info' pointer containing the open
+	flags (open and release), and the file handle.  Verion changed to
+	3.0.
+
+2004-11-23  Miklos Szeredi <miklos@szeredi.hu>
+
+	* More cleanups in the kernel
+
+	* The 10,229 charater device number has been assigned for FUSE
+
+	* Version file checking fix (reported by Christian Magnusson)
+
+	* fusermount: opening the fuse device now doesn't need /sys.
+
+	* Optimize reading by controlling the maximum readahead based on
+	the 'max_read' mount option
+
+	* fixes for UCLIBC (Christian Magnusson)
+
+2004-11-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Cleaned up kernel in preparation for merge into mainline:
+
+	* Use /sys/fs/fuse/version instead of /proc/fs/fuse/version
+
+	* Use real device (/dev/fuse) instead of /proc/fs/fuse/dev
+
+	* __user annotations for sparse
+
+	* allocate individual pages instead of kmalloc in fuse_readdir,
+	fuse_read and fuse_write.
+
+	* Fix NFS export in case "use_ino" mount option is given
+
+	* Make libfuse and fusermount compatible with future versions
+
+	* fusermount: properly add mount options to /etc/mtab
+
+2004-11-15  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fusermount: do not resolve last component of mountpoint on if it
+	is '.' or '..'.  This new path resolvation is now done on mount as
+	well as unmount.  This enables relative paths to work on unmount.
+
+	* fusermount: parse common mount options like "ro", "rw", etc...
+
+	* Allow module params to be changed through sysfs
+
+2004-11-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 2.1-pre1
+
+2004-11-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix bug in fuse_readpages() causing Oops in certain situations.
+	Bug found by Vincenzo Ciancia.
+
+	* Fix compilation with kernels versions > 2.6.9.
+
+2004-11-11  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Check kernel interface version in fusermount to prevent
+	strangeness in case of mismatch.
+
+	* No need to allocate fuse_conn until actual mount happens
+
+	* Fix potential race between umount and fuse_invalidate
+
+	* Check superblock of proc file in addition to inode number
+
+	* Fix race between request_send_noreply() and fuse_dev_release()
+
+2004-11-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Separate configure for the kernel directory
+
+	* Don't allow write to return more than 'count'
+
+	* Extend kernel interface for future use
+
+2004-11-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix 'makeconf.sh' to use autoreconf if available
+
+2004-11-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add ino argument to 'fuse_dirfil_t'.  NOTE: This breaks source
+	compatibility with earlier versions.  To compile earier versions
+	just add '-DFUSE_DIRFIL_COMPAT' compile flag or fix the source.
+	Do not use the "use_ino" mount flag with filesystems compiled with
+	FUSE_DIRFIL_COMPAT.
+
+	* Add pkg-config support.  To compile a FUSE based filesystem you
+	can do  "gcc -Wall `pkg-config --cflags --libs fuse` myfs.c -o myfs"
+	or similar.  Note, that the PKG_CONFIG_PATH environment variable
+	usually needs to be set to "/usr/local/lib/pkgconfig".
+
+	* fuse.h is now installed in ${prefix}/include/fuse/
+
+2004-11-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Added "use_ino" mount option.  This enables the filesystems to
+	set the st_ino field on files
+
+2004-11-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix compile problems with ancient (<=2.4.18) kernels (reported
+	by Jeremy Smith)
+
+	* Add "allow_root" mount option.  Patch by Yaroslav Rastrigin
+
+	* Clear the 'exited' flag when mail loop is finished
+
+2004-10-28  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Make xattr functions work under 2.6 (bug found by Vincenzo
+	Ciancia)
+
+2004-10-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Reset request in fuse_flush() (bugreport by David Shaw)
+
+2004-10-21  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fuse_main() now does not exit on error, rather it returns an
+	error code
+
+	* Exported __fuse_setup() and __fuse_teardown() functions, which
+	make it easier to implement a custom event loop.
+
+	* Use daemon() call to background the filesystem after mounting.
+	This function closes the standard input, output and error and
+	changes the current working directory to "/".
+
+2004-10-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 1.9
+
+2004-10-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Don't allow fuse_flush() to be interrupted (bug found by David
+	Shaw)
+
+2004-09-27  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add PID to fuse_context.  Patch by Steven James
+
+	* Change file handle type to 'unsigned long' in kernel interface
+
+2004-09-22  Miklos Szeredi <miklos@szeredi.hu>
+
+	* A slight API change: fuse_get_context() doesn't need the "fuse"
+	pointer, but the returned context contains it instead.  The
+	fuse_get() function is not needed anymore, so it's removed.
+
+	* Fix mounting and umounting FUSE filesystem under another FUSE
+	filesystem by non-root (bug spotted by Valient Gough)
+
+2004-09-21  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix deadlock in case of memory allocation failure.  Patch by
+	Christian Magnusson
+
+2004-09-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Check memory allocation failures in libfuse
+
+2004-09-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Check temporary file creation failure in do_getdir().  Bug
+	spotted by Terje Oseberg
+
+2004-09-13  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Allow "large_read" option for 2.6 kernels but warn of deprecation
+
+	* Make requests non-interruptible so race with FORGET is avoided.
+	This is only a temporary solution
+
+	* Support compiling FUSE kernel module on 2.4.x UML kernels
+
+2004-09-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix bug in case two FORGETs for the same node are executed in
+	the wrong order.  Bug spotted and endured for months by Franco
+	Broi, and logfile for solution provided by Terje Oseberg
+
+2004-09-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add -D_REENTRANT to the compile flags
+
+	* Add documentation of fuse internals by Terje Oseberg
+
+2004-08-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Change release method to be non-interruptible.  Fixes bug
+	causing missing release() call when program which has opened files
+	is killed (reported by Franco Broi and David Shaw)
+
+2004-07-29  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add fuse_invalidate() to library API
+
+2004-07-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Check permissions in setattr if 'default_permissions' flag is
+	set.  Bug spotted by Damjan Lango
+
+2004-07-24  Miklos Szeredi <miklos@szeredi.hu>
+
+	* 'large_read' mount option removed for 2.6 kernels, since the
+	default (dynamic read size) is better
+
+	* Extend kernel API with file handles.  A file handle is returned
+	by open, and passed to read, write, flush, fsync and release.
+	This is currently only used for debug output in the library.
+
+	* Security changes:
+
+	* Change the current directory to the mountpoint before checking
+	the permissions and mount filesystem on "."
+
+	* By default don't modprobe the fuse module for non-root.  The old
+	behavior can be restored with the '--enable-auto-modprobe' flag of
+	./configure
+
+	* By default don't allow shared writable mappings for non-root.
+	The old behavior can be restored with the 'user_mmap=1' module
+	parameter
+
+2004-07-23  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Clean up mount option passing to fusermount and to fuse_new()
+	BEWARE: this changes the userspace API slightly, and the command
+	line usage of programs using fuse_main()
+
+2004-07-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Optimize reading under 2.6 kernels by issuing multiple page
+	asynchronous read requests
+
+2004-07-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Only use redirty_page_for_writepage() for kernels >= 2.6.6
+
+2004-07-16  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Separate directory entry and inode attribute validity timer
+
+	* New write semaphore to stop page writeback during truncate
+
+	* Fsync now waits for all writes to complete before sending the
+	request
+
+	* Optimization: if a page is completely written by
+	fuse_commit_write(), clear the dirty flag and set the uptodate
+	flag for that page
+
+	* Some memory cleanup at exit
+
+2004-07-13  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add FUSE_HARD_REMOVE flag, and '-i' option to fuse main, which
+	disable the "hide if open" behavior of unlink/rename.
+
+	* If temporary buffer allocation fails in raw read, fall back to a
+	smaller buffer
+
+2004-07-12  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix bug in do_open() in libfuse: open count was incremented
+	after the reply is sent so it could race with unlink/forget and
+	cause an abort.
+
+2004-07-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* When performing create or remove operation, refresh the parent's
+	attributes on next revalidate, as i_nlink (and maybe size/time)
+	could be inacurate.
+
+	* Use redirty_page_for_writepage() in fuse_writepage() for skipped
+	pages (2.6 only)
+
+	* Set set_page_dirty address space operation (2.6 only)
+
+2004-07-06  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Minor fix in read:  print debug info even if read size is zero
+
+2004-07-04  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix race between truncate and writepage (fsx-linux now runs
+	without error)
+
+2004-07-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix kernel hang on mkfifo under 2.4 kernels (spotted and patch
+	by Mattias Wadman)
+
+	* Added option for direct read/write (-r)
+
+	* Fix revalidate time setting for newly created inodes
+
+	* Remove uid==0 check for '-x' option in fusermount (kernel checks
+	this)
+
+	* fuse_main() only installs handlers for signals (out of INT, HUP,
+	TERM, PIPE), for which no handler has yet been installed
+
+	* Add module option 'user_allow_other' which if set to non-zero
+	will allow non root user to specify the 'allow_other' mount option
+	('-x' option of fusermount)
+
+	* Fix deadlock between page writeback completion and truncate
+	(bug found by Valient Gough with the fsx-linux utility)
+
+2004-07-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Change passing fuse include dir to 2.6 kernel make system more
+	robust (fixes compile problems seen on SuSE 9.1 with updated 2.6
+	kernel)
+
+2004-06-30  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Acquire inode->i_sem before open and release methods to prevent
+	concurrent rename or unlink operations.
+
+	* Make __fuse_read_cmd() read only one command.  This allows
+	multiplexing the fuse file descriptor with other event sources
+	using select() or poll() (patch by Jeff Harris)
+
+	* Export 'exited' flag with __fuse_exited() (patch by Jeff Harris)
+
+2004-06-27  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix file offset wrap around at 4G when doing large reads
+
+2004-06-24  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix memory leak in open (Valient Gough)
+
+2004-06-24  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add "close after delete" support to libfuse (patch by Valient
+	Gough)
+
+	* Cancel all worker threads before exit in multithreaded mode
+
+2004-06-23  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix locking bugs
+
+	* Don't send reply to RELEASE
+
+	* Work with newer libtool (1.5a)
+
+	* Check for st_atim member of struct stat
+
+2004-06-22  Miklos Szeredi <miklos@szeredi.hu>
+
+	* No request allocation needed on inode and file release
+
+2004-06-21  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix possible inode leak in userspace in case of unfinished
+	lookup/mknod/mkdir/symlink/link operation.
+
+2004-06-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix some races and cleanups in fuse_read_super()
+
+2004-06-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Requests are allocated at open time
+
+2004-06-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Build shared library as well as static (using libtool)
+
+	* Change FUSE_MINOR_VERSION from 1 to 0.  I know it's illegal but
+	there has not been a release with the previous minor number, and I
+	hope nobody is using it for anything.
+
+	* Change fuse_main(), so that default behavior is to go into
+	background if mount is successful.  '-f' and '-d' options disable
+	backgrounding.  This fixes the "Why does my FUSE daemon hang?"
+	newbie complaint.
+
+	* Cache ENOSYS (function not implemented) errors on *xattr, flush
+	and fsync
+
+	* Don't call getdir method from open() only from first readdir().
+	Open is sometimes just used to store the current directory
+	(e.g. find)
+
+2004-05-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Added flush() call
+
+2004-05-04  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Extended attributes support for 2.4 (patch by Cody Pisto)
+
+2004-04-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fixed parser with modversions (Mattias Wadman)
+
+2004-04-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Added mount option parser to 2.4 build
+
+2004-04-13  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Replaced binary mount data with text options
+
+	* Show FUSE specific mount options in /proc/mounts
+
+	* Check in fuse.h whether _FILE_OFFSET_BITS is set to 64
+
+2004-04-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Check some limits so userspace won't get too big requests
+
+2004-04-05  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Kill compile warning
+
+	* Upgraded user-mount patch for 2.6.5
+
+2004-04-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add detection of user-mode-linux to configure
+
+2004-03-31  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fixed zero size case for getxattr and listxattr
+
+2004-03-30  Miklos Szeredi <miklos@szeredi.hu>
+
+	* new fusermount flag '-z': lazy unmount, default is not lazy
+
+	* Extended attributes operations added (getxattr, setxattr,
+	listxattr, removexattr)
+
+2004-03-25  Miklos Szeredi <miklos@szeredi.hu>
+
+	* If filesystem doesn't define a statfs operation, then an
+	all-zero default statfs is returned instead of ENOSYS
+
+2004-03-24  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add FS_BINARY_MOUNTDATA filesystem flag for kernels > 2.6.4
+
+2004-03-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix for uClinux (Christian Magnusson)
+
+2004-03-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fuse_main() adds "-n progname" to the fusermount command line
+
+	* More kernel interface changes:
+
+	* Lookup/getattr return cache timeout values
+
+2004-02-25  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Clean up option parsing in fuse_main()
+
+	* Added fuse_get() function which returns the fuse object created
+	by fuse_main()
+
+2004-02-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* removed old way of mounting (fusermount mountpoint program)
+
+	* more kernel interface changes:
+
+	* added nanosecond precision to file times
+
+	* removed interface version from mount data
+
+	* added /proc/fs/fuse/version which contains MAJOR.MINOR
+
+2004-02-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* statfs library API changed to match other methods.  Since this
+	  is not backward compatible FUSE_MAJOR_VERSION is changed to 2
+
+	* kernel interface changes follow:
+
+	* statfs changed to 64 bits, added 'bavail' field
+
+	* add generation number to lookup result
+
+	* optimized mknod/mkdir/symlink/link (no separate lookup is
+	needed)
+
+	* rdev size increased to 32 bits for mknod
+
+	* kernel interface version changed to 3.1
+
+2004-02-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* user-mount upgraded for 2.6.3 kernel
+
+2004-02-17  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Added user-mount.2.6.2-rc3.patch
+
+	* Add FS_SAFE flag to fuse filesystem
+
+	* fusermount should allow (un)mounting for non-root even if not
+	suid-root
+
+2004-02-12  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Remove MS_PERMISSION mount flag (that means something else now)
+
+2004-02-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Added check for i_size_read/write functions to configure.in
+	(patch by Valient Gough)
+
+2004-02-06  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fixed writing >= 2G files
+
+	* Check file size on open (with generic_file_open())
+
+	* Readpage calls flush_dcache_page() after storing data
+
+	* Use i_size_read/write for accessing inode->i_size
+
+	* Make loopback mount of a fuse file work
+
+2004-02-04  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 1.1
+
+2004-01-29  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Properly check if the inode exists in fuse_invalidate
+
+2004-01-27  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Added -q option for fusermount
+
+	* fuse_unmount() now uses -q option of fusermount, so no error is
+	printed if the cause of the program exit is that the filesystem
+	has already been unmounted
+
+	* Fix i_nlink correctness after rmdir/unlink
+
+2004-01-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 1.1-pre2
+
+2004-01-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix typo (thanks Marcos Dione)
+
+	* Compile fixes for 2.4 kernels
+
+2004-01-23  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix CONFIG_MODVERSIONS compile on 2.6
+
+2004-01-22  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Write all pending data before a RELEASE operation
+
+	* Suppress 'Bad file descriptor' warning on exit
+
+	* Replaced fusermount option '-d xxx' with '-n xxx' so it doesn't
+	get confused with '-d' of fuse_main() (sorry about this change)
+
+	* New fusermount option '-l' which enables big reads.  Big reads
+	are now disabled by default.
+
+	* fuse_main() can accept fusermount arguments after a '--'
+
+2004-01-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Support for exporting filesystem over NFS (see README.NFS)
+
+2004-01-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Support non-blocking writepage on 2.6.  This makes FUSE behave
+	much more nicely in low-memory situations
+
+	* Fix 32-bit dev handling in getattr and mknod for 2.6 kernels.
+	(Note: the mknod method does not yet use 32bit device number)
+
+2004-01-13  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Code cleanups
+
+2004-01-07  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Released 1.1-pre1
+
+2004-01-06  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Integrated 2.6 kernel support patch by Michael Grigoriev
+
+	* Improvements and cleanups for 2.6 kernels
+
+2004-01-05  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Added -d option to fusermount
+
+2003-12-15  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Added major+minor version to library API, and minor version to
+	  kernel API
+
+2003-12-13  David McNab <david@rebirthing.co.nz>
+
+	* Implemented fsync support in examples/example.py
+
+	* Implemented 'fsync' and 'statfs' methods in python
+	  interface
+
+2003-12-12  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Make it compile on 2.4.19.
+
+	* Add fsync operation (write file failed on xemacs & vi)
+
+2003-12-12  David McNab <david@rebirthing.co.nz>
+
+	* Added distutils support to the python module, as per standard
+	  python development practice
+
+2003-12-11  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add file locking for mount/unmount (based on patch by Valient
+	Gough)
+
+2003-12-11  David McNab <david@rebirthing.co.nz>
+
+	* Python filesystem - was broken with python2.3, now fixed:
+	   - changed PyTuple_* calls to PySequence_*, because os.lstat
+	     is no longer returning a pure tuple
+	   - changed PyInt_Check() calls to also call PyLong_Check,
+	     to cover for cases (eg os.lstat) where longs are returned
+	   - Added support for file 'release' handling, which IMO is
+	     essential since this signals to a FS that writes to a file
+	     are complete (and therefore the file can now be disposed of
+	     meaningfully at the python filesystem's discretion)
+	   - Added '__init__' handler to base Fuse class, which allows
+	     your Python class to know the mountpoint and mount args,
+	     as attributes myfs.mountpoint, myfs.optlist, myfs.optdict
+
+	* General:
+	   - added 'mount.fuse' script (in util/ dir), which is meant to be
+	     symlinked from /sbin, and which allows FUSE filesystems to
+	     be mounted with the 'mount' command, and listed in fstab;
+	     also, mount arguments get passed to your filesystem
+
+
+2003-11-04  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix kernel version detection (again).  Bugreport by Peter Levart
+
+2003-11-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Applied read combining patch by Michael Grigoriev (tested by
+	Valient Gough and Vincent Wagelaar)
+
+2003-10-22  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Mtab handling fix in fusermount by "Valient Gough" (SF patch
+	#766443)
+
+2003-10-13  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Error code fixes in kernel module
+
+2003-10-04  Miklos Szeredi <miklos@szeredi.hu>
+
+	* kernel version detection fix
+
+	* fusermount now uses "lazy" umount option
+
+	* fusermount can use modprobe with module-init-tools
+
+2003-09-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Integrated caching patch by Michael Grigoriev
+
+	* Added "Filesystems" file with descriptions of projects using
+	FUSE
+
+	* Added patch by Michael Grigoriev to allow compliation of FUSE
+	kernel module for 2.6 kernels
+
+2003-06-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* And another spec-file fix by Achim Settelmeier
+
+2003-05-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Spec-file fix by Achim Settelmeier
+
+2003-03-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fix umount oops (found by Samuli Kärkkäinen)
+
+2003-03-05  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Merge of fuse_redhat.spec and fuse.spec by Achim Settelmeier
+
+2003-03-04  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Updated fuse.spec file (Achim Settelmeier)
+
+2003-02-19  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Version 1.0 released
+
+2003-02-12  Miklos Szeredi <miklos@szeredi.hu>
+
+	* SuSE compilation fix by Juan-Mariano de Goyeneche
+
+2002-12-10  Miklos Szeredi <miklos@szeredi.hu>
+
+	* The release() VFS call is now exported to the FUSE interface
+
+2002-12-05  Miklos Szeredi <miklos@szeredi.hu>
+
+	* 64 bit file offset fixes in the fuse kernel module
+
+	* Added function 'fuse_exit()' which can be used to exit the main
+	loop
+
+2002-12-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Added _FILE_OFFSET_BITS=64 define to fuse.h.  Note, that this is
+	an incompatible interface change.
+
+2002-10-28  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Portablility fix (bug reported by C. Chris Erway)
+
+2002-10-25  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Use Mark Glines' fd passing method for default operation instead
+	of old reexec
+
+2002-10-22  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fix "Stale NFS file handle" bug caused by changes in 2.4.19
+
+2002-10-22  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fix incompatiblity with Red Hat kernels, with help from Nathan
+	Thompson-Amato.
+
+2002-04-18  Mark Glines <mark@glines.org>
+
+	* added an alternative to fuse_mount(), called
+      fuse_mount_ioslave(), which does not need to reexec the
+      FUSE program.
+	* added a small helper util needed by fuse_mount_ioslave().
+
+2002-03-16  Mark Glines <mark@glines.org>
+
+	* use struct fuse_statfs everywhere possible to avoid problems
+      with the headerfiles changing struct statfs member sizes
+
+2002-03-01  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Another RPM spec file for RedHat >= 7 by Ian Pilcher
+
+2002-01-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* RPM support by Achim Settelmeier
+
+2002-01-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Version 0.95 released
+
+2002-01-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Revaidate all path components not just the last, this means a
+	very small performance penalty for being more up-to-date.
+
+2002-01-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Update and fix python interface
+
+2002-01-07  Mark Glines <mark@glines.org>
+
+	* Added statfs() support to kernel, lib, examples, and perl!
+
+2001-12-26  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Better cross compilation support
+
+	* Ported to Compaq IPAQ
+
+2001-12-20  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Added function fuse_get_context() to library API (inspired by
+	patch from Matt Ryan)
+
+	* Added flags to fusermount and to kernel interface to control
+	permission checking
+
+	* Integrated fuse_set_operations() into fuse_new()
+
+2001-12-08  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Applied header protection + extern "C" patch by Roland
+	Bauerschmidt
+
+2001-12-02  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Added perl bindings by Mark Glines
+
+2001-11-21  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Cleaned up way of mounting simple filesystems.
+
+	* fuse_main() helper function added
+
+2001-11-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Optimized read/write operations, so that minimal copying of data
+	is done
+
+2001-11-14  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Python bindings by Jeff Epler added
+
+2001-11-13  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Fixed vfsmount reference leak in fuse_follow_link
+
+	* FS blocksize is set to PAGE_CACHE_SIZE, blksize attribute from
+	userspace is ignored
+
+2001-11-09  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Started ChangeLog
diff --git a/fuse/README b/fuse/README
index 3d1f6f0..398dd65 100644
--- a/fuse/README
+++ b/fuse/README
@@ -1,12 +1,380 @@
-Libfuse for Android
+General Information
+===================
 
-FUSE[1] is a framework to develop userspace file systems for linux. Since Android is based on linux, it won't be too difficult to port libfuse to Android.
+FUSE (Filesystem in Userspace) is a simple interface for userspace
+programs to export a virtual filesystem to the Linux kernel.  FUSE
+also aims to provide a secure method for non privileged users to
+create and mount their own filesystem implementations.
 
-The main problem of building and running libfuse on Android is that the bionic c library lacks support for pthread_cancel(), which is necessary for libfuse multi-thread code. This stackoverflow entry[2] has suggested a solution, which uses SIGUSR1 as an alternative. It seems to work.
+You can download the source code releases from
 
-Libfuse can be build with Android NDK[3]. If success, you will get libfuse.a and an example program fusexmp. To run the example, the android kernel should be built with FUSE kernel support.
+  http://sourceforge.net/projects/fuse
 
-References:
-[1]. http://fuse.sourceforge.net
-[2]. http://stackoverflow.com/questions/4610086/pthread-cancel-alternatives-in-android-ndk
-[3]. http://developer.android.com/sdk/ndk/index.html
+or alternatively you can use CVS to get the very latest development
+version:
+
+  cvs -d :pserver:anonymous@fuse.cvs.sourceforge.net:/cvsroot/fuse co fuse
+
+
+Dependencies
+============
+
+Linux kernel version 2.6.X where X >= 9.
+
+Alternatively a kernel module from FUSE release 2.5.* can be used with
+this release, which supports kernels >= 2.4.21.
+
+Installation
+============
+
+./configure
+make
+make install
+modprobe fuse
+
+You may also need to add '/usr/local/lib' to '/etc/ld.so.conf' and/or
+run ldconfig.
+
+You'll also need a fuse kernel module, Linux kernels 2.6.14 or later
+contain FUSE support.
+
+For more details see the file 'INSTALL'
+
+How To Use
+==========
+
+FUSE is made up of three main parts:
+
+ - A kernel filesystem module
+
+ - A userspace library
+
+ - A mount/unmount program
+
+
+Here's how to create your very own virtual filesystem in five easy
+steps (after installing FUSE):
+
+  1) Edit the file example/fusexmp.c to do whatever you want...
+
+  2) Build the fusexmp program
+
+  3) run 'example/fusexmp /mnt/fuse -d'
+
+  4) ls -al /mnt/fuse
+
+  5) Be glad
+
+If it doesn't work out, please ask!  Also see the file 'include/fuse.h' for
+detailed documentation of the library interface.
+
+Security
+========
+
+If you run 'make install', the fusermount program is installed
+set-user-id to root.  This is done to allow normal users to mount
+their own filesystem implementations.
+
+There must however be some limitations, in order to prevent Bad User from
+doing nasty things.  Currently those limitations are:
+
+  - The user can only mount on a mountpoint, for which it has write
+    permission
+
+  - The mountpoint is not a sticky directory which isn't owned by the
+    user (like /tmp usually is)
+
+  - No other user (including root) can access the contents of the mounted
+    filesystem.
+
+Configuration
+=============
+
+Some options regarding mount policy can be set in the file
+'/etc/fuse.conf'
+
+Currently these options are:
+
+mount_max = NNN
+
+  Set the maximum number of FUSE mounts allowed to non-root users.
+  The default is 1000.
+
+user_allow_other
+
+  Allow non-root users to specify the 'allow_other' or 'allow_root'
+  mount options.
+
+
+Mount options
+=============
+
+Most of the generic mount options described in 'man mount' are
+supported (ro, rw, suid, nosuid, dev, nodev, exec, noexec, atime,
+noatime, sync async, dirsync).  Filesystems are mounted with
+'-onodev,nosuid' by default, which can only be overridden by a
+privileged user.
+
+These are FUSE specific mount options that can be specified for all
+filesystems:
+
+default_permissions
+
+  By default FUSE doesn't check file access permissions, the
+  filesystem is free to implement it's access policy or leave it to
+  the underlying file access mechanism (e.g. in case of network
+  filesystems).  This option enables permission checking, restricting
+  access based on file mode.  This is option is usually useful
+  together with the 'allow_other' mount option.
+
+allow_other
+
+  This option overrides the security measure restricting file access
+  to the user mounting the filesystem.  So all users (including root)
+  can access the files.  This option is by default only allowed to
+  root, but this restriction can be removed with a configuration
+  option described in the previous section.
+
+allow_root
+
+  This option is similar to 'allow_other' but file access is limited
+  to the user mounting the filesystem and root.  This option and
+  'allow_other' are mutually exclusive.
+
+kernel_cache
+
+  This option disables flushing the cache of the file contents on
+  every open().  This should only be enabled on filesystems, where the
+  file data is never changed externally (not through the mounted FUSE
+  filesystem).  Thus it is not suitable for network filesystems and
+  other "intermediate" filesystems.
+
+  NOTE: if this option is not specified (and neither 'direct_io') data
+  is still cached after the open(), so a read() system call will not
+  always initiate a read operation.
+
+auto_cache
+
+  This option enables automatic flushing of the data cache on open().
+  The cache will only be flushed if the modification time or the size
+  of the file has changed.
+
+large_read
+
+  Issue large read requests.  This can improve performance for some
+  filesystems, but can also degrade performance.  This option is only
+  useful on 2.4.X kernels, as on 2.6 kernels requests size is
+  automatically determined for optimum performance.
+
+direct_io
+
+  This option disables the use of page cache (file content cache) in
+  the kernel for this filesystem.  This has several affects:
+
+     - Each read() or write() system call will initiate one or more
+       read or write operations, data will not be cached in the
+       kernel.
+
+     - The return value of the read() and write() system calls will
+       correspond to the return values of the read and write
+       operations.  This is useful for example if the file size is not
+       known in advance (before reading it).
+
+max_read=N
+
+  With this option the maximum size of read operations can be set.
+  The default is infinite.  Note that the size of read requests is
+  limited anyway to 32 pages (which is 128kbyte on i386).
+
+max_readahead=N
+
+  Set the maximum number of bytes to read-ahead.  The default is
+  determined by the kernel.  On linux-2.6.22 or earlier it's 131072
+  (128kbytes)
+
+max_write=N
+
+  Set the maximum number of bytes in a single write operation.  The
+  default is 128kbytes.  Note, that due to various limitations, the
+  size of write requests can be much smaller (4kbytes).  This
+  limitation will be removed in the future.
+
+async_read
+
+  Perform reads asynchronously. This is the default
+
+sync_read
+
+  Perform all reads (even read-ahead) synchronously.
+
+hard_remove
+
+  The default behavior is that if an open file is deleted, the file is
+  renamed to a hidden file (.fuse_hiddenXXX), and only removed when
+  the file is finally released.  This relieves the filesystem
+  implementation of having to deal with this problem.  This option
+  disables the hiding behavior, and files are removed immediately in
+  an unlink operation (or in a rename operation which overwrites an
+  existing file).
+
+  It is recommended that you not use the hard_remove option. When
+  hard_remove is set, the following libc functions fail on unlinked
+  files (returning errno of ENOENT):
+     - read()
+     - write()
+     - fsync()
+     - close()
+     - f*xattr()
+     - ftruncate()
+     - fstat()
+     - fchmod()
+     - fchown()
+
+debug
+
+  Turns on debug information printing by the library.
+
+fsname=NAME
+
+  Sets the filesystem source (first field in /etc/mtab).  The default
+  is the program name.
+
+subtype=TYPE
+
+  Sets the filesystem type (third field in /etc/mtab).  The default is
+  the program name.
+
+  If the kernel suppports it, /etc/mtab and /proc/mounts will show the
+  filesystem type as "fuse.TYPE"
+
+  If the kernel doesn't support subtypes, the source filed will be
+  "TYPE#NAME", or if fsname option is not specified, just "TYPE".
+
+use_ino
+
+  Honor the 'st_ino' field in getattr() and fill_dir().  This value is
+  used to fill in the 'st_ino' field in the stat()/lstat()/fstat()
+  functions and the 'd_ino' field in the readdir() function.  The
+  filesystem does not have to guarantee uniqueness, however some
+  applications rely on this value being unique for the whole
+  filesystem.
+
+readdir_ino
+
+  If 'use_ino' option is not given, still try to fill in the 'd_ino'
+  field in readdir().  If the name was previously looked up, and is
+  still in the cache, the inode number found there will be used.
+  Otherwise it will be set to '-1'.  If 'use_ino' option is given,
+  this option is ignored.
+
+nonempty
+
+  Allows mounts over a non-empty file or directory.  By default these
+  mounts are rejected (from version 2.3.1) to prevent accidental
+  covering up of data, which could for example prevent automatic
+  backup.
+
+umask=M
+
+  Override the permission bits in 'st_mode' set by the filesystem.
+  The resulting permission bits are the ones missing from the given
+  umask value.  The value is given in octal representation.
+
+uid=N
+
+  Override the 'st_uid' field set by the filesystem.
+
+gid=N
+
+  Override the 'st_gid' field set by the filesystem.
+
+blkdev
+
+  Mount a filesystem backed by a block device.  This is a privileged
+  option.  The device must be specified with the 'fsname=NAME' option.
+
+entry_timeout=T
+
+  The timeout in seconds for which name lookups will be cached. The
+  default is 1.0 second.  For all the timeout options, it is possible
+  to give fractions of a second as well (e.g. "-oentry_timeout=2.8")
+
+negative_timeout=T
+
+  The timeout in seconds for which a negative lookup will be cached.
+  This means, that if file did not exist (lookup retuned ENOENT), the
+  lookup will only be redone after the timeout, and the file/directory
+  will be assumed to not exist until then.  The default is 0.0 second,
+  meaning that caching negative lookups are disabled.
+
+attr_timeout=T
+
+  The timeout in seconds for which file/directory attributes are
+  cached.  The default is 1.0 second.
+
+ac_attr_timeout=T
+
+  The timeout in seconds for which file attributes are cached for the
+  purpose of checking if "auto_cache" should flush the file data on
+  open.   The default is the value of 'attr_timeout'
+
+intr
+
+  Allow requests to be interrupted.  Turning on this option may result
+  in unexpected behavior, if the filesystem does not support request
+  interruption.
+
+intr_signal=NUM
+
+  Specify which signal number to send to the filesystem when a request
+  is interrupted.  The default is 10 (USR1).
+
+modules=M1[:M2...]
+
+  Add modules to the filesystem stack.  Modules are pushed in the
+  order they are specified, with the original filesystem being on the
+  bottom of the stack.
+
+
+Modules distributed with fuse
+-----------------------------
+
+iconv
+`````
+Perform file name character set conversion.  Options are:
+
+from_code=CHARSET
+
+  Character set to convert from (see iconv -l for a list of possible
+  values).  Default is UTF-8.
+
+to_code=CHARSET
+
+  Character set to convert to.  Default is determined by the current
+  locale.
+
+
+subdir
+``````
+Prepend a given directory to each path. Options are:
+
+subdir=DIR
+
+  Directory to prepend to all paths.  This option is mandatory.
+
+rellinks
+
+  Transform absolute symlinks into relative
+
+norellinks
+
+  Do not transform absolute symlinks into relative.  This is the default.
+
+
+Reporting bugs
+==============
+
+Please send bug reports to the <fuse-devel@lists.sourceforge.net>
+mailing list.
+
+The list is open, you need not be subscribed to post.
diff --git a/fuse/include/config.h b/fuse/android/config.h
similarity index 95%
rename from fuse/include/config.h
rename to fuse/android/config.h
index a0c603a..dac8c16 100644
--- a/fuse/include/config.h
+++ b/fuse/android/config.h
@@ -72,16 +72,16 @@
 #define PACKAGE_NAME "fuse"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "fuse 2.8.5"
+#define PACKAGE_STRING "fuse 2.9.3"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "fuse"
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "2.8.5"
+#define PACKAGE_VERSION "2.9.3"
 
 /* Define to 1 if you have the ANSI C header files. */
 #define STDC_HEADERS 1
 
 /* Version number of package */
-#define VERSION "2.8.5"
+#define VERSION "2.9.3"
diff --git a/fuse/android/statvfs.c b/fuse/android/statvfs.c
new file mode 100644
index 0000000..7cec574
--- /dev/null
+++ b/fuse/android/statvfs.c
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2012 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *
+ */
+
+#include "sys/statvfs.h"
+#include <sys/statfs.h>
+
+#define MAP(to,from) vfs->to = sfs.from
+
+int statvfs(const char *path, struct statvfs *vfs) {
+    struct statfs sfs;
+    int ret;
+    int *fsid;
+    if ((ret = statfs(path, &sfs)) != 0)
+        return ret;
+
+    MAP(f_bsize,   f_bsize);
+    MAP(f_frsize,  f_frsize);
+    MAP(f_blocks,  f_blocks);
+    MAP(f_bfree,   f_bfree);
+    MAP(f_bavail,  f_bavail);
+    MAP(f_files,   f_files);
+    MAP(f_ffree,   f_ffree);
+    MAP(f_namemax, f_namelen);
+
+    vfs->f_favail = 0;
+    vfs->f_flag   = 0;
+
+    fsid = (int *)&sfs.f_fsid;
+    vfs->f_fsid   = (fsid[0] << sizeof(fsid[0])) | fsid[1];
+
+    return ret;
+}
diff --git a/fuse/android/sys/statvfs.h b/fuse/android/sys/statvfs.h
new file mode 100644
index 0000000..0d770dd
--- /dev/null
+++ b/fuse/android/sys/statvfs.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2012 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *
+ */
+
+#ifndef _SYS_STATVFS_H_
+#define _SYS_STATVFS_H_
+#include <sys/types.h>
+
+struct statvfs {
+	unsigned long  f_bsize;    /* file system block size */
+	unsigned long  f_frsize;   /* fragment size */
+	fsblkcnt_t     f_blocks;   /* size of fs in f_frsize units */
+	fsblkcnt_t     f_bfree;    /* # free blocks */
+	fsblkcnt_t     f_bavail;   /* # free blocks for non-root */
+	fsfilcnt_t     f_files;    /* # inodes */
+	fsfilcnt_t     f_ffree;    /* # free inodes */
+	fsfilcnt_t     f_favail;   /* # free inodes for non-root */
+	unsigned long  f_fsid;     /* file system ID */
+	unsigned long  f_flag;     /* mount flags */
+	unsigned long  f_namemax;  /* maximum filename length */
+};
+
+int statvfs(const char *, struct statvfs *);
+#endif
diff --git a/fuse/buffer.c b/fuse/buffer.c
index 053e396..6fa55c9 100644
--- a/fuse/buffer.c
+++ b/fuse/buffer.c
@@ -45,7 +45,7 @@
 
 	while (len) {
 		if (dst->flags & FUSE_BUF_FD_SEEK) {
-			res = pwrite(dst->fd, src->mem + src_off, len,
+			res = pwrite64(dst->fd, src->mem + src_off, len,
 				     dst->pos + dst_off);
 		} else {
 			res = write(dst->fd, src->mem + src_off, len);
@@ -160,10 +160,10 @@
 			       size_t len, enum fuse_buf_copy_flags flags)
 {
 	int splice_flags = 0;
-	off64_t *srcpos = NULL;
-	off64_t *dstpos = NULL;
-	off64_t srcpos_val;
-	off64_t dstpos_val;
+	loff_t *srcpos = NULL;
+	loff_t *dstpos = NULL;
+	loff_t srcpos_val;
+	loff_t dstpos_val;
 	ssize_t res;
 	size_t copied = 0;
 
diff --git a/fuse/cuse_lowlevel.c b/fuse/cuse_lowlevel.c
index be49ad4..ae08ed4 100644
--- a/fuse/cuse_lowlevel.c
+++ b/fuse/cuse_lowlevel.c
@@ -43,14 +43,14 @@
 }
 
 static void cuse_fll_read(fuse_req_t req, fuse_ino_t ino, size_t size,
-			  off64_t off, struct fuse_file_info *fi)
+			  loff_t off, struct fuse_file_info *fi)
 {
 	(void)ino;
 	req_clop(req)->read(req, size, off, fi);
 }
 
 static void cuse_fll_write(fuse_req_t req, fuse_ino_t ino, const char *buf,
-			   size_t size, off64_t off, struct fuse_file_info *fi)
+			   size_t size, loff_t off, struct fuse_file_info *fi)
 {
 	(void)ino;
 	req_clop(req)->write(req, buf, size, off, fi);
diff --git a/fuse/fuse.c b/fuse/fuse.c
index 588d445..2c1aa17 100644
--- a/fuse/fuse.c
+++ b/fuse/fuse.c
@@ -30,13 +30,17 @@
 #include <limits.h>
 #include <errno.h>
 #include <signal.h>
-#include <dlfcn.h>
 #include <assert.h>
 #include <poll.h>
 #include <sys/param.h>
 #include <sys/uio.h>
 #include <sys/time.h>
 #include <sys/mman.h>
+#include <sys/file.h>
+
+#ifdef USE_MODULES
+#include <dlfcn.h>
+#endif
 
 #define FUSE_NODE_SLAB 1
 
@@ -156,8 +160,8 @@
 
 struct lock {
 	int type;
-	off64_t start;
-	off64_t end;
+	loff_t start;
+	loff_t end;
 	pid_t pid;
 	uint64_t owner;
 	struct lock *next;
@@ -175,7 +179,7 @@
 	int open_count;
 	struct timespec stat_updated;
 	struct timespec mtime;
-	off64_t size;
+	loff_t size;
 	struct lock *locks;
 	unsigned int is_hidden : 1;
 	unsigned int cache_valid : 1;
@@ -221,6 +225,8 @@
 static pthread_key_t fuse_context_key;
 static pthread_mutex_t fuse_context_lock = PTHREAD_MUTEX_INITIALIZER;
 static int fuse_context_ref;
+
+#ifdef USE_MODULES
 static struct fusemod_so *fuse_current_so;
 static struct fuse_module *fuse_modules;
 
@@ -319,6 +325,7 @@
 	}
 	pthread_mutex_unlock(&fuse_context_lock);
 }
+#endif
 
 static void init_list_head(struct list_head *list)
 {
@@ -1021,10 +1028,12 @@
 	if (qe->first_locked) {
 		wnode = qe->wnode1 ? *qe->wnode1 : NULL;
 		unlock_path(f, qe->nodeid1, wnode, NULL);
+		qe->first_locked = false;
 	}
 	if (qe->second_locked) {
 		wnode = qe->wnode2 ? *qe->wnode2 : NULL;
 		unlock_path(f, qe->nodeid2, wnode, NULL);
+		qe->second_locked = false;
 	}
 }
 
@@ -1757,7 +1766,7 @@
 }
 
 int fuse_fs_read_buf(struct fuse_fs *fs, const char *path,
-		     struct fuse_bufvec **bufp, size_t size, off64_t off,
+		     struct fuse_bufvec **bufp, size_t size, loff_t off,
 		     struct fuse_file_info *fi)
 {
 	fuse_get_context()->private_data = fs->user_data;
@@ -1812,7 +1821,7 @@
 }
 
 int fuse_fs_read(struct fuse_fs *fs, const char *path, char *mem, size_t size,
-		 off64_t off, struct fuse_file_info *fi)
+		 loff_t off, struct fuse_file_info *fi)
 {
 	int res;
 	struct fuse_bufvec *buf = NULL;
@@ -1830,7 +1839,7 @@
 }
 
 int fuse_fs_write_buf(struct fuse_fs *fs, const char *path,
-		      struct fuse_bufvec *buf, off64_t off,
+		      struct fuse_bufvec *buf, loff_t off,
 		      struct fuse_file_info *fi)
 {
 	fuse_get_context()->private_data = fs->user_data;
@@ -1894,7 +1903,7 @@
 }
 
 int fuse_fs_write(struct fuse_fs *fs, const char *path, const char *mem,
-		  size_t size, off64_t off, struct fuse_file_info *fi)
+		  size_t size, loff_t off, struct fuse_file_info *fi)
 {
 	struct fuse_bufvec bufv = FUSE_BUFVEC_INIT(size);
 
@@ -1993,7 +2002,7 @@
 }
 
 int fuse_fs_readdir(struct fuse_fs *fs, const char *path, void *buf,
-		    fuse_fill_dir_t filler, off64_t off,
+		    fuse_fill_dir_t filler, loff_t off,
 		    struct fuse_file_info *fi)
 {
 	fuse_get_context()->private_data = fs->user_data;
@@ -2104,7 +2113,7 @@
 	}
 }
 
-int fuse_fs_truncate(struct fuse_fs *fs, const char *path, off64_t size)
+int fuse_fs_truncate(struct fuse_fs *fs, const char *path, loff_t size)
 {
 	fuse_get_context()->private_data = fs->user_data;
 	if (fs->op.truncate) {
@@ -2118,7 +2127,7 @@
 	}
 }
 
-int fuse_fs_ftruncate(struct fuse_fs *fs, const char *path, off64_t size,
+int fuse_fs_ftruncate(struct fuse_fs *fs, const char *path, loff_t size,
 		      struct fuse_file_info *fi)
 {
 	fuse_get_context()->private_data = fs->user_data;
@@ -2336,7 +2345,7 @@
 }
 
 int fuse_fs_fallocate(struct fuse_fs *fs, const char *path, int mode,
-		off64_t offset, off64_t length, struct fuse_file_info *fi)
+		loff_t offset, loff_t length, struct fuse_file_info *fi)
 {
 	fuse_get_context()->private_data = fs->user_data;
 	if (fs->op.fallocate) {
@@ -2393,6 +2402,7 @@
 		if (res)
 			break;
 
+		memset(&buf, 0, sizeof(buf));
 		res = fuse_fs_getattr(f->fs, newpath, &buf);
 		if (res == -ENOENT)
 			break;
@@ -2608,8 +2618,10 @@
 	fuse_get_context()->private_data = fs->user_data;
 	if (fs->op.destroy)
 		fs->op.destroy(fs->user_data);
+#ifdef USE_MODULES
 	if (fs->m)
 		fuse_put_module(fs->m);
+#endif
 	free(fs);
 }
 
@@ -2766,6 +2778,7 @@
 	char *path;
 	int err;
 
+	memset(&buf, 0, sizeof(buf));
 	if (valid == FUSE_SET_ATTR_SIZE && fi != NULL &&
 	    f->fs->op.ftruncate && f->fs->op.fgetattr)
 		err = get_path_nullok(f, ino, &path);
@@ -3235,7 +3248,7 @@
 }
 
 static void fuse_lib_read(fuse_req_t req, fuse_ino_t ino, size_t size,
-			  off64_t off, struct fuse_file_info *fi)
+			  loff_t off, struct fuse_file_info *fi)
 {
 	struct fuse *f = req_fuse_prepare(req);
 	struct fuse_bufvec *buf = NULL;
@@ -3261,7 +3274,7 @@
 }
 
 static void fuse_lib_write_buf(fuse_req_t req, fuse_ino_t ino,
-			       struct fuse_bufvec *buf, off64_t off,
+			       struct fuse_bufvec *buf, loff_t off,
 			       struct fuse_file_info *fi)
 {
 	struct fuse *f = req_fuse_prepare(req);
@@ -3390,7 +3403,7 @@
 }
 
 static int fill_dir(void *dh_, const char *name, const struct stat *statp,
-		    off64_t off)
+		    loff_t off)
 {
 	struct fuse_dh *dh = (struct fuse_dh *) dh_;
 	struct stat stbuf;
@@ -3440,7 +3453,7 @@
 }
 
 static int readdir_fill(struct fuse *f, fuse_req_t req, fuse_ino_t ino,
-			size_t size, off64_t off, struct fuse_dh *dh,
+			size_t size, loff_t off, struct fuse_dh *dh,
 			struct fuse_file_info *fi)
 {
 	char *path;
@@ -3472,7 +3485,7 @@
 }
 
 static void fuse_lib_readdir(fuse_req_t req, fuse_ino_t ino, size_t size,
-			     off64_t off, struct fuse_file_info *llfi)
+			     loff_t off, struct fuse_file_info *llfi)
 {
 	struct fuse *f = req_fuse_prepare(req);
 	struct fuse_file_info fi;
@@ -3995,12 +4008,13 @@
 }
 
 static void fuse_lib_ioctl(fuse_req_t req, fuse_ino_t ino, int cmd, void *arg,
-			   struct fuse_file_info *fi, unsigned int flags,
+			   struct fuse_file_info *llfi, unsigned int flags,
 			   const void *in_buf, size_t in_bufsz,
 			   size_t out_bufsz)
 {
 	struct fuse *f = req_fuse_prepare(req);
 	struct fuse_intr_data d;
+	struct fuse_file_info fi;
 	char *path, *out_buf = NULL;
 	int err;
 
@@ -4008,6 +4022,11 @@
 	if (flags & FUSE_IOCTL_UNRESTRICTED)
 		goto err;
 
+	if (flags & FUSE_IOCTL_DIR)
+		get_dirhandle(llfi, &fi);
+	else
+		fi = *llfi;
+
 	if (out_bufsz) {
 		err = -ENOMEM;
 		out_buf = malloc(out_bufsz);
@@ -4025,7 +4044,7 @@
 
 	fuse_prepare_interrupt(f, req, &d);
 
-	err = fuse_fs_ioctl(f->fs, path, cmd, arg, fi, flags,
+	err = fuse_fs_ioctl(f->fs, path, cmd, arg, &fi, flags,
 			    out_buf ?: (void *)in_buf);
 
 	fuse_finish_interrupt(f, req, &d);
@@ -4062,7 +4081,7 @@
 }
 
 static void fuse_lib_fallocate(fuse_req_t req, fuse_ino_t ino, int mode,
-		off64_t offset, off64_t length, struct fuse_file_info *fi)
+		loff_t offset, loff_t length, struct fuse_file_info *fi)
 {
 	struct fuse *f = req_fuse_prepare(req);
 	struct fuse_intr_data d;
@@ -4415,12 +4434,14 @@
 "    -o ac_attr_timeout=T   auto cache timeout for attributes (attr_timeout)\n"
 "    -o noforget            never forget cached inodes\n"
 "    -o remember=T          remember cached inodes for T seconds (0s)\n"
+"    -o nopath              don't supply path if not necessary\n"
 "    -o intr                allow requests to be interrupted\n"
 "    -o intr_signal=NUM     signal to send on interrupt (%i)\n"
 "    -o modules=M1[:M2...]  names of modules to push onto filesystem stack\n"
 "\n", FUSE_DEFAULT_INTR_SIGNAL);
 }
 
+#ifdef USE_MODULES
 static void fuse_lib_help_modules(void)
 {
 	struct fuse_module *m;
@@ -4440,6 +4461,7 @@
 	}
 	pthread_mutex_unlock(&fuse_context_lock);
 }
+#endif
 
 static int fuse_lib_opt_proc(void *data, const char *arg, int key,
 			     struct fuse_args *outargs)
@@ -4495,7 +4517,7 @@
 	sigaction(signum, &sa, NULL);
 }
 
-
+#ifdef USE_MODULES
 static int fuse_push_module(struct fuse *f, const char *module,
 			    struct fuse_args *args)
 {
@@ -4518,6 +4540,7 @@
 	f->utime_omit_ok = newfs->op.flag_utime_omit_ok && f->utime_omit_ok;
 	return 0;
 }
+#endif
 
 struct fuse_fs *fuse_fs_new(const struct fuse_operations *op, size_t op_size,
 			    void *user_data)
@@ -4555,11 +4578,30 @@
 	return 0;
 }
 
+static void thread_exit_handler(int sig)
+{
+	pthread_exit(0);
+}
+
 static void *fuse_prune_nodes(void *fuse)
 {
 	struct fuse *f = fuse;
 	int sleep_time;
 
+#if defined(__ANDROID__)
+	struct sigaction actions;
+	memset(&actions, 0, sizeof(actions));
+	sigemptyset(&actions.sa_mask);
+	actions.sa_flags = 0;
+	actions.sa_handler = thread_exit_handler;
+	sigaction(SIGUSR1, &actions, NULL);
+
+	sigset_t setusr1;
+	sigemptyset(&setusr1);
+	sigaddset(&setusr1, SIGUSR1);
+	pthread_sigmask(SIG_BLOCK, &setusr1, NULL);
+#endif
+
 	while(1) {
 		sleep_time = fuse_clean_cache(f);
 		sleep(sleep_time);
@@ -4579,10 +4621,10 @@
 {
 	if (lru_enabled(f)) {
 		pthread_mutex_lock(&f->lock);
-#ifndef ANDROID
-		pthread_cancel(f->prune_thread);
-#else
+#if defined(__ANDROID__)
 		pthread_kill(f->prune_thread, SIGUSR1);
+#else
+		pthread_cancel(f->prune_thread);
 #endif
 		pthread_mutex_unlock(&f->lock);
 		pthread_join(f->prune_thread, NULL);
@@ -4637,6 +4679,7 @@
 			   fuse_lib_opt_proc) == -1)
 		goto out_free_fs;
 
+#ifdef USE_MODULES
 	if (f->conf.modules) {
 		char *module;
 		char *next;
@@ -4651,6 +4694,7 @@
 				goto out_free_fs;
 		}
 	}
+#endif
 
 	if (!f->conf.ac_attr_timeout_set)
 		f->conf.ac_attr_timeout = f->conf.attr_timeout;
@@ -4670,8 +4714,10 @@
 
 	f->se = fuse_lowlevel_new_common(args, &llop, sizeof(llop), f);
 	if (f->se == NULL) {
+#ifdef USE_MODULES
 		if (f->conf.help)
 			fuse_lib_help_modules();
+#endif
 		goto out_free_fs;
 	}
 
@@ -4700,6 +4746,10 @@
 		fprintf(stderr, "fuse: memory allocation failed\n");
 		goto out_free_id_table;
 	}
+	if (lru_enabled(f)) {
+		struct node_lru *lnode = node_lru(root);
+		init_list_head(&lnode->lru);
+	}
 
 	strcpy(root->inline_name, "/");
 	root->name = root->inline_name;
@@ -4808,6 +4858,7 @@
 	return f;
 }
 
+#ifdef USE_MODULES
 /* called with fuse_context_lock held or during initialization (before
    main() has been called) */
 void fuse_register_module(struct fuse_module *mod)
@@ -4819,6 +4870,7 @@
 	mod->next = fuse_modules;
 	fuse_modules = mod;
 }
+#endif
 
 #if !defined(__FreeBSD__) && !defined(__NetBSD__)
 
@@ -4870,11 +4922,11 @@
 				      11);
 }
 
-FUSE_SYMVER(".symver fuse_exited,__fuse_exited@");
-FUSE_SYMVER(".symver fuse_process_cmd,__fuse_process_cmd@");
-FUSE_SYMVER(".symver fuse_read_cmd,__fuse_read_cmd@");
-FUSE_SYMVER(".symver fuse_set_getcontext_func,__fuse_set_getcontext_func@");
-FUSE_SYMVER(".symver fuse_new_compat2,fuse_new@");
+FUSE_SYMVER(".symver fuse_exited,__fuse_exited@FUSE_UNVERSIONED");
+FUSE_SYMVER(".symver fuse_process_cmd,__fuse_process_cmd@FUSE_UNVERSIONED");
+FUSE_SYMVER(".symver fuse_read_cmd,__fuse_read_cmd@FUSE_UNVERSIONED");
+FUSE_SYMVER(".symver fuse_set_getcontext_func,__fuse_set_getcontext_func@FUSE_UNVERSIONED");
+FUSE_SYMVER(".symver fuse_new_compat2,fuse_new@FUSE_UNVERSIONED");
 FUSE_SYMVER(".symver fuse_new_compat22,fuse_new@FUSE_2.2");
 
 #endif /* __FreeBSD__ || __NetBSD__  */
diff --git a/fuse/fuse_i.h b/fuse/fuse_i.h
index 78f1467..fa37156 100644
--- a/fuse/fuse_i.h
+++ b/fuse/fuse_i.h
@@ -106,6 +106,8 @@
 					size_t op_size, void *userdata);
 
 void fuse_kern_unmount_compat22(const char *mountpoint);
+int fuse_chan_clearfd(struct fuse_chan *ch);
+
 void fuse_kern_unmount(const char *mountpoint, int fd);
 int fuse_kern_mount(const char *mountpoint, struct fuse_args *args);
 
diff --git a/fuse/fuse_kern_chan.c b/fuse/fuse_kern_chan.c
index 5f77bbf..4a9beb8 100644
--- a/fuse/fuse_kern_chan.c
+++ b/fuse/fuse_kern_chan.c
@@ -77,7 +77,10 @@
 
 static void fuse_kern_chan_destroy(struct fuse_chan *ch)
 {
-	close(fuse_chan_fd(ch));
+	int fd = fuse_chan_fd(ch);
+
+	if (fd != -1)
+		close(fd);
 }
 
 #define MIN_BUFSIZE 0x21000
diff --git a/fuse/fuse_loop_mt.c b/fuse/fuse_loop_mt.c
index aefc3ec..90fc1e6 100644
--- a/fuse/fuse_loop_mt.c
+++ b/fuse/fuse_loop_mt.c
@@ -19,7 +19,6 @@
 #include <semaphore.h>
 #include <errno.h>
 #include <sys/time.h>
-#include <pthread.h>
 
 /* Environment var controlling the thread stack size */
 #define ENVNAME_THREAD_STACK "FUSE_THREAD_STACK"
@@ -62,16 +61,32 @@
 	next->prev = prev;
 }
 
-#define PTHREAD_CANCEL_ENABLE 0
-#define PTHREAD_CANCEL_DISABLE 1
-
 static int fuse_loop_start_thread(struct fuse_mt *mt);
 
+static void thread_exit_handler(int sig)
+{
+	pthread_exit(0);
+}
+
 static void *fuse_do_work(void *data)
 {
 	struct fuse_worker *w = (struct fuse_worker *) data;
 	struct fuse_mt *mt = w->mt;
 
+#if defined(__ANDROID__)
+	struct sigaction actions;
+	memset(&actions, 0, sizeof(actions));
+	sigemptyset(&actions.sa_mask);
+	actions.sa_flags = 0;
+	actions.sa_handler = thread_exit_handler;
+	sigaction(SIGUSR1, &actions, NULL);
+
+	sigset_t setusr1;
+	sigemptyset(&setusr1);
+	sigaddset(&setusr1, SIGUSR1);
+	pthread_sigmask(SIG_BLOCK, &setusr1, NULL);
+#endif
+
 	while (!fuse_session_exited(mt->se)) {
 		int isforget = 0;
 		struct fuse_chan *ch = mt->prevch;
@@ -81,11 +96,15 @@
 		};
 		int res;
 
-#ifndef ANDROID
+#if defined(__ANDROID__)
+		pthread_sigmask(SIG_UNBLOCK, &setusr1, NULL);
+#else
 		pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
 #endif
 		res = fuse_session_receive_buf(mt->se, &fbuf, &ch);
-#ifndef ANDROID
+#if defined(__ANDROID__)
+		pthread_sigmask(SIG_BLOCK, &setusr1, NULL);
+#else
 		pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
 #endif
 		if (res == -EINTR)
@@ -249,14 +268,15 @@
 		while (!fuse_session_exited(se))
 			sem_wait(&mt.finish);
 
-#ifndef ANDROID
+		pthread_mutex_lock(&mt.lock);
 		for (w = mt.main.next; w != &mt.main; w = w->next)
-			pthread_cancel(w->thread_id);
-#else
-                for (w = mt.main.next; w != &mt.main; w = w->next)
+#if defined(__ANDROID__)
 			pthread_kill(w->thread_id, SIGUSR1);
+#else
+			pthread_cancel(w->thread_id);
 #endif
 		mt.exit = 1;
+		pthread_mutex_unlock(&mt.lock);
 
 		while (mt.main.next != &mt.main)
 			fuse_join_worker(&mt, mt.main.next);
diff --git a/fuse/fuse_lowlevel.c b/fuse/fuse_lowlevel.c
index 103f831..5f223c9 100644
--- a/fuse/fuse_lowlevel.c
+++ b/fuse/fuse_lowlevel.c
@@ -24,6 +24,7 @@
 #include <limits.h>
 #include <errno.h>
 #include <assert.h>
+#include <sys/file.h>
 
 #ifndef F_LINUX_SPECIFIC_BASE
 #define F_LINUX_SPECIFIC_BASE       1024
@@ -247,7 +248,7 @@
 }
 
 char *fuse_add_dirent(char *buf, const char *name, const struct stat *stbuf,
-		      off64_t off)
+		      loff_t off)
 {
 	unsigned namelen = strlen(name);
 	unsigned entlen = FUSE_NAME_OFFSET + namelen;
@@ -267,7 +268,7 @@
 }
 
 size_t fuse_add_direntry(fuse_req_t req, char *buf, size_t bufsize,
-			 const char *name, const struct stat *stbuf, off64_t off)
+			 const char *name, const struct stat *stbuf, loff_t off)
 {
 	size_t entsize;
 
@@ -1979,7 +1980,7 @@
 }
 
 int fuse_lowlevel_notify_inval_inode(struct fuse_chan *ch, fuse_ino_t ino,
-                                     off64_t off, off64_t len)
+                                     loff_t off, loff_t len)
 {
 	struct fuse_notify_inval_inode_out outarg;
 	struct fuse_ll *f;
@@ -2060,7 +2061,7 @@
 }
 
 int fuse_lowlevel_notify_store(struct fuse_chan *ch, fuse_ino_t ino,
-			       off64_t offset, struct fuse_bufvec *bufv,
+			       loff_t offset, struct fuse_bufvec *bufv,
 			       enum fuse_buf_copy_flags flags)
 {
 	struct fuse_out_header out;
@@ -2144,7 +2145,7 @@
 }
 
 int fuse_lowlevel_notify_retrieve(struct fuse_chan *ch, fuse_ino_t ino,
-				  size_t size, off64_t offset, void *cookie)
+				  size_t size, loff_t offset, void *cookie)
 {
 	struct fuse_notify_retrieve_out outarg;
 	struct fuse_ll *f;
diff --git a/fuse/fuse_mt.c b/fuse/fuse_mt.c
index f6dbe71..fd5ac23 100644
--- a/fuse/fuse_mt.c
+++ b/fuse/fuse_mt.c
@@ -119,4 +119,4 @@
 	return res;
 }
 
-FUSE_SYMVER(".symver fuse_loop_mt_proc,__fuse_loop_mt@");
+FUSE_SYMVER(".symver fuse_loop_mt_proc,__fuse_loop_mt@FUSE_UNVERSIONED");
diff --git a/fuse/fuse_session.c b/fuse/fuse_session.c
index c55f250..18c8c42 100644
--- a/fuse/fuse_session.c
+++ b/fuse/fuse_session.c
@@ -182,6 +182,16 @@
 	return ch->fd;
 }
 
+int fuse_chan_clearfd(struct fuse_chan *ch)
+{
+	if (ch == NULL)
+		return -1;
+
+	int fd = ch->fd;
+	ch->fd = -1;
+	return fd;
+}
+
 size_t fuse_chan_bufsize(struct fuse_chan *ch)
 {
 	return ch->bufsize;
diff --git a/fuse/fuse_signals.c b/fuse/fuse_signals.c
index 88ac39e..353cb24 100644
--- a/fuse/fuse_signals.c
+++ b/fuse/fuse_signals.c
@@ -21,13 +21,13 @@
 		fuse_session_exit(fuse_instance);
 }
 
-static int set_one_signal_handler(int sig, void (*handler)(int))
+static int set_one_signal_handler(int sig, void (*handler)(int), int remove)
 {
 	struct sigaction sa;
 	struct sigaction old_sa;
 
 	memset(&sa, 0, sizeof(struct sigaction));
-	sa.sa_handler = handler;
+	sa.sa_handler = remove ? SIG_DFL : handler;
 	sigemptyset(&(sa.sa_mask));
 	sa.sa_flags = 0;
 
@@ -36,7 +36,7 @@
 		return -1;
 	}
 
-	if (old_sa.sa_handler == SIG_DFL &&
+	if (old_sa.sa_handler == (remove ? handler : SIG_DFL) &&
 	    sigaction(sig, &sa, NULL) == -1) {
 		perror("fuse: cannot set signal handler");
 		return -1;
@@ -46,10 +46,10 @@
 
 int fuse_set_signal_handlers(struct fuse_session *se)
 {
-	if (set_one_signal_handler(SIGHUP, exit_handler) == -1 ||
-	    set_one_signal_handler(SIGINT, exit_handler) == -1 ||
-	    set_one_signal_handler(SIGTERM, exit_handler) == -1 ||
-	    set_one_signal_handler(SIGPIPE, SIG_IGN) == -1)
+	if (set_one_signal_handler(SIGHUP, exit_handler, 0) == -1 ||
+	    set_one_signal_handler(SIGINT, exit_handler, 0) == -1 ||
+	    set_one_signal_handler(SIGTERM, exit_handler, 0) == -1 ||
+	    set_one_signal_handler(SIGPIPE, SIG_IGN, 0) == -1)
 		return -1;
 
 	fuse_instance = se;
@@ -64,9 +64,9 @@
 	else
 		fuse_instance = NULL;
 
-	set_one_signal_handler(SIGHUP, SIG_DFL);
-	set_one_signal_handler(SIGINT, SIG_DFL);
-	set_one_signal_handler(SIGTERM, SIG_DFL);
-	set_one_signal_handler(SIGPIPE, SIG_DFL);
+	set_one_signal_handler(SIGHUP, exit_handler, 1);
+	set_one_signal_handler(SIGINT, exit_handler, 1);
+	set_one_signal_handler(SIGTERM, exit_handler, 1);
+	set_one_signal_handler(SIGPIPE, SIG_IGN, 1);
 }
 
diff --git a/fuse/fuse_versionscript b/fuse/fuse_versionscript
new file mode 100644
index 0000000..de16ab2
--- /dev/null
+++ b/fuse/fuse_versionscript
@@ -0,0 +1,210 @@
+FUSE_UNVERSIONED {
+};
+
+FUSE_2.2 {
+	global:
+		fuse_destroy;
+		fuse_exit;
+		fuse_exited;
+		fuse_invalidate;
+		fuse_is_lib_option;
+		fuse_loop;
+		fuse_loop_mt;
+		fuse_loop_mt_proc;
+		fuse_main;
+		fuse_main_compat1;
+		fuse_main_compat2;
+		fuse_mount_compat1;
+		fuse_new_compat1;
+		fuse_new_compat2;
+		fuse_process_cmd;
+		fuse_read_cmd;
+		fuse_set_getcontext_func;
+		fuse_setup_compat2;
+};
+
+FUSE_2.4 {
+	global:
+		fuse_add_dirent;
+		fuse_chan_bufsize;
+		fuse_chan_data;
+		fuse_chan_destroy;
+		fuse_chan_fd;
+		fuse_chan_receive;
+		fuse_chan_send;
+		fuse_chan_session;
+		fuse_dirent_size;
+		fuse_kern_chan_new;
+		fuse_lowlevel_is_lib_option;
+		fuse_reply_attr;
+		fuse_reply_buf;
+		fuse_reply_entry;
+		fuse_reply_err;
+		fuse_reply_none;
+		fuse_reply_readlink;
+		fuse_reply_write;
+		fuse_reply_xattr;
+		fuse_req_userdata;
+		fuse_session_add_chan;
+		fuse_session_destroy;
+		fuse_session_exit;
+		fuse_session_exited;
+		fuse_session_loop;
+		fuse_session_loop_mt;
+		fuse_session_new;
+		fuse_session_next_chan;
+		fuse_session_process;
+		fuse_session_reset;
+} FUSE_2.2;
+
+FUSE_2.5 {
+	global:
+		fuse_lowlevel_new_compat;
+		fuse_main_real_compat22;
+		fuse_mount_compat22;
+		fuse_new_compat22;
+		fuse_opt_parse;
+		fuse_opt_add_opt;
+		fuse_opt_add_arg;
+		fuse_opt_free_args;
+		fuse_opt_match;
+		fuse_parse_cmdline;
+		fuse_remove_signal_handlers;
+		fuse_reply_create;
+		fuse_reply_open;
+		fuse_reply_open_compat;
+		fuse_reply_statfs;
+		fuse_reply_statfs_compat;
+		fuse_setup_compat22;
+		fuse_set_signal_handlers;
+} FUSE_2.4;
+
+FUSE_2.6 {
+	global:
+		fuse_add_direntry;
+		fuse_chan_new;
+		fuse_chan_new_compat24;
+		fuse_chan_recv;
+		fuse_daemonize;
+		fuse_get_session;
+		fuse_interrupted;
+		fuse_lowlevel_new;
+		fuse_lowlevel_new_compat25;
+		fuse_main_real;
+		fuse_main_real_compat25;
+		fuse_mount;
+		fuse_mount_compat25;
+		fuse_new;
+		fuse_new_compat25;
+		fuse_opt_insert_arg;
+		fuse_reply_lock;
+		fuse_req_interrupt_func;
+		fuse_req_interrupted;
+		fuse_session_remove_chan;
+		fuse_setup;
+		fuse_setup_compat25;
+		fuse_teardown;
+		fuse_teardown_compat22;
+		fuse_unmount;
+		fuse_unmount_compat22;
+} FUSE_2.5;
+
+FUSE_2.7 {
+	global:
+		fuse_fs_access;
+		fuse_fs_bmap;
+		fuse_fs_chmod;
+		fuse_fs_chown;
+		fuse_fs_create;
+		fuse_fs_destroy;
+		fuse_fs_fgetattr;
+		fuse_fs_flush;
+		fuse_fs_fsync;
+		fuse_fs_fsyncdir;
+		fuse_fs_ftruncate;
+		fuse_fs_getattr;
+		fuse_fs_getxattr;
+		fuse_fs_init;
+		fuse_fs_link;
+		fuse_fs_listxattr;
+		fuse_fs_lock;
+		fuse_fs_mkdir;
+		fuse_fs_mknod;
+		fuse_fs_new;
+		fuse_fs_open;
+		fuse_fs_opendir;
+		fuse_fs_read;
+		fuse_fs_readdir;
+		fuse_fs_readlink;
+		fuse_fs_release;
+		fuse_fs_releasedir;
+		fuse_fs_removexattr;
+		fuse_fs_rename;
+		fuse_fs_rmdir;
+		fuse_fs_setxattr;
+		fuse_fs_statfs;
+		fuse_fs_symlink;
+		fuse_fs_truncate;
+		fuse_fs_unlink;
+		fuse_fs_utimens;
+		fuse_fs_write;
+		fuse_register_module;
+		fuse_reply_iov;
+		fuse_version;
+} FUSE_2.6;
+
+FUSE_2.7.5 {
+	global:
+		fuse_reply_bmap;
+} FUSE_2.7;
+
+FUSE_2.8 {
+	global:
+		cuse_lowlevel_new;
+		cuse_lowlevel_main;
+		cuse_lowlevel_setup;
+		cuse_lowlevel_teardown;
+		fuse_fs_ioctl;
+		fuse_fs_poll;
+		fuse_get_context;
+		fuse_getgroups;
+		fuse_lowlevel_notify_inval_entry;
+		fuse_lowlevel_notify_inval_inode;
+		fuse_lowlevel_notify_poll;
+		fuse_notify_poll;
+		fuse_opt_add_opt_escaped;
+		fuse_pollhandle_destroy;
+		fuse_reply_ioctl;
+		fuse_reply_ioctl_iov;
+		fuse_reply_ioctl_retry;
+		fuse_reply_poll;
+		fuse_req_ctx;
+		fuse_req_getgroups;
+		fuse_session_data;
+} FUSE_2.7.5;
+
+FUSE_2.9 {
+	global:
+		fuse_buf_copy;
+		fuse_buf_size;
+		fuse_fs_read_buf;
+		fuse_fs_write_buf;
+		fuse_lowlevel_notify_retrieve;
+		fuse_lowlevel_notify_store;
+		fuse_reply_data;
+		fuse_session_process_buf;
+		fuse_session_receive_buf;
+		fuse_start_cleanup_thread;
+		fuse_stop_cleanup_thread;
+		fuse_clean_cache;
+		fuse_lowlevel_notify_delete;
+		fuse_fs_flock;
+} FUSE_2.8;
+
+FUSE_2.9.1 {
+	global:
+		fuse_fs_fallocate;
+
+	local:
+		*;
+} FUSE_2.9;
diff --git a/fuse/fusexmp.c b/fuse/fusexmp.c
deleted file mode 100644
index d4edbc9..0000000
--- a/fuse/fusexmp.c
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
-  FUSE: Filesystem in Userspace
-  Copyright (C) 2001-2007  Miklos Szeredi <miklos@szeredi.hu>
-
-  This program can be distributed under the terms of the GNU GPL.
-  See the file COPYING.
-
-  gcc -Wall `pkg-config fuse --cflags --libs` fusexmp.c -o fusexmp
-*/
-
-#define FUSE_USE_VERSION 26
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef linux
-/* For pread()/pwrite() */
-#define _XOPEN_SOURCE 500
-#endif
-
-#include <fuse.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <errno.h>
-#include <sys/time.h>
-#ifdef HAVE_SETXATTR
-#include <sys/xattr.h>
-#endif
-
-static int xmp_getattr(const char *path, struct stat *stbuf)
-{
-	int res;
-
-	res = lstat(path, stbuf);
-	if (res == -1)
-		return -errno;
-
-	return 0;
-}
-
-static int xmp_access(const char *path, int mask)
-{
-	int res;
-
-	res = access(path, mask);
-	if (res == -1)
-		return -errno;
-
-	return 0;
-}
-
-static int xmp_readlink(const char *path, char *buf, size_t size)
-{
-	int res;
-
-	res = readlink(path, buf, size - 1);
-	if (res == -1)
-		return -errno;
-
-	buf[res] = '\0';
-	return 0;
-}
-
-
-static int xmp_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
-		       off64_t offset, struct fuse_file_info *fi)
-{
-	DIR *dp;
-	struct dirent *de;
-
-	(void) offset;
-	(void) fi;
-
-	dp = opendir(path);
-	if (dp == NULL)
-		return -errno;
-
-	while ((de = readdir(dp)) != NULL) {
-		struct stat st;
-		memset(&st, 0, sizeof(st));
-		st.st_ino = de->d_ino;
-		st.st_mode = de->d_type << 12;
-		if (filler(buf, de->d_name, &st, 0))
-			break;
-	}
-
-	closedir(dp);
-	return 0;
-}
-
-static int xmp_mknod(const char *path, mode_t mode, dev_t rdev)
-{
-	int res;
-
-	/* On Linux this could just be 'mknod(path, mode, rdev)' but this
-	   is more portable */
-	if (S_ISREG(mode)) {
-		res = open(path, O_CREAT | O_EXCL | O_WRONLY, mode);
-		if (res >= 0)
-			res = close(res);
-	} else if (S_ISFIFO(mode))
-		res = mkfifo(path, mode);
-	else
-		res = mknod(path, mode, rdev);
-	if (res == -1)
-		return -errno;
-
-	return 0;
-}
-
-static int xmp_mkdir(const char *path, mode_t mode)
-{
-	int res;
-
-	res = mkdir(path, mode);
-	if (res == -1)
-		return -errno;
-
-	return 0;
-}
-
-static int xmp_unlink(const char *path)
-{
-	int res;
-
-	res = unlink(path);
-	if (res == -1)
-		return -errno;
-
-	return 0;
-}
-
-static int xmp_rmdir(const char *path)
-{
-	int res;
-
-	res = rmdir(path);
-	if (res == -1)
-		return -errno;
-
-	return 0;
-}
-
-static int xmp_symlink(const char *from, const char *to)
-{
-	int res;
-
-	res = symlink(from, to);
-	if (res == -1)
-		return -errno;
-
-	return 0;
-}
-
-static int xmp_rename(const char *from, const char *to)
-{
-	int res;
-
-	res = rename(from, to);
-	if (res == -1)
-		return -errno;
-
-	return 0;
-}
-
-static int xmp_link(const char *from, const char *to)
-{
-	int res;
-
-	res = link(from, to);
-	if (res == -1)
-		return -errno;
-
-	return 0;
-}
-
-static int xmp_chmod(const char *path, mode_t mode)
-{
-	int res;
-
-	res = chmod(path, mode);
-	if (res == -1)
-		return -errno;
-
-	return 0;
-}
-
-static int xmp_chown(const char *path, uid_t uid, gid_t gid)
-{
-	int res;
-
-	res = lchown(path, uid, gid);
-	if (res == -1)
-		return -errno;
-
-	return 0;
-}
-
-static int xmp_truncate(const char *path, off64_t size)
-{
-	int res;
-
-	res = truncate(path, size);
-	if (res == -1)
-		return -errno;
-
-	return 0;
-}
-
-static int xmp_utimens(const char *path, const struct timespec ts[2])
-{
-	int res;
-	struct timeval tv[2];
-
-	tv[0].tv_sec = ts[0].tv_sec;
-	tv[0].tv_usec = ts[0].tv_nsec / 1000;
-	tv[1].tv_sec = ts[1].tv_sec;
-	tv[1].tv_usec = ts[1].tv_nsec / 1000;
-
-	res = utimes(path, tv);
-	if (res == -1)
-		return -errno;
-
-	return 0;
-}
-
-static int xmp_open(const char *path, struct fuse_file_info *fi)
-{
-	int res;
-
-	res = open(path, fi->flags);
-	if (res == -1)
-		return -errno;
-
-	close(res);
-	return 0;
-}
-
-static int xmp_read(const char *path, char *buf, size_t size, off64_t offset,
-		    struct fuse_file_info *fi)
-{
-	int fd;
-	int res;
-
-	(void) fi;
-	fd = open(path, O_RDONLY);
-	if (fd == -1)
-		return -errno;
-
-	res = pread(fd, buf, size, offset);
-	if (res == -1)
-		res = -errno;
-
-	close(fd);
-	return res;
-}
-
-static int xmp_write(const char *path, const char *buf, size_t size,
-		     off64_t offset, struct fuse_file_info *fi)
-{
-	int fd;
-	int res;
-
-	(void) fi;
-	fd = open(path, O_WRONLY);
-	if (fd == -1)
-		return -errno;
-
-	res = pwrite(fd, buf, size, offset);
-	if (res == -1)
-		res = -errno;
-
-	close(fd);
-	return res;
-}
-
-static int xmp_statfs(const char *path, struct statvfs *stbuf)
-{
-	int res;
-
-	//res = statvfs(path, stbuf);
-	if (res == -1)
-		return -errno;
-
-	return 0;
-}
-
-static int xmp_release(const char *path, struct fuse_file_info *fi)
-{
-	/* Just a stub.	 This method is optional and can safely be left
-	   unimplemented */
-
-	(void) path;
-	(void) fi;
-	return 0;
-}
-
-static int xmp_fsync(const char *path, int isdatasync,
-		     struct fuse_file_info *fi)
-{
-	/* Just a stub.	 This method is optional and can safely be left
-	   unimplemented */
-
-	(void) path;
-	(void) isdatasync;
-	(void) fi;
-	return 0;
-}
-
-#ifdef HAVE_SETXATTR
-/* xattr operations are optional and can safely be left unimplemented */
-static int xmp_setxattr(const char *path, const char *name, const char *value,
-			size_t size, int flags)
-{
-	int res = lsetxattr(path, name, value, size, flags);
-	if (res == -1)
-		return -errno;
-	return 0;
-}
-
-static int xmp_getxattr(const char *path, const char *name, char *value,
-			size_t size)
-{
-	int res = lgetxattr(path, name, value, size);
-	if (res == -1)
-		return -errno;
-	return res;
-}
-
-static int xmp_listxattr(const char *path, char *list, size_t size)
-{
-	int res = llistxattr(path, list, size);
-	if (res == -1)
-		return -errno;
-	return res;
-}
-
-static int xmp_removexattr(const char *path, const char *name)
-{
-	int res = lremovexattr(path, name);
-	if (res == -1)
-		return -errno;
-	return 0;
-}
-#endif /* HAVE_SETXATTR */
-
-static struct fuse_operations xmp_oper = {
-	.getattr	= xmp_getattr,
-	.access		= xmp_access,
-	.readlink	= xmp_readlink,
-	.readdir	= xmp_readdir,
-	.mknod		= xmp_mknod,
-	.mkdir		= xmp_mkdir,
-	.symlink	= xmp_symlink,
-	.unlink		= xmp_unlink,
-	.rmdir		= xmp_rmdir,
-	.rename		= xmp_rename,
-	.link		= xmp_link,
-	.chmod		= xmp_chmod,
-	.chown		= xmp_chown,
-	.truncate	= xmp_truncate,
-	.utimens	= xmp_utimens,
-	.open		= xmp_open,
-	.read		= xmp_read,
-	.write		= xmp_write,
-	.statfs		= xmp_statfs,
-	.release	= xmp_release,
-	.fsync		= xmp_fsync,
-#ifdef HAVE_SETXATTR
-	.setxattr	= xmp_setxattr,
-	.getxattr	= xmp_getxattr,
-	.listxattr	= xmp_listxattr,
-	.removexattr	= xmp_removexattr,
-#endif
-};
-
-int main(int argc, char *argv[])
-{
-	umask(0);
-	return fuse_main(argc, argv, &xmp_oper, NULL);
-}
diff --git a/fuse/helper.c b/fuse/helper.c
index ace19dd..c5349bf 100644
--- a/fuse/helper.c
+++ b/fuse/helper.c
@@ -249,10 +249,12 @@
 
 static void fuse_unmount_common(const char *mountpoint, struct fuse_chan *ch)
 {
-	int fd = ch ? fuse_chan_fd(ch) : -1;
-	fuse_kern_unmount(mountpoint, fd);
-	if (ch)
-		fuse_chan_destroy(ch);
+	if (mountpoint) {
+		int fd = ch ? fuse_chan_clearfd(ch) : -1;
+		fuse_kern_unmount(mountpoint, fd);
+		if (ch)
+			fuse_chan_destroy(ch);
+	}
 }
 
 void fuse_unmount(const char *mountpoint, struct fuse_chan *ch)
@@ -434,10 +436,10 @@
 	return fuse_mount_compat22(mountpoint, NULL);
 }
 
-FUSE_SYMVER(".symver fuse_setup_compat2,__fuse_setup@");
+FUSE_SYMVER(".symver fuse_setup_compat2,__fuse_setup@FUSE_UNVERSIONED");
 FUSE_SYMVER(".symver fuse_setup_compat22,fuse_setup@FUSE_2.2");
-FUSE_SYMVER(".symver fuse_teardown,__fuse_teardown@");
-FUSE_SYMVER(".symver fuse_main_compat2,fuse_main@");
+FUSE_SYMVER(".symver fuse_teardown,__fuse_teardown@FUSE_UNVERSIONED");
+FUSE_SYMVER(".symver fuse_main_compat2,fuse_main@FUSE_UNVERSIONED");
 FUSE_SYMVER(".symver fuse_main_real_compat22,fuse_main_real@FUSE_2.2");
 
 #endif /* __FreeBSD__ || __NetBSD__ */
diff --git a/fuse/include/Makefile b/fuse/include/Makefile
deleted file mode 100644
index 43fd00a..0000000
--- a/fuse/include/Makefile
+++ /dev/null
@@ -1,515 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# include/Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-
-
-pkgdatadir = $(datadir)/fuse
-pkgincludedir = $(includedir)/fuse
-pkglibdir = $(libdir)/fuse
-pkglibexecdir = $(libexecdir)/fuse
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = i686-pc-linux-gnu
-host_triplet = i686-pc-linux-gnu
-target_triplet = i686-pc-linux-gnu
-subdir = include
-DIST_COMMON = $(fuseinclude_HEADERS) $(include_HEADERS) \
-	$(noinst_HEADERS) $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(srcdir)/config.h.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-SOURCES =
-DIST_SOURCES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__installdirs = "$(DESTDIR)$(fuseincludedir)" \
-	"$(DESTDIR)$(includedir)"
-HEADERS = $(fuseinclude_HEADERS) $(include_HEADERS) $(noinst_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} /root/fuse-2.8.5/missing --run aclocal-1.11
-AMTAR = ${SHELL} /root/fuse-2.8.5/missing --run tar
-AR = ar
-AUTOCONF = ${SHELL} /root/fuse-2.8.5/missing --run autoconf
-AUTOHEADER = ${SHELL} /root/fuse-2.8.5/missing --run autoheader
-AUTOMAKE = ${SHELL} /root/fuse-2.8.5/missing --run automake-1.11
-AWK = mawk
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -Wall -W -Wno-sign-compare -Wstrict-prototypes -Wmissing-declarations -Wwrite-strings -g -O2 -fno-strict-aliasing
-CPP = gcc -E
-CPPFLAGS = 
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-DSYMUTIL = 
-DUMPBIN = 
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = /bin/grep -E
-EXEEXT = 
-FGREP = /bin/grep -F
-GREP = /bin/grep
-INIT_D_PATH = /etc/init.d
-INSTALL = /usr/bin/install -c
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
-LD = /usr/bin/ld
-LDFLAGS = 
-LIBICONV = 
-LIBOBJS = 
-LIBS = 
-LIBTOOL = $(SHELL) $(top_builddir)/libtool
-LIPO = 
-LN_S = ln -s
-LTLIBICONV = 
-LTLIBOBJS = 
-MAKEINFO = ${SHELL} /root/fuse-2.8.5/missing --run makeinfo
-MKDIR_P = /bin/mkdir -p
-MOUNT_FUSE_PATH = /sbin
-NM = /usr/bin/nm -B
-NMEDIT = 
-OBJDUMP = objdump
-OBJEXT = o
-OTOOL = 
-OTOOL64 = 
-PACKAGE = fuse
-PACKAGE_BUGREPORT = 
-PACKAGE_NAME = fuse
-PACKAGE_STRING = fuse 2.8.5
-PACKAGE_TARNAME = fuse
-PACKAGE_VERSION = 2.8.5
-PATH_SEPARATOR = :
-RANLIB = ranlib
-SED = /bin/sed
-SET_MAKE = 
-SHELL = /bin/bash
-STRIP = strip
-UDEV_RULES_PATH = /etc/udev/rules.d
-VERSION = 2.8.5
-abs_builddir = /root/fuse-2.8.5/include
-abs_srcdir = /root/fuse-2.8.5/include
-abs_top_builddir = /root/fuse-2.8.5
-abs_top_srcdir = /root/fuse-2.8.5
-ac_ct_CC = gcc
-ac_ct_DUMPBIN = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = ${AMTAR} chof - "$$tardir"
-am__untar = ${AMTAR} xf -
-bindir = ${exec_prefix}/bin
-build = i686-pc-linux-gnu
-build_alias = 
-build_cpu = i686
-build_os = linux-gnu
-build_vendor = pc
-builddir = .
-datadir = ${datarootdir}
-datarootdir = ${prefix}/share
-docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
-dvidir = ${docdir}
-exec_prefix = ${prefix}
-host = i686-pc-linux-gnu
-host_alias = 
-host_cpu = i686
-host_os = linux-gnu
-host_vendor = pc
-htmldir = ${docdir}
-includedir = ${prefix}/include
-infodir = ${datarootdir}/info
-install_sh = ${SHELL} /root/fuse-2.8.5/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-libfuse_libs = -pthread -lrt -ldl  
-localedir = ${datarootdir}/locale
-localstatedir = ${prefix}/var
-lt_ECHO = echo
-mandir = ${datarootdir}/man
-mkdir_p = /bin/mkdir -p
-oldincludedir = /usr/include
-pdfdir = ${docdir}
-pkgconfigdir = ${libdir}/pkgconfig
-prefix = /usr/local
-program_transform_name = s,x,x,
-psdir = ${docdir}
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-srcdir = .
-subdirs2 = include lib util example
-sysconfdir = ${prefix}/etc
-target = i686-pc-linux-gnu
-target_alias = 
-target_cpu = i686
-target_os = linux-gnu
-target_vendor = pc
-top_build_prefix = ../
-top_builddir = ..
-top_srcdir = ..
-fuseincludedir = $(includedir)/fuse
-fuseinclude_HEADERS = \
-	fuse.h			\
-	fuse_compat.h		\
-	fuse_common.h		\
-	fuse_common_compat.h    \
-	fuse_lowlevel.h		\
-	fuse_lowlevel_compat.h	\
-	fuse_opt.h		\
-	cuse_lowlevel.h
-
-include_HEADERS = old/fuse.h ulockmgr.h
-noinst_HEADERS = fuse_kernel.h
-all: config.h
-	$(MAKE) $(AM_MAKEFLAGS) all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu include/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-config.h: stamp-h1
-	@if test ! -f $@; then \
-	  rm -f stamp-h1; \
-	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
-	else :; fi
-
-stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
-	@rm -f stamp-h1
-	cd $(top_builddir) && $(SHELL) ./config.status include/config.h
-$(srcdir)/config.h.in:  $(am__configure_deps) 
-	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
-	rm -f stamp-h1
-	touch $@
-
-distclean-hdr:
-	-rm -f config.h stamp-h1
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-fuseincludeHEADERS: $(fuseinclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(fuseincludedir)" || $(MKDIR_P) "$(DESTDIR)$(fuseincludedir)"
-	@list='$(fuseinclude_HEADERS)'; test -n "$(fuseincludedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(fuseincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(fuseincludedir)" || exit $$?; \
-	done
-
-uninstall-fuseincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(fuseinclude_HEADERS)'; test -n "$(fuseincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(fuseincludedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(fuseincludedir)" && rm -f $$files
-install-includeHEADERS: $(include_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
-	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
-	done
-
-uninstall-includeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(includedir)" && rm -f $$files
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS) config.h
-installdirs:
-	for dir in "$(DESTDIR)$(fuseincludedir)" "$(DESTDIR)$(includedir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-fuseincludeHEADERS install-includeHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-fuseincludeHEADERS uninstall-includeHEADERS
-
-.MAKE: all install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic distclean-hdr \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-fuseincludeHEADERS install-html \
-	install-html-am install-includeHEADERS install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
-	uninstall-am uninstall-fuseincludeHEADERS \
-	uninstall-includeHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/fuse/include/Makefile.in b/fuse/include/Makefile.in
deleted file mode 100644
index 1ae6d85..0000000
--- a/fuse/include/Makefile.in
+++ /dev/null
@@ -1,515 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-target_triplet = @target@
-subdir = include
-DIST_COMMON = $(fuseinclude_HEADERS) $(include_HEADERS) \
-	$(noinst_HEADERS) $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(srcdir)/config.h.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-SOURCES =
-DIST_SOURCES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__installdirs = "$(DESTDIR)$(fuseincludedir)" \
-	"$(DESTDIR)$(includedir)"
-HEADERS = $(fuseinclude_HEADERS) $(include_HEADERS) $(noinst_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GREP = @GREP@
-INIT_D_PATH = @INIT_D_PATH@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBICONV = @LIBICONV@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBICONV = @LTLIBICONV@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-MOUNT_FUSE_PATH = @MOUNT_FUSE_PATH@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-UDEV_RULES_PATH = @UDEV_RULES_PATH@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-libfuse_libs = @libfuse_libs@
-localedir = @localedir@
-localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-pkgconfigdir = @pkgconfigdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-subdirs2 = @subdirs2@
-sysconfdir = @sysconfdir@
-target = @target@
-target_alias = @target_alias@
-target_cpu = @target_cpu@
-target_os = @target_os@
-target_vendor = @target_vendor@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-fuseincludedir = $(includedir)/fuse
-fuseinclude_HEADERS = \
-	fuse.h			\
-	fuse_compat.h		\
-	fuse_common.h		\
-	fuse_common_compat.h    \
-	fuse_lowlevel.h		\
-	fuse_lowlevel_compat.h	\
-	fuse_opt.h		\
-	cuse_lowlevel.h
-
-include_HEADERS = old/fuse.h ulockmgr.h
-noinst_HEADERS = fuse_kernel.h
-all: config.h
-	$(MAKE) $(AM_MAKEFLAGS) all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu include/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-config.h: stamp-h1
-	@if test ! -f $@; then \
-	  rm -f stamp-h1; \
-	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
-	else :; fi
-
-stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
-	@rm -f stamp-h1
-	cd $(top_builddir) && $(SHELL) ./config.status include/config.h
-$(srcdir)/config.h.in:  $(am__configure_deps) 
-	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
-	rm -f stamp-h1
-	touch $@
-
-distclean-hdr:
-	-rm -f config.h stamp-h1
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-fuseincludeHEADERS: $(fuseinclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(fuseincludedir)" || $(MKDIR_P) "$(DESTDIR)$(fuseincludedir)"
-	@list='$(fuseinclude_HEADERS)'; test -n "$(fuseincludedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(fuseincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(fuseincludedir)" || exit $$?; \
-	done
-
-uninstall-fuseincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(fuseinclude_HEADERS)'; test -n "$(fuseincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(fuseincludedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(fuseincludedir)" && rm -f $$files
-install-includeHEADERS: $(include_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
-	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
-	done
-
-uninstall-includeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(includedir)" && rm -f $$files
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS) config.h
-installdirs:
-	for dir in "$(DESTDIR)$(fuseincludedir)" "$(DESTDIR)$(includedir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-fuseincludeHEADERS install-includeHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-fuseincludeHEADERS uninstall-includeHEADERS
-
-.MAKE: all install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic distclean-hdr \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-fuseincludeHEADERS install-html \
-	install-html-am install-includeHEADERS install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
-	uninstall-am uninstall-fuseincludeHEADERS \
-	uninstall-includeHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/fuse/include/config.h.in b/fuse/include/config.h.in
deleted file mode 100644
index 3e7c14c..0000000
--- a/fuse/include/config.h.in
+++ /dev/null
@@ -1,86 +0,0 @@
-/* include/config.h.in.  Generated from configure.in by autoheader.  */
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define to 1 if you have the `fdatasync' function. */
-#undef HAVE_FDATASYNC
-
-/* Define to 1 if you have the `fork' function. */
-#undef HAVE_FORK
-
-/* Define if you have the iconv() function and it works. */
-#undef HAVE_ICONV
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the `setxattr' function. */
-#undef HAVE_SETXATTR
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if `st_atim' is member of `struct stat'. */
-#undef HAVE_STRUCT_STAT_ST_ATIM
-
-/* Define to 1 if `st_atimespec' is member of `struct stat'. */
-#undef HAVE_STRUCT_STAT_ST_ATIMESPEC
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define as const if the declaration of iconv() needs const. */
-#undef ICONV_CONST
-
-/* Don't update /etc/mtab */
-#undef IGNORE_MTAB
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
-#undef LT_OBJDIR
-
-/* Define to 1 if your C compiler doesn't accept -c and -o together. */
-#undef NO_MINUS_C_MINUS_O
-
-/* Name of package */
-#undef PACKAGE
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Version number of package */
-#undef VERSION
diff --git a/fuse/include/cuse_lowlevel.h b/fuse/include/cuse_lowlevel.h
index d628eac..fb445a7 100644
--- a/fuse/include/cuse_lowlevel.h
+++ b/fuse/include/cuse_lowlevel.h
@@ -51,9 +51,9 @@
 	void (*init_done) (void *userdata);
 	void (*destroy) (void *userdata);
 	void (*open) (fuse_req_t req, struct fuse_file_info *fi);
-	void (*read) (fuse_req_t req, size_t size, off64_t off,
+	void (*read) (fuse_req_t req, size_t size, loff_t off,
 		      struct fuse_file_info *fi);
-	void (*write) (fuse_req_t req, const char *buf, size_t size, off64_t off,
+	void (*write) (fuse_req_t req, const char *buf, size_t size, loff_t off,
 		       struct fuse_file_info *fi);
 	void (*flush) (fuse_req_t req, struct fuse_file_info *fi);
 	void (*release) (fuse_req_t req, struct fuse_file_info *fi);
diff --git a/fuse/include/fuse.h b/fuse/include/fuse.h
index cad816c..b82325e 100644
--- a/fuse/include/fuse.h
+++ b/fuse/include/fuse.h
@@ -30,9 +30,11 @@
 #include <utime.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#if defined(__ANDROID__)
+#include <pthread.h>
+#endif
 #include <sys/statvfs.h>
 #include <sys/uio.h>
-#include <pthread.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -57,7 +59,7 @@
  * @return 1 if buffer is full, zero otherwise
  */
 typedef int (*fuse_fill_dir_t) (void *buf, const char *name,
-				const struct stat *stbuf, off64_t off);
+				const struct stat *stbuf, loff_t off);
 
 /* Used by deprecated getdir() method */
 typedef struct fuse_dirhandle *fuse_dirh_t;
@@ -146,7 +148,7 @@
 	int (*chown) (const char *, uid_t, gid_t);
 
 	/** Change the size of a file */
-	int (*truncate) (const char *, off64_t);
+	int (*truncate) (const char *, loff_t);
 
 	/** Change the access and/or modification times of a file
 	 *
@@ -184,7 +186,7 @@
 	 *
 	 * Changed in version 2.2
 	 */
-	int (*read) (const char *, char *, size_t, off64_t,
+	int (*read) (const char *, char *, size_t, loff_t,
 		     struct fuse_file_info *);
 
 	/** Write data to an open file
@@ -195,7 +197,7 @@
 	 *
 	 * Changed in version 2.2
 	 */
-	int (*write) (const char *, const char *, size_t, off64_t,
+	int (*write) (const char *, const char *, size_t, loff_t,
 		      struct fuse_file_info *);
 
 	/** Get file system statistics
@@ -302,7 +304,7 @@
 	 *
 	 * Introduced in version 2.3
 	 */
-	int (*readdir) (const char *, void *, fuse_fill_dir_t, off64_t,
+	int (*readdir) (const char *, void *, fuse_fill_dir_t, loff_t,
 			struct fuse_file_info *);
 
 	/** Release directory
@@ -380,7 +382,7 @@
 	 *
 	 * Introduced in version 2.5
 	 */
-	int (*ftruncate) (const char *, off64_t, struct fuse_file_info *);
+	int (*ftruncate) (const char *, loff_t, struct fuse_file_info *);
 
 	/**
 	 * Get attributes from an open file
@@ -501,6 +503,9 @@
 	 * _IOC_READ in area and if both are set in/out area.  In all
 	 * non-NULL cases, the area is of _IOC_SIZE(cmd) bytes.
 	 *
+	 * If flags has FUSE_IOCTL_DIR then the fuse_file_info refers to a
+	 * directory file handle.
+	 *
 	 * Introduced in version 2.8
 	 */
 	int (*ioctl) (const char *, int cmd, void *arg,
@@ -534,7 +539,7 @@
 	 *
 	 * Introduced in version 2.9
 	 */
-	int (*write_buf) (const char *, struct fuse_bufvec *buf, off64_t off,
+	int (*write_buf) (const char *, struct fuse_bufvec *buf, loff_t off,
 			  struct fuse_file_info *);
 
 	/** Store data from an open file in a buffer
@@ -554,7 +559,7 @@
 	 * Introduced in version 2.9
 	 */
 	int (*read_buf) (const char *, struct fuse_bufvec **bufp,
-			 size_t size, off64_t off, struct fuse_file_info *);
+			 size_t size, loff_t off, struct fuse_file_info *);
 	/**
 	 * Perform BSD file locking operation
 	 *
@@ -587,7 +592,7 @@
 	 *
 	 * Introduced in version 2.9.1
 	 */
-	int (*fallocate) (const char *, int, off64_t, off64_t,
+	int (*fallocate) (const char *, int, loff_t, loff_t,
 			  struct fuse_file_info *);
 };
 
@@ -827,14 +832,14 @@
 int fuse_fs_open(struct fuse_fs *fs, const char *path,
 		 struct fuse_file_info *fi);
 int fuse_fs_read(struct fuse_fs *fs, const char *path, char *buf, size_t size,
-		 off64_t off, struct fuse_file_info *fi);
+		 loff_t off, struct fuse_file_info *fi);
 int fuse_fs_read_buf(struct fuse_fs *fs, const char *path,
-		     struct fuse_bufvec **bufp, size_t size, off64_t off,
+		     struct fuse_bufvec **bufp, size_t size, loff_t off,
 		     struct fuse_file_info *fi);
 int fuse_fs_write(struct fuse_fs *fs, const char *path, const char *buf,
-		  size_t size, off64_t off, struct fuse_file_info *fi);
+		  size_t size, loff_t off, struct fuse_file_info *fi);
 int fuse_fs_write_buf(struct fuse_fs *fs, const char *path,
-		      struct fuse_bufvec *buf, off64_t off,
+		      struct fuse_bufvec *buf, loff_t off,
 		      struct fuse_file_info *fi);
 int fuse_fs_fsync(struct fuse_fs *fs, const char *path, int datasync,
 		  struct fuse_file_info *fi);
@@ -844,7 +849,7 @@
 int fuse_fs_opendir(struct fuse_fs *fs, const char *path,
 		    struct fuse_file_info *fi);
 int fuse_fs_readdir(struct fuse_fs *fs, const char *path, void *buf,
-		    fuse_fill_dir_t filler, off64_t off,
+		    fuse_fill_dir_t filler, loff_t off,
 		    struct fuse_file_info *fi);
 int fuse_fs_fsyncdir(struct fuse_fs *fs, const char *path, int datasync,
 		     struct fuse_file_info *fi);
@@ -858,8 +863,8 @@
 		  struct fuse_file_info *fi, int op);
 int fuse_fs_chmod(struct fuse_fs *fs, const char *path, mode_t mode);
 int fuse_fs_chown(struct fuse_fs *fs, const char *path, uid_t uid, gid_t gid);
-int fuse_fs_truncate(struct fuse_fs *fs, const char *path, off64_t size);
-int fuse_fs_ftruncate(struct fuse_fs *fs, const char *path, off64_t size,
+int fuse_fs_truncate(struct fuse_fs *fs, const char *path, loff_t size);
+int fuse_fs_ftruncate(struct fuse_fs *fs, const char *path, loff_t size,
 		      struct fuse_file_info *fi);
 int fuse_fs_utimens(struct fuse_fs *fs, const char *path,
 		    const struct timespec tv[2]);
@@ -885,7 +890,7 @@
 		 struct fuse_file_info *fi, struct fuse_pollhandle *ph,
 		 unsigned *reventsp);
 int fuse_fs_fallocate(struct fuse_fs *fs, const char *path, int mode,
-		 off64_t offset, off64_t length, struct fuse_file_info *fi);
+		 loff_t offset, loff_t length, struct fuse_file_info *fi);
 void fuse_fs_init(struct fuse_fs *fs, struct fuse_conn_info *conn);
 void fuse_fs_destroy(struct fuse_fs *fs);
 
diff --git a/fuse/include/fuse_common.h b/fuse/include/fuse_common.h
index dab3a56..f08778b 100644
--- a/fuse/include/fuse_common.h
+++ b/fuse/include/fuse_common.h
@@ -28,7 +28,7 @@
 #define FUSE_MAKE_VERSION(maj, min)  ((maj) * 10 + (min))
 #define FUSE_VERSION FUSE_MAKE_VERSION(FUSE_MAJOR_VERSION, FUSE_MINOR_VERSION)
 
-/* This interface uses 64 bit off64_t */
+/* This interface uses 64 bit off_t */
 #if _FILE_OFFSET_BITS != 64
 #error Please add -D_FILE_OFFSET_BITS=64 to your compile flags!
 #endif
@@ -372,7 +372,7 @@
 	 *
 	 * Used if FUSE_BUF_FD_SEEK flag is set.
 	 */
-	off64_t pos;
+	loff_t pos;
 };
 
 /**
diff --git a/fuse/include/fuse_compat.h b/fuse/include/fuse_compat.h
index d093238..b825dee 100644
--- a/fuse/include/fuse_compat.h
+++ b/fuse/include/fuse_compat.h
@@ -9,6 +9,8 @@
 /* these definitions provide source compatibility to prior versions.
    Do not include this file directly! */
 
+#include "fuse_lowlevel.h"
+
 struct fuse_operations_compat25 {
 	int (*getattr) (const char *, struct stat *);
 	int (*readlink) (const char *, char *, size_t);
@@ -22,12 +24,12 @@
 	int (*link) (const char *, const char *);
 	int (*chmod) (const char *, mode_t);
 	int (*chown) (const char *, uid_t, gid_t);
-	int (*truncate) (const char *, off64_t);
+	int (*truncate) (const char *, loff_t);
 	int (*utime) (const char *, struct utimbuf *);
 	int (*open) (const char *, struct fuse_file_info *);
-	int (*read) (const char *, char *, size_t, off64_t,
+	int (*read) (const char *, char *, size_t, loff_t,
 		     struct fuse_file_info *);
-	int (*write) (const char *, const char *, size_t, off64_t,
+	int (*write) (const char *, const char *, size_t, loff_t,
 		      struct fuse_file_info *);
 	int (*statfs) (const char *, struct statvfs *);
 	int (*flush) (const char *, struct fuse_file_info *);
@@ -38,7 +40,7 @@
 	int (*listxattr) (const char *, char *, size_t);
 	int (*removexattr) (const char *, const char *);
 	int (*opendir) (const char *, struct fuse_file_info *);
-	int (*readdir) (const char *, void *, fuse_fill_dir_t, off64_t,
+	int (*readdir) (const char *, void *, fuse_fill_dir_t, loff_t,
 			struct fuse_file_info *);
 	int (*releasedir) (const char *, struct fuse_file_info *);
 	int (*fsyncdir) (const char *, int, struct fuse_file_info *);
@@ -46,7 +48,7 @@
 	void (*destroy) (void *);
 	int (*access) (const char *, int);
 	int (*create) (const char *, mode_t, struct fuse_file_info *);
-	int (*ftruncate) (const char *, off64_t, struct fuse_file_info *);
+	int (*ftruncate) (const char *, loff_t, struct fuse_file_info *);
 	int (*fgetattr) (const char *, struct stat *, struct fuse_file_info *);
 };
 
@@ -81,12 +83,12 @@
 	int (*link) (const char *, const char *);
 	int (*chmod) (const char *, mode_t);
 	int (*chown) (const char *, uid_t, gid_t);
-	int (*truncate) (const char *, off64_t);
+	int (*truncate) (const char *, loff_t);
 	int (*utime) (const char *, struct utimbuf *);
 	int (*open) (const char *, struct fuse_file_info_compat *);
-	int (*read) (const char *, char *, size_t, off64_t,
+	int (*read) (const char *, char *, size_t, loff_t,
 		     struct fuse_file_info_compat *);
-	int (*write) (const char *, const char *, size_t, off64_t,
+	int (*write) (const char *, const char *, size_t, loff_t,
 		      struct fuse_file_info_compat *);
 	int (*statfs) (const char *, struct statfs *);
 	int (*flush) (const char *, struct fuse_file_info_compat *);
@@ -97,7 +99,7 @@
 	int (*listxattr) (const char *, char *, size_t);
 	int (*removexattr) (const char *, const char *);
 	int (*opendir) (const char *, struct fuse_file_info_compat *);
-	int (*readdir) (const char *, void *, fuse_fill_dir_t, off64_t,
+	int (*readdir) (const char *, void *, fuse_fill_dir_t, loff_t,
 			struct fuse_file_info_compat *);
 	int (*releasedir) (const char *, struct fuse_file_info_compat *);
 	int (*fsyncdir) (const char *, int, struct fuse_file_info_compat *);
@@ -132,11 +134,11 @@
 	int (*link)	   (const char *, const char *);
 	int (*chmod)	   (const char *, mode_t);
 	int (*chown)	   (const char *, uid_t, gid_t);
-	int (*truncate)	   (const char *, off64_t);
+	int (*truncate)	   (const char *, loff_t);
 	int (*utime)	   (const char *, struct utimbuf *);
 	int (*open)	   (const char *, int);
-	int (*read)	   (const char *, char *, size_t, off64_t);
-	int (*write)	   (const char *, const char *, size_t, off64_t);
+	int (*read)	   (const char *, char *, size_t, loff_t);
+	int (*write)	   (const char *, const char *, size_t, loff_t);
 	int (*statfs)	   (const char *, struct statfs *);
 	int (*flush)	   (const char *);
 	int (*release)	   (const char *, int);
@@ -180,11 +182,11 @@
 	int (*link)	(const char *, const char *);
 	int (*chmod)	(const char *, mode_t);
 	int (*chown)	(const char *, uid_t, gid_t);
-	int (*truncate) (const char *, off64_t);
+	int (*truncate) (const char *, loff_t);
 	int (*utime)	(const char *, struct utimbuf *);
 	int (*open)	(const char *, int);
-	int (*read)	(const char *, char *, size_t, off64_t);
-	int (*write)	(const char *, const char *, size_t, off64_t);
+	int (*read)	(const char *, char *, size_t, loff_t);
+	int (*write)	(const char *, const char *, size_t, loff_t);
 	int (*statfs)	(struct fuse_statfs_compat1 *);
 	int (*release)	(const char *, int);
 	int (*fsync)	(const char *, int);
diff --git a/fuse/include/fuse_lowlevel.h b/fuse/include/fuse_lowlevel.h
index 36cf26d..6971f73 100644
--- a/fuse/include/fuse_lowlevel.h
+++ b/fuse/include/fuse_lowlevel.h
@@ -462,7 +462,7 @@
 	 * @param off offset to read from
 	 * @param fi file information
 	 */
-	void (*read) (fuse_req_t req, fuse_ino_t ino, size_t size, off64_t off,
+	void (*read) (fuse_req_t req, fuse_ino_t ino, size_t size, loff_t off,
 		      struct fuse_file_info *fi);
 
 	/**
@@ -489,7 +489,7 @@
 	 * @param fi file information
 	 */
 	void (*write) (fuse_req_t req, fuse_ino_t ino, const char *buf,
-		       size_t size, off64_t off, struct fuse_file_info *fi);
+		       size_t size, loff_t off, struct fuse_file_info *fi);
 
 	/**
 	 * Flush method
@@ -612,7 +612,7 @@
 	 * @param off offset to continue reading the directory stream
 	 * @param fi file information
 	 */
-	void (*readdir) (fuse_req_t req, fuse_ino_t ino, size_t size, off64_t off,
+	void (*readdir) (fuse_req_t req, fuse_ino_t ino, size_t size, loff_t off,
 			 struct fuse_file_info *fi);
 
 	/**
@@ -941,7 +941,7 @@
 	 * @param fi file information
 	 */
 	void (*write_buf) (fuse_req_t req, fuse_ino_t ino,
-			   struct fuse_bufvec *bufv, off64_t off,
+			   struct fuse_bufvec *bufv, loff_t off,
 			   struct fuse_file_info *fi);
 
 	/**
@@ -959,7 +959,7 @@
 	 * @param bufv the buffer containing the returned data
 	 */
 	void (*retrieve_reply) (fuse_req_t req, void *cookie, fuse_ino_t ino,
-				off64_t offset, struct fuse_bufvec *bufv);
+				loff_t offset, struct fuse_bufvec *bufv);
 
 	/**
 	 * Forget about multiple inodes
@@ -1015,7 +1015,7 @@
 	 *             see fallocate(2)
 	 */
 	void (*fallocate) (fuse_req_t req, fuse_ino_t ino, int mode,
-		       off64_t offset, off64_t length, struct fuse_file_info *fi);
+		       loff_t offset, loff_t length, struct fuse_file_info *fi);
 };
 
 /**
@@ -1249,7 +1249,7 @@
  */
 size_t fuse_add_direntry(fuse_req_t req, char *buf, size_t bufsize,
 			 const char *name, const struct stat *stbuf,
-			 off64_t off);
+			 loff_t off);
 
 /**
  * Reply to ask for data fetch and output buffer preparation.  ioctl
@@ -1329,12 +1329,16 @@
  * @return zero for success, -errno for failure
  */
 int fuse_lowlevel_notify_inval_inode(struct fuse_chan *ch, fuse_ino_t ino,
-                                     off64_t off, off64_t len);
+                                     loff_t off, loff_t len);
 
 /**
  * Notify to invalidate parent attributes and the dentry matching
  * parent/name
  *
+ * To avoid a deadlock don't call this function from a filesystem operation and
+ * don't call it with a lock held that can also be held by a filesystem
+ * operation.
+ *
  * @param ch the channel through which to send the invalidation
  * @param parent inode number
  * @param name file name
@@ -1349,6 +1353,10 @@
  * parent/name if the dentry's inode number matches child (otherwise it
  * will invalidate the matching dentry).
  *
+ * To avoid a deadlock don't call this function from a filesystem operation and
+ * don't call it with a lock held that can also be held by a filesystem
+ * operation.
+ *
  * @param ch the channel through which to send the notification
  * @param parent inode number
  * @param child inode number
@@ -1382,7 +1390,7 @@
  * @return zero for success, -errno for failure
  */
 int fuse_lowlevel_notify_store(struct fuse_chan *ch, fuse_ino_t ino,
-			       off64_t offset, struct fuse_bufvec *bufv,
+			       loff_t offset, struct fuse_bufvec *bufv,
 			       enum fuse_buf_copy_flags flags);
 /**
  * Retrieve data from the kernel buffers
@@ -1410,7 +1418,7 @@
  * @return zero for success, -errno for failure
  */
 int fuse_lowlevel_notify_retrieve(struct fuse_chan *ch, fuse_ino_t ino,
-				  size_t size, off64_t offset, void *cookie);
+				  size_t size, loff_t offset, void *cookie);
 
 
 /* ----------------------------------------------------------- *
diff --git a/fuse/include/fuse_lowlevel_compat.h b/fuse/include/fuse_lowlevel_compat.h
index 78b7c2b..f13adbd 100644
--- a/fuse/include/fuse_lowlevel_compat.h
+++ b/fuse/include/fuse_lowlevel_compat.h
@@ -9,6 +9,8 @@
 /* these definitions provide source compatibility to prior versions.
    Do not include this file directly! */
 
+#include "fuse_common.h"
+
 struct fuse_lowlevel_ops_compat25 {
 	void (*init) (void *userdata);
 	void (*destroy) (void *userdata);
@@ -33,10 +35,10 @@
 		      const char *newname);
 	void (*open) (fuse_req_t req, fuse_ino_t ino,
 		      struct fuse_file_info *fi);
-	void (*read) (fuse_req_t req, fuse_ino_t ino, size_t size, off64_t off,
+	void (*read) (fuse_req_t req, fuse_ino_t ino, size_t size, loff_t off,
 		      struct fuse_file_info *fi);
 	void (*write) (fuse_req_t req, fuse_ino_t ino, const char *buf,
-		       size_t size, off64_t off, struct fuse_file_info *fi);
+		       size_t size, loff_t off, struct fuse_file_info *fi);
 	void (*flush) (fuse_req_t req, fuse_ino_t ino,
 		       struct fuse_file_info *fi);
 	void (*release) (fuse_req_t req, fuse_ino_t ino,
@@ -45,7 +47,7 @@
 		       struct fuse_file_info *fi);
 	void (*opendir) (fuse_req_t req, fuse_ino_t ino,
 			 struct fuse_file_info *fi);
-	void (*readdir) (fuse_req_t req, fuse_ino_t ino, size_t size, off64_t off,
+	void (*readdir) (fuse_req_t req, fuse_ino_t ino, size_t size, loff_t off,
 			 struct fuse_file_info *fi);
 	void (*releasedir) (fuse_req_t req, fuse_ino_t ino,
 			    struct fuse_file_info *fi);
@@ -70,7 +72,7 @@
 size_t fuse_dirent_size(size_t namelen);
 
 char *fuse_add_dirent(char *buf, const char *name, const struct stat *stbuf,
-		      off64_t off);
+		      loff_t off);
 
 #if !defined(__FreeBSD__) && !defined(__NetBSD__)
 
@@ -100,10 +102,10 @@
 		      const char *newname);
 	void (*open) (fuse_req_t req, fuse_ino_t ino,
 		      struct fuse_file_info_compat *fi);
-	void (*read) (fuse_req_t req, fuse_ino_t ino, size_t size, off64_t off,
+	void (*read) (fuse_req_t req, fuse_ino_t ino, size_t size, loff_t off,
 		      struct fuse_file_info_compat *fi);
 	void (*write) (fuse_req_t req, fuse_ino_t ino, const char *buf,
-		       size_t size, off64_t off, struct fuse_file_info_compat *fi);
+		       size_t size, loff_t off, struct fuse_file_info_compat *fi);
 	void (*flush) (fuse_req_t req, fuse_ino_t ino,
 		       struct fuse_file_info_compat *fi);
 	void (*release) (fuse_req_t req, fuse_ino_t ino,
@@ -112,7 +114,7 @@
 		       struct fuse_file_info_compat *fi);
 	void (*opendir) (fuse_req_t req, fuse_ino_t ino,
 			 struct fuse_file_info_compat *fi);
-	void (*readdir) (fuse_req_t req, fuse_ino_t ino, size_t size, off64_t off,
+	void (*readdir) (fuse_req_t req, fuse_ino_t ino, size_t size, loff_t off,
 			 struct fuse_file_info_compat *fi);
 	void (*releasedir) (fuse_req_t req, fuse_ino_t ino,
 			    struct fuse_file_info_compat *fi);
diff --git a/fuse/include/stamp-h1 b/fuse/include/stamp-h1
deleted file mode 100644
index b330768..0000000
--- a/fuse/include/stamp-h1
+++ /dev/null
@@ -1 +0,0 @@
-timestamp for include/config.h
diff --git a/fuse/include/sys/statvfs.h b/fuse/include/sys/statvfs.h
deleted file mode 100644
index 6e3e39f..0000000
--- a/fuse/include/sys/statvfs.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef __STATVFS_H
-#define __STATVFS_H
-
-struct statvfs {
-	unsigned long  f_bsize;    /* file system block size */
-	unsigned long  f_frsize;   /* fragment size */
-	fsblkcnt_t     f_blocks;   /* size of fs in f_frsize units */
-	fsblkcnt_t     f_bfree;    /* # free blocks */
-	fsblkcnt_t     f_bavail;   /* # free blocks for non-root */
-	fsfilcnt_t     f_files;    /* # inodes */
-	fsfilcnt_t     f_ffree;    /* # free inodes */
-	fsfilcnt_t     f_favail;   /* # free inodes for non-root */
-	unsigned long  f_fsid;     /* file system ID */
-	unsigned long  f_flag;     /* mount flags */
-	unsigned long  f_namemax;  /* maximum filename length */
-};
-
-#endif
diff --git a/fuse/include/ulockmgr.h b/fuse/include/ulockmgr.h
index ad55579..c3ceef5 100644
--- a/fuse/include/ulockmgr.h
+++ b/fuse/include/ulockmgr.h
@@ -6,6 +6,8 @@
   See the file COPYING.LIB.
 */
 
+#include "fuse_lowlevel.h"
+
 #include <stdint.h>
 #include <fcntl.h>
 #include <sys/types.h>
diff --git a/fuse/modules/iconv.c b/fuse/modules/iconv.c
new file mode 100644
index 0000000..9b78cfd
--- /dev/null
+++ b/fuse/modules/iconv.c
@@ -0,0 +1,739 @@
+/*
+  fuse iconv module: file name charset conversion
+  Copyright (C) 2007  Miklos Szeredi <miklos@szeredi.hu>
+
+  This program can be distributed under the terms of the GNU LGPLv2.
+  See the file COPYING.LIB
+*/
+
+#define FUSE_USE_VERSION 26
+
+#include <fuse.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <errno.h>
+#include <iconv.h>
+#include <pthread.h>
+#include <locale.h>
+#include <langinfo.h>
+
+struct iconv {
+	struct fuse_fs *next;
+	pthread_mutex_t lock;
+	char *from_code;
+	char *to_code;
+	iconv_t tofs;
+	iconv_t fromfs;
+};
+
+struct iconv_dh {
+	struct iconv *ic;
+	void *prev_buf;
+	fuse_fill_dir_t prev_filler;
+};
+
+static struct iconv *iconv_get(void)
+{
+	return fuse_get_context()->private_data;
+}
+
+static int iconv_convpath(struct iconv *ic, const char *path, char **newpathp,
+			  int fromfs)
+{
+	size_t pathlen;
+	size_t newpathlen;
+	char *newpath;
+	size_t plen;
+	char *p;
+	size_t res;
+	int err;
+
+	if (path == NULL) {
+		*newpathp = NULL;
+		return 0;
+	}
+
+	pathlen = strlen(path);
+	newpathlen = pathlen * 4;
+	newpath = malloc(newpathlen + 1);
+	if (!newpath)
+		return -ENOMEM;
+
+	plen = newpathlen;
+	p = newpath;
+	pthread_mutex_lock(&ic->lock);
+	do {
+		res = iconv(fromfs ? ic->fromfs : ic->tofs, (char **) &path,
+			    &pathlen, &p, &plen);
+		if (res == (size_t) -1) {
+			char *tmp;
+			size_t inc;
+
+			err = -EILSEQ;
+			if (errno != E2BIG)
+				goto err;
+
+			inc = (pathlen + 1) * 4;
+			newpathlen += inc;
+			tmp = realloc(newpath, newpathlen + 1);
+			err = -ENOMEM;
+			if (!tmp)
+				goto err;
+
+			p = tmp + (p - newpath);
+			plen += inc;
+			newpath = tmp;
+		}
+	} while (res == (size_t) -1);
+	pthread_mutex_unlock(&ic->lock);
+	*p = '\0';
+	*newpathp = newpath;
+	return 0;
+
+err:
+	iconv(fromfs ? ic->fromfs : ic->tofs, NULL, NULL, NULL, NULL);
+	pthread_mutex_unlock(&ic->lock);
+	free(newpath);
+	return err;
+}
+
+static int iconv_getattr(const char *path, struct stat *stbuf)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_getattr(ic->next, newpath, stbuf);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_fgetattr(const char *path, struct stat *stbuf,
+			  struct fuse_file_info *fi)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_fgetattr(ic->next, newpath, stbuf, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_access(const char *path, int mask)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_access(ic->next, newpath, mask);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_readlink(const char *path, char *buf, size_t size)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_readlink(ic->next, newpath, buf, size);
+		if (!err) {
+			char *newlink;
+			err = iconv_convpath(ic, buf, &newlink, 1);
+			if (!err) {
+				strncpy(buf, newlink, size - 1);
+				buf[size - 1] = '\0';
+				free(newlink);
+			}
+		}
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_opendir(const char *path, struct fuse_file_info *fi)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_opendir(ic->next, newpath, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_dir_fill(void *buf, const char *name,
+			  const struct stat *stbuf, loff_t off)
+{
+	struct iconv_dh *dh = buf;
+	char *newname;
+	int res = 0;
+	if (iconv_convpath(dh->ic, name, &newname, 1) == 0) {
+		res = dh->prev_filler(dh->prev_buf, newname, stbuf, off);
+		free(newname);
+	}
+	return res;
+}
+
+static int iconv_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
+			 loff_t offset, struct fuse_file_info *fi)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		struct iconv_dh dh;
+		dh.ic = ic;
+		dh.prev_buf = buf;
+		dh.prev_filler = filler;
+		err = fuse_fs_readdir(ic->next, newpath, &dh, iconv_dir_fill,
+				      offset, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_releasedir(const char *path, struct fuse_file_info *fi)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_releasedir(ic->next, newpath, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_mknod(const char *path, mode_t mode, dev_t rdev)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_mknod(ic->next, newpath, mode, rdev);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_mkdir(const char *path, mode_t mode)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_mkdir(ic->next, newpath, mode);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_unlink(const char *path)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_unlink(ic->next, newpath);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_rmdir(const char *path)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_rmdir(ic->next, newpath);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_symlink(const char *from, const char *to)
+{
+	struct iconv *ic = iconv_get();
+	char *newfrom;
+	char *newto;
+	int err = iconv_convpath(ic, from, &newfrom, 0);
+	if (!err) {
+		err = iconv_convpath(ic, to, &newto, 0);
+		if (!err) {
+			err = fuse_fs_symlink(ic->next, newfrom, newto);
+			free(newto);
+		}
+		free(newfrom);
+	}
+	return err;
+}
+
+static int iconv_rename(const char *from, const char *to)
+{
+	struct iconv *ic = iconv_get();
+	char *newfrom;
+	char *newto;
+	int err = iconv_convpath(ic, from, &newfrom, 0);
+	if (!err) {
+		err = iconv_convpath(ic, to, &newto, 0);
+		if (!err) {
+			err = fuse_fs_rename(ic->next, newfrom, newto);
+			free(newto);
+		}
+		free(newfrom);
+	}
+	return err;
+}
+
+static int iconv_link(const char *from, const char *to)
+{
+	struct iconv *ic = iconv_get();
+	char *newfrom;
+	char *newto;
+	int err = iconv_convpath(ic, from, &newfrom, 0);
+	if (!err) {
+		err = iconv_convpath(ic, to, &newto, 0);
+		if (!err) {
+			err = fuse_fs_link(ic->next, newfrom, newto);
+			free(newto);
+		}
+		free(newfrom);
+	}
+	return err;
+}
+
+static int iconv_chmod(const char *path, mode_t mode)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_chmod(ic->next, newpath, mode);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_chown(const char *path, uid_t uid, gid_t gid)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_chown(ic->next, newpath, uid, gid);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_truncate(const char *path, loff_t size)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_truncate(ic->next, newpath, size);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_ftruncate(const char *path, loff_t size,
+			   struct fuse_file_info *fi)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_ftruncate(ic->next, newpath, size, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_utimens(const char *path, const struct timespec ts[2])
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_utimens(ic->next, newpath, ts);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_create(const char *path, mode_t mode,
+			struct fuse_file_info *fi)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_create(ic->next, newpath, mode, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_open_file(const char *path, struct fuse_file_info *fi)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_open(ic->next, newpath, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_read_buf(const char *path, struct fuse_bufvec **bufp,
+			  size_t size, loff_t offset, struct fuse_file_info *fi)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_read_buf(ic->next, newpath, bufp, size, offset, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_write_buf(const char *path, struct fuse_bufvec *buf,
+			   loff_t offset, struct fuse_file_info *fi)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_write_buf(ic->next, newpath, buf, offset, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_statfs(const char *path, struct statvfs *stbuf)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_statfs(ic->next, newpath, stbuf);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_flush(const char *path, struct fuse_file_info *fi)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_flush(ic->next, newpath, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_release(const char *path, struct fuse_file_info *fi)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_release(ic->next, newpath, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_fsync(const char *path, int isdatasync,
+		       struct fuse_file_info *fi)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_fsync(ic->next, newpath, isdatasync, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_fsyncdir(const char *path, int isdatasync,
+			  struct fuse_file_info *fi)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_fsyncdir(ic->next, newpath, isdatasync, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_setxattr(const char *path, const char *name,
+			  const char *value, size_t size, int flags)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_setxattr(ic->next, newpath, name, value, size,
+				       flags);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_getxattr(const char *path, const char *name, char *value,
+			  size_t size)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_getxattr(ic->next, newpath, name, value, size);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_listxattr(const char *path, char *list, size_t size)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_listxattr(ic->next, newpath, list, size);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_removexattr(const char *path, const char *name)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_removexattr(ic->next, newpath, name);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_lock(const char *path, struct fuse_file_info *fi, int cmd,
+		      struct flock *lock)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_lock(ic->next, newpath, fi, cmd, lock);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_flock(const char *path, struct fuse_file_info *fi, int op)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_flock(ic->next, newpath, fi, op);
+		free(newpath);
+	}
+	return err;
+}
+
+static int iconv_bmap(const char *path, size_t blocksize, uint64_t *idx)
+{
+	struct iconv *ic = iconv_get();
+	char *newpath;
+	int err = iconv_convpath(ic, path, &newpath, 0);
+	if (!err) {
+		err = fuse_fs_bmap(ic->next, newpath, blocksize, idx);
+		free(newpath);
+	}
+	return err;
+}
+
+static void *iconv_init(struct fuse_conn_info *conn)
+{
+	struct iconv *ic = iconv_get();
+	fuse_fs_init(ic->next, conn);
+	return ic;
+}
+
+static void iconv_destroy(void *data)
+{
+	struct iconv *ic = data;
+	fuse_fs_destroy(ic->next);
+	iconv_close(ic->tofs);
+	iconv_close(ic->fromfs);
+	pthread_mutex_destroy(&ic->lock);
+	free(ic->from_code);
+	free(ic->to_code);
+	free(ic);
+}
+
+static const struct fuse_operations iconv_oper = {
+	.destroy	= iconv_destroy,
+	.init		= iconv_init,
+	.getattr	= iconv_getattr,
+	.fgetattr	= iconv_fgetattr,
+	.access		= iconv_access,
+	.readlink	= iconv_readlink,
+	.opendir	= iconv_opendir,
+	.readdir	= iconv_readdir,
+	.releasedir	= iconv_releasedir,
+	.mknod		= iconv_mknod,
+	.mkdir		= iconv_mkdir,
+	.symlink	= iconv_symlink,
+	.unlink		= iconv_unlink,
+	.rmdir		= iconv_rmdir,
+	.rename		= iconv_rename,
+	.link		= iconv_link,
+	.chmod		= iconv_chmod,
+	.chown		= iconv_chown,
+	.truncate	= iconv_truncate,
+	.ftruncate	= iconv_ftruncate,
+	.utimens	= iconv_utimens,
+	.create		= iconv_create,
+	.open		= iconv_open_file,
+	.read_buf	= iconv_read_buf,
+	.write_buf	= iconv_write_buf,
+	.statfs		= iconv_statfs,
+	.flush		= iconv_flush,
+	.release	= iconv_release,
+	.fsync		= iconv_fsync,
+	.fsyncdir	= iconv_fsyncdir,
+	.setxattr	= iconv_setxattr,
+	.getxattr	= iconv_getxattr,
+	.listxattr	= iconv_listxattr,
+	.removexattr	= iconv_removexattr,
+	.lock		= iconv_lock,
+	.flock		= iconv_flock,
+	.bmap		= iconv_bmap,
+
+	.flag_nullpath_ok = 1,
+	.flag_nopath = 1,
+};
+
+static const struct fuse_opt iconv_opts[] = {
+	FUSE_OPT_KEY("-h", 0),
+	FUSE_OPT_KEY("--help", 0),
+	{ "from_code=%s", offsetof(struct iconv, from_code), 0 },
+	{ "to_code=%s", offsetof(struct iconv, to_code), 1 },
+	FUSE_OPT_END
+};
+
+static void iconv_help(void)
+{
+	char *old = strdup(setlocale(LC_CTYPE, ""));
+	char *charmap = strdup(nl_langinfo(CODESET));
+	setlocale(LC_CTYPE, old);
+	free(old);
+	fprintf(stderr,
+"    -o from_code=CHARSET   original encoding of file names (default: UTF-8)\n"
+"    -o to_code=CHARSET	    new encoding of the file names (default: %s)\n",
+		charmap);
+	free(charmap);
+}
+
+static int iconv_opt_proc(void *data, const char *arg, int key,
+			  struct fuse_args *outargs)
+{
+	(void) data; (void) arg; (void) outargs;
+
+	if (!key) {
+		iconv_help();
+		return -1;
+	}
+
+	return 1;
+}
+
+static struct fuse_fs *iconv_new(struct fuse_args *args,
+				 struct fuse_fs *next[])
+{
+	struct fuse_fs *fs;
+	struct iconv *ic;
+	char *old = NULL;
+	const char *from;
+	const char *to;
+
+	ic = calloc(1, sizeof(struct iconv));
+	if (ic == NULL) {
+		fprintf(stderr, "fuse-iconv: memory allocation failed\n");
+		return NULL;
+	}
+
+	if (fuse_opt_parse(args, ic, iconv_opts, iconv_opt_proc) == -1)
+		goto out_free;
+
+	if (!next[0] || next[1]) {
+		fprintf(stderr, "fuse-iconv: exactly one next filesystem required\n");
+		goto out_free;
+	}
+
+	from = ic->from_code ? ic->from_code : "UTF-8";
+	to = ic->to_code ? ic->to_code : "";
+	/* FIXME: detect charset equivalence? */
+	if (!to[0])
+		old = strdup(setlocale(LC_CTYPE, ""));
+	ic->tofs = iconv_open(from, to);
+	if (ic->tofs == (iconv_t) -1) {
+		fprintf(stderr, "fuse-iconv: cannot convert from %s to %s\n",
+			to, from);
+		goto out_free;
+	}
+	ic->fromfs = iconv_open(to, from);
+	if (ic->tofs == (iconv_t) -1) {
+		fprintf(stderr, "fuse-iconv: cannot convert from %s to %s\n",
+			from, to);
+		goto out_iconv_close_to;
+	}
+	if (old) {
+		setlocale(LC_CTYPE, old);
+		free(old);
+	}
+
+	ic->next = next[0];
+	fs = fuse_fs_new(&iconv_oper, sizeof(iconv_oper), ic);
+	if (!fs)
+		goto out_iconv_close_from;
+
+	return fs;
+
+out_iconv_close_from:
+	iconv_close(ic->fromfs);
+out_iconv_close_to:
+	iconv_close(ic->tofs);
+out_free:
+	free(ic->from_code);
+	free(ic->to_code);
+	free(ic);
+	if (old) {
+		setlocale(LC_CTYPE, old);
+		free(old);
+	}
+	return NULL;
+}
+
+FUSE_REGISTER_MODULE(iconv, iconv_new);
diff --git a/fuse/modules/subdir.c b/fuse/modules/subdir.c
new file mode 100644
index 0000000..05b3379
--- /dev/null
+++ b/fuse/modules/subdir.c
@@ -0,0 +1,697 @@
+/*
+  fuse subdir module: offset paths with a base directory
+  Copyright (C) 2007  Miklos Szeredi <miklos@szeredi.hu>
+
+  This program can be distributed under the terms of the GNU LGPLv2.
+  See the file COPYING.LIB
+*/
+
+#define FUSE_USE_VERSION 26
+
+#include <fuse.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <errno.h>
+
+struct subdir {
+	char *base;
+	size_t baselen;
+	int rellinks;
+	struct fuse_fs *next;
+};
+
+static struct subdir *subdir_get(void)
+{
+	return fuse_get_context()->private_data;
+}
+
+static int subdir_addpath(struct subdir *d, const char *path, char **newpathp)
+{
+	char *newpath = NULL;
+
+	if (path != NULL) {
+		unsigned newlen = d->baselen + strlen(path);
+
+		newpath = malloc(newlen + 2);
+		if (!newpath)
+			return -ENOMEM;
+
+		if (path[0] == '/')
+			path++;
+		strcpy(newpath, d->base);
+		strcpy(newpath + d->baselen, path);
+		if (!newpath[0])
+			strcpy(newpath, ".");
+	}
+	*newpathp = newpath;
+
+	return 0;
+}
+
+static int subdir_getattr(const char *path, struct stat *stbuf)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_getattr(d->next, newpath, stbuf);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_fgetattr(const char *path, struct stat *stbuf,
+			   struct fuse_file_info *fi)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_fgetattr(d->next, newpath, stbuf, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_access(const char *path, int mask)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_access(d->next, newpath, mask);
+		free(newpath);
+	}
+	return err;
+}
+
+
+static int count_components(const char *p)
+{
+	int ctr;
+
+	for (; *p == '/'; p++);
+	for (ctr = 0; *p; ctr++) {
+		for (; *p && *p != '/'; p++);
+		for (; *p == '/'; p++);
+	}
+	return ctr;
+}
+
+static void strip_common(const char **sp, const char **tp)
+{
+	const char *s = *sp;
+	const char *t = *tp;
+	do {
+		for (; *s == '/'; s++);
+		for (; *t == '/'; t++);
+		*tp = t;
+		*sp = s;
+		for (; *s == *t && *s && *s != '/'; s++, t++);
+	} while ((*s == *t && *s) || (!*s && *t == '/') || (*s == '/' && !*t));
+}
+
+static void transform_symlink(struct subdir *d, const char *path,
+			      char *buf, size_t size)
+{
+	const char *l = buf;
+	size_t llen;
+	char *s;
+	int dotdots;
+	int i;
+
+	if (l[0] != '/' || d->base[0] != '/')
+		return;
+
+	strip_common(&l, &path);
+	if (l - buf < (long) d->baselen)
+		return;
+
+	dotdots = count_components(path);
+	if (!dotdots)
+		return;
+	dotdots--;
+
+	llen = strlen(l);
+	if (dotdots * 3 + llen + 2 > size)
+		return;
+
+	s = buf + dotdots * 3;
+	if (llen)
+		memmove(s, l, llen + 1);
+	else if (!dotdots)
+		strcpy(s, ".");
+	else
+		*s = '\0';
+
+	for (s = buf, i = 0; i < dotdots; i++, s += 3)
+		memcpy(s, "../", 3);
+}
+
+
+static int subdir_readlink(const char *path, char *buf, size_t size)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_readlink(d->next, newpath, buf, size);
+		if (!err && d->rellinks)
+			transform_symlink(d, newpath, buf, size);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_opendir(const char *path, struct fuse_file_info *fi)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_opendir(d->next, newpath, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_readdir(const char *path, void *buf,
+			  fuse_fill_dir_t filler, loff_t offset,
+			  struct fuse_file_info *fi)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_readdir(d->next, newpath, buf, filler, offset,
+				      fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_releasedir(const char *path, struct fuse_file_info *fi)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_releasedir(d->next, newpath, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_mknod(const char *path, mode_t mode, dev_t rdev)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_mknod(d->next, newpath, mode, rdev);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_mkdir(const char *path, mode_t mode)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_mkdir(d->next, newpath, mode);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_unlink(const char *path)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_unlink(d->next, newpath);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_rmdir(const char *path)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_rmdir(d->next, newpath);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_symlink(const char *from, const char *path)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_symlink(d->next, from, newpath);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_rename(const char *from, const char *to)
+{
+	struct subdir *d = subdir_get();
+	char *newfrom;
+	char *newto;
+	int err = subdir_addpath(d, from, &newfrom);
+	if (!err) {
+		err = subdir_addpath(d, to, &newto);
+		if (!err) {
+			err = fuse_fs_rename(d->next, newfrom, newto);
+			free(newto);
+		}
+		free(newfrom);
+	}
+	return err;
+}
+
+static int subdir_link(const char *from, const char *to)
+{
+	struct subdir *d = subdir_get();
+	char *newfrom;
+	char *newto;
+	int err = subdir_addpath(d, from, &newfrom);
+	if (!err) {
+		err = subdir_addpath(d, to, &newto);
+		if (!err) {
+			err = fuse_fs_link(d->next, newfrom, newto);
+			free(newto);
+		}
+		free(newfrom);
+	}
+	return err;
+}
+
+static int subdir_chmod(const char *path, mode_t mode)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_chmod(d->next, newpath, mode);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_chown(const char *path, uid_t uid, gid_t gid)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_chown(d->next, newpath, uid, gid);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_truncate(const char *path, loff_t size)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_truncate(d->next, newpath, size);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_ftruncate(const char *path, loff_t size,
+			    struct fuse_file_info *fi)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_ftruncate(d->next, newpath, size, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_utimens(const char *path, const struct timespec ts[2])
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_utimens(d->next, newpath, ts);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_create(const char *path, mode_t mode,
+			 struct fuse_file_info *fi)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_create(d->next, newpath, mode, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_open(const char *path, struct fuse_file_info *fi)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_open(d->next, newpath, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_read_buf(const char *path, struct fuse_bufvec **bufp,
+			   size_t size, loff_t offset, struct fuse_file_info *fi)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_read_buf(d->next, newpath, bufp, size, offset, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_write_buf(const char *path, struct fuse_bufvec *buf,
+			loff_t offset, struct fuse_file_info *fi)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_write_buf(d->next, newpath, buf, offset, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_statfs(const char *path, struct statvfs *stbuf)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_statfs(d->next, newpath, stbuf);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_flush(const char *path, struct fuse_file_info *fi)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_flush(d->next, newpath, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_release(const char *path, struct fuse_file_info *fi)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_release(d->next, newpath, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_fsync(const char *path, int isdatasync,
+			struct fuse_file_info *fi)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_fsync(d->next, newpath, isdatasync, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_fsyncdir(const char *path, int isdatasync,
+			   struct fuse_file_info *fi)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_fsyncdir(d->next, newpath, isdatasync, fi);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_setxattr(const char *path, const char *name,
+			   const char *value, size_t size, int flags)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_setxattr(d->next, newpath, name, value, size,
+				       flags);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_getxattr(const char *path, const char *name, char *value,
+			   size_t size)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_getxattr(d->next, newpath, name, value, size);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_listxattr(const char *path, char *list, size_t size)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_listxattr(d->next, newpath, list, size);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_removexattr(const char *path, const char *name)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_removexattr(d->next, newpath, name);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_lock(const char *path, struct fuse_file_info *fi, int cmd,
+		       struct flock *lock)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_lock(d->next, newpath, fi, cmd, lock);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_flock(const char *path, struct fuse_file_info *fi, int op)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_flock(d->next, newpath, fi, op);
+		free(newpath);
+	}
+	return err;
+}
+
+static int subdir_bmap(const char *path, size_t blocksize, uint64_t *idx)
+{
+	struct subdir *d = subdir_get();
+	char *newpath;
+	int err = subdir_addpath(d, path, &newpath);
+	if (!err) {
+		err = fuse_fs_bmap(d->next, newpath, blocksize, idx);
+		free(newpath);
+	}
+	return err;
+}
+
+static void *subdir_init(struct fuse_conn_info *conn)
+{
+	struct subdir *d = subdir_get();
+	fuse_fs_init(d->next, conn);
+	return d;
+}
+
+static void subdir_destroy(void *data)
+{
+	struct subdir *d = data;
+	fuse_fs_destroy(d->next);
+	free(d->base);
+	free(d);
+}
+
+static const struct fuse_operations subdir_oper = {
+	.destroy	= subdir_destroy,
+	.init		= subdir_init,
+	.getattr	= subdir_getattr,
+	.fgetattr	= subdir_fgetattr,
+	.access		= subdir_access,
+	.readlink	= subdir_readlink,
+	.opendir	= subdir_opendir,
+	.readdir	= subdir_readdir,
+	.releasedir	= subdir_releasedir,
+	.mknod		= subdir_mknod,
+	.mkdir		= subdir_mkdir,
+	.symlink	= subdir_symlink,
+	.unlink		= subdir_unlink,
+	.rmdir		= subdir_rmdir,
+	.rename		= subdir_rename,
+	.link		= subdir_link,
+	.chmod		= subdir_chmod,
+	.chown		= subdir_chown,
+	.truncate	= subdir_truncate,
+	.ftruncate	= subdir_ftruncate,
+	.utimens	= subdir_utimens,
+	.create		= subdir_create,
+	.open		= subdir_open,
+	.read_buf	= subdir_read_buf,
+	.write_buf	= subdir_write_buf,
+	.statfs		= subdir_statfs,
+	.flush		= subdir_flush,
+	.release	= subdir_release,
+	.fsync		= subdir_fsync,
+	.fsyncdir	= subdir_fsyncdir,
+	.setxattr	= subdir_setxattr,
+	.getxattr	= subdir_getxattr,
+	.listxattr	= subdir_listxattr,
+	.removexattr	= subdir_removexattr,
+	.lock		= subdir_lock,
+	.flock		= subdir_flock,
+	.bmap		= subdir_bmap,
+
+	.flag_nullpath_ok = 1,
+	.flag_nopath = 1,
+};
+
+static const struct fuse_opt subdir_opts[] = {
+	FUSE_OPT_KEY("-h", 0),
+	FUSE_OPT_KEY("--help", 0),
+	{ "subdir=%s", offsetof(struct subdir, base), 0 },
+	{ "rellinks", offsetof(struct subdir, rellinks), 1 },
+	{ "norellinks", offsetof(struct subdir, rellinks), 0 },
+	FUSE_OPT_END
+};
+
+static void subdir_help(void)
+{
+	fprintf(stderr,
+"    -o subdir=DIR	    prepend this directory to all paths (mandatory)\n"
+"    -o [no]rellinks	    transform absolute symlinks to relative\n");
+}
+
+static int subdir_opt_proc(void *data, const char *arg, int key,
+			   struct fuse_args *outargs)
+{
+	(void) data; (void) arg; (void) outargs;
+
+	if (!key) {
+		subdir_help();
+		return -1;
+	}
+
+	return 1;
+}
+
+static struct fuse_fs *subdir_new(struct fuse_args *args,
+				  struct fuse_fs *next[])
+{
+	struct fuse_fs *fs;
+	struct subdir *d;
+
+	d = calloc(1, sizeof(struct subdir));
+	if (d == NULL) {
+		fprintf(stderr, "fuse-subdir: memory allocation failed\n");
+		return NULL;
+	}
+
+	if (fuse_opt_parse(args, d, subdir_opts, subdir_opt_proc) == -1)
+		goto out_free;
+
+	if (!next[0] || next[1]) {
+		fprintf(stderr, "fuse-subdir: exactly one next filesystem required\n");
+		goto out_free;
+	}
+
+	if (!d->base) {
+		fprintf(stderr, "fuse-subdir: missing 'subdir' option\n");
+		goto out_free;
+	}
+
+	if (d->base[0] && d->base[strlen(d->base)-1] != '/') {
+		char *tmp = realloc(d->base, strlen(d->base) + 2);
+		if (!tmp) {
+			fprintf(stderr, "fuse-subdir: memory allocation failed\n");
+			goto out_free;
+		}
+		d->base = tmp;
+		strcat(d->base, "/");
+	}
+	d->baselen = strlen(d->base);
+	d->next = next[0];
+	fs = fuse_fs_new(&subdir_oper, sizeof(subdir_oper), d);
+	if (!fs)
+		goto out_free;
+	return fs;
+
+out_free:
+	free(d->base);
+	free(d);
+	return NULL;
+}
+
+FUSE_REGISTER_MODULE(subdir, subdir_new);
diff --git a/fuse/mount.c b/fuse/mount.c
index af7218f..eb0bb17 100644
--- a/fuse/mount.c
+++ b/fuse/mount.c
@@ -36,13 +36,16 @@
 #define MS_SYNCHRONOUS 	MNT_SYNCHRONOUS
 #define MS_NOATIME 	MNT_NOATIME
 
-
 #define umount2(mnt, flags) unmount(mnt, (flags == 2) ? MNT_FORCE : 0)
 #endif
 
 #define FUSERMOUNT_PROG		"fusermount"
 #define FUSE_COMMFD_ENV		"_FUSE_COMMFD"
 
+#if defined(__ANDROID__) && !defined(FUSERMOUNT_DIR)
+# define FUSERMOUNT_DIR "/system/xbin"
+#endif
+
 #ifndef HAVE_FORK
 #define fork() vfork()
 #endif
@@ -138,7 +141,6 @@
 "\n");
 }
 
-#define FUSERMOUNT_DIR "/usr/bin"
 static void exec_fusermount(const char *argv[])
 {
 	execv(FUSERMOUNT_DIR "/" FUSERMOUNT_PROG, (char **) argv);
@@ -302,14 +304,18 @@
 		pfd.fd = fd;
 		pfd.events = 0;
 		res = poll(&pfd, 1, 0);
+
+		/* Need to close file descriptor, otherwise synchronous umount
+		   would recurse into filesystem, and deadlock.
+
+		   Caller expects fuse_kern_unmount to close the fd, so close it
+		   anyway. */
+		close(fd);
+
 		/* If file poll returns POLLERR on the device file descriptor,
 		   then the filesystem is already unmounted */
 		if (res == 1 && (pfd.revents & POLLERR))
 			return;
-
-		/* Need to close file descriptor, otherwise synchronous umount
-		   would recurse into filesystem, and deadlock */
-		close(fd);
 	}
 
 	if (geteuid() == 0) {
@@ -465,7 +471,7 @@
 		return -1;
 	}
 
-	snprintf(tmp, sizeof(tmp),  "fd=%i,rootmode=%o,user_id=%i,group_id=%i",
+	snprintf(tmp, sizeof(tmp),  "fd=%i,rootmode=%o,user_id=%u,group_id=%u",
 		 fd, stbuf.st_mode & S_IFMT, getuid(), getgid());
 
 	res = fuse_opt_add_opt(&mo->kernel_opts, tmp);
diff --git a/fuse/mount_bsd.c b/fuse/mount_bsd.c
index 62443ac..3aec3e3 100644
--- a/fuse/mount_bsd.c
+++ b/fuse/mount_bsd.c
@@ -228,18 +228,21 @@
 	(void)mountpoint;
 
 	if (fstat(fd, &sbuf) == -1)
-		return;
+		goto out;
 
 	devname_r(sbuf.st_rdev, S_IFCHR, dev, 128);
 
 	if (strncmp(dev, "fuse", 4))
-		return;
+		goto out;
 
 	strtol(dev + 4, &ep, 10);
 	if (*ep != '\0')
-		return;
+		goto out;
 
 	do_unmount(dev, fd);
+
+out:
+	close(fd);
 }
 
 /* Check if kernel is doing init in background */
diff --git a/fuse/mount_util.c b/fuse/mount_util.c
index bfd801f..020b223 100644
--- a/fuse/mount_util.c
+++ b/fuse/mount_util.c
@@ -16,16 +16,23 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <limits.h>
-#include <mntent.h>
 #include <paths.h>
+#ifndef __NetBSD__
+#include <mntent.h>
+#endif
 #include <sys/stat.h>
 #include <sys/wait.h>
 #include <sys/mount.h>
 #include <sys/param.h>
+#if defined(__ANDROID__)
+#include <paths.h>
+#endif
 
 #ifdef __NetBSD__
 #define umount2(mnt, flags) unmount(mnt, (flags == 2) ? MNT_FORCE : 0)
 #define mtab_needs_update(mnt) 0
+#elif defined(__ANDROID__)
+#define mtab_needs_update(mnt) 0
 #else
 static int mtab_needs_update(const char *mnt)
 {
@@ -94,10 +101,12 @@
 		goto out_restore;
 	}
 	if (res == 0) {
+		char *env = NULL;
+
 		sigprocmask(SIG_SETMASK, &oldmask, NULL);
 		setuid(geteuid());
-		execl("/bin/mount", "/bin/mount", "--no-canonicalize", "-i",
-		      "-f", "-t", type, "-o", opts, fsname, mnt, NULL);
+		execle("/bin/mount", "/bin/mount", "--no-canonicalize", "-i",
+		       "-f", "-t", type, "-o", opts, fsname, mnt, NULL, &env);
 		fprintf(stderr, "%s: failed to execute /bin/mount: %s\n",
 			progname, strerror(errno));
 		exit(1);
@@ -145,10 +154,17 @@
 		goto out_restore;
 	}
 	if (res == 0) {
+		char *env = NULL;
+
 		sigprocmask(SIG_SETMASK, &oldmask, NULL);
 		setuid(geteuid());
-		execl("/bin/umount", "/bin/umount", "-i", rel_mnt,
-		      lazy ? "-l" : NULL, NULL);
+		if (lazy) {
+			execle("/bin/umount", "/bin/umount", "-i", rel_mnt,
+			       "-l", NULL, &env);
+		} else {
+			execle("/bin/umount", "/bin/umount", "-i", rel_mnt,
+			       NULL, &env);
+		}
 		fprintf(stderr, "%s: failed to execute /bin/umount: %s\n",
 			progname, strerror(errno));
 		exit(1);
@@ -204,10 +220,12 @@
 		goto out_restore;
 	}
 	if (res == 0) {
+		char *env = NULL;
+
 		sigprocmask(SIG_SETMASK, &oldmask, NULL);
 		setuid(geteuid());
-		execl("/bin/umount", "/bin/umount", "--no-canonicalize", "-i",
-		      "--fake", mnt, NULL);
+		execle("/bin/umount", "/bin/umount", "--no-canonicalize", "-i",
+		       "--fake", mnt, NULL, &env);
 		fprintf(stderr, "%s: failed to execute /bin/umount: %s\n",
 			progname, strerror(errno));
 		exit(1);
@@ -300,7 +318,7 @@
 }
 
 int fuse_mnt_check_empty(const char *progname, const char *mnt,
-			 mode_t rootmode, off64_t rootsize)
+			 mode_t rootmode, loff_t rootsize)
 {
 	int isempty = 1;
 
diff --git a/fuse/mount_util.h b/fuse/mount_util.h
index f89c115..0e0f564 100644
--- a/fuse/mount_util.h
+++ b/fuse/mount_util.h
@@ -15,5 +15,5 @@
 		    const char *rel_mnt, int lazy);
 char *fuse_mnt_resolve_path(const char *progname, const char *orig);
 int fuse_mnt_check_empty(const char *progname, const char *mnt,
-			 mode_t rootmode, off64_t rootsize);
+			 mode_t rootmode, loff_t rootsize);
 int fuse_mnt_check_fuseblk(void);
diff --git a/fuse/ulockmgr.c b/fuse/ulockmgr.c
index f0523ae..ebd68c6 100644
--- a/fuse/ulockmgr.c
+++ b/fuse/ulockmgr.c
@@ -356,10 +356,10 @@
 
 static int ulockmgr_canonicalize(int fd, struct flock *lock)
 {
-	off64_t offset;
+	loff_t offset;
 	if (lock->l_whence == SEEK_CUR) {
 		offset = lseek(fd, 0, SEEK_CUR);
-		if (offset == (off64_t) -1)
+		if (offset == (loff_t) -1)
 			return -errno;
 	} else if (lock->l_whence == SEEK_END) {
 		struct stat stbuf;