summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbrodkorb@conet.de>2015-06-24 18:19:31 +0200
committerWaldemar Brodkorb <wbrodkorb@conet.de>2015-06-24 18:19:31 +0200
commitbd63480810c047da6109cfcf3287d058dc0d4190 (patch)
tree9723f9fb77029a6055ca79ebf8ea42a43d5afdc5
parent48e6b5573016036676d9df90f418ec8b083c1cff (diff)
parentd94181d688c220f6574587081a3cf84fb1b3fc42 (diff)
merge
-rw-r--r--target/linux/patches/4.0.6/aufs4.patch4022
1 files changed, 1825 insertions, 2197 deletions
diff --git a/target/linux/patches/4.0.6/aufs4.patch b/target/linux/patches/4.0.6/aufs4.patch
index 73b035010..db38c850a 100644
--- a/target/linux/patches/4.0.6/aufs4.patch
+++ b/target/linux/patches/4.0.6/aufs4.patch
@@ -1,1553 +1,6 @@
-diff -Nur linux-4.0.4.orig/Documentation/ABI/testing/debugfs-aufs linux-4.0.4/Documentation/ABI/testing/debugfs-aufs
---- linux-4.0.4.orig/Documentation/ABI/testing/debugfs-aufs 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/Documentation/ABI/testing/debugfs-aufs 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,50 @@
-+What: /debug/aufs/si_<id>/
-+Date: March 2009
-+Contact: J. R. Okajima <hooanon05g@gmail.com>
-+Description:
-+ Under /debug/aufs, a directory named si_<id> is created
-+ per aufs mount, where <id> is a unique id generated
-+ internally.
-+
-+What: /debug/aufs/si_<id>/plink
-+Date: Apr 2013
-+Contact: J. R. Okajima <hooanon05g@gmail.com>
-+Description:
-+ It has three lines and shows the information about the
-+ pseudo-link. The first line is a single number
-+ representing a number of buckets. The second line is a
-+ number of pseudo-links per buckets (separated by a
-+ blank). The last line is a single number representing a
-+ total number of psedo-links.
-+ When the aufs mount option 'noplink' is specified, it
-+ will show "1\n0\n0\n".
-+
-+What: /debug/aufs/si_<id>/xib
-+Date: March 2009
-+Contact: J. R. Okajima <hooanon05g@gmail.com>
-+Description:
-+ It shows the consumed blocks by xib (External Inode Number
-+ Bitmap), its block size and file size.
-+ When the aufs mount option 'noxino' is specified, it
-+ will be empty. About XINO files, see the aufs manual.
-+
-+What: /debug/aufs/si_<id>/xino0, xino1 ... xinoN
-+Date: March 2009
-+Contact: J. R. Okajima <hooanon05g@gmail.com>
-+Description:
-+ It shows the consumed blocks by xino (External Inode Number
-+ Translation Table), its link count, block size and file
-+ size.
-+ When the aufs mount option 'noxino' is specified, it
-+ will be empty. About XINO files, see the aufs manual.
-+
-+What: /debug/aufs/si_<id>/xigen
-+Date: March 2009
-+Contact: J. R. Okajima <hooanon05g@gmail.com>
-+Description:
-+ It shows the consumed blocks by xigen (External Inode
-+ Generation Table), its block size and file size.
-+ If CONFIG_AUFS_EXPORT is disabled, this entry will not
-+ be created.
-+ When the aufs mount option 'noxino' is specified, it
-+ will be empty. About XINO files, see the aufs manual.
-diff -Nur linux-4.0.4.orig/Documentation/ABI/testing/sysfs-aufs linux-4.0.4/Documentation/ABI/testing/sysfs-aufs
---- linux-4.0.4.orig/Documentation/ABI/testing/sysfs-aufs 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/Documentation/ABI/testing/sysfs-aufs 2015-05-30 22:11:29.000000000 +0200
-@@ -0,0 +1,31 @@
-+What: /sys/fs/aufs/si_<id>/
-+Date: March 2009
-+Contact: J. R. Okajima <hooanon05g@gmail.com>
-+Description:
-+ Under /sys/fs/aufs, a directory named si_<id> is created
-+ per aufs mount, where <id> is a unique id generated
-+ internally.
-+
-+What: /sys/fs/aufs/si_<id>/br0, br1 ... brN
-+Date: March 2009
-+Contact: J. R. Okajima <hooanon05g@gmail.com>
-+Description:
-+ It shows the abolute path of a member directory (which
-+ is called branch) in aufs, and its permission.
-+
-+What: /sys/fs/aufs/si_<id>/brid0, brid1 ... bridN
-+Date: July 2013
-+Contact: J. R. Okajima <hooanon05g@gmail.com>
-+Description:
-+ It shows the id of a member directory (which is called
-+ branch) in aufs.
-+
-+What: /sys/fs/aufs/si_<id>/xi_path
-+Date: March 2009
-+Contact: J. R. Okajima <hooanon05g@gmail.com>
-+Description:
-+ It shows the abolute path of XINO (External Inode Number
-+ Bitmap, Translation Table and Generation Table) file
-+ even if it is the default path.
-+ When the aufs mount option 'noxino' is specified, it
-+ will be empty. About XINO files, see the aufs manual.
-diff -Nur linux-4.0.4.orig/Documentation/filesystems/aufs/design/01intro.txt linux-4.0.4/Documentation/filesystems/aufs/design/01intro.txt
---- linux-4.0.4.orig/Documentation/filesystems/aufs/design/01intro.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/Documentation/filesystems/aufs/design/01intro.txt 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,157 @@
-+
-+# Copyright (C) 2005-2015 Junjiro R. Okajima
-+
-+Introduction
-+----------------------------------------
-+
-+aufs [ei ju: ef es] | [a u f s]
-+1. abbrev. for "advanced multi-layered unification filesystem".
-+2. abbrev. for "another unionfs".
-+3. abbrev. for "auf das" in German which means "on the" in English.
-+ Ex. "Butter aufs Brot"(G) means "butter onto bread"(E).
-+ But "Filesystem aufs Filesystem" is hard to understand.
-+
-+AUFS is a filesystem with features:
-+- multi layered stackable unification filesystem, the member directory
-+ is called as a branch.
-+- branch permission and attribute, 'readonly', 'real-readonly',
-+ 'readwrite', 'whiteout-able', 'link-able whiteout', etc. and their
-+ combination.
-+- internal "file copy-on-write".
-+- logical deletion, whiteout.
-+- dynamic branch manipulation, adding, deleting and changing permission.
-+- allow bypassing aufs, user's direct branch access.
-+- external inode number translation table and bitmap which maintains the
-+ persistent aufs inode number.
-+- seekable directory, including NFS readdir.
-+- file mapping, mmap and sharing pages.
-+- pseudo-link, hardlink over branches.
-+- loopback mounted filesystem as a branch.
-+- several policies to select one among multiple writable branches.
-+- revert a single systemcall when an error occurs in aufs.
-+- and more...
-+
-+
-+Multi Layered Stackable Unification Filesystem
-+----------------------------------------------------------------------
-+Most people already knows what it is.
-+It is a filesystem which unifies several directories and provides a
-+merged single directory. When users access a file, the access will be
-+passed/re-directed/converted (sorry, I am not sure which English word is
-+correct) to the real file on the member filesystem. The member
-+filesystem is called 'lower filesystem' or 'branch' and has a mode
-+'readonly' and 'readwrite.' And the deletion for a file on the lower
-+readonly branch is handled by creating 'whiteout' on the upper writable
-+branch.
-+
-+On LKML, there have been discussions about UnionMount (Jan Blunck,
-+Bharata B Rao and Valerie Aurora) and Unionfs (Erez Zadok). They took
-+different approaches to implement the merged-view.
-+The former tries putting it into VFS, and the latter implements as a
-+separate filesystem.
-+(If I misunderstand about these implementations, please let me know and
-+I shall correct it. Because it is a long time ago when I read their
-+source files last time).
-+
-+UnionMount's approach will be able to small, but may be hard to share
-+branches between several UnionMount since the whiteout in it is
-+implemented in the inode on branch filesystem and always
-+shared. According to Bharata's post, readdir does not seems to be
-+finished yet.
-+There are several missing features known in this implementations such as
-+- for users, the inode number may change silently. eg. copy-up.
-+- link(2) may break by copy-up.
-+- read(2) may get an obsoleted filedata (fstat(2) too).
-+- fcntl(F_SETLK) may be broken by copy-up.
-+- unnecessary copy-up may happen, for example mmap(MAP_PRIVATE) after
-+ open(O_RDWR).
-+
-+In linux-3.18, "overlay" filesystem (formerly known as "overlayfs") was
-+merged into mainline. This is another implementation of UnionMount as a
-+separated filesystem. All the limitations and known problems which
-+UnionMount are equally inherited to "overlay" filesystem.
-+
-+Unionfs has a longer history. When I started implementing a stackable
-+filesystem (Aug 2005), it already existed. It has virtual super_block,
-+inode, dentry and file objects and they have an array pointing lower
-+same kind objects. After contributing many patches for Unionfs, I
-+re-started my project AUFS (Jun 2006).
-+
-+In AUFS, the structure of filesystem resembles to Unionfs, but I
-+implemented my own ideas, approaches and enhancements and it became
-+totally different one.
-+
-+Comparing DM snapshot and fs based implementation
-+- the number of bytes to be copied between devices is much smaller.
-+- the type of filesystem must be one and only.
-+- the fs must be writable, no readonly fs, even for the lower original
-+ device. so the compression fs will not be usable. but if we use
-+ loopback mount, we may address this issue.
-+ for instance,
-+ mount /cdrom/squashfs.img /sq
-+ losetup /sq/ext2.img
-+ losetup /somewhere/cow
-+ dmsetup "snapshot /dev/loop0 /dev/loop1 ..."
-+- it will be difficult (or needs more operations) to extract the
-+ difference between the original device and COW.
-+- DM snapshot-merge may help a lot when users try merging. in the
-+ fs-layer union, users will use rsync(1).
-+
-+You may want to read my old paper "Filesystems in LiveCD"
-+(http://aufs.sourceforge.net/aufs2/report/sq/sq.pdf).
-+
-+
-+Several characters/aspects/persona of aufs
-+----------------------------------------------------------------------
-+
-+Aufs has several characters, aspects or persona.
-+1. a filesystem, callee of VFS helper
-+2. sub-VFS, caller of VFS helper for branches
-+3. a virtual filesystem which maintains persistent inode number
-+4. reader/writer of files on branches such like an application
-+
-+1. Callee of VFS Helper
-+As an ordinary linux filesystem, aufs is a callee of VFS. For instance,
-+unlink(2) from an application reaches sys_unlink() kernel function and
-+then vfs_unlink() is called. vfs_unlink() is one of VFS helper and it
-+calls filesystem specific unlink operation. Actually aufs implements the
-+unlink operation but it behaves like a redirector.
-+
-+2. Caller of VFS Helper for Branches
-+aufs_unlink() passes the unlink request to the branch filesystem as if
-+it were called from VFS. So the called unlink operation of the branch
-+filesystem acts as usual. As a caller of VFS helper, aufs should handle
-+every necessary pre/post operation for the branch filesystem.
-+- acquire the lock for the parent dir on a branch
-+- lookup in a branch
-+- revalidate dentry on a branch
-+- mnt_want_write() for a branch
-+- vfs_unlink() for a branch
-+- mnt_drop_write() for a branch
-+- release the lock on a branch
-+
-+3. Persistent Inode Number
-+One of the most important issue for a filesystem is to maintain inode
-+numbers. This is particularly important to support exporting a
-+filesystem via NFS. Aufs is a virtual filesystem which doesn't have a
-+backend block device for its own. But some storage is necessary to
-+keep and maintain the inode numbers. It may be a large space and may not
-+suit to keep in memory. Aufs rents some space from its first writable
-+branch filesystem (by default) and creates file(s) on it. These files
-+are created by aufs internally and removed soon (currently) keeping
-+opened.
-+Note: Because these files are removed, they are totally gone after
-+ unmounting aufs. It means the inode numbers are not persistent
-+ across unmount or reboot. I have a plan to make them really
-+ persistent which will be important for aufs on NFS server.
-+
-+4. Read/Write Files Internally (copy-on-write)
-+Because a branch can be readonly, when you write a file on it, aufs will
-+"copy-up" it to the upper writable branch internally. And then write the
-+originally requested thing to the file. Generally kernel doesn't
-+open/read/write file actively. In aufs, even a single write may cause a
-+internal "file copy". This behaviour is very similar to cp(1) command.
-+
-+Some people may think it is better to pass such work to user space
-+helper, instead of doing in kernel space. Actually I am still thinking
-+about it. But currently I have implemented it in kernel space.
-diff -Nur linux-4.0.4.orig/Documentation/filesystems/aufs/design/02struct.txt linux-4.0.4/Documentation/filesystems/aufs/design/02struct.txt
---- linux-4.0.4.orig/Documentation/filesystems/aufs/design/02struct.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/Documentation/filesystems/aufs/design/02struct.txt 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,245 @@
-+
-+# Copyright (C) 2005-2015 Junjiro R. Okajima
-+
-+Basic Aufs Internal Structure
-+
-+Superblock/Inode/Dentry/File Objects
-+----------------------------------------------------------------------
-+As like an ordinary filesystem, aufs has its own
-+superblock/inode/dentry/file objects. All these objects have a
-+dynamically allocated array and store the same kind of pointers to the
-+lower filesystem, branch.
-+For example, when you build a union with one readwrite branch and one
-+readonly, mounted /au, /rw and /ro respectively.
-+- /au = /rw + /ro
-+- /ro/fileA exists but /rw/fileA
-+
-+Aufs lookup operation finds /ro/fileA and gets dentry for that. These
-+pointers are stored in a aufs dentry. The array in aufs dentry will be,
-+- [0] = NULL (because /rw/fileA doesn't exist)
-+- [1] = /ro/fileA
-+
-+This style of an array is essentially same to the aufs
-+superblock/inode/dentry/file objects.
-+
-+Because aufs supports manipulating branches, ie. add/delete/change
-+branches dynamically, these objects has its own generation. When
-+branches are changed, the generation in aufs superblock is
-+incremented. And a generation in other object are compared when it is
-+accessed. When a generation in other objects are obsoleted, aufs
-+refreshes the internal array.
-+
-+
-+Superblock
-+----------------------------------------------------------------------
-+Additionally aufs superblock has some data for policies to select one
-+among multiple writable branches, XIB files, pseudo-links and kobject.
-+See below in detail.
-+About the policies which supports copy-down a directory, see
-+wbr_policy.txt too.
-+
-+
-+Branch and XINO(External Inode Number Translation Table)
-+----------------------------------------------------------------------
-+Every branch has its own xino (external inode number translation table)
-+file. The xino file is created and unlinked by aufs internally. When two
-+members of a union exist on the same filesystem, they share the single
-+xino file.
-+The struct of a xino file is simple, just a sequence of aufs inode
-+numbers which is indexed by the lower inode number.
-+In the above sample, assume the inode number of /ro/fileA is i111 and
-+aufs assigns the inode number i999 for fileA. Then aufs writes 999 as
-+4(8) bytes at 111 * 4(8) bytes offset in the xino file.
-+
-+When the inode numbers are not contiguous, the xino file will be sparse
-+which has a hole in it and doesn't consume as much disk space as it
-+might appear. If your branch filesystem consumes disk space for such
-+holes, then you should specify 'xino=' option at mounting aufs.
-+
-+Aufs has a mount option to free the disk blocks for such holes in XINO
-+files on tmpfs or ramdisk. But it is not so effective actually. If you
-+meet a problem of disk shortage due to XINO files, then you should try
-+"tmpfs-ino.patch" (and "vfs-ino.patch" too) in aufs4-standalone.git.
-+The patch localizes the assignment inumbers per tmpfs-mount and avoid
-+the holes in XINO files.
-+
-+Also a writable branch has three kinds of "whiteout bases". All these
-+are existed when the branch is joined to aufs, and their names are
-+whiteout-ed doubly, so that users will never see their names in aufs
-+hierarchy.
-+1. a regular file which will be hardlinked to all whiteouts.
-+2. a directory to store a pseudo-link.
-+3. a directory to store an "orphan"-ed file temporary.
-+
-+1. Whiteout Base
-+ When you remove a file on a readonly branch, aufs handles it as a
-+ logical deletion and creates a whiteout on the upper writable branch
-+ as a hardlink of this file in order not to consume inode on the
-+ writable branch.
-+2. Pseudo-link Dir
-+ See below, Pseudo-link.
-+3. Step-Parent Dir
-+ When "fileC" exists on the lower readonly branch only and it is
-+ opened and removed with its parent dir, and then user writes
-+ something into it, then aufs copies-up fileC to this
-+ directory. Because there is no other dir to store fileC. After
-+ creating a file under this dir, the file is unlinked.
-+
-+Because aufs supports manipulating branches, ie. add/delete/change
-+dynamically, a branch has its own id. When the branch order changes,
-+aufs finds the new index by searching the branch id.
-+
-+
-+Pseudo-link
-+----------------------------------------------------------------------
-+Assume "fileA" exists on the lower readonly branch only and it is
-+hardlinked to "fileB" on the branch. When you write something to fileA,
-+aufs copies-up it to the upper writable branch. Additionally aufs
-+creates a hardlink under the Pseudo-link Directory of the writable
-+branch. The inode of a pseudo-link is kept in aufs super_block as a
-+simple list. If fileB is read after unlinking fileA, aufs returns
-+filedata from the pseudo-link instead of the lower readonly
-+branch. Because the pseudo-link is based upon the inode, to keep the
-+inode number by xino (see above) is essentially necessary.
-+
-+All the hardlinks under the Pseudo-link Directory of the writable branch
-+should be restored in a proper location later. Aufs provides a utility
-+to do this. The userspace helpers executed at remounting and unmounting
-+aufs by default.
-+During this utility is running, it puts aufs into the pseudo-link
-+maintenance mode. In this mode, only the process which began the
-+maintenance mode (and its child processes) is allowed to operate in
-+aufs. Some other processes which are not related to the pseudo-link will
-+be allowed to run too, but the rest have to return an error or wait
-+until the maintenance mode ends. If a process already acquires an inode
-+mutex (in VFS), it has to return an error.
-+
-+
-+XIB(external inode number bitmap)
-+----------------------------------------------------------------------
-+Addition to the xino file per a branch, aufs has an external inode number
-+bitmap in a superblock object. It is also an internal file such like a
-+xino file.
-+It is a simple bitmap to mark whether the aufs inode number is in-use or
-+not.
-+To reduce the file I/O, aufs prepares a single memory page to cache xib.
-+
-+As well as XINO files, aufs has a feature to truncate/refresh XIB to
-+reduce the number of consumed disk blocks for these files.
-+
-+
-+Virtual or Vertical Dir, and Readdir in Userspace
-+----------------------------------------------------------------------
-+In order to support multiple layers (branches), aufs readdir operation
-+constructs a virtual dir block on memory. For readdir, aufs calls
-+vfs_readdir() internally for each dir on branches, merges their entries
-+with eliminating the whiteout-ed ones, and sets it to file (dir)
-+object. So the file object has its entry list until it is closed. The
-+entry list will be updated when the file position is zero and becomes
-+obsoleted. This decision is made in aufs automatically.
-+
-+The dynamically allocated memory block for the name of entries has a
-+unit of 512 bytes (by default) and stores the names contiguously (no
-+padding). Another block for each entry is handled by kmem_cache too.
-+During building dir blocks, aufs creates hash list and judging whether
-+the entry is whiteouted by its upper branch or already listed.
-+The merged result is cached in the corresponding inode object and
-+maintained by a customizable life-time option.
-+
-+Some people may call it can be a security hole or invite DoS attack
-+since the opened and once readdir-ed dir (file object) holds its entry
-+list and becomes a pressure for system memory. But I'd say it is similar
-+to files under /proc or /sys. The virtual files in them also holds a
-+memory page (generally) while they are opened. When an idea to reduce
-+memory for them is introduced, it will be applied to aufs too.
-+For those who really hate this situation, I've developed readdir(3)
-+library which operates this merging in userspace. You just need to set
-+LD_PRELOAD environment variable, and aufs will not consume no memory in
-+kernel space for readdir(3).
-+
-+
-+Workqueue
-+----------------------------------------------------------------------
-+Aufs sometimes requires privilege access to a branch. For instance,
-+in copy-up/down operation. When a user process is going to make changes
-+to a file which exists in the lower readonly branch only, and the mode
-+of one of ancestor directories may not be writable by a user
-+process. Here aufs copy-up the file with its ancestors and they may
-+require privilege to set its owner/group/mode/etc.
-+This is a typical case of a application character of aufs (see
-+Introduction).
-+
-+Aufs uses workqueue synchronously for this case. It creates its own
-+workqueue. The workqueue is a kernel thread and has privilege. Aufs
-+passes the request to call mkdir or write (for example), and wait for
-+its completion. This approach solves a problem of a signal handler
-+simply.
-+If aufs didn't adopt the workqueue and changed the privilege of the
-+process, then the process may receive the unexpected SIGXFSZ or other
-+signals.
-+
-+Also aufs uses the system global workqueue ("events" kernel thread) too
-+for asynchronous tasks, such like handling inotify/fsnotify, re-creating a
-+whiteout base and etc. This is unrelated to a privilege.
-+Most of aufs operation tries acquiring a rw_semaphore for aufs
-+superblock at the beginning, at the same time waits for the completion
-+of all queued asynchronous tasks.
-+
-+
-+Whiteout
-+----------------------------------------------------------------------
-+The whiteout in aufs is very similar to Unionfs's. That is represented
-+by its filename. UnionMount takes an approach of a file mode, but I am
-+afraid several utilities (find(1) or something) will have to support it.
-+
-+Basically the whiteout represents "logical deletion" which stops aufs to
-+lookup further, but also it represents "dir is opaque" which also stop
-+further lookup.
-+
-+In aufs, rmdir(2) and rename(2) for dir uses whiteout alternatively.
-+In order to make several functions in a single systemcall to be
-+revertible, aufs adopts an approach to rename a directory to a temporary
-+unique whiteouted name.
-+For example, in rename(2) dir where the target dir already existed, aufs
-+renames the target dir to a temporary unique whiteouted name before the
-+actual rename on a branch, and then handles other actions (make it opaque,
-+update the attributes, etc). If an error happens in these actions, aufs
-+simply renames the whiteouted name back and returns an error. If all are
-+succeeded, aufs registers a function to remove the whiteouted unique
-+temporary name completely and asynchronously to the system global
-+workqueue.
-+
-+
-+Copy-up
-+----------------------------------------------------------------------
-+It is a well-known feature or concept.
-+When user modifies a file on a readonly branch, aufs operate "copy-up"
-+internally and makes change to the new file on the upper writable branch.
-+When the trigger systemcall does not update the timestamps of the parent
-+dir, aufs reverts it after copy-up.
-+
-+
-+Move-down (aufs3.9 and later)
-+----------------------------------------------------------------------
-+"Copy-up" is one of the essential feature in aufs. It copies a file from
-+the lower readonly branch to the upper writable branch when a user
-+changes something about the file.
-+"Move-down" is an opposite action of copy-up. Basically this action is
-+ran manually instead of automatically and internally.
-+For desgin and implementation, aufs has to consider these issues.
-+- whiteout for the file may exist on the lower branch.
-+- ancestor directories may not exist on the lower branch.
-+- diropq for the ancestor directories may exist on the upper branch.
-+- free space on the lower branch will reduce.
-+- another access to the file may happen during moving-down, including
-+ UDBA (see "Revalidate Dentry and UDBA").
-+- the file should not be hard-linked nor pseudo-linked. they should be
-+ handled by auplink utility later.
-+
-+Sometimes users want to move-down a file from the upper writable branch
-+to the lower readonly or writable branch. For instance,
-+- the free space of the upper writable branch is going to run out.
-+- create a new intermediate branch between the upper and lower branch.
-+- etc.
-+
-+For this purpose, use "aumvdown" command in aufs-util.git.
-diff -Nur linux-4.0.4.orig/Documentation/filesystems/aufs/design/03atomic_open.txt linux-4.0.4/Documentation/filesystems/aufs/design/03atomic_open.txt
---- linux-4.0.4.orig/Documentation/filesystems/aufs/design/03atomic_open.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/Documentation/filesystems/aufs/design/03atomic_open.txt 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,72 @@
-+
-+# Copyright (C) 2015 Junjiro R. Okajima
-+
-+Support for a branch who has its ->atomic_open()
-+----------------------------------------------------------------------
-+The filesystems who implement its ->atomic_open() are not majority. For
-+example NFSv4 does, and aufs should call NFSv4 ->atomic_open,
-+particularly for open(O_CREAT|O_EXCL, 0400) case. Other than
-+->atomic_open(), NFSv4 returns an error for this open(2). While I am not
-+sure whether all filesystems who have ->atomic_open() behave like this,
-+but NFSv4 surely returns the error.
-+
-+In order to support ->atomic_open() for aufs, there are a few
-+approaches.
-+
-+A. Introduce aufs_atomic_open()
-+ - calls one of VFS:do_last(), lookup_open() or atomic_open() for
-+ branch fs.
-+B. Introduce aufs_atomic_open() calling create, open and chmod. this is
-+ an aufs user Pip Cet's approach
-+ - calls aufs_create(), VFS finish_open() and notify_change().
-+ - pass fake-mode to finish_open(), and then correct the mode by
-+ notify_change().
-+C. Extend aufs_open() to call branch fs's ->atomic_open()
-+ - no aufs_atomic_open().
-+ - aufs_lookup() registers the TID to an aufs internal object.
-+ - aufs_create() does nothing when the matching TID is registered, but
-+ registers the mode.
-+ - aufs_open() calls branch fs's ->atomic_open() when the matching
-+ TID is registered.
-+D. Extend aufs_open() to re-try branch fs's ->open() with superuser's
-+ credential
-+ - no aufs_atomic_open().
-+ - aufs_create() registers the TID to an internal object. this info
-+ represents "this process created this file just now."
-+ - when aufs gets EACCES from branch fs's ->open(), then confirm the
-+ registered TID and re-try open() with superuser's credential.
-+
-+Pros and cons for each approach.
-+
-+A.
-+ - straightforward but highly depends upon VFS internal.
-+ - the atomic behavaiour is kept.
-+ - some of parameters such as nameidata are hard to reproduce for
-+ branch fs.
-+ - large overhead.
-+B.
-+ - easy to implement.
-+ - the atomic behavaiour is lost.
-+C.
-+ - the atomic behavaiour is kept.
-+ - dirty and tricky.
-+ - VFS checks whether the file is created correctly after calling
-+ ->create(), which means this approach doesn't work.
-+D.
-+ - easy to implement.
-+ - the atomic behavaiour is lost.
-+ - to open a file with superuser's credential and give it to a user
-+ process is a bad idea, since the file object keeps the credential
-+ in it. It may affect LSM or something. This approach doesn't work
-+ either.
-+
-+The approach A is ideal, but it hard to implement. So here is a
-+variation of A, which is to be implemented.
-+
-+A-1. Introduce aufs_atomic_open()
-+ - calls branch fs ->atomic_open() if exists. otherwise calls
-+ vfs_create() and finish_open().
-+ - the demerit is that the several checks after branch fs
-+ ->atomic_open() are lost. in the ordinary case, the checks are
-+ done by VFS:do_last(), lookup_open() and atomic_open(). some can
-+ be implemented in aufs, but not all I am afraid.
-diff -Nur linux-4.0.4.orig/Documentation/filesystems/aufs/design/03lookup.txt linux-4.0.4/Documentation/filesystems/aufs/design/03lookup.txt
---- linux-4.0.4.orig/Documentation/filesystems/aufs/design/03lookup.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/Documentation/filesystems/aufs/design/03lookup.txt 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,100 @@
-+
-+# Copyright (C) 2005-2015 Junjiro R. Okajima
-+
-+Lookup in a Branch
-+----------------------------------------------------------------------
-+Since aufs has a character of sub-VFS (see Introduction), it operates
-+lookup for branches as VFS does. It may be a heavy work. But almost all
-+lookup operation in aufs is the simplest case, ie. lookup only an entry
-+directly connected to its parent. Digging down the directory hierarchy
-+is unnecessary. VFS has a function lookup_one_len() for that use, and
-+aufs calls it.
-+
-+When a branch is a remote filesystem, aufs basically relies upon its
-+->d_revalidate(), also aufs forces the hardest revalidate tests for
-+them.
-+For d_revalidate, aufs implements three levels of revalidate tests. See
-+"Revalidate Dentry and UDBA" in detail.
-+
-+
-+Test Only the Highest One for the Directory Permission (dirperm1 option)
-+----------------------------------------------------------------------
-+Let's try case study.
-+- aufs has two branches, upper readwrite and lower readonly.
-+ /au = /rw + /ro
-+- "dirA" exists under /ro, but /rw. and its mode is 0700.
-+- user invoked "chmod a+rx /au/dirA"
-+- the internal copy-up is activated and "/rw/dirA" is created and its
-+ permission bits are set to world readable.
-+- then "/au/dirA" becomes world readable?
-+
-+In this case, /ro/dirA is still 0700 since it exists in readonly branch,
-+or it may be a natively readonly filesystem. If aufs respects the lower
-+branch, it should not respond readdir request from other users. But user
-+allowed it by chmod. Should really aufs rejects showing the entries
-+under /ro/dirA?
-+
-+To be honest, I don't have a good solution for this case. So aufs
-+implements 'dirperm1' and 'nodirperm1' mount options, and leave it to
-+users.
-+When dirperm1 is specified, aufs checks only the highest one for the
-+directory permission, and shows the entries. Otherwise, as usual, checks
-+every dir existing on all branches and rejects the request.
-+
-+As a side effect, dirperm1 option improves the performance of aufs
-+because the number of permission check is reduced when the number of
-+branch is many.
-+
-+
-+Revalidate Dentry and UDBA (User's Direct Branch Access)
-+----------------------------------------------------------------------
-+Generally VFS helpers re-validate a dentry as a part of lookup.
-+0. digging down the directory hierarchy.
-+1. lock the parent dir by its i_mutex.
-+2. lookup the final (child) entry.
-+3. revalidate it.
-+4. call the actual operation (create, unlink, etc.)
-+5. unlock the parent dir
-+
-+If the filesystem implements its ->d_revalidate() (step 3), then it is
-+called. Actually aufs implements it and checks the dentry on a branch is
-+still valid.
-+But it is not enough. Because aufs has to release the lock for the
-+parent dir on a branch at the end of ->lookup() (step 2) and
-+->d_revalidate() (step 3) while the i_mutex of the aufs dir is still
-+held by VFS.
-+If the file on a branch is changed directly, eg. bypassing aufs, after
-+aufs released the lock, then the subsequent operation may cause
-+something unpleasant result.
-+
-+This situation is a result of VFS architecture, ->lookup() and
-+->d_revalidate() is separated. But I never say it is wrong. It is a good
-+design from VFS's point of view. It is just not suitable for sub-VFS
-+character in aufs.
-+
-+Aufs supports such case by three level of revalidation which is
-+selectable by user.
-+1. Simple Revalidate
-+ Addition to the native flow in VFS's, confirm the child-parent
-+ relationship on the branch just after locking the parent dir on the
-+ branch in the "actual operation" (step 4). When this validation
-+ fails, aufs returns EBUSY. ->d_revalidate() (step 3) in aufs still
-+ checks the validation of the dentry on branches.
-+2. Monitor Changes Internally by Inotify/Fsnotify
-+ Addition to above, in the "actual operation" (step 4) aufs re-lookup
-+ the dentry on the branch, and returns EBUSY if it finds different
-+ dentry.
-+ Additionally, aufs sets the inotify/fsnotify watch for every dir on branches
-+ during it is in cache. When the event is notified, aufs registers a
-+ function to kernel 'events' thread by schedule_work(). And the
-+ function sets some special status to the cached aufs dentry and inode
-+ private data. If they are not cached, then aufs has nothing to
-+ do. When the same file is accessed through aufs (step 0-3) later,
-+ aufs will detect the status and refresh all necessary data.
-+ In this mode, aufs has to ignore the event which is fired by aufs
-+ itself.
-+3. No Extra Validation
-+ This is the simplest test and doesn't add any additional revalidation
-+ test, and skip the revalidation in step 4. It is useful and improves
-+ aufs performance when system surely hide the aufs branches from user,
-+ by over-mounting something (or another method).
-diff -Nur linux-4.0.4.orig/Documentation/filesystems/aufs/design/04branch.txt linux-4.0.4/Documentation/filesystems/aufs/design/04branch.txt
---- linux-4.0.4.orig/Documentation/filesystems/aufs/design/04branch.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/Documentation/filesystems/aufs/design/04branch.txt 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,61 @@
-+
-+# Copyright (C) 2005-2015 Junjiro R. Okajima
-+
-+Branch Manipulation
-+
-+Since aufs supports dynamic branch manipulation, ie. add/remove a branch
-+and changing its permission/attribute, there are a lot of works to do.
-+
-+
-+Add a Branch
-+----------------------------------------------------------------------
-+o Confirm the adding dir exists outside of aufs, including loopback
-+ mount, and its various attributes.
-+o Initialize the xino file and whiteout bases if necessary.
-+ See struct.txt.
-+
-+o Check the owner/group/mode of the directory
-+ When the owner/group/mode of the adding directory differs from the
-+ existing branch, aufs issues a warning because it may impose a
-+ security risk.
-+ For example, when a upper writable branch has a world writable empty
-+ top directory, a malicious user can create any files on the writable
-+ branch directly, like copy-up and modify manually. If something like
-+ /etc/{passwd,shadow} exists on the lower readonly branch but the upper
-+ writable branch, and the writable branch is world-writable, then a
-+ malicious guy may create /etc/passwd on the writable branch directly
-+ and the infected file will be valid in aufs.
-+ I am afraid it can be a security issue, but aufs can do nothing except
-+ producing a warning.
-+
-+
-+Delete a Branch
-+----------------------------------------------------------------------
-+o Confirm the deleting branch is not busy
-+ To be general, there is one merit to adopt "remount" interface to
-+ manipulate branches. It is to discard caches. At deleting a branch,
-+ aufs checks the still cached (and connected) dentries and inodes. If
-+ there are any, then they are all in-use. An inode without its
-+ corresponding dentry can be alive alone (for example, inotify/fsnotify case).
-+
-+ For the cached one, aufs checks whether the same named entry exists on
-+ other branches.
-+ If the cached one is a directory, because aufs provides a merged view
-+ to users, as long as one dir is left on any branch aufs can show the
-+ dir to users. In this case, the branch can be removed from aufs.
-+ Otherwise aufs rejects deleting the branch.
-+
-+ If any file on the deleting branch is opened by aufs, then aufs
-+ rejects deleting.
-+
-+
-+Modify the Permission of a Branch
-+----------------------------------------------------------------------
-+o Re-initialize or remove the xino file and whiteout bases if necessary.
-+ See struct.txt.
-+
-+o rw --> ro: Confirm the modifying branch is not busy
-+ Aufs rejects the request if any of these conditions are true.
-+ - a file on the branch is mmap-ed.
-+ - a regular file on the branch is opened for write and there is no
-+ same named entry on the upper branch.
-diff -Nur linux-4.0.4.orig/Documentation/filesystems/aufs/design/05wbr_policy.txt linux-4.0.4/Documentation/filesystems/aufs/design/05wbr_policy.txt
---- linux-4.0.4.orig/Documentation/filesystems/aufs/design/05wbr_policy.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/Documentation/filesystems/aufs/design/05wbr_policy.txt 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,51 @@
-+
-+# Copyright (C) 2005-2015 Junjiro R. Okajima
-+
-+Policies to Select One among Multiple Writable Branches
-+----------------------------------------------------------------------
-+When the number of writable branch is more than one, aufs has to decide
-+the target branch for file creation or copy-up. By default, the highest
-+writable branch which has the parent (or ancestor) dir of the target
-+file is chosen (top-down-parent policy).
-+By user's request, aufs implements some other policies to select the
-+writable branch, for file creation several policies, round-robin,
-+most-free-space, and other policies. For copy-up, top-down-parent,
-+bottom-up-parent, bottom-up and others.
-+
-+As expected, the round-robin policy selects the branch in circular. When
-+you have two writable branches and creates 10 new files, 5 files will be
-+created for each branch. mkdir(2) systemcall is an exception. When you
-+create 10 new directories, all will be created on the same branch.
-+And the most-free-space policy selects the one which has most free
-+space among the writable branches. The amount of free space will be
-+checked by aufs internally, and users can specify its time interval.
-+
-+The policies for copy-up is more simple,
-+top-down-parent is equivalent to the same named on in create policy,
-+bottom-up-parent selects the writable branch where the parent dir
-+exists and the nearest upper one from the copyup-source,
-+bottom-up selects the nearest upper writable branch from the
-+copyup-source, regardless the existence of the parent dir.
-+
-+There are some rules or exceptions to apply these policies.
-+- If there is a readonly branch above the policy-selected branch and
-+ the parent dir is marked as opaque (a variation of whiteout), or the
-+ target (creating) file is whiteout-ed on the upper readonly branch,
-+ then the result of the policy is ignored and the target file will be
-+ created on the nearest upper writable branch than the readonly branch.
-+- If there is a writable branch above the policy-selected branch and
-+ the parent dir is marked as opaque or the target file is whiteouted
-+ on the branch, then the result of the policy is ignored and the target
-+ file will be created on the highest one among the upper writable
-+ branches who has diropq or whiteout. In case of whiteout, aufs removes
-+ it as usual.
-+- link(2) and rename(2) systemcalls are exceptions in every policy.
-+ They try selecting the branch where the source exists as possible
-+ since copyup a large file will take long time. If it can't be,
-+ ie. the branch where the source exists is readonly, then they will
-+ follow the copyup policy.
-+- There is an exception for rename(2) when the target exists.
-+ If the rename target exists, aufs compares the index of the branches
-+ where the source and the target exists and selects the higher
-+ one. If the selected branch is readonly, then aufs follows the
-+ copyup policy.
-diff -Nur linux-4.0.4.orig/Documentation/filesystems/aufs/design/06fhsm.txt linux-4.0.4/Documentation/filesystems/aufs/design/06fhsm.txt
---- linux-4.0.4.orig/Documentation/filesystems/aufs/design/06fhsm.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/Documentation/filesystems/aufs/design/06fhsm.txt 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,105 @@
-+
-+# Copyright (C) 2011-2015 Junjiro R. Okajima
-+
-+File-based Hierarchical Storage Management (FHSM)
-+----------------------------------------------------------------------
-+Hierarchical Storage Management (or HSM) is a well-known feature in the
-+storage world. Aufs provides this feature as file-based with multiple
-+writable branches, based upon the principle of "Colder, the Lower".
-+Here the word "colder" means that the less used files, and "lower" means
-+that the position in the order of the stacked branches vertically.
-+These multiple writable branches are prioritized, ie. the topmost one
-+should be the fastest drive and be used heavily.
-+
-+o Characters in aufs FHSM story
-+- aufs itself and a new branch attribute.
-+- a new ioctl interface to move-down and to establish a connection with
-+ the daemon ("move-down" is a converse of "copy-up").
-+- userspace tool and daemon.
-+
-+The userspace daemon establishes a connection with aufs and waits for
-+the notification. The notified information is very similar to struct
-+statfs containing the number of consumed blocks and inodes.
-+When the consumed blocks/inodes of a branch exceeds the user-specified
-+upper watermark, the daemon activates its move-down process until the
-+consumed blocks/inodes reaches the user-specified lower watermark.
-+
-+The actual move-down is done by aufs based upon the request from
-+user-space since we need to maintain the inode number and the internal
-+pointer arrays in aufs.
-+
-+Currently aufs FHSM handles the regular files only. Additionally they
-+must not be hard-linked nor pseudo-linked.
-+
-+
-+o Cowork of aufs and the user-space daemon
-+ During the userspace daemon established the connection, aufs sends a
-+ small notification to it whenever aufs writes something into the
-+ writable branch. But it may cost high since aufs issues statfs(2)
-+ internally. So user can specify a new option to cache the
-+ info. Actually the notification is controlled by these factors.
-+ + the specified cache time.
-+ + classified as "force" by aufs internally.
-+ Until the specified time expires, aufs doesn't send the info
-+ except the forced cases. When aufs decide forcing, the info is always
-+ notified to userspace.
-+ For example, the number of free inodes is generally large enough and
-+ the shortage of it happens rarely. So aufs doesn't force the
-+ notification when creating a new file, directory and others. This is
-+ the typical case which aufs doesn't force.
-+ When aufs writes the actual filedata and the files consumes any of new
-+ blocks, the aufs forces notifying.
-+
-+
-+o Interfaces in aufs
-+- New branch attribute.
-+ + fhsm
-+ Specifies that the branch is managed by FHSM feature. In other word,
-+ participant in the FHSM.
-+ When nofhsm is set to the branch, it will not be the source/target
-+ branch of the move-down operation. This attribute is set
-+ independently from coo and moo attributes, and if you want full
-+ FHSM, you should specify them as well.
-+- New mount option.
-+ + fhsm_sec
-+ Specifies a second to suppress many less important info to be
-+ notified.
-+- New ioctl.
-+ + AUFS_CTL_FHSM_FD
-+ create a new file descriptor which userspace can read the notification
-+ (a subset of struct statfs) from aufs.
-+- Module parameter 'brs'
-+ It has to be set to 1. Otherwise the new mount option 'fhsm' will not
-+ be set.
-+- mount helpers /sbin/mount.aufs and /sbin/umount.aufs
-+ When there are two or more branches with fhsm attributes,
-+ /sbin/mount.aufs invokes the user-space daemon and /sbin/umount.aufs
-+ terminates it. As a result of remounting and branch-manipulation, the
-+ number of branches with fhsm attribute can be one. In this case,
-+ /sbin/mount.aufs will terminate the user-space daemon.
-+
-+
-+Finally the operation is done as these steps in kernel-space.
-+- make sure that,
-+ + no one else is using the file.
-+ + the file is not hard-linked.
-+ + the file is not pseudo-linked.
-+ + the file is a regular file.
-+ + the parent dir is not opaqued.
-+- find the target writable branch.
-+- make sure the file is not whiteout-ed by the upper (than the target)
-+ branch.
-+- make the parent dir on the target branch.
-+- mutex lock the inode on the branch.
-+- unlink the whiteout on the target branch (if exists).
-+- lookup and create the whiteout-ed temporary name on the target branch.
-+- copy the file as the whiteout-ed temporary name on the target branch.
-+- rename the whiteout-ed temporary name to the original name.
-+- unlink the file on the source branch.
-+- maintain the internal pointer array and the external inode number
-+ table (XINO).
-+- maintain the timestamps and other attributes of the parent dir and the
-+ file.
-+
-+And of course, in every step, an error may happen. So the operation
-+should restore the original file state after an error happens.
-diff -Nur linux-4.0.4.orig/Documentation/filesystems/aufs/design/06mmap.txt linux-4.0.4/Documentation/filesystems/aufs/design/06mmap.txt
---- linux-4.0.4.orig/Documentation/filesystems/aufs/design/06mmap.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/Documentation/filesystems/aufs/design/06mmap.txt 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,33 @@
-+
-+# Copyright (C) 2005-2015 Junjiro R. Okajima
-+
-+mmap(2) -- File Memory Mapping
-+----------------------------------------------------------------------
-+In aufs, the file-mapped pages are handled by a branch fs directly, no
-+interaction with aufs. It means aufs_mmap() calls the branch fs's
-+->mmap().
-+This approach is simple and good, but there is one problem.
-+Under /proc, several entries show the mmapped files by its path (with
-+device and inode number), and the printed path will be the path on the
-+branch fs's instead of virtual aufs's.
-+This is not a problem in most cases, but some utilities lsof(1) (and its
-+user) may expect the path on aufs.
-+
-+To address this issue, aufs adds a new member called vm_prfile in struct
-+vm_area_struct (and struct vm_region). The original vm_file points to
-+the file on the branch fs in order to handle everything correctly as
-+usual. The new vm_prfile points to a virtual file in aufs, and the
-+show-functions in procfs refers to vm_prfile if it is set.
-+Also we need to maintain several other places where touching vm_file
-+such like
-+- fork()/clone() copies vma and the reference count of vm_file is
-+ incremented.
-+- merging vma maintains the ref count too.
-+
-+This is not a good approach. It just fakes the printed path. But it
-+leaves all behaviour around f_mapping unchanged. This is surely an
-+advantage.
-+Actually aufs had adopted another complicated approach which calls
-+generic_file_mmap() and handles struct vm_operations_struct. In this
-+approach, aufs met a hard problem and I could not solve it without
-+switching the approach.
-diff -Nur linux-4.0.4.orig/Documentation/filesystems/aufs/design/06xattr.txt linux-4.0.4/Documentation/filesystems/aufs/design/06xattr.txt
---- linux-4.0.4.orig/Documentation/filesystems/aufs/design/06xattr.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/Documentation/filesystems/aufs/design/06xattr.txt 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,81 @@
-+
-+# Copyright (C) 2014-2015 Junjiro R. Okajima
-+
-+Listing XATTR/EA and getting the value
-+----------------------------------------------------------------------
-+For the inode standard attributes (owner, group, timestamps, etc.), aufs
-+shows the values from the topmost existing file. This behaviour is good
-+for the non-dir entries since the bahaviour exactly matches the shown
-+information. But for the directories, aufs considers all the same named
-+entries on the lower branches. Which means, if one of the lower entry
-+rejects readdir call, then aufs returns an error even if the topmost
-+entry allows it. This behaviour is necessary to respect the branch fs's
-+security, but can make users confused since the user-visible standard
-+attributes don't match the behaviour.
-+To address this issue, aufs has a mount option called dirperm1 which
-+checks the permission for the topmost entry only, and ignores the lower
-+entry's permission.
-+
-+A similar issue can happen around XATTR.
-+getxattr(2) and listxattr(2) families behave as if dirperm1 option is
-+always set. Otherwise these very unpleasant situation would happen.
-+- listxattr(2) may return the duplicated entries.
-+- users may not be able to remove or reset the XATTR forever,
-+
-+
-+XATTR/EA support in the internal (copy,move)-(up,down)
-+----------------------------------------------------------------------
-+Generally the extended attributes of inode are categorized as these.
-+- "security" for LSM and capability.
-+- "system" for posix ACL, 'acl' mount option is required for the branch
-+ fs generally.
-+- "trusted" for userspace, CAP_SYS_ADMIN is required.
-+- "user" for userspace, 'user_xattr' mount option is required for the
-+ branch fs generally.
-+
-+Moreover there are some other categories. Aufs handles these rather
-+unpopular categories as the ordinary ones, ie. there is no special
-+condition nor exception.
-+
-+In copy-up, the support for XATTR on the dst branch may differ from the
-+src branch. In this case, the copy-up operation will get an error and
-+the original user operation which triggered the copy-up will fail. It
-+can happen that even all copy-up will fail.
-+When both of src and dst branches support XATTR and if an error occurs
-+during copying XATTR, then the copy-up should fail obviously. That is a
-+good reason and aufs should return an error to userspace. But when only
-+the src branch support that XATTR, aufs should not return an error.
-+For example, the src branch supports ACL but the dst branch doesn't
-+because the dst branch may natively un-support it or temporary
-+un-support it due to "noacl" mount option. Of course, the dst branch fs
-+may NOT return an error even if the XATTR is not supported. It is
-+totally up to the branch fs.
-+
-+Anyway when the aufs internal copy-up gets an error from the dst branch
-+fs, then aufs tries removing the just copied entry and returns the error
-+to the userspace. The worst case of this situation will be all copy-up
-+will fail.
-+
-+For the copy-up operation, there two basic approaches.
-+- copy the specified XATTR only (by category above), and return the
-+ error unconditionally if it happens.
-+- copy all XATTR, and ignore the error on the specified category only.
-+
-+In order to support XATTR and to implement the correct behaviour, aufs
-+chooses the latter approach and introduces some new branch attributes,
-+"icexsec", "icexsys", "icextr", "icexusr", and "icexoth".
-+They correspond to the XATTR namespaces (see above). Additionally, to be
-+convenient, "icex" is also provided which means all "icex*" attributes
-+are set (here the word "icex" stands for "ignore copy-error on XATTR").
-+
-+The meaning of these attributes is to ignore the error from setting
-+XATTR on that branch.
-+Note that aufs tries copying all XATTR unconditionally, and ignores the
-+error from the dst branch according to the specified attributes.
-+
-+Some XATTR may have its default value. The default value may come from
-+the parent dir or the environment. If the default value is set at the
-+file creating-time, it will be overwritten by copy-up.
-+Some contradiction may happen I am afraid.
-+Do we need another attribute to stop copying XATTR? I am unsure. For
-+now, aufs implements the branch attributes to ignore the error.
-diff -Nur linux-4.0.4.orig/Documentation/filesystems/aufs/design/07export.txt linux-4.0.4/Documentation/filesystems/aufs/design/07export.txt
---- linux-4.0.4.orig/Documentation/filesystems/aufs/design/07export.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/Documentation/filesystems/aufs/design/07export.txt 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,45 @@
-+
-+# Copyright (C) 2005-2015 Junjiro R. Okajima
-+
-+Export Aufs via NFS
-+----------------------------------------------------------------------
-+Here is an approach.
-+- like xino/xib, add a new file 'xigen' which stores aufs inode
-+ generation.
-+- iget_locked(): initialize aufs inode generation for a new inode, and
-+ store it in xigen file.
-+- destroy_inode(): increment aufs inode generation and store it in xigen
-+ file. it is necessary even if it is not unlinked, because any data of
-+ inode may be changed by UDBA.
-+- encode_fh(): for a root dir, simply return FILEID_ROOT. otherwise
-+ build file handle by
-+ + branch id (4 bytes)
-+ + superblock generation (4 bytes)
-+ + inode number (4 or 8 bytes)
-+ + parent dir inode number (4 or 8 bytes)
-+ + inode generation (4 bytes))
-+ + return value of exportfs_encode_fh() for the parent on a branch (4
-+ bytes)
-+ + file handle for a branch (by exportfs_encode_fh())
-+- fh_to_dentry():
-+ + find the index of a branch from its id in handle, and check it is
-+ still exist in aufs.
-+ + 1st level: get the inode number from handle and search it in cache.
-+ + 2nd level: if not found in cache, get the parent inode number from
-+ the handle and search it in cache. and then open the found parent
-+ dir, find the matching inode number by vfs_readdir() and get its
-+ name, and call lookup_one_len() for the target dentry.
-+ + 3rd level: if the parent dir is not cached, call
-+ exportfs_decode_fh() for a branch and get the parent on a branch,
-+ build a pathname of it, convert it a pathname in aufs, call
-+ path_lookup(). now aufs gets a parent dir dentry, then handle it as
-+ the 2nd level.
-+ + to open the dir, aufs needs struct vfsmount. aufs keeps vfsmount
-+ for every branch, but not itself. to get this, (currently) aufs
-+ searches in current->nsproxy->mnt_ns list. it may not be a good
-+ idea, but I didn't get other approach.
-+ + test the generation of the gotten inode.
-+- every inode operation: they may get EBUSY due to UDBA. in this case,
-+ convert it into ESTALE for NFSD.
-+- readdir(): call lockdep_on/off() because filldir in NFSD calls
-+ lookup_one_len(), vfs_getattr(), encode_fh() and others.
-diff -Nur linux-4.0.4.orig/Documentation/filesystems/aufs/design/08shwh.txt linux-4.0.4/Documentation/filesystems/aufs/design/08shwh.txt
---- linux-4.0.4.orig/Documentation/filesystems/aufs/design/08shwh.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/Documentation/filesystems/aufs/design/08shwh.txt 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,39 @@
-+
-+# Copyright (C) 2005-2015 Junjiro R. Okajima
-+
-+Show Whiteout Mode (shwh)
-+----------------------------------------------------------------------
-+Generally aufs hides the name of whiteouts. But in some cases, to show
-+them is very useful for users. For instance, creating a new middle layer
-+(branch) by merging existing layers.
-+
-+(borrowing aufs1 HOW-TO from a user, Michael Towers)
-+When you have three branches,
-+- Bottom: 'system', squashfs (underlying base system), read-only
-+- Middle: 'mods', squashfs, read-only
-+- Top: 'overlay', ram (tmpfs), read-write
-+
-+The top layer is loaded at boot time and saved at shutdown, to preserve
-+the changes made to the system during the session.
-+When larger changes have been made, or smaller changes have accumulated,
-+the size of the saved top layer data grows. At this point, it would be
-+nice to be able to merge the two overlay branches ('mods' and 'overlay')
-+and rewrite the 'mods' squashfs, clearing the top layer and thus
-+restoring save and load speed.
-+
-+This merging is simplified by the use of another aufs mount, of just the
-+two overlay branches using the 'shwh' option.
-+# mount -t aufs -o ro,shwh,br:/livesys/overlay=ro+wh:/livesys/mods=rr+wh \
-+ aufs /livesys/merge_union
-+
-+A merged view of these two branches is then available at
-+/livesys/merge_union, and the new feature is that the whiteouts are
-+visible!
-+Note that in 'shwh' mode the aufs mount must be 'ro', which will disable
-+writing to all branches. Also the default mode for all branches is 'ro'.
-+It is now possible to save the combined contents of the two overlay
-+branches to a new squashfs, e.g.:
-+# mksquashfs /livesys/merge_union /path/to/newmods.squash
-+
-+This new squashfs archive can be stored on the boot device and the
-+initramfs will use it to replace the old one at the next boot.
-diff -Nur linux-4.0.4.orig/Documentation/filesystems/aufs/design/10dynop.txt linux-4.0.4/Documentation/filesystems/aufs/design/10dynop.txt
---- linux-4.0.4.orig/Documentation/filesystems/aufs/design/10dynop.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/Documentation/filesystems/aufs/design/10dynop.txt 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,34 @@
-+
-+# Copyright (C) 2010-2015 Junjiro R. Okajima
-+
-+Dynamically customizable FS operations
-+----------------------------------------------------------------------
-+Generally FS operations (struct inode_operations, struct
-+address_space_operations, struct file_operations, etc.) are defined as
-+"static const", but it never means that FS have only one set of
-+operation. Some FS have multiple sets of them. For instance, ext2 has
-+three sets, one for XIP, for NOBH, and for normal.
-+Since aufs overrides and redirects these operations, sometimes aufs has
-+to change its behaviour according to the branch FS type. More importantly
-+VFS acts differently if a function (member in the struct) is set or
-+not. It means aufs should have several sets of operations and select one
-+among them according to the branch FS definition.
-+
-+In order to solve this problem and not to affect the behaviour of VFS,
-+aufs defines these operations dynamically. For instance, aufs defines
-+dummy direct_IO function for struct address_space_operations, but it may
-+not be set to the address_space_operations actually. When the branch FS
-+doesn't have it, aufs doesn't set it to its address_space_operations
-+while the function definition itself is still alive. So the behaviour
-+itself will not change, and it will return an error when direct_IO is
-+not set.
-+
-+The lifetime of these dynamically generated operation object is
-+maintained by aufs branch object. When the branch is removed from aufs,
-+the reference counter of the object is decremented. When it reaches
-+zero, the dynamically generated operation object will be freed.
-+
-+This approach is designed to support AIO (io_submit), Direct I/O and
-+XIP (DAX) mainly.
-+Currently this approach is applied to address_space_operations for
-+regular files only.
-diff -Nur linux-4.0.4.orig/Documentation/filesystems/aufs/README linux-4.0.4/Documentation/filesystems/aufs/README
---- linux-4.0.4.orig/Documentation/filesystems/aufs/README 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/Documentation/filesystems/aufs/README 2015-05-30 22:11:29.000000000 +0200
-@@ -0,0 +1,383 @@
-+
-+Aufs4 -- advanced multi layered unification filesystem version 4.x
-+http://aufs.sf.net
-+Junjiro R. Okajima
-+
-+
-+0. Introduction
-+----------------------------------------
-+In the early days, aufs was entirely re-designed and re-implemented
-+Unionfs Version 1.x series. Adding many original ideas, approaches,
-+improvements and implementations, it becomes totally different from
-+Unionfs while keeping the basic features.
-+Recently, Unionfs Version 2.x series begin taking some of the same
-+approaches to aufs1's.
-+Unionfs is being developed by Professor Erez Zadok at Stony Brook
-+University and his team.
-+
-+Aufs4 supports linux-4.0 and later, and for linux-3.x series try aufs3.
-+If you want older kernel version support, try aufs2-2.6.git or
-+aufs2-standalone.git repository, aufs1 from CVS on SourceForge.
-+
-+Note: it becomes clear that "Aufs was rejected. Let's give it up."
-+ According to Christoph Hellwig, linux rejects all union-type
-+ filesystems but UnionMount.
-+<http://marc.info/?l=linux-kernel&m=123938533724484&w=2>
-+
-+PS. Al Viro seems have a plan to merge aufs as well as overlayfs and
-+ UnionMount, and he pointed out an issue around a directory mutex
-+ lock and aufs addressed it. But it is still unsure whether aufs will
-+ be merged (or any other union solution).
-+<http://marc.info/?l=linux-kernel&m=136312705029295&w=1>
-+
-+
-+1. Features
-+----------------------------------------
-+- unite several directories into a single virtual filesystem. The member
-+ directory is called as a branch.
-+- you can specify the permission flags to the branch, which are 'readonly',
-+ 'readwrite' and 'whiteout-able.'
-+- by upper writable branch, internal copyup and whiteout, files/dirs on
-+ readonly branch are modifiable logically.
-+- dynamic branch manipulation, add, del.
-+- etc...
-+
-+Also there are many enhancements in aufs, such as:
-+- test only the highest one for the directory permission (dirperm1)
-+- copyup on open (coo=)
-+- 'move' policy for copy-up between two writable branches, after
-+ checking free space.
-+- xattr, acl
-+- readdir(3) in userspace.
-+- keep inode number by external inode number table
-+- keep the timestamps of file/dir in internal copyup operation
-+- seekable directory, supporting NFS readdir.
-+- whiteout is hardlinked in order to reduce the consumption of inodes
-+ on branch
-+- do not copyup, nor create a whiteout when it is unnecessary
-+- revert a single systemcall when an error occurs in aufs
-+- remount interface instead of ioctl
-+- maintain /etc/mtab by an external command, /sbin/mount.aufs.
-+- loopback mounted filesystem as a branch
-+- kernel thread for removing the dir who has a plenty of whiteouts
-+- support copyup sparse file (a file which has a 'hole' in it)
-+- default permission flags for branches
-+- selectable permission flags for ro branch, whether whiteout can
-+ exist or not
-+- export via NFS.
-+- support <sysfs>/fs/aufs and <debugfs>/aufs.
-+- support multiple writable branches, some policies to select one
-+ among multiple writable branches.
-+- a new semantics for link(2) and rename(2) to support multiple
-+ writable branches.
-+- no glibc changes are required.
-+- pseudo hardlink (hardlink over branches)
-+- allow a direct access manually to a file on branch, e.g. bypassing aufs.
-+ including NFS or remote filesystem branch.
-+- userspace wrapper for pathconf(3)/fpathconf(3) with _PC_LINK_MAX.
-+- and more...
-+
-+Currently these features are dropped temporary from aufs4.
-+See design/08plan.txt in detail.
-+- nested mount, i.e. aufs as readonly no-whiteout branch of another aufs
-+ (robr)
-+- statistics of aufs thread (/sys/fs/aufs/stat)
-+
-+Features or just an idea in the future (see also design/*.txt),
-+- reorder the branch index without del/re-add.
-+- permanent xino files for NFSD
-+- an option for refreshing the opened files after add/del branches
-+- light version, without branch manipulation. (unnecessary?)
-+- copyup in userspace
-+- inotify in userspace
-+- readv/writev
-+
-+
-+2. Download
-+----------------------------------------
-+There are three GIT trees for aufs4, aufs4-linux.git,
-+aufs4-standalone.git, and aufs-util.git. Note that there is no "4" in
-+"aufs-util.git."
-+While the aufs-util is always necessary, you need either of aufs4-linux
-+or aufs4-standalone.
-+
-+The aufs4-linux tree includes the whole linux mainline GIT tree,
-+git://git.kernel.org/.../torvalds/linux.git.
-+And you cannot select CONFIG_AUFS_FS=m for this version, eg. you cannot
-+build aufs4 as an external kernel module.
-+Several extra patches are not included in this tree. Only
-+aufs4-standalone tree contains them. They are describe in the later
-+section "Configuration and Compilation."
-+
-+On the other hand, the aufs4-standalone tree has only aufs source files
-+and necessary patches, and you can select CONFIG_AUFS_FS=m.
-+But you need to apply all aufs patches manually.
-+
-+You will find GIT branches whose name is in form of "aufs4.x" where "x"
-+represents the linux kernel version, "linux-4.x". For instance,
-+"aufs4.0" is for linux-4.0. For latest "linux-4.x-rcN", use
-+"aufs4.x-rcN" branch.
-+
-+o aufs4-linux tree
-+$ git clone --reference /your/linux/git/tree \
-+ git://github.com/sfjro/aufs4-linux.git aufs4-linux.git
-+- if you don't have linux GIT tree, then remove "--reference ..."
-+$ cd aufs4-linux.git
-+$ git checkout origin/aufs4.0
-+
-+Or You may want to directly git-pull aufs into your linux GIT tree, and
-+leave the patch-work to GIT.
-+$ cd /your/linux/git/tree
-+$ git remote add aufs4 git://github.com/sfjro/aufs4-linux.git
-+$ git fetch aufs4
-+$ git checkout -b my4.0 v4.0
-+$ (add your local change...)
-+$ git pull aufs4 aufs4.0
-+- now you have v4.0 + your_changes + aufs4.0 in you my4.0 branch.
-+- you may need to solve some conflicts between your_changes and
-+ aufs4.0. in this case, git-rerere is recommended so that you can
-+ solve the similar conflicts automatically when you upgrade to 4.1 or
-+ later in the future.
-+
-+o aufs4-standalone tree
-+$ git clone git://github.com/sfjro/aufs4-standalone.git aufs4-standalone.git
-+$ cd aufs4-standalone.git
-+$ git checkout origin/aufs4.0
-+
-+o aufs-util tree
-+$ git clone git://git.code.sf.net/p/aufs/aufs-util aufs-util.git
-+- note that the public aufs-util.git is on SourceForge instead of
-+ GitHUB.
-+$ cd aufs-util.git
-+$ git checkout origin/aufs4.0
-+
-+Note: The 4.x-rcN branch is to be used with `rc' kernel versions ONLY.
-+The minor version number, 'x' in '4.x', of aufs may not always
-+follow the minor version number of the kernel.
-+Because changes in the kernel that cause the use of a new
-+minor version number do not always require changes to aufs-util.
-+
-+Since aufs-util has its own minor version number, you may not be
-+able to find a GIT branch in aufs-util for your kernel's
-+exact minor version number.
-+In this case, you should git-checkout the branch for the
-+nearest lower number.
-+
-+For (an unreleased) example:
-+If you are using "linux-4.10" and the "aufs4.10" branch
-+does not exist in aufs-util repository, then "aufs4.9", "aufs4.8"
-+or something numerically smaller is the branch for your kernel.
-+
-+Also you can view all branches by
-+ $ git branch -a
-+
-+
-+3. Configuration and Compilation
-+----------------------------------------
-+Make sure you have git-checkout'ed the correct branch.
-+
-+For aufs4-linux tree,
-+- enable CONFIG_AUFS_FS.
-+- set other aufs configurations if necessary.
-+
-+For aufs4-standalone tree,
-+There are several ways to build.
-+
-+1.
-+- apply ./aufs4-kbuild.patch to your kernel source files.
-+- apply ./aufs4-base.patch too.
-+- apply ./aufs4-mmap.patch too.
-+- apply ./aufs4-standalone.patch too, if you have a plan to set
-+ CONFIG_AUFS_FS=m. otherwise you don't need ./aufs4-standalone.patch.
-+- copy ./{Documentation,fs,include/uapi/linux/aufs_type.h} files to your
-+ kernel source tree. Never copy $PWD/include/uapi/linux/Kbuild.
-+- enable CONFIG_AUFS_FS, you can select either
-+ =m or =y.
-+- and build your kernel as usual.
-+- install the built kernel.
-+ Note: Since linux-3.9, every filesystem module requires an alias
-+ "fs-<fsname>". You should make sure that "fs-aufs" is listed in your
-+ modules.aliases file if you set CONFIG_AUFS_FS=m.
-+- install the header files too by "make headers_install" to the
-+ directory where you specify. By default, it is $PWD/usr.
-+ "make help" shows a brief note for headers_install.
-+- and reboot your system.
-+
-+2.
-+- module only (CONFIG_AUFS_FS=m).
-+- apply ./aufs4-base.patch to your kernel source files.
-+- apply ./aufs4-mmap.patch too.
-+- apply ./aufs4-standalone.patch too.
-+- build your kernel, don't forget "make headers_install", and reboot.
-+- edit ./config.mk and set other aufs configurations if necessary.
-+ Note: You should read $PWD/fs/aufs/Kconfig carefully which describes
-+ every aufs configurations.
-+- build the module by simple "make".
-+ Note: Since linux-3.9, every filesystem module requires an alias
-+ "fs-<fsname>". You should make sure that "fs-aufs" is listed in your
-+ modules.aliases file.
-+- you can specify ${KDIR} make variable which points to your kernel
-+ source tree.
-+- install the files
-+ + run "make install" to install the aufs module, or copy the built
-+ $PWD/aufs.ko to /lib/modules/... and run depmod -a (or reboot simply).
-+ + run "make install_headers" (instead of headers_install) to install
-+ the modified aufs header file (you can specify DESTDIR which is
-+ available in aufs standalone version's Makefile only), or copy
-+ $PWD/usr/include/linux/aufs_type.h to /usr/include/linux or wherever
-+ you like manually. By default, the target directory is $PWD/usr.
-+- no need to apply aufs4-kbuild.patch, nor copying source files to your
-+ kernel source tree.
-+
-+Note: The header file aufs_type.h is necessary to build aufs-util
-+ as well as "make headers_install" in the kernel source tree.
-+ headers_install is subject to be forgotten, but it is essentially
-+ necessary, not only for building aufs-util.
-+ You may not meet problems without headers_install in some older
-+ version though.
-+
-+And then,
-+- read README in aufs-util, build and install it
-+- note that your distribution may contain an obsoleted version of
-+ aufs_type.h in /usr/include/linux or something. When you build aufs
-+ utilities, make sure that your compiler refers the correct aufs header
-+ file which is built by "make headers_install."
-+- if you want to use readdir(3) in userspace or pathconf(3) wrapper,
-+ then run "make install_ulib" too. And refer to the aufs manual in
-+ detail.
-+
-+There several other patches in aufs4-standalone.git. They are all
-+optional. When you meet some problems, they will help you.
-+- aufs4-loopback.patch
-+ Supports a nested loopback mount in a branch-fs. This patch is
-+ unnecessary until aufs produces a message like "you may want to try
-+ another patch for loopback file".
-+- vfs-ino.patch
-+ Modifies a system global kernel internal function get_next_ino() in
-+ order to stop assigning 0 for an inode-number. Not directly related to
-+ aufs, but recommended generally.
-+- tmpfs-idr.patch
-+ Keeps the tmpfs inode number as the lowest value. Effective to reduce
-+ the size of aufs XINO files for tmpfs branch. Also it prevents the
-+ duplication of inode number, which is important for backup tools and
-+ other utilities. When you find aufs XINO files for tmpfs branch
-+ growing too much, try this patch.
-+
-+
-+4. Usage
-+----------------------------------------
-+At first, make sure aufs-util are installed, and please read the aufs
-+manual, aufs.5 in aufs-util.git tree.
-+$ man -l aufs.5
-+
-+And then,
-+$ mkdir /tmp/rw /tmp/aufs
-+# mount -t aufs -o br=/tmp/rw:${HOME} none /tmp/aufs
-+
-+Here is another example. The result is equivalent.
-+# mount -t aufs -o br=/tmp/rw=rw:${HOME}=ro none /tmp/aufs
-+ Or
-+# mount -t aufs -o br:/tmp/rw none /tmp/aufs
-+# mount -o remount,append:${HOME} /tmp/aufs
-+
-+Then, you can see whole tree of your home dir through /tmp/aufs. If
-+you modify a file under /tmp/aufs, the one on your home directory is
-+not affected, instead the same named file will be newly created under
-+/tmp/rw. And all of your modification to a file will be applied to
-+the one under /tmp/rw. This is called the file based Copy on Write
-+(COW) method.
-+Aufs mount options are described in aufs.5.
-+If you run chroot or something and make your aufs as a root directory,
-+then you need to customize the shutdown script. See the aufs manual in
-+detail.
-+
-+Additionally, there are some sample usages of aufs which are a
-+diskless system with network booting, and LiveCD over NFS.
-+See sample dir in CVS tree on SourceForge.
-+
-+
-+5. Contact
-+----------------------------------------
-+When you have any problems or strange behaviour in aufs, please let me
-+know with:
-+- /proc/mounts (instead of the output of mount(8))
-+- /sys/module/aufs/*
-+- /sys/fs/aufs/* (if you have them)
-+- /debug/aufs/* (if you have them)
-+- linux kernel version
-+ if your kernel is not plain, for example modified by distributor,
-+ the url where i can download its source is necessary too.
-+- aufs version which was printed at loading the module or booting the
-+ system, instead of the date you downloaded.
-+- configuration (define/undefine CONFIG_AUFS_xxx)
-+- kernel configuration or /proc/config.gz (if you have it)
-+- behaviour which you think to be incorrect
-+- actual operation, reproducible one is better
-+- mailto: aufs-users at lists.sourceforge.net
-+
-+Usually, I don't watch the Public Areas(Bugs, Support Requests, Patches,
-+and Feature Requests) on SourceForge. Please join and write to
-+aufs-users ML.
-+
-+
-+6. Acknowledgements
-+----------------------------------------
-+Thanks to everyone who have tried and are using aufs, whoever
-+have reported a bug or any feedback.
-+
-+Especially donators:
-+Tomas Matejicek(slax.org) made a donation (much more than once).
-+ Since Apr 2010, Tomas M (the author of Slax and Linux Live
-+ scripts) is making "doubling" donations.
-+ Unfortunately I cannot list all of the donators, but I really
-+ appreciate.
-+ It ends Aug 2010, but the ordinary donation URL is still available.
-+ <http://sourceforge.net/donate/index.php?group_id=167503>
-+Dai Itasaka made a donation (2007/8).
-+Chuck Smith made a donation (2008/4, 10 and 12).
-+Henk Schoneveld made a donation (2008/9).
-+Chih-Wei Huang, ASUS, CTC donated Eee PC 4G (2008/10).
-+Francois Dupoux made a donation (2008/11).
-+Bruno Cesar Ribas and Luis Carlos Erpen de Bona, C3SL serves public
-+ aufs2 GIT tree (2009/2).
-+William Grant made a donation (2009/3).
-+Patrick Lane made a donation (2009/4).
-+The Mail Archive (mail-archive.com) made donations (2009/5).
-+Nippy Networks (Ed Wildgoose) made a donation (2009/7).
-+New Dream Network, LLC (www.dreamhost.com) made a donation (2009/11).
-+Pavel Pronskiy made a donation (2011/2).
-+Iridium and Inmarsat satellite phone retailer (www.mailasail.com), Nippy
-+ Networks (Ed Wildgoose) made a donation for hardware (2011/3).
-+Max Lekomcev (DOM-TV project) made a donation (2011/7, 12, 2012/3, 6 and
-+11).
-+Sam Liddicott made a donation (2011/9).
-+Era Scarecrow made a donation (2013/4).
-+Bor Ratajc made a donation (2013/4).
-+Alessandro Gorreta made a donation (2013/4).
-+POIRETTE Marc made a donation (2013/4).
-+Alessandro Gorreta made a donation (2013/4).
-+lauri kasvandik made a donation (2013/5).
-+"pemasu from Finland" made a donation (2013/7).
-+The Parted Magic Project made a donation (2013/9 and 11).
-+Pavel Barta made a donation (2013/10).
-+Nikolay Pertsev made a donation (2014/5).
-+James B made a donation (2014/7).
-+Stefano Di Biase made a donation (2014/8).
-+Daniel Epellei made a donation (2015/1).
-+
-+Thank you very much.
-+Donations are always, including future donations, very important and
-+helpful for me to keep on developing aufs.
-+
-+
-+7.
-+----------------------------------------
-+If you are an experienced user, no explanation is needed. Aufs is
-+just a linux filesystem.
-+
-+
-+Enjoy!
-+
-+# Local variables: ;
-+# mode: text;
-+# End: ;
-diff -Nur linux-4.0.4.orig/drivers/block/loop.c linux-4.0.4/drivers/block/loop.c
---- linux-4.0.4.orig/drivers/block/loop.c 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/drivers/block/loop.c 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/drivers/block/loop.c linux-4.0.5/drivers/block/loop.c
+--- linux-4.0.5.orig/drivers/block/loop.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/drivers/block/loop.c 2015-06-21 14:08:17.146432521 -0500
@@ -592,6 +592,24 @@
return i && S_ISBLK(i->i_mode) && MAJOR(i->i_rdev) == LOOP_MAJOR;
}
@@ -1573,12 +26,25 @@ diff -Nur linux-4.0.4.orig/drivers/block/loop.c linux-4.0.4/drivers/block/loop.c
/* loop sysfs attributes */
static ssize_t loop_attr_show(struct device *dev, char *page,
-diff -Nur linux-4.0.4.orig/fs/aufs/aufs.h linux-4.0.4/fs/aufs/aufs.h
---- linux-4.0.4.orig/fs/aufs/aufs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/aufs.h 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,46 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/aufs.h linux-4.0.5/fs/aufs/aufs.h
+--- linux-4.0.5.orig/fs/aufs/aufs.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/aufs.h 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -1623,12 +89,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/aufs.h linux-4.0.4/fs/aufs/aufs.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/branch.c linux-4.0.4/fs/aufs/branch.c
---- linux-4.0.4.orig/fs/aufs/branch.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/branch.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,1393 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/branch.c linux-4.0.5/fs/aufs/branch.c
+--- linux-4.0.5.orig/fs/aufs/branch.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/branch.c 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,1406 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -3020,12 +1499,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/branch.c linux-4.0.4/fs/aufs/branch.c
+
+ return err;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/branch.h linux-4.0.4/fs/aufs/branch.h
---- linux-4.0.4.orig/fs/aufs/branch.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/branch.h 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,266 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/branch.h linux-4.0.5/fs/aufs/branch.h
+--- linux-4.0.5.orig/fs/aufs/branch.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/branch.h 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -3290,12 +1782,67 @@ diff -Nur linux-4.0.4.orig/fs/aufs/branch.h linux-4.0.4/fs/aufs/branch.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_BRANCH_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/cpup.c linux-4.0.4/fs/aufs/cpup.c
---- linux-4.0.4.orig/fs/aufs/cpup.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/cpup.c 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,1295 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/conf.mk linux-4.0.5/fs/aufs/conf.mk
+--- linux-4.0.5.orig/fs/aufs/conf.mk 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/conf.mk 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,38 @@
++
++AuConfStr = CONFIG_AUFS_FS=${CONFIG_AUFS_FS}
++
++define AuConf
++ifdef ${1}
++AuConfStr += ${1}=${${1}}
++endif
++endef
++
++AuConfAll = BRANCH_MAX_127 BRANCH_MAX_511 BRANCH_MAX_1023 BRANCH_MAX_32767 \
++ SBILIST \
++ HNOTIFY HFSNOTIFY \
++ EXPORT INO_T_64 \
++ XATTR \
++ FHSM \
++ RDU \
++ SHWH \
++ BR_RAMFS \
++ BR_FUSE POLL \
++ BR_HFSPLUS \
++ BDEV_LOOP \
++ DEBUG MAGIC_SYSRQ
++$(foreach i, ${AuConfAll}, \
++ $(eval $(call AuConf,CONFIG_AUFS_${i})))
++
++AuConfName = ${obj}/conf.str
++${AuConfName}.tmp: FORCE
++ @echo ${AuConfStr} | tr ' ' '\n' | sed -e 's/^/"/' -e 's/$$/\\n"/' > $@
++${AuConfName}: ${AuConfName}.tmp
++ @diff -q $< $@ > /dev/null 2>&1 || { \
++ echo ' GEN ' $@; \
++ cp -p $< $@; \
++ }
++FORCE:
++clean-files += ${AuConfName} ${AuConfName}.tmp
++${obj}/sysfs.o: ${AuConfName}
++
++-include ${srctree}/${src}/conf_priv.mk
+diff -Nur linux-4.0.5.orig/fs/aufs/cpup.c linux-4.0.5/fs/aufs/cpup.c
+--- linux-4.0.5.orig/fs/aufs/cpup.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/cpup.c 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,1308 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -4589,12 +3136,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/cpup.c linux-4.0.4/fs/aufs/cpup.c
+ dput(parent);
+ return err;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/cpup.h linux-4.0.4/fs/aufs/cpup.h
---- linux-4.0.4.orig/fs/aufs/cpup.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/cpup.h 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,81 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/cpup.h linux-4.0.5/fs/aufs/cpup.h
+--- linux-4.0.5.orig/fs/aufs/cpup.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/cpup.h 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -4674,12 +3234,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/cpup.h linux-4.0.4/fs/aufs/cpup.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_CPUP_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/dbgaufs.c linux-4.0.4/fs/aufs/dbgaufs.c
---- linux-4.0.4.orig/fs/aufs/dbgaufs.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/dbgaufs.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,419 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/dbgaufs.c linux-4.0.5/fs/aufs/dbgaufs.c
+--- linux-4.0.5.orig/fs/aufs/dbgaufs.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/dbgaufs.c 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,432 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -5097,12 +3670,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/dbgaufs.c linux-4.0.4/fs/aufs/dbgaufs.c
+ err = 0;
+ return err;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/dbgaufs.h linux-4.0.4/fs/aufs/dbgaufs.h
---- linux-4.0.4.orig/fs/aufs/dbgaufs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/dbgaufs.h 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,35 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/dbgaufs.h linux-4.0.5/fs/aufs/dbgaufs.h
+--- linux-4.0.5.orig/fs/aufs/dbgaufs.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/dbgaufs.h 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -5136,12 +3722,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/dbgaufs.h linux-4.0.4/fs/aufs/dbgaufs.h
+
+#endif /* __KERNEL__ */
+#endif /* __DBGAUFS_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/dcsub.c linux-4.0.4/fs/aufs/dcsub.c
---- linux-4.0.4.orig/fs/aufs/dcsub.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/dcsub.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,211 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/dcsub.c linux-4.0.5/fs/aufs/dcsub.c
+--- linux-4.0.5.orig/fs/aufs/dcsub.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/dcsub.c 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -5351,12 +3950,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/dcsub.c linux-4.0.4/fs/aufs/dcsub.c
+
+ return path_is_under(path + 0, path + 1);
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/dcsub.h linux-4.0.4/fs/aufs/dcsub.h
---- linux-4.0.4.orig/fs/aufs/dcsub.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/dcsub.h 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,119 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/dcsub.h linux-4.0.5/fs/aufs/dcsub.h
+--- linux-4.0.5.orig/fs/aufs/dcsub.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/dcsub.h 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -5474,12 +4086,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/dcsub.h linux-4.0.4/fs/aufs/dcsub.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_DCSUB_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/debug.c linux-4.0.4/fs/aufs/debug.c
---- linux-4.0.4.orig/fs/aufs/debug.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/debug.c 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,425 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/debug.c linux-4.0.5/fs/aufs/debug.c
+--- linux-4.0.5.orig/fs/aufs/debug.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/debug.c 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,438 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -5903,12 +4528,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/debug.c linux-4.0.4/fs/aufs/debug.c
+
+ return 0;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/debug.h linux-4.0.4/fs/aufs/debug.h
---- linux-4.0.4.orig/fs/aufs/debug.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/debug.h 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,212 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/debug.h linux-4.0.5/fs/aufs/debug.h
+--- linux-4.0.5.orig/fs/aufs/debug.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/debug.h 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -6119,12 +4757,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/debug.h linux-4.0.4/fs/aufs/debug.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_DEBUG_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/dentry.c linux-4.0.4/fs/aufs/dentry.c
---- linux-4.0.4.orig/fs/aufs/dentry.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/dentry.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,1084 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/dentry.c linux-4.0.5/fs/aufs/dentry.c
+--- linux-4.0.5.orig/fs/aufs/dentry.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/dentry.c 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,1097 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -7207,12 +5858,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/dentry.c linux-4.0.4/fs/aufs/dentry.c
+ .d_weak_revalidate = aufs_d_revalidate,
+ .d_release = aufs_d_release
+};
-diff -Nur linux-4.0.4.orig/fs/aufs/dentry.h linux-4.0.4/fs/aufs/dentry.h
---- linux-4.0.4.orig/fs/aufs/dentry.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/dentry.h 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,220 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/dentry.h linux-4.0.5/fs/aufs/dentry.h
+--- linux-4.0.5.orig/fs/aufs/dentry.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/dentry.h 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -7431,12 +6095,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/dentry.h linux-4.0.4/fs/aufs/dentry.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_DENTRY_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/dinfo.c linux-4.0.4/fs/aufs/dinfo.c
---- linux-4.0.4.orig/fs/aufs/dinfo.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/dinfo.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,531 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/dinfo.c linux-4.0.5/fs/aufs/dinfo.c
+--- linux-4.0.5.orig/fs/aufs/dinfo.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/dinfo.c 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,544 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -7966,12 +6643,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/dinfo.c linux-4.0.4/fs/aufs/dinfo.c
+ return bindex;
+ return -1;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/dir.c linux-4.0.4/fs/aufs/dir.c
---- linux-4.0.4.orig/fs/aufs/dir.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/dir.c 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,738 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/dir.c linux-4.0.5/fs/aufs/dir.c
+--- linux-4.0.5.orig/fs/aufs/dir.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/dir.c 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,751 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -8370,8 +7060,8 @@ diff -Nur linux-4.0.4.orig/fs/aufs/dir.c linux-4.0.4/fs/aufs/dir.c
+ if (unlikely(err))
+ goto out;
+
-+ sb = file->f_path.dentry->d_sb;
+ inode = file_inode(file);
++ sb = inode->i_sb;
+ bend = au_fbend_dir(file);
+ for (bindex = au_fbstart(file); !err && bindex <= bend; bindex++) {
+ h_file = au_hf_dir(file, bindex);
@@ -8708,12 +7398,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/dir.c linux-4.0.4/fs/aufs/dir.c
+ .flush = aufs_flush_dir,
+ .fsync = aufs_fsync_dir
+};
-diff -Nur linux-4.0.4.orig/fs/aufs/dir.h linux-4.0.4/fs/aufs/dir.h
---- linux-4.0.4.orig/fs/aufs/dir.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/dir.h 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,118 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/dir.h linux-4.0.5/fs/aufs/dir.h
+--- linux-4.0.5.orig/fs/aufs/dir.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/dir.h 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -8830,12 +7533,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/dir.h linux-4.0.4/fs/aufs/dir.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_DIR_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/dynop.c linux-4.0.4/fs/aufs/dynop.c
---- linux-4.0.4.orig/fs/aufs/dynop.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/dynop.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,356 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/dynop.c linux-4.0.5/fs/aufs/dynop.c
+--- linux-4.0.5.orig/fs/aufs/dynop.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/dynop.c 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,369 @@
+/*
+ * Copyright (C) 2010-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -9190,12 +7906,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/dynop.c linux-4.0.4/fs/aufs/dynop.c
+ for (i = 0; i < AuDyLast; i++)
+ WARN_ON(!list_empty(&dynop[i].head));
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/dynop.h linux-4.0.4/fs/aufs/dynop.h
---- linux-4.0.4.orig/fs/aufs/dynop.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/dynop.h 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,61 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/dynop.h linux-4.0.5/fs/aufs/dynop.h
+--- linux-4.0.5.orig/fs/aufs/dynop.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/dynop.h 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2010-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -9255,12 +7984,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/dynop.h linux-4.0.4/fs/aufs/dynop.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_DYNOP_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/export.c linux-4.0.4/fs/aufs/export.c
---- linux-4.0.4.orig/fs/aufs/export.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/export.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,818 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/export.c linux-4.0.5/fs/aufs/export.c
+--- linux-4.0.5.orig/fs/aufs/export.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/export.c 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,831 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -10077,12 +8819,26 @@ diff -Nur linux-4.0.4.orig/fs/aufs/export.c linux-4.0.4/fs/aufs/export.c
+ BUILD_BUG_ON(sizeof(u) != sizeof(int));
+ atomic_set(&sbinfo->si_xigen_next, u);
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/fhsm.c linux-4.0.4/fs/aufs/fhsm.c
---- linux-4.0.4.orig/fs/aufs/fhsm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/fhsm.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,412 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/fhsm.c linux-4.0.5/fs/aufs/fhsm.c
+--- linux-4.0.5.orig/fs/aufs/fhsm.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/fhsm.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,426 @@
+/*
+ * Copyright (C) 2011-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/*
@@ -10493,12 +9249,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/fhsm.c linux-4.0.4/fs/aufs/fhsm.c
+ if (u != AUFS_FHSM_CACHE_DEF_SEC)
+ seq_printf(seq, ",fhsm_sec=%u", u);
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/file.c linux-4.0.4/fs/aufs/file.c
---- linux-4.0.4.orig/fs/aufs/file.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/file.c 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,831 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/file.c linux-4.0.5/fs/aufs/file.c
+--- linux-4.0.5.orig/fs/aufs/file.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/file.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,844 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -11328,12 +10097,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/file.c linux-4.0.4/fs/aufs/file.c
+ .swap_deactivate = aufs_swap_deactivate
+#endif /* CONFIG_AUFS_DEBUG */
+};
-diff -Nur linux-4.0.4.orig/fs/aufs/file.h linux-4.0.4/fs/aufs/file.h
---- linux-4.0.4.orig/fs/aufs/file.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/file.h 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,277 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/file.h linux-4.0.5/fs/aufs/file.h
+--- linux-4.0.5.orig/fs/aufs/file.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/file.h 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,291 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -11432,6 +10214,7 @@ diff -Nur linux-4.0.4.orig/fs/aufs/file.h linux-4.0.4/fs/aufs/file.h
+extern const struct file_operations aufs_file_fop;
+int au_do_open_nondir(struct file *file, int flags, struct file *h_file);
+int aufs_release_nondir(struct inode *inode __maybe_unused, struct file *file);
++struct file *au_read_pre(struct file *file, int keep_fi);
+
+/* finfo.c */
+void au_hfput(struct au_hfile *hf, struct file *file);
@@ -11609,12 +10392,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/file.h linux-4.0.4/fs/aufs/file.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_FILE_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/finfo.c linux-4.0.4/fs/aufs/finfo.c
---- linux-4.0.4.orig/fs/aufs/finfo.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/finfo.c 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,144 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/finfo.c linux-4.0.5/fs/aufs/finfo.c
+--- linux-4.0.5.orig/fs/aufs/finfo.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/finfo.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -11757,12 +10553,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/finfo.c linux-4.0.4/fs/aufs/finfo.c
+out:
+ return err;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/f_op.c linux-4.0.4/fs/aufs/f_op.c
---- linux-4.0.4.orig/fs/aufs/f_op.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/f_op.c 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,807 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/f_op.c linux-4.0.5/fs/aufs/f_op.c
+--- linux-4.0.5.orig/fs/aufs/f_op.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/f_op.c 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,748 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -11879,33 +10688,122 @@ diff -Nur linux-4.0.4.orig/fs/aufs/f_op.c linux-4.0.4/fs/aufs/f_op.c
+ * read functions after [fdi]_rwsem are released, but it should be harmless.
+ */
+
-+static ssize_t aufs_read(struct file *file, char __user *buf, size_t count,
-+ loff_t *ppos)
++/* Callers should call au_read_post() or fput() in the end */
++struct file *au_read_pre(struct file *file, int keep_fi)
+{
-+ ssize_t err;
-+ struct dentry *dentry;
+ struct file *h_file;
-+ struct super_block *sb;
++ int err;
+
-+ dentry = file->f_path.dentry;
-+ sb = dentry->d_sb;
-+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW);
+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/0);
++ if (!err) {
++ di_read_unlock(file->f_path.dentry, AuLock_IR);
++ h_file = au_hf_top(file);
++ get_file(h_file);
++ if (!keep_fi)
++ fi_read_unlock(file);
++ } else
++ h_file = ERR_PTR(err);
++
++ return h_file;
++}
++
++static void au_read_post(struct inode *inode, struct file *h_file)
++{
++ /* update without lock, I don't think it a problem */
++ fsstack_copy_attr_atime(inode, file_inode(h_file));
++ fput(h_file);
++}
++
++struct au_write_pre {
++ blkcnt_t blks;
++ aufs_bindex_t bstart;
++};
++
++/*
++ * return with iinfo is write-locked
++ * callers should call au_write_post() or iinfo_write_unlock() + fput() in the
++ * end
++ */
++static struct file *au_write_pre(struct file *file, int do_ready,
++ struct au_write_pre *wpre)
++{
++ struct file *h_file;
++ struct dentry *dentry;
++ int err;
++ struct au_pin pin;
++
++ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1);
++ h_file = ERR_PTR(err);
+ if (unlikely(err))
+ goto out;
+
++ dentry = file->f_path.dentry;
++ if (do_ready) {
++ err = au_ready_to_write(file, -1, &pin);
++ if (unlikely(err)) {
++ h_file = ERR_PTR(err);
++ di_write_unlock(dentry);
++ goto out_fi;
++ }
++ }
++
++ di_downgrade_lock(dentry, /*flags*/0);
++ if (wpre)
++ wpre->bstart = au_fbstart(file);
+ h_file = au_hf_top(file);
+ get_file(h_file);
-+ di_read_unlock(dentry, AuLock_IR);
-+ fi_read_unlock(file);
++ if (wpre)
++ wpre->blks = file_inode(h_file)->i_blocks;
++ if (do_ready)
++ au_unpin(&pin);
++ di_read_unlock(dentry, /*flags*/0);
++
++out_fi:
++ fi_write_unlock(file);
++out:
++ return h_file;
++}
++
++static void au_write_post(struct inode *inode, struct file *h_file,
++ struct au_write_pre *wpre, ssize_t written)
++{
++ struct inode *h_inode;
++
++ au_cpup_attr_timesizes(inode);
++ AuDebugOn(au_ibstart(inode) != wpre->bstart);
++ h_inode = file_inode(h_file);
++ inode->i_mode = h_inode->i_mode;
++ ii_write_unlock(inode);
++ fput(h_file);
++
++ /* AuDbg("blks %llu, %llu\n", (u64)blks, (u64)h_inode->i_blocks); */
++ if (written > 0)
++ au_fhsm_wrote(inode->i_sb, wpre->bstart,
++ /*force*/h_inode->i_blocks > wpre->blks);
++}
++
++static ssize_t aufs_read(struct file *file, char __user *buf, size_t count,
++ loff_t *ppos)
++{
++ ssize_t err;
++ struct inode *inode;
++ struct file *h_file;
++ struct super_block *sb;
++
++ inode = file_inode(file);
++ sb = inode->i_sb;
++ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW);
++
++ h_file = au_read_pre(file, /*keep_fi*/0);
++ err = PTR_ERR(h_file);
++ if (IS_ERR(h_file))
++ goto out;
+
+ /* filedata may be obsoleted by concurrent copyup, but no problem */
+ err = vfsub_read_u(h_file, buf, count, ppos);
+ /* todo: necessary? */
+ /* file->f_ra = h_file->f_ra; */
-+ /* update without lock, I don't think it a problem */
-+ fsstack_copy_attr_atime(dentry->d_inode, file_inode(h_file));
-+ fput(h_file);
++ au_read_post(inode, h_file);
+
+out:
+ si_read_unlock(sb);
@@ -11938,53 +10836,24 @@ diff -Nur linux-4.0.4.orig/fs/aufs/f_op.c linux-4.0.4/fs/aufs/f_op.c
+ size_t count, loff_t *ppos)
+{
+ ssize_t err;
-+ blkcnt_t blks;
-+ aufs_bindex_t bstart;
-+ struct au_pin pin;
-+ struct dentry *dentry;
-+ struct inode *inode, *h_inode;
-+ struct super_block *sb;
++ struct au_write_pre wpre;
++ struct inode *inode;
+ struct file *h_file;
+ char __user *buf = (char __user *)ubuf;
+
-+ dentry = file->f_path.dentry;
-+ sb = dentry->d_sb;
-+ inode = dentry->d_inode;
++ inode = file_inode(file);
+ au_mtx_and_read_lock(inode);
+
-+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1);
-+ if (unlikely(err))
-+ goto out;
-+
-+ err = au_ready_to_write(file, -1, &pin);
-+ di_downgrade_lock(dentry, AuLock_IR);
-+ if (unlikely(err)) {
-+ di_read_unlock(dentry, AuLock_IR);
-+ fi_write_unlock(file);
++ h_file = au_write_pre(file, /*do_ready*/1, &wpre);
++ err = PTR_ERR(h_file);
++ if (IS_ERR(h_file))
+ goto out;
-+ }
-+
-+ bstart = au_fbstart(file);
-+ h_file = au_hf_top(file);
-+ get_file(h_file);
-+ h_inode = file_inode(h_file);
-+ blks = h_inode->i_blocks;
-+ au_unpin(&pin);
-+ di_read_unlock(dentry, AuLock_IR);
-+ fi_write_unlock(file);
+
+ err = vfsub_write_u(h_file, buf, count, ppos);
-+ ii_write_lock_child(inode);
-+ au_cpup_attr_timesizes(inode);
-+ inode->i_mode = file_inode(h_file)->i_mode;
-+ AuDbg("blks %llu, %llu\n", (u64)blks, (u64)h_inode->i_blocks);
-+ if (err > 0)
-+ au_fhsm_wrote(sb, bstart, /*force*/h_inode->i_blocks > blks);
-+ ii_write_unlock(inode);
-+ fput(h_file);
++ au_write_post(inode, h_file, &wpre, err);
+
+out:
-+ si_read_unlock(sb);
++ si_read_unlock(inode->i_sb);
+ mutex_unlock(&inode->i_mutex);
+ return err;
+}
@@ -12036,28 +10905,23 @@ diff -Nur linux-4.0.4.orig/fs/aufs/f_op.c linux-4.0.4/fs/aufs/f_op.c
+{
+ ssize_t err;
+ struct file *file, *h_file;
-+ struct dentry *dentry;
++ struct inode *inode;
+ struct super_block *sb;
+
+ file = kio->ki_filp;
-+ dentry = file->f_path.dentry;
-+ sb = dentry->d_sb;
++ inode = file_inode(file);
++ sb = inode->i_sb;
+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW);
-+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/0);
-+ if (unlikely(err))
-+ goto out;
+
-+ h_file = au_hf_top(file);
-+ get_file(h_file);
-+ di_read_unlock(dentry, AuLock_IR);
-+ fi_read_unlock(file);
++ h_file = au_read_pre(file, /*keep_fi*/0);
++ err = PTR_ERR(h_file);
++ if (IS_ERR(h_file))
++ goto out;
+
+ err = au_do_iter(h_file, MAY_READ, kio, iov_iter);
+ /* todo: necessary? */
+ /* file->f_ra = h_file->f_ra; */
-+ /* update without lock, I don't think it a problem */
-+ fsstack_copy_attr_atime(dentry->d_inode, file_inode(h_file));
-+ fput(h_file);
++ au_read_post(inode, h_file);
+
+out:
+ si_read_unlock(sb);
@@ -12067,53 +10931,24 @@ diff -Nur linux-4.0.4.orig/fs/aufs/f_op.c linux-4.0.4/fs/aufs/f_op.c
+static ssize_t aufs_write_iter(struct kiocb *kio, struct iov_iter *iov_iter)
+{
+ ssize_t err;
-+ blkcnt_t blks;
-+ aufs_bindex_t bstart;
-+ struct au_pin pin;
-+ struct dentry *dentry;
-+ struct inode *inode, *h_inode;
++ struct au_write_pre wpre;
++ struct inode *inode;
+ struct file *file, *h_file;
-+ struct super_block *sb;
+
+ file = kio->ki_filp;
-+ dentry = file->f_path.dentry;
-+ sb = dentry->d_sb;
-+ inode = dentry->d_inode;
++ inode = file_inode(file);
+ au_mtx_and_read_lock(inode);
+
-+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1);
-+ if (unlikely(err))
++ h_file = au_write_pre(file, /*do_ready*/1, &wpre);
++ err = PTR_ERR(h_file);
++ if (IS_ERR(h_file))
+ goto out;
+
-+ err = au_ready_to_write(file, -1, &pin);
-+ di_downgrade_lock(dentry, AuLock_IR);
-+ if (unlikely(err)) {
-+ di_read_unlock(dentry, AuLock_IR);
-+ fi_write_unlock(file);
-+ goto out;
-+ }
-+
-+ bstart = au_fbstart(file);
-+ h_file = au_hf_top(file);
-+ get_file(h_file);
-+ h_inode = file_inode(h_file);
-+ blks = h_inode->i_blocks;
-+ au_unpin(&pin);
-+ di_read_unlock(dentry, AuLock_IR);
-+ fi_write_unlock(file);
-+
+ err = au_do_iter(h_file, MAY_WRITE, kio, iov_iter);
-+ ii_write_lock_child(inode);
-+ au_cpup_attr_timesizes(inode);
-+ inode->i_mode = file_inode(h_file)->i_mode;
-+ AuDbg("blks %llu, %llu\n", (u64)blks, (u64)h_inode->i_blocks);
-+ if (err > 0)
-+ au_fhsm_wrote(sb, bstart, /*force*/h_inode->i_blocks > blks);
-+ ii_write_unlock(inode);
-+ fput(h_file);
++ au_write_post(inode, h_file, &wpre, err);
+
+out:
-+ si_read_unlock(sb);
++ si_read_unlock(inode->i_sb);
+ mutex_unlock(&inode->i_mutex);
+ return err;
+}
@@ -12124,19 +10959,18 @@ diff -Nur linux-4.0.4.orig/fs/aufs/f_op.c linux-4.0.4/fs/aufs/f_op.c
+{
+ ssize_t err;
+ struct file *h_file;
-+ struct dentry *dentry;
++ struct inode *inode;
+ struct super_block *sb;
+
-+ dentry = file->f_path.dentry;
-+ sb = dentry->d_sb;
++ inode = file_inode(file);
++ sb = inode->i_sb;
+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW);
-+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/0);
-+ if (unlikely(err))
++
++ h_file = au_read_pre(file, /*keep_fi*/1);
++ err = PTR_ERR(h_file);
++ if (IS_ERR(h_file))
+ goto out;
+
-+ err = -EINVAL;
-+ h_file = au_hf_top(file);
-+ get_file(h_file);
+ if (au_test_loopback_kthread()) {
+ au_warn_loopback(h_file->f_path.dentry->d_sb);
+ if (file->f_mapping != h_file->f_mapping) {
@@ -12144,15 +10978,12 @@ diff -Nur linux-4.0.4.orig/fs/aufs/f_op.c linux-4.0.4/fs/aufs/f_op.c
+ smp_mb(); /* unnecessary? */
+ }
+ }
-+ di_read_unlock(dentry, AuLock_IR);
+ fi_read_unlock(file);
+
+ err = vfsub_splice_to(h_file, ppos, pipe, len, flags);
+ /* todo: necessasry? */
+ /* file->f_ra = h_file->f_ra; */
-+ /* update without lock, I don't think it a problem */
-+ fsstack_copy_attr_atime(dentry->d_inode, file_inode(h_file));
-+ fput(h_file);
++ au_read_post(inode, h_file);
+
+out:
+ si_read_unlock(sb);
@@ -12164,52 +10995,23 @@ diff -Nur linux-4.0.4.orig/fs/aufs/f_op.c linux-4.0.4/fs/aufs/f_op.c
+ size_t len, unsigned int flags)
+{
+ ssize_t err;
-+ blkcnt_t blks;
-+ aufs_bindex_t bstart;
-+ struct au_pin pin;
-+ struct dentry *dentry;
-+ struct inode *inode, *h_inode;
-+ struct super_block *sb;
++ struct au_write_pre wpre;
++ struct inode *inode;
+ struct file *h_file;
+
-+ dentry = file->f_path.dentry;
-+ sb = dentry->d_sb;
-+ inode = dentry->d_inode;
++ inode = file_inode(file);
+ au_mtx_and_read_lock(inode);
+
-+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1);
-+ if (unlikely(err))
-+ goto out;
-+
-+ err = au_ready_to_write(file, -1, &pin);
-+ di_downgrade_lock(dentry, AuLock_IR);
-+ if (unlikely(err)) {
-+ di_read_unlock(dentry, AuLock_IR);
-+ fi_write_unlock(file);
++ h_file = au_write_pre(file, /*do_ready*/1, &wpre);
++ err = PTR_ERR(h_file);
++ if (IS_ERR(h_file))
+ goto out;
-+ }
-+
-+ bstart = au_fbstart(file);
-+ h_file = au_hf_top(file);
-+ get_file(h_file);
-+ h_inode = file_inode(h_file);
-+ blks = h_inode->i_blocks;
-+ au_unpin(&pin);
-+ di_read_unlock(dentry, AuLock_IR);
-+ fi_write_unlock(file);
+
+ err = vfsub_splice_from(pipe, h_file, ppos, len, flags);
-+ ii_write_lock_child(inode);
-+ au_cpup_attr_timesizes(inode);
-+ inode->i_mode = file_inode(h_file)->i_mode;
-+ AuDbg("blks %llu, %llu\n", (u64)blks, (u64)h_inode->i_blocks);
-+ if (err > 0)
-+ au_fhsm_wrote(sb, bstart, /*force*/h_inode->i_blocks > blks);
-+ ii_write_unlock(inode);
-+ fput(h_file);
++ au_write_post(inode, h_file, &wpre, err);
+
+out:
-+ si_read_unlock(sb);
++ si_read_unlock(inode->i_sb);
+ mutex_unlock(&inode->i_mutex);
+ return err;
+}
@@ -12218,46 +11020,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/f_op.c linux-4.0.4/fs/aufs/f_op.c
+ loff_t len)
+{
+ long err;
-+ struct au_pin pin;
-+ struct dentry *dentry;
-+ struct super_block *sb;
++ struct au_write_pre wpre;
+ struct inode *inode;
+ struct file *h_file;
+
-+ dentry = file->f_path.dentry;
-+ sb = dentry->d_sb;
-+ inode = dentry->d_inode;
++ inode = file_inode(file);
+ au_mtx_and_read_lock(inode);
+
-+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1);
-+ if (unlikely(err))
-+ goto out;
-+
-+ err = au_ready_to_write(file, -1, &pin);
-+ di_downgrade_lock(dentry, AuLock_IR);
-+ if (unlikely(err)) {
-+ di_read_unlock(dentry, AuLock_IR);
-+ fi_write_unlock(file);
++ h_file = au_write_pre(file, /*do_ready*/1, &wpre);
++ err = PTR_ERR(h_file);
++ if (IS_ERR(h_file))
+ goto out;
-+ }
-+
-+ h_file = au_hf_top(file);
-+ get_file(h_file);
-+ au_unpin(&pin);
-+ di_read_unlock(dentry, AuLock_IR);
-+ fi_write_unlock(file);
+
+ lockdep_off();
+ err = vfs_fallocate(h_file, mode, offset, len);
+ lockdep_on();
-+ ii_write_lock_child(inode);
-+ au_cpup_attr_timesizes(inode);
-+ inode->i_mode = file_inode(h_file)->i_mode;
-+ ii_write_unlock(inode);
-+ fput(h_file);
++ au_write_post(inode, h_file, &wpre, /*written*/1);
+
+out:
-+ si_read_unlock(sb);
++ si_read_unlock(inode->i_sb);
+ mutex_unlock(&inode->i_mutex);
+ return err;
+}
@@ -12322,44 +11103,27 @@ diff -Nur linux-4.0.4.orig/fs/aufs/f_op.c linux-4.0.4/fs/aufs/f_op.c
+static int aufs_mmap(struct file *file, struct vm_area_struct *vma)
+{
+ int err;
-+ aufs_bindex_t bstart;
+ const unsigned char wlock
+ = (file->f_mode & FMODE_WRITE) && (vma->vm_flags & VM_SHARED);
-+ struct dentry *dentry;
+ struct super_block *sb;
+ struct file *h_file;
-+ struct au_branch *br;
-+ struct au_pin pin;
++ struct inode *inode;
+
+ AuDbgVmRegion(file, vma);
+
-+ dentry = file->f_path.dentry;
-+ sb = dentry->d_sb;
++ inode = file_inode(file);
++ sb = inode->i_sb;
+ lockdep_off();
+ si_read_lock(sb, AuLock_NOPLMW);
-+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1);
-+ if (unlikely(err))
-+ goto out;
+
-+ if (wlock) {
-+ err = au_ready_to_write(file, -1, &pin);
-+ di_write_unlock(dentry);
-+ if (unlikely(err)) {
-+ fi_write_unlock(file);
-+ goto out;
-+ }
-+ au_unpin(&pin);
-+ } else
-+ di_write_unlock(dentry);
-+
-+ bstart = au_fbstart(file);
-+ br = au_sbr(sb, bstart);
-+ h_file = au_hf_top(file);
-+ get_file(h_file);
-+ au_set_mmapped(file);
-+ fi_write_unlock(file);
++ h_file = au_write_pre(file, wlock, /*wpre*/NULL);
+ lockdep_on();
++ err = PTR_ERR(h_file);
++ if (IS_ERR(h_file))
++ goto out;
+
++ err = 0;
++ au_set_mmapped(file);
+ au_vm_file_reset(vma, h_file);
+ /*
+ * we cannot call security_mmap_file() here since it may acquire
@@ -12370,21 +11134,21 @@ diff -Nur linux-4.0.4.orig/fs/aufs/f_op.c linux-4.0.4/fs/aufs/f_op.c
+ */
+ if (!err)
+ err = h_file->f_op->mmap(h_file, vma);
-+ if (unlikely(err))
-+ goto out_reset;
-+
-+ au_vm_prfile_set(vma, file);
-+ /* update without lock, I don't think it a problem */
-+ fsstack_copy_attr_atime(file_inode(file), file_inode(h_file));
-+ goto out_fput; /* success */
-+
-+out_reset:
++ if (!err) {
++ au_vm_prfile_set(vma, file);
++ fsstack_copy_attr_atime(inode, file_inode(h_file));
++ goto out_fput; /* success */
++ }
+ au_unset_mmapped(file);
+ au_vm_file_reset(vma, file);
++
+out_fput:
-+ fput(h_file);
+ lockdep_off();
++ ii_write_unlock(inode);
++ lockdep_on();
++ fput(h_file);
+out:
++ lockdep_off();
+ si_read_unlock(sb);
+ lockdep_on();
+ AuTraceErr(err);
@@ -12397,45 +11161,29 @@ diff -Nur linux-4.0.4.orig/fs/aufs/f_op.c linux-4.0.4/fs/aufs/f_op.c
+ int datasync)
+{
+ int err;
-+ struct au_pin pin;
-+ struct dentry *dentry;
++ struct au_write_pre wpre;
+ struct inode *inode;
+ struct file *h_file;
-+ struct super_block *sb;
-+
-+ dentry = file->f_path.dentry;
-+ inode = dentry->d_inode;
-+ sb = dentry->d_sb;
-+ mutex_lock(&inode->i_mutex);
-+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM);
-+ if (unlikely(err))
-+ goto out;
+
+ err = 0; /* -EBADF; */ /* posix? */
+ if (unlikely(!(file->f_mode & FMODE_WRITE)))
-+ goto out_si;
-+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1);
-+ if (unlikely(err))
-+ goto out_si;
++ goto out;
+
-+ err = au_ready_to_write(file, -1, &pin);
-+ di_downgrade_lock(dentry, AuLock_IR);
-+ if (unlikely(err))
++ inode = file_inode(file);
++ au_mtx_and_read_lock(inode);
++
++ h_file = au_write_pre(file, /*do_ready*/1, &wpre);
++ err = PTR_ERR(h_file);
++ if (IS_ERR(h_file))
+ goto out_unlock;
-+ au_unpin(&pin);
+
-+ err = -EINVAL;
-+ h_file = au_hf_top(file);
+ err = vfsub_fsync(h_file, &h_file->f_path, datasync);
-+ au_cpup_attr_timesizes(inode);
++ au_write_post(inode, h_file, &wpre, /*written*/0);
+
+out_unlock:
-+ di_read_unlock(dentry, AuLock_IR);
-+ fi_write_unlock(file);
-+out_si:
-+ si_read_unlock(sb);
-+out:
++ si_read_unlock(inode->i_sb);
+ mutex_unlock(&inode->i_mutex);
++out:
+ return err;
+}
+
@@ -12444,28 +11192,22 @@ diff -Nur linux-4.0.4.orig/fs/aufs/f_op.c linux-4.0.4/fs/aufs/f_op.c
+static int aufs_aio_fsync_nondir(struct kiocb *kio, int datasync)
+{
+ int err;
-+ struct au_pin pin;
-+ struct dentry *dentry;
++ struct au_write_pre wpre;
+ struct inode *inode;
+ struct file *file, *h_file;
+
-+ file = kio->ki_filp;
-+ dentry = file->f_path.dentry;
-+ inode = dentry->d_inode;
-+ au_mtx_and_read_lock(inode);
-+
+ err = 0; /* -EBADF; */ /* posix? */
+ if (unlikely(!(file->f_mode & FMODE_WRITE)))
+ goto out;
-+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1);
-+ if (unlikely(err))
-+ goto out;
+
-+ err = au_ready_to_write(file, -1, &pin);
-+ di_downgrade_lock(dentry, AuLock_IR);
-+ if (unlikely(err))
++ file = kio->ki_filp;
++ inode = file_inode(file);
++ au_mtx_and_read_lock(inode);
++
++ h_file = au_write_pre(file, /*do_ready*/1, &wpre);
++ err = PTR_ERR(h_file);
++ if (IS_ERR(h_file))
+ goto out_unlock;
-+ au_unpin(&pin);
+
+ err = -ENOSYS;
+ h_file = au_hf_top(file);
@@ -12483,16 +11225,14 @@ diff -Nur linux-4.0.4.orig/fs/aufs/f_op.c linux-4.0.4/fs/aufs/f_op.c
+ if (!err)
+ vfsub_update_h_iattr(&h_file->f_path, /*did*/NULL);
+ /*ignore*/
-+ au_cpup_attr_timesizes(inode);
+ mutex_unlock(h_mtx);
+ }
++ au_write_post(inode, h_file, &wpre, /*written*/0);
+
+out_unlock:
-+ di_read_unlock(dentry, AuLock_IR);
-+ fi_write_unlock(file);
-+out:
+ si_read_unlock(inode->sb);
+ mutex_unlock(&inode->i_mutex);
++out:
+ return err;
+}
+#endif
@@ -12501,22 +11241,19 @@ diff -Nur linux-4.0.4.orig/fs/aufs/f_op.c linux-4.0.4/fs/aufs/f_op.c
+{
+ int err;
+ struct file *h_file;
-+ struct dentry *dentry;
+ struct super_block *sb;
+
-+ dentry = file->f_path.dentry;
-+ sb = dentry->d_sb;
++ sb = file->f_path.dentry->d_sb;
+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW);
-+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/0);
-+ if (unlikely(err))
++
++ h_file = au_read_pre(file, /*keep_fi*/0);
++ err = PTR_ERR(h_file);
++ if (IS_ERR(h_file))
+ goto out;
+
-+ h_file = au_hf_top(file);
+ if (h_file->f_op->fasync)
+ err = h_file->f_op->fasync(fd, h_file, flag);
-+
-+ di_read_unlock(dentry, AuLock_IR);
-+ fi_read_unlock(file);
++ fput(h_file); /* instead of au_read_post() */
+
+out:
+ si_read_unlock(sb);
@@ -12568,12 +11305,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/f_op.c linux-4.0.4/fs/aufs/f_op.c
+#endif
+ .fallocate = aufs_fallocate
+};
-diff -Nur linux-4.0.4.orig/fs/aufs/fstype.h linux-4.0.4/fs/aufs/fstype.h
---- linux-4.0.4.orig/fs/aufs/fstype.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/fstype.h 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,387 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/fstype.h linux-4.0.5/fs/aufs/fstype.h
+--- linux-4.0.5.orig/fs/aufs/fstype.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/fstype.h 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,400 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -12959,12 +11709,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/fstype.h linux-4.0.4/fs/aufs/fstype.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_FSTYPE_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/hfsnotify.c linux-4.0.4/fs/aufs/hfsnotify.c
---- linux-4.0.4.orig/fs/aufs/hfsnotify.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/hfsnotify.c 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,275 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/hfsnotify.c linux-4.0.5/fs/aufs/hfsnotify.c
+--- linux-4.0.5.orig/fs/aufs/hfsnotify.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/hfsnotify.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,288 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -13238,12 +12001,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/hfsnotify.c linux-4.0.4/fs/aufs/hfsnotify.c
+ .fin_br = au_hfsn_fin_br,
+ .init_br = au_hfsn_init_br
+};
-diff -Nur linux-4.0.4.orig/fs/aufs/hfsplus.c linux-4.0.4/fs/aufs/hfsplus.c
---- linux-4.0.4.orig/fs/aufs/hfsplus.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/hfsplus.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,43 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/hfsplus.c linux-4.0.5/fs/aufs/hfsplus.c
+--- linux-4.0.5.orig/fs/aufs/hfsplus.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/hfsplus.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2010-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -13285,12 +12061,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/hfsplus.c linux-4.0.4/fs/aufs/hfsplus.c
+ au_sbr_put(dentry->d_sb, bindex);
+ }
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/hnotify.c linux-4.0.4/fs/aufs/hnotify.c
---- linux-4.0.4.orig/fs/aufs/hnotify.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/hnotify.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,701 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/hnotify.c linux-4.0.5/fs/aufs/hnotify.c
+--- linux-4.0.5.orig/fs/aufs/hnotify.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/hnotify.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,714 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -13990,12 +12779,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/hnotify.c linux-4.0.4/fs/aufs/hnotify.c
+ if (au_cachep[AuCache_HNOTIFY])
+ au_hn_destroy_cache();
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/iinfo.c linux-4.0.4/fs/aufs/iinfo.c
---- linux-4.0.4.orig/fs/aufs/iinfo.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/iinfo.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,264 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/iinfo.c linux-4.0.5/fs/aufs/iinfo.c
+--- linux-4.0.5.orig/fs/aufs/iinfo.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/iinfo.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -14258,12 +13060,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/iinfo.c linux-4.0.4/fs/aufs/iinfo.c
+ iinfo->ii_hinode = NULL;
+ AuRwDestroy(&iinfo->ii_rwsem);
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/inode.c linux-4.0.4/fs/aufs/inode.c
---- linux-4.0.4.orig/fs/aufs/inode.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/inode.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,482 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/inode.c linux-4.0.5/fs/aufs/inode.c
+--- linux-4.0.5.orig/fs/aufs/inode.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/inode.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,495 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -14744,12 +13559,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/inode.c linux-4.0.4/fs/aufs/inode.c
+ mask |= MAY_READ; /* force permission check */
+ return au_test_h_perm(h_inode, mask);
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/inode.h linux-4.0.4/fs/aufs/inode.h
---- linux-4.0.4.orig/fs/aufs/inode.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/inode.h 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,660 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/inode.h linux-4.0.5/fs/aufs/inode.h
+--- linux-4.0.5.orig/fs/aufs/inode.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/inode.h 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,673 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -15408,12 +14236,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/inode.h linux-4.0.4/fs/aufs/inode.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_INODE_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/ioctl.c linux-4.0.4/fs/aufs/ioctl.c
---- linux-4.0.4.orig/fs/aufs/ioctl.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/ioctl.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,206 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/ioctl.c linux-4.0.5/fs/aufs/ioctl.c
+--- linux-4.0.5.orig/fs/aufs/ioctl.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/ioctl.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -15618,12 +14459,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/ioctl.c linux-4.0.4/fs/aufs/ioctl.c
+ return aufs_ioctl_nondir(file, cmd, (unsigned long)compat_ptr(arg));
+}
+#endif
-diff -Nur linux-4.0.4.orig/fs/aufs/i_op_add.c linux-4.0.4/fs/aufs/i_op_add.c
---- linux-4.0.4.orig/fs/aufs/i_op_add.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/i_op_add.c 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,917 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/i_op_add.c linux-4.0.5/fs/aufs/i_op_add.c
+--- linux-4.0.5.orig/fs/aufs/i_op_add.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/i_op_add.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,930 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -16539,12 +15393,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/i_op_add.c linux-4.0.4/fs/aufs/i_op_add.c
+out:
+ return err;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/i_op.c linux-4.0.4/fs/aufs/i_op.c
---- linux-4.0.4.orig/fs/aufs/i_op.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/i_op.c 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,1432 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/i_op.c linux-4.0.5/fs/aufs/i_op.c
+--- linux-4.0.5.orig/fs/aufs/i_op.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/i_op.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,1445 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -17975,12 +16842,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/i_op.c linux-4.0.4/fs/aufs/i_op.c
+
+ .update_time = aufs_update_time
+};
-diff -Nur linux-4.0.4.orig/fs/aufs/i_op_del.c linux-4.0.4/fs/aufs/i_op_del.c
---- linux-4.0.4.orig/fs/aufs/i_op_del.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/i_op_del.c 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,493 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/i_op_del.c linux-4.0.5/fs/aufs/i_op_del.c
+--- linux-4.0.5.orig/fs/aufs/i_op_del.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/i_op_del.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,506 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -18472,12 +17352,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/i_op_del.c linux-4.0.4/fs/aufs/i_op_del.c
+ AuTraceErr(err);
+ return err;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/i_op_ren.c linux-4.0.4/fs/aufs/i_op_ren.c
---- linux-4.0.4.orig/fs/aufs/i_op_ren.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/i_op_ren.c 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,1002 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/i_op_ren.c linux-4.0.5/fs/aufs/i_op_ren.c
+--- linux-4.0.5.orig/fs/aufs/i_op_ren.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/i_op_ren.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,1015 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -19478,12 +18371,12 @@ diff -Nur linux-4.0.4.orig/fs/aufs/i_op_ren.c linux-4.0.4/fs/aufs/i_op_ren.c
+ AuTraceErr(err);
+ return err;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/Kconfig linux-4.0.4/fs/aufs/Kconfig
---- linux-4.0.4.orig/fs/aufs/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/Kconfig 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/fs/aufs/Kconfig linux-4.0.5/fs/aufs/Kconfig
+--- linux-4.0.5.orig/fs/aufs/Kconfig 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/Kconfig 2015-06-21 14:07:48.682432781 -0500
@@ -0,0 +1,185 @@
+config AUFS_FS
-+ bool "Aufs (Advanced multi layered unification filesystem) support"
++ tristate "Aufs (Advanced multi layered unification filesystem) support"
+ help
+ Aufs is a stackable unification filesystem such as Unionfs,
+ which unifies several directories and provides a merged single
@@ -19555,7 +18448,7 @@ diff -Nur linux-4.0.4.orig/fs/aufs/Kconfig linux-4.0.4/fs/aufs/Kconfig
+
+config AUFS_EXPORT
+ bool "NFS-exportable aufs"
-+ depends on EXPORTFS = y
++ depends on EXPORTFS
+ help
+ If you want to export your mounted aufs via NFS, then enable this
+ option. There are several requirements for this configuration.
@@ -19667,12 +18560,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/Kconfig linux-4.0.4/fs/aufs/Kconfig
+ Automatic configuration for internal use.
+ When aufs supports Magic SysRq, enabled automatically.
+endif
-diff -Nur linux-4.0.4.orig/fs/aufs/loop.c linux-4.0.4/fs/aufs/loop.c
---- linux-4.0.4.orig/fs/aufs/loop.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/loop.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,132 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/loop.c linux-4.0.5/fs/aufs/loop.c
+--- linux-4.0.5.orig/fs/aufs/loop.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/loop.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -19803,12 +18709,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/loop.c linux-4.0.4/fs/aufs/loop.c
+ symbol_put(loop_backing_file);
+ kfree(au_warn_loopback_array);
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/loop.h linux-4.0.4/fs/aufs/loop.h
---- linux-4.0.4.orig/fs/aufs/loop.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/loop.h 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,39 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/loop.h linux-4.0.5/fs/aufs/loop.h
+--- linux-4.0.5.orig/fs/aufs/loop.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/loop.h 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -19846,9 +18765,9 @@ diff -Nur linux-4.0.4.orig/fs/aufs/loop.h linux-4.0.4/fs/aufs/loop.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_LOOP_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/magic.mk linux-4.0.4/fs/aufs/magic.mk
---- linux-4.0.4.orig/fs/aufs/magic.mk 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/magic.mk 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/fs/aufs/magic.mk linux-4.0.5/fs/aufs/magic.mk
+--- linux-4.0.5.orig/fs/aufs/magic.mk 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/magic.mk 2015-06-21 14:07:48.686432781 -0500
@@ -0,0 +1,30 @@
+
+# defined in ${srctree}/fs/fuse/inode.c
@@ -19880,18 +18799,26 @@ diff -Nur linux-4.0.4.orig/fs/aufs/magic.mk linux-4.0.4/fs/aufs/magic.mk
+ifdef CONFIG_HFSPLUS_FS
+ccflags-y += -DHFSPLUS_SUPER_MAGIC=0x482b
+endif
-diff -Nur linux-4.0.4.orig/fs/aufs/Makefile linux-4.0.4/fs/aufs/Makefile
---- linux-4.0.4.orig/fs/aufs/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/Makefile 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,36 @@
-+
-+include ${srctree}/${src}/magic.mk
+diff -Nur linux-4.0.5.orig/fs/aufs/Makefile linux-4.0.5/fs/aufs/Makefile
+--- linux-4.0.5.orig/fs/aufs/Makefile 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/Makefile 2015-06-21 14:07:48.682432781 -0500
+@@ -0,0 +1,44 @@
++
++include ${src}/magic.mk
++ifeq (${CONFIG_AUFS_FS},m)
++include ${src}/conf.mk
++endif
++-include ${src}/priv_def.mk
+
+# cf. include/linux/kernel.h
+# enable pr_debug
+ccflags-y += -DDEBUG
+# sparse requires the full pathname
++ifdef M
++ccflags-y += -include ${M}/../../include/uapi/linux/aufs_type.h
++else
+ccflags-y += -include ${srctree}/include/uapi/linux/aufs_type.h
++endif
+
+obj-$(CONFIG_AUFS_FS) += aufs.o
+aufs-y := module.o sbinfo.o super.o branch.o xino.o sysaufs.o opts.o \
@@ -19920,12 +18847,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/Makefile linux-4.0.4/fs/aufs/Makefile
+aufs-$(CONFIG_AUFS_BR_HFSPLUS) += hfsplus.o
+aufs-$(CONFIG_AUFS_DEBUG) += debug.o
+aufs-$(CONFIG_AUFS_MAGIC_SYSRQ) += sysrq.o
-diff -Nur linux-4.0.4.orig/fs/aufs/module.c linux-4.0.4/fs/aufs/module.c
---- linux-4.0.4.orig/fs/aufs/module.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/module.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,196 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/module.c linux-4.0.5/fs/aufs/module.c
+--- linux-4.0.5.orig/fs/aufs/module.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/module.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -20015,6 +18955,7 @@ diff -Nur linux-4.0.4.orig/fs/aufs/module.c linux-4.0.4/fs/aufs/module.c
+MODULE_DESCRIPTION(AUFS_NAME
+ " -- Advanced multi layered unification filesystem");
+MODULE_VERSION(AUFS_VERSION);
++MODULE_ALIAS_FS(AUFS_NAME);
+
+/* this module parameter has no meaning when SYSFS is disabled */
+int sysaufs_brs = 1;
@@ -20120,12 +19061,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/module.c linux-4.0.4/fs/aufs/module.c
+
+module_init(aufs_init);
+module_exit(aufs_exit);
-diff -Nur linux-4.0.4.orig/fs/aufs/module.h linux-4.0.4/fs/aufs/module.h
---- linux-4.0.4.orig/fs/aufs/module.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/module.h 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,91 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/module.h linux-4.0.5/fs/aufs/module.h
+--- linux-4.0.5.orig/fs/aufs/module.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/module.h 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -20215,12 +19169,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/module.h linux-4.0.4/fs/aufs/module.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_MODULE_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/mvdown.c linux-4.0.4/fs/aufs/mvdown.c
---- linux-4.0.4.orig/fs/aufs/mvdown.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/mvdown.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,681 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/mvdown.c linux-4.0.5/fs/aufs/mvdown.c
+--- linux-4.0.5.orig/fs/aufs/mvdown.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/mvdown.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,694 @@
+/*
+ * Copyright (C) 2011-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -20900,12 +19867,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/mvdown.c linux-4.0.4/fs/aufs/mvdown.c
+ AuTraceErr(err);
+ return err;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/opts.c linux-4.0.4/fs/aufs/opts.c
---- linux-4.0.4.orig/fs/aufs/opts.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/opts.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,1822 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/opts.c linux-4.0.5/fs/aufs/opts.c
+--- linux-4.0.5.orig/fs/aufs/opts.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/opts.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,1835 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -22726,12 +21706,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/opts.c linux-4.0.4/fs/aufs/opts.c
+{
+ return au_mntflags(sb) & AuOptMask_UDBA;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/opts.h linux-4.0.4/fs/aufs/opts.h
---- linux-4.0.4.orig/fs/aufs/opts.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/opts.h 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,197 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/opts.h linux-4.0.5/fs/aufs/opts.h
+--- linux-4.0.5.orig/fs/aufs/opts.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/opts.h 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -22927,12 +21920,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/opts.h linux-4.0.4/fs/aufs/opts.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_OPTS_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/plink.c linux-4.0.4/fs/aufs/plink.c
---- linux-4.0.4.orig/fs/aufs/plink.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/plink.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,519 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/plink.c linux-4.0.5/fs/aufs/plink.c
+--- linux-4.0.5.orig/fs/aufs/plink.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/plink.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,532 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -23450,12 +22456,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/plink.c linux-4.0.4/fs/aufs/plink.c
+ }
+ }
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/poll.c linux-4.0.4/fs/aufs/poll.c
---- linux-4.0.4.orig/fs/aufs/poll.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/poll.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,42 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/poll.c linux-4.0.5/fs/aufs/poll.c
+--- linux-4.0.5.orig/fs/aufs/poll.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/poll.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -23470,38 +22489,48 @@ diff -Nur linux-4.0.4.orig/fs/aufs/poll.c linux-4.0.4/fs/aufs/poll.c
+ unsigned int mask;
+ int err;
+ struct file *h_file;
-+ struct dentry *dentry;
+ struct super_block *sb;
+
+ /* We should pretend an error happened. */
+ mask = POLLERR /* | POLLIN | POLLOUT */;
-+ dentry = file->f_path.dentry;
-+ sb = dentry->d_sb;
++ sb = file->f_path.dentry->d_sb;
+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW);
-+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/0);
-+ if (unlikely(err))
++
++ h_file = au_read_pre(file, /*keep_fi*/0);
++ err = PTR_ERR(h_file);
++ if (IS_ERR(h_file))
+ goto out;
+
+ /* it is not an error if h_file has no operation */
+ mask = DEFAULT_POLLMASK;
-+ h_file = au_hf_top(file);
+ if (h_file->f_op->poll)
+ mask = h_file->f_op->poll(h_file, wait);
-+
-+ di_read_unlock(dentry, AuLock_IR);
-+ fi_read_unlock(file);
++ fput(h_file); /* instead of au_read_post() */
+
+out:
+ si_read_unlock(sb);
+ AuTraceErr((int)mask);
+ return mask;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/posix_acl.c linux-4.0.4/fs/aufs/posix_acl.c
---- linux-4.0.4.orig/fs/aufs/posix_acl.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/posix_acl.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,86 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/posix_acl.c linux-4.0.5/fs/aufs/posix_acl.c
+--- linux-4.0.5.orig/fs/aufs/posix_acl.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/posix_acl.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2014-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -23586,12 +22615,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/posix_acl.c linux-4.0.4/fs/aufs/posix_acl.c
+ mutex_unlock(&inode->i_mutex);
+ return err;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/procfs.c linux-4.0.4/fs/aufs/procfs.c
---- linux-4.0.4.orig/fs/aufs/procfs.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/procfs.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,156 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/procfs.c linux-4.0.5/fs/aufs/procfs.c
+--- linux-4.0.5.orig/fs/aufs/procfs.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/procfs.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2010-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -23746,12 +22788,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/procfs.c linux-4.0.4/fs/aufs/procfs.c
+out:
+ return err;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/rdu.c linux-4.0.4/fs/aufs/rdu.c
---- linux-4.0.4.orig/fs/aufs/rdu.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/rdu.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,375 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/rdu.c linux-4.0.5/fs/aufs/rdu.c
+--- linux-4.0.5.orig/fs/aufs/rdu.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/rdu.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,388 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -24125,12 +23180,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/rdu.c linux-4.0.4/fs/aufs/rdu.c
+ return err;
+}
+#endif
-diff -Nur linux-4.0.4.orig/fs/aufs/rwsem.h linux-4.0.4/fs/aufs/rwsem.h
---- linux-4.0.4.orig/fs/aufs/rwsem.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/rwsem.h 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,178 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/rwsem.h linux-4.0.5/fs/aufs/rwsem.h
+--- linux-4.0.5.orig/fs/aufs/rwsem.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/rwsem.h 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -24307,12 +23375,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/rwsem.h linux-4.0.4/fs/aufs/rwsem.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_RWSEM_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/sbinfo.c linux-4.0.4/fs/aufs/sbinfo.c
---- linux-4.0.4.orig/fs/aufs/sbinfo.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/sbinfo.c 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,341 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/sbinfo.c linux-4.0.5/fs/aufs/sbinfo.c
+--- linux-4.0.5.orig/fs/aufs/sbinfo.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/sbinfo.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,354 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -24652,12 +23733,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/sbinfo.c linux-4.0.4/fs/aufs/sbinfo.c
+ p = radix_tree_delete(&sbinfo->au_si_pid.tree, current->pid);
+ spin_unlock(&sbinfo->au_si_pid.tree_lock);
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/spl.h linux-4.0.4/fs/aufs/spl.h
---- linux-4.0.4.orig/fs/aufs/spl.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/spl.h 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,98 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/spl.h linux-4.0.5/fs/aufs/spl.h
+--- linux-4.0.5.orig/fs/aufs/spl.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/spl.h 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -24754,12 +23848,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/spl.h linux-4.0.4/fs/aufs/spl.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_SPL_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/super.c linux-4.0.4/fs/aufs/super.c
---- linux-4.0.4.orig/fs/aufs/super.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/super.c 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,993 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/super.c linux-4.0.5/fs/aufs/super.c
+--- linux-4.0.5.orig/fs/aufs/super.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/super.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,1006 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -25751,12 +24858,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/super.c linux-4.0.4/fs/aufs/super.c
+ /* no need to __module_get() and module_put(). */
+ .owner = THIS_MODULE,
+};
-diff -Nur linux-4.0.4.orig/fs/aufs/super.h linux-4.0.4/fs/aufs/super.h
---- linux-4.0.4.orig/fs/aufs/super.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/super.h 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,626 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/super.h linux-4.0.5/fs/aufs/super.h
+--- linux-4.0.5.orig/fs/aufs/super.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/super.h 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,639 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -26381,12 +25501,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/super.h linux-4.0.4/fs/aufs/super.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_SUPER_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/sysaufs.c linux-4.0.4/fs/aufs/sysaufs.c
---- linux-4.0.4.orig/fs/aufs/sysaufs.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/sysaufs.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,91 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/sysaufs.c linux-4.0.5/fs/aufs/sysaufs.c
+--- linux-4.0.5.orig/fs/aufs/sysaufs.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/sysaufs.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -26476,12 +25609,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/sysaufs.c linux-4.0.4/fs/aufs/sysaufs.c
+out:
+ return err;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/sysaufs.h linux-4.0.4/fs/aufs/sysaufs.h
---- linux-4.0.4.orig/fs/aufs/sysaufs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/sysaufs.h 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,88 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/sysaufs.h linux-4.0.5/fs/aufs/sysaufs.h
+--- linux-4.0.5.orig/fs/aufs/sysaufs.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/sysaufs.h 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -26568,12 +25714,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/sysaufs.h linux-4.0.4/fs/aufs/sysaufs.h
+
+#endif /* __KERNEL__ */
+#endif /* __SYSAUFS_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/sysfs.c linux-4.0.4/fs/aufs/sysfs.c
---- linux-4.0.4.orig/fs/aufs/sysfs.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/sysfs.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,336 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/sysfs.c linux-4.0.5/fs/aufs/sysfs.c
+--- linux-4.0.5.orig/fs/aufs/sysfs.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/sysfs.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,372 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -26584,7 +25743,30 @@ diff -Nur linux-4.0.4.orig/fs/aufs/sysfs.c linux-4.0.4/fs/aufs/sysfs.c
+#include <linux/seq_file.h>
+#include "aufs.h"
+
++#ifdef CONFIG_AUFS_FS_MODULE
++/* this entry violates the "one line per file" policy of sysfs */
++static ssize_t config_show(struct kobject *kobj, struct kobj_attribute *attr,
++ char *buf)
++{
++ ssize_t err;
++ static char *conf =
++/* this file is generated at compiling */
++#include "conf.str"
++ ;
++
++ err = snprintf(buf, PAGE_SIZE, conf);
++ if (unlikely(err >= PAGE_SIZE))
++ err = -EFBIG;
++ return err;
++}
++
++static struct kobj_attribute au_config_attr = __ATTR_RO(config);
++#endif
++
+static struct attribute *au_attr[] = {
++#ifdef CONFIG_AUFS_FS_MODULE
++ &au_config_attr.attr,
++#endif
+ NULL, /* need to NULL terminate the list of attributes */
+};
+
@@ -26908,12 +26090,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/sysfs.c linux-4.0.4/fs/aufs/sysfs.c
+ }
+ }
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/sysrq.c linux-4.0.4/fs/aufs/sysrq.c
---- linux-4.0.4.orig/fs/aufs/sysrq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/sysrq.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,144 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/sysrq.c linux-4.0.5/fs/aufs/sysrq.c
+--- linux-4.0.5.orig/fs/aufs/sysrq.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/sysrq.c 2015-06-21 14:07:48.686432781 -0500
+@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -27056,12 +26251,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/sysrq.c linux-4.0.4/fs/aufs/sysrq.c
+ if (unlikely(err))
+ pr_err("err %d (ignored)\n", err);
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/vdir.c linux-4.0.4/fs/aufs/vdir.c
---- linux-4.0.4.orig/fs/aufs/vdir.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/vdir.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,876 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/vdir.c linux-4.0.5/fs/aufs/vdir.c
+--- linux-4.0.5.orig/fs/aufs/vdir.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/vdir.c 2015-06-21 14:07:48.690432781 -0500
+@@ -0,0 +1,888 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -27517,7 +26725,6 @@ diff -Nur linux-4.0.4.orig/fs/aufs/vdir.c linux-4.0.4/fs/aufs/vdir.c
+ || au_nhash_test_known_wh(&arg->whlist, name, nlen))
+ goto out; /* already exists or whiteouted */
+
-+ sb = arg->file->f_path.dentry->d_sb;
+ arg->err = au_ino(sb, arg->bindex, h_ino, d_type, &ino);
+ if (!arg->err) {
+ if (unlikely(nlen > AUFS_MAX_NAMELEN))
@@ -27936,12 +27143,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/vdir.c linux-4.0.4/fs/aufs/vdir.c
+ /* smp_mb(); */
+ return 0;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/vfsub.c linux-4.0.4/fs/aufs/vfsub.c
---- linux-4.0.4.orig/fs/aufs/vfsub.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/vfsub.c 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,833 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/vfsub.c linux-4.0.5/fs/aufs/vfsub.c
+--- linux-4.0.5.orig/fs/aufs/vfsub.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/vfsub.c 2015-06-21 14:07:48.690432781 -0500
+@@ -0,0 +1,846 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -28773,12 +27993,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/vfsub.c linux-4.0.4/fs/aufs/vfsub.c
+
+ return err;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/vfsub.h linux-4.0.4/fs/aufs/vfsub.h
---- linux-4.0.4.orig/fs/aufs/vfsub.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/vfsub.h 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,273 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/vfsub.h linux-4.0.5/fs/aufs/vfsub.h
+--- linux-4.0.5.orig/fs/aufs/vfsub.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/vfsub.h 2015-06-21 14:07:48.690432781 -0500
+@@ -0,0 +1,286 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -29050,12 +28283,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/vfsub.h linux-4.0.4/fs/aufs/vfsub.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_VFSUB_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/wbr_policy.c linux-4.0.4/fs/aufs/wbr_policy.c
---- linux-4.0.4.orig/fs/aufs/wbr_policy.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/wbr_policy.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,752 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/wbr_policy.c linux-4.0.5/fs/aufs/wbr_policy.c
+--- linux-4.0.5.orig/fs/aufs/wbr_policy.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/wbr_policy.c 2015-06-21 14:07:48.690432781 -0500
+@@ -0,0 +1,765 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -29806,12 +29052,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/wbr_policy.c linux-4.0.4/fs/aufs/wbr_policy.c
+ .fin = au_wbr_create_fin_mfs
+ }
+};
-diff -Nur linux-4.0.4.orig/fs/aufs/whout.c linux-4.0.4/fs/aufs/whout.c
---- linux-4.0.4.orig/fs/aufs/whout.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/whout.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,1051 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/whout.c linux-4.0.5/fs/aufs/whout.c
+--- linux-4.0.5.orig/fs/aufs/whout.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/whout.c 2015-06-21 14:07:48.690432781 -0500
+@@ -0,0 +1,1064 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -30861,12 +30120,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/whout.c linux-4.0.4/fs/aufs/whout.c
+ au_whtmp_rmdir_free(args);
+ }
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/whout.h linux-4.0.4/fs/aufs/whout.h
---- linux-4.0.4.orig/fs/aufs/whout.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/whout.h 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,72 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/whout.h linux-4.0.5/fs/aufs/whout.h
+--- linux-4.0.5.orig/fs/aufs/whout.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/whout.h 2015-06-21 14:07:48.690432781 -0500
+@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -30937,12 +30209,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/whout.h linux-4.0.4/fs/aufs/whout.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_WHOUT_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/wkq.c linux-4.0.4/fs/aufs/wkq.c
---- linux-4.0.4.orig/fs/aufs/wkq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/wkq.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,200 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/wkq.c linux-4.0.5/fs/aufs/wkq.c
+--- linux-4.0.5.orig/fs/aufs/wkq.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/wkq.c 2015-06-21 14:07:48.690432781 -0500
+@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -31141,12 +30426,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/wkq.c linux-4.0.4/fs/aufs/wkq.c
+
+ return err;
+}
-diff -Nur linux-4.0.4.orig/fs/aufs/wkq.h linux-4.0.4/fs/aufs/wkq.h
---- linux-4.0.4.orig/fs/aufs/wkq.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/wkq.h 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,78 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/wkq.h linux-4.0.5/fs/aufs/wkq.h
+--- linux-4.0.5.orig/fs/aufs/wkq.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/wkq.h 2015-06-21 14:07:48.690432781 -0500
+@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -31223,12 +30521,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/wkq.h linux-4.0.4/fs/aufs/wkq.h
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_WKQ_H__ */
-diff -Nur linux-4.0.4.orig/fs/aufs/xattr.c linux-4.0.4/fs/aufs/xattr.c
---- linux-4.0.4.orig/fs/aufs/xattr.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/xattr.c 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,331 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/xattr.c linux-4.0.5/fs/aufs/xattr.c
+--- linux-4.0.5.orig/fs/aufs/xattr.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/xattr.c 2015-06-21 14:07:48.690432781 -0500
+@@ -0,0 +1,344 @@
+/*
+ * Copyright (C) 2014-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -31558,12 +30869,25 @@ diff -Nur linux-4.0.4.orig/fs/aufs/xattr.c linux-4.0.4/fs/aufs/xattr.c
+ /* sb->s_xattr = au_xattr_handlers; */
+}
+#endif
-diff -Nur linux-4.0.4.orig/fs/aufs/xino.c linux-4.0.4/fs/aufs/xino.c
---- linux-4.0.4.orig/fs/aufs/xino.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/fs/aufs/xino.c 2015-05-30 22:11:30.000000000 +0200
-@@ -0,0 +1,1305 @@
+diff -Nur linux-4.0.5.orig/fs/aufs/xino.c linux-4.0.5/fs/aufs/xino.c
+--- linux-4.0.5.orig/fs/aufs/xino.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/fs/aufs/xino.c 2015-06-21 14:07:48.690432781 -0500
+@@ -0,0 +1,1322 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
@@ -32280,7 +31604,7 @@ diff -Nur linux-4.0.4.orig/fs/aufs/xino.c linux-4.0.4/fs/aufs/xino.c
+{
+ struct file *file;
+ struct dentry *h_parent, *d;
-+ struct inode *h_dir;
++ struct inode *h_dir, *inode;
+ int err;
+
+ /*
@@ -32298,12 +31622,16 @@ diff -Nur linux-4.0.4.orig/fs/aufs/xino.c linux-4.0.4/fs/aufs/xino.c
+ }
+
+ /* keep file count */
++ err = 0;
++ inode = file_inode(file);
+ h_parent = dget_parent(file->f_path.dentry);
+ h_dir = h_parent->d_inode;
+ mutex_lock_nested(&h_dir->i_mutex, AuLsc_I_PARENT);
+ /* mnt_want_write() is unnecessary here */
+ /* no delegation since it is just created */
-+ err = vfsub_unlink(h_dir, &file->f_path, /*delegated*/NULL, /*force*/0);
++ if (inode->i_nlink)
++ err = vfsub_unlink(h_dir, &file->f_path, /*delegated*/NULL,
++ /*force*/0);
+ mutex_unlock(&h_dir->i_mutex);
+ dput(h_parent);
+ if (unlikely(err)) {
@@ -32867,9 +32195,9 @@ diff -Nur linux-4.0.4.orig/fs/aufs/xino.c linux-4.0.4/fs/aufs/xino.c
+out:
+ return err;
+}
-diff -Nur linux-4.0.4.orig/fs/buffer.c linux-4.0.4/fs/buffer.c
---- linux-4.0.4.orig/fs/buffer.c 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/fs/buffer.c 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/fs/buffer.c linux-4.0.5/fs/buffer.c
+--- linux-4.0.5.orig/fs/buffer.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/fs/buffer.c 2015-06-21 14:08:25.130432449 -0500
@@ -2450,7 +2450,7 @@
* Update file times before taking page lock. We may end up failing the
* fault so this update may be superfluous but who really cares...
@@ -32879,9 +32207,9 @@ diff -Nur linux-4.0.4.orig/fs/buffer.c linux-4.0.4/fs/buffer.c
ret = __block_page_mkwrite(vma, vmf, get_block);
sb_end_pagefault(sb);
-diff -Nur linux-4.0.4.orig/fs/dcache.c linux-4.0.4/fs/dcache.c
---- linux-4.0.4.orig/fs/dcache.c 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/fs/dcache.c 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/fs/dcache.c linux-4.0.5/fs/dcache.c
+--- linux-4.0.5.orig/fs/dcache.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/fs/dcache.c 2015-06-21 14:08:28.354432418 -0500
@@ -1130,7 +1130,7 @@
*
* The @enter() and @finish() callbacks are called with d_lock held.
@@ -32891,9 +32219,47 @@ diff -Nur linux-4.0.4.orig/fs/dcache.c linux-4.0.4/fs/dcache.c
enum d_walk_ret (*enter)(void *, struct dentry *),
void (*finish)(void *))
{
-diff -Nur linux-4.0.4.orig/fs/Kconfig linux-4.0.4/fs/Kconfig
---- linux-4.0.4.orig/fs/Kconfig 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/fs/Kconfig 2015-05-30 22:11:31.000000000 +0200
+@@ -1235,6 +1235,7 @@
+ seq = 1;
+ goto again;
+ }
++EXPORT_SYMBOL(d_walk);
+
+ /*
+ * Search for at least 1 mount point in the dentry's subdirs.
+diff -Nur linux-4.0.5.orig/fs/file_table.c linux-4.0.5/fs/file_table.c
+--- linux-4.0.5.orig/fs/file_table.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/fs/file_table.c 2015-06-21 14:08:28.358432418 -0500
+@@ -147,6 +147,7 @@
+ }
+ return ERR_PTR(-ENFILE);
+ }
++EXPORT_SYMBOL(get_empty_filp);
+
+ /**
+ * alloc_file - allocate and initialize a 'struct file'
+@@ -308,6 +309,7 @@
+ file_free(file);
+ }
+ }
++EXPORT_SYMBOL(put_filp);
+
+ void __init files_init(unsigned long mempages)
+ {
+diff -Nur linux-4.0.5.orig/fs/inode.c linux-4.0.5/fs/inode.c
+--- linux-4.0.5.orig/fs/inode.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/fs/inode.c 2015-06-21 14:08:28.358432418 -0500
+@@ -58,6 +58,7 @@
+ static __cacheline_aligned_in_smp DEFINE_SPINLOCK(inode_hash_lock);
+
+ __cacheline_aligned_in_smp DEFINE_SPINLOCK(inode_sb_list_lock);
++EXPORT_SYMBOL(inode_sb_list_lock);
+
+ /*
+ * Empty aops. Can be used for the cases where the user does not
+diff -Nur linux-4.0.5.orig/fs/Kconfig linux-4.0.5/fs/Kconfig
+--- linux-4.0.5.orig/fs/Kconfig 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/fs/Kconfig 2015-06-21 14:08:20.746432489 -0500
@@ -218,6 +218,7 @@
source "fs/ufs/Kconfig"
source "fs/exofs/Kconfig"
@@ -32902,17 +32268,125 @@ diff -Nur linux-4.0.4.orig/fs/Kconfig linux-4.0.4/fs/Kconfig
endif # MISC_FILESYSTEMS
-diff -Nur linux-4.0.4.orig/fs/Makefile linux-4.0.4/fs/Makefile
---- linux-4.0.4.orig/fs/Makefile 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/fs/Makefile 2015-05-30 22:11:31.000000000 +0200
+diff -Nur linux-4.0.5.orig/fs/Makefile linux-4.0.5/fs/Makefile
+--- linux-4.0.5.orig/fs/Makefile 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/fs/Makefile 2015-06-21 14:08:20.746432489 -0500
@@ -126,3 +126,4 @@
obj-$(CONFIG_CEPH_FS) += ceph/
obj-$(CONFIG_PSTORE) += pstore/
obj-$(CONFIG_EFIVAR_FS) += efivarfs/
+obj-$(CONFIG_AUFS_FS) += aufs/
-diff -Nur linux-4.0.4.orig/fs/proc/base.c linux-4.0.4/fs/proc/base.c
---- linux-4.0.4.orig/fs/proc/base.c 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/fs/proc/base.c 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/fs/namespace.c linux-4.0.5/fs/namespace.c
+--- linux-4.0.5.orig/fs/namespace.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/fs/namespace.c 2015-06-21 14:08:28.358432418 -0500
+@@ -463,6 +463,7 @@
+ mnt_dec_writers(real_mount(mnt));
+ preempt_enable();
+ }
++EXPORT_SYMBOL_GPL(__mnt_drop_write);
+
+ /**
+ * mnt_drop_write - give up write access to a mount
+@@ -1770,6 +1771,7 @@
+ }
+ return 0;
+ }
++EXPORT_SYMBOL(iterate_mounts);
+
+ static void cleanup_group_ids(struct mount *mnt, struct mount *end)
+ {
+diff -Nur linux-4.0.5.orig/fs/notify/group.c linux-4.0.5/fs/notify/group.c
+--- linux-4.0.5.orig/fs/notify/group.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/fs/notify/group.c 2015-06-21 14:08:28.362432418 -0500
+@@ -22,6 +22,7 @@
+ #include <linux/srcu.h>
+ #include <linux/rculist.h>
+ #include <linux/wait.h>
++#include <linux/module.h>
+
+ #include <linux/fsnotify_backend.h>
+ #include "fsnotify.h"
+@@ -72,6 +73,7 @@
+ {
+ atomic_inc(&group->refcnt);
+ }
++EXPORT_SYMBOL(fsnotify_get_group);
+
+ /*
+ * Drop a reference to a group. Free it if it's through.
+@@ -81,6 +83,7 @@
+ if (atomic_dec_and_test(&group->refcnt))
+ fsnotify_final_destroy_group(group);
+ }
++EXPORT_SYMBOL(fsnotify_put_group);
+
+ /*
+ * Create a new fsnotify_group and hold a reference for the group returned.
+@@ -109,6 +112,7 @@
+
+ return group;
+ }
++EXPORT_SYMBOL(fsnotify_alloc_group);
+
+ int fsnotify_fasync(int fd, struct file *file, int on)
+ {
+diff -Nur linux-4.0.5.orig/fs/notify/mark.c linux-4.0.5/fs/notify/mark.c
+--- linux-4.0.5.orig/fs/notify/mark.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/fs/notify/mark.c 2015-06-21 14:08:28.362432418 -0500
+@@ -109,6 +109,7 @@
+ mark->free_mark(mark);
+ }
+ }
++EXPORT_SYMBOL(fsnotify_put_mark);
+
+ /* Calculate mask of events for a list of marks */
+ u32 fsnotify_recalc_mask(struct hlist_head *head)
+@@ -202,6 +203,7 @@
+ fsnotify_destroy_mark_locked(mark, group);
+ mutex_unlock(&group->mark_mutex);
+ }
++EXPORT_SYMBOL(fsnotify_destroy_mark);
+
+ /*
+ * Destroy all marks in the given list. The marks must be already detached from
+@@ -376,6 +378,7 @@
+
+ return ret;
+ }
++EXPORT_SYMBOL(fsnotify_add_mark);
+
+ int fsnotify_add_mark(struct fsnotify_mark *mark, struct fsnotify_group *group,
+ struct inode *inode, struct vfsmount *mnt, int allow_dups)
+@@ -455,6 +458,7 @@
+ atomic_set(&mark->refcnt, 1);
+ mark->free_mark = free_mark;
+ }
++EXPORT_SYMBOL(fsnotify_init_mark);
+
+ static int fsnotify_mark_destroy(void *ignored)
+ {
+diff -Nur linux-4.0.5.orig/fs/open.c linux-4.0.5/fs/open.c
+--- linux-4.0.5.orig/fs/open.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/fs/open.c 2015-06-21 14:08:28.362432418 -0500
+@@ -62,6 +62,7 @@
+ mutex_unlock(&dentry->d_inode->i_mutex);
+ return ret;
+ }
++EXPORT_SYMBOL(do_truncate);
+
+ long vfs_truncate(struct path *path, loff_t length)
+ {
+@@ -672,6 +673,7 @@
+ }
+ return 0;
+ }
++EXPORT_SYMBOL(open_check_o_direct);
+
+ static int do_dentry_open(struct file *f,
+ int (*open)(struct inode *, struct file *),
+diff -Nur linux-4.0.5.orig/fs/proc/base.c linux-4.0.5/fs/proc/base.c
+--- linux-4.0.5.orig/fs/proc/base.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/fs/proc/base.c 2015-06-21 14:08:25.134432449 -0500
@@ -1735,7 +1735,7 @@
down_read(&mm->mmap_sem);
vma = find_exact_vma(mm, vm_start, vm_end);
@@ -32922,9 +32396,9 @@ diff -Nur linux-4.0.4.orig/fs/proc/base.c linux-4.0.4/fs/proc/base.c
path_get(path);
rc = 0;
}
-diff -Nur linux-4.0.4.orig/fs/proc/nommu.c linux-4.0.4/fs/proc/nommu.c
---- linux-4.0.4.orig/fs/proc/nommu.c 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/fs/proc/nommu.c 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/fs/proc/nommu.c linux-4.0.5/fs/proc/nommu.c
+--- linux-4.0.5.orig/fs/proc/nommu.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/fs/proc/nommu.c 2015-06-21 14:08:25.134432449 -0500
@@ -45,7 +45,10 @@
file = region->vm_file;
@@ -32937,9 +32411,9 @@ diff -Nur linux-4.0.4.orig/fs/proc/nommu.c linux-4.0.4/fs/proc/nommu.c
dev = inode->i_sb->s_dev;
ino = inode->i_ino;
}
-diff -Nur linux-4.0.4.orig/fs/proc/task_mmu.c linux-4.0.4/fs/proc/task_mmu.c
---- linux-4.0.4.orig/fs/proc/task_mmu.c 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/fs/proc/task_mmu.c 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/fs/proc/task_mmu.c linux-4.0.5/fs/proc/task_mmu.c
+--- linux-4.0.5.orig/fs/proc/task_mmu.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/fs/proc/task_mmu.c 2015-06-21 14:08:25.134432449 -0500
@@ -279,7 +279,10 @@
const char *name = NULL;
@@ -32961,9 +32435,9 @@ diff -Nur linux-4.0.4.orig/fs/proc/task_mmu.c linux-4.0.4/fs/proc/task_mmu.c
struct mm_struct *mm = vma->vm_mm;
struct mm_walk walk = {
.hugetlb_entry = gather_hugetlb_stats,
-diff -Nur linux-4.0.4.orig/fs/proc/task_nommu.c linux-4.0.4/fs/proc/task_nommu.c
---- linux-4.0.4.orig/fs/proc/task_nommu.c 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/fs/proc/task_nommu.c 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/fs/proc/task_nommu.c linux-4.0.5/fs/proc/task_nommu.c
+--- linux-4.0.5.orig/fs/proc/task_nommu.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/fs/proc/task_nommu.c 2015-06-21 14:08:25.134432449 -0500
@@ -160,7 +160,10 @@
file = vma->vm_file;
@@ -32971,14 +32445,14 @@ diff -Nur linux-4.0.4.orig/fs/proc/task_nommu.c linux-4.0.4/fs/proc/task_nommu.c
- struct inode *inode = file_inode(vma->vm_file);
+ struct inode *inode;
+
-+ file = vma_pr_or_file(file);
++ file = vma_pr_or_file(vma);
+ inode = file_inode(file);
dev = inode->i_sb->s_dev;
ino = inode->i_ino;
pgoff = (loff_t)vma->vm_pgoff << PAGE_SHIFT;
-diff -Nur linux-4.0.4.orig/fs/splice.c linux-4.0.4/fs/splice.c
---- linux-4.0.4.orig/fs/splice.c 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/fs/splice.c 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/fs/splice.c linux-4.0.5/fs/splice.c
+--- linux-4.0.5.orig/fs/splice.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/fs/splice.c 2015-06-21 14:08:28.362432418 -0500
@@ -1099,8 +1099,8 @@
/*
* Attempt to initiate a splice from pipe to file.
@@ -32990,7 +32464,12 @@ diff -Nur linux-4.0.4.orig/fs/splice.c linux-4.0.4/fs/splice.c
{
ssize_t (*splice_write)(struct pipe_inode_info *, struct file *,
loff_t *, size_t, unsigned int);
-@@ -1116,9 +1116,9 @@
+@@ -1112,13 +1112,14 @@
+
+ return splice_write(pipe, out, ppos, len, flags);
+ }
++EXPORT_SYMBOL(do_splice_from);
+
/*
* Attempt to initiate a splice from a file to a pipe.
*/
@@ -33003,9 +32482,28 @@ diff -Nur linux-4.0.4.orig/fs/splice.c linux-4.0.4/fs/splice.c
{
ssize_t (*splice_read)(struct file *, loff_t *,
struct pipe_inode_info *, size_t, unsigned int);
-diff -Nur linux-4.0.4.orig/include/linux/file.h linux-4.0.4/include/linux/file.h
---- linux-4.0.4.orig/include/linux/file.h 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/include/linux/file.h 2015-05-30 22:11:31.000000000 +0200
+@@ -1138,6 +1139,7 @@
+
+ return splice_read(in, ppos, pipe, len, flags);
+ }
++EXPORT_SYMBOL(do_splice_to);
+
+ /**
+ * splice_direct_to_actor - splices data directly between two non-pipes
+diff -Nur linux-4.0.5.orig/fs/xattr.c linux-4.0.5/fs/xattr.c
+--- linux-4.0.5.orig/fs/xattr.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/fs/xattr.c 2015-06-21 14:08:28.362432418 -0500
+@@ -207,6 +207,7 @@
+ *xattr_value = value;
+ return error;
+ }
++EXPORT_SYMBOL(vfs_getxattr_alloc);
+
+ /* Compare an extended attribute value with the given value */
+ int vfs_xattr_cmp(struct dentry *dentry, const char *xattr_name,
+diff -Nur linux-4.0.5.orig/include/linux/file.h linux-4.0.5/include/linux/file.h
+--- linux-4.0.5.orig/include/linux/file.h 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/include/linux/file.h 2015-06-21 14:08:17.150432522 -0500
@@ -19,6 +19,7 @@
struct path;
extern struct file *alloc_file(struct path *, fmode_t mode,
@@ -33014,14 +32512,13 @@ diff -Nur linux-4.0.4.orig/include/linux/file.h linux-4.0.4/include/linux/file.h
static inline void fput_light(struct file *file, int fput_needed)
{
-diff -Nur linux-4.0.4.orig/include/linux/mm.h linux-4.0.4/include/linux/mm.h
---- linux-4.0.4.orig/include/linux/mm.h 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/include/linux/mm.h 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/include/linux/mm.h linux-4.0.5/include/linux/mm.h
+--- linux-4.0.5.orig/include/linux/mm.h 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/include/linux/mm.h 2015-06-21 14:08:25.138432449 -0500
@@ -1254,6 +1254,28 @@
}
#endif
-+#ifdef CONFIG_MMU
+extern void vma_do_file_update_time(struct vm_area_struct *, const char[], int);
+extern struct file *vma_do_pr_or_file(struct vm_area_struct *, const char[],
+ int);
@@ -33034,21 +32531,22 @@ diff -Nur linux-4.0.4.orig/include/linux/mm.h linux-4.0.4/include/linux/mm.h
+ __LINE__)
+#define vma_get_file(vma) vma_do_get_file(vma, __func__, __LINE__)
+#define vma_fput(vma) vma_do_fput(vma, __func__, __LINE__)
-+#else
++
++#ifndef CONFIG_MMU
+extern struct file *vmr_do_pr_or_file(struct vm_region *, const char[], int);
+extern void vmr_do_fput(struct vm_region *, const char[], int);
+
+#define vmr_pr_or_file(region) vmr_do_pr_or_file(region, __func__, \
+ __LINE__)
+#define vmr_fput(region) vmr_do_fput(region, __func__, __LINE__)
-+#endif /* CONFIG_MMU */
++#endif /* !CONFIG_MMU */
+
extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write);
extern int access_remote_vm(struct mm_struct *mm, unsigned long addr,
void *buf, int len, int write);
-diff -Nur linux-4.0.4.orig/include/linux/mm_types.h linux-4.0.4/include/linux/mm_types.h
---- linux-4.0.4.orig/include/linux/mm_types.h 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/include/linux/mm_types.h 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/include/linux/mm_types.h linux-4.0.5/include/linux/mm_types.h
+--- linux-4.0.5.orig/include/linux/mm_types.h 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/include/linux/mm_types.h 2015-06-21 14:08:25.138432449 -0500
@@ -241,6 +241,7 @@
unsigned long vm_top; /* region allocated to here */
unsigned long vm_pgoff; /* the offset in vm_file corresponding to vm_start */
@@ -33065,9 +32563,9 @@ diff -Nur linux-4.0.4.orig/include/linux/mm_types.h linux-4.0.4/include/linux/mm
void * vm_private_data; /* was vm_pte (shared mem) */
#ifndef CONFIG_MMU
-diff -Nur linux-4.0.4.orig/include/linux/splice.h linux-4.0.4/include/linux/splice.h
---- linux-4.0.4.orig/include/linux/splice.h 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/include/linux/splice.h 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/include/linux/splice.h linux-4.0.5/include/linux/splice.h
+--- linux-4.0.5.orig/include/linux/splice.h 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/include/linux/splice.h 2015-06-21 14:08:17.150432522 -0500
@@ -83,4 +83,10 @@
extern void spd_release_page(struct splice_pipe_desc *, unsigned int);
@@ -33079,12 +32577,25 @@ diff -Nur linux-4.0.4.orig/include/linux/splice.h linux-4.0.4/include/linux/spli
+ struct pipe_inode_info *pipe, size_t len,
+ unsigned int flags);
#endif
-diff -Nur linux-4.0.4.orig/include/uapi/linux/aufs_type.h linux-4.0.4/include/uapi/linux/aufs_type.h
---- linux-4.0.4.orig/include/uapi/linux/aufs_type.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/include/uapi/linux/aufs_type.h 2015-05-30 22:11:31.000000000 +0200
-@@ -0,0 +1,406 @@
+diff -Nur linux-4.0.5.orig/include/uapi/linux/aufs_type.h linux-4.0.5/include/uapi/linux/aufs_type.h
+--- linux-4.0.5.orig/include/uapi/linux/aufs_type.h 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/include/uapi/linux/aufs_type.h 2015-06-21 14:09:29.158432082 -0500
+@@ -0,0 +1,419 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
++ *
++ * This program, aufs 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __AUFS_TYPE_H__
@@ -33111,7 +32622,7 @@ diff -Nur linux-4.0.4.orig/include/uapi/linux/aufs_type.h linux-4.0.4/include/ua
+
+#include <linux/limits.h>
+
-+#define AUFS_VERSION "4.0"
++#define AUFS_VERSION "4.0-20150622"
+
+/* todo? move this to linux-2.6.19/include/magic.h */
+#define AUFS_SUPER_MAGIC ('a' << 24 | 'u' << 16 | 'f' << 8 | 's')
@@ -33489,9 +33000,9 @@ diff -Nur linux-4.0.4.orig/include/uapi/linux/aufs_type.h linux-4.0.4/include/ua
+#define AUFS_CTL_FHSM_FD _IOW(AuCtlType, AuCtl_FHSM_FD, int)
+
+#endif /* __AUFS_TYPE_H__ */
-diff -Nur linux-4.0.4.orig/include/uapi/linux/Kbuild linux-4.0.4/include/uapi/linux/Kbuild
---- linux-4.0.4.orig/include/uapi/linux/Kbuild 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/include/uapi/linux/Kbuild 2015-05-30 22:11:31.000000000 +0200
+diff -Nur linux-4.0.5.orig/include/uapi/linux/Kbuild linux-4.0.5/include/uapi/linux/Kbuild
+--- linux-4.0.5.orig/include/uapi/linux/Kbuild 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/include/uapi/linux/Kbuild 2015-06-21 14:08:20.746432489 -0500
@@ -58,6 +58,7 @@
header-y += atm_tcp.h
header-y += atm_zatm.h
@@ -33500,9 +33011,9 @@ diff -Nur linux-4.0.4.orig/include/uapi/linux/Kbuild linux-4.0.4/include/uapi/li
header-y += auto_fs4.h
header-y += auto_fs.h
header-y += auxvec.h
-diff -Nur linux-4.0.4.orig/kernel/fork.c linux-4.0.4/kernel/fork.c
---- linux-4.0.4.orig/kernel/fork.c 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/kernel/fork.c 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/kernel/fork.c linux-4.0.5/kernel/fork.c
+--- linux-4.0.5.orig/kernel/fork.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/kernel/fork.c 2015-06-21 14:08:25.138432449 -0500
@@ -430,7 +430,7 @@
struct inode *inode = file_inode(file);
struct address_space *mapping = file->f_mapping;
@@ -33512,9 +33023,9 @@ diff -Nur linux-4.0.4.orig/kernel/fork.c linux-4.0.4/kernel/fork.c
if (tmp->vm_flags & VM_DENYWRITE)
atomic_dec(&inode->i_writecount);
i_mmap_lock_write(mapping);
-diff -Nur linux-4.0.4.orig/MAINTAINERS linux-4.0.4/MAINTAINERS
---- linux-4.0.4.orig/MAINTAINERS 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/MAINTAINERS 2015-05-30 22:11:31.000000000 +0200
+diff -Nur linux-4.0.5.orig/MAINTAINERS linux-4.0.5/MAINTAINERS
+--- linux-4.0.5.orig/MAINTAINERS 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/MAINTAINERS 2015-06-21 14:08:17.142432521 -0500
@@ -1864,6 +1864,19 @@
F: include/uapi/linux/audit.h
F: kernel/audit*
@@ -33535,9 +33046,9 @@ diff -Nur linux-4.0.4.orig/MAINTAINERS linux-4.0.4/MAINTAINERS
AUXILIARY DISPLAY DRIVERS
M: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>
W: http://miguelojeda.es/auxdisplay.htm
-diff -Nur linux-4.0.4.orig/mm/filemap.c linux-4.0.4/mm/filemap.c
---- linux-4.0.4.orig/mm/filemap.c 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/mm/filemap.c 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/mm/filemap.c linux-4.0.5/mm/filemap.c
+--- linux-4.0.5.orig/mm/filemap.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/mm/filemap.c 2015-06-21 14:08:25.142432449 -0500
@@ -2064,7 +2064,7 @@
int ret = VM_FAULT_LOCKED;
@@ -33547,9 +33058,9 @@ diff -Nur linux-4.0.4.orig/mm/filemap.c linux-4.0.4/mm/filemap.c
lock_page(page);
if (page->mapping != inode->i_mapping) {
unlock_page(page);
-diff -Nur linux-4.0.4.orig/mm/madvise.c linux-4.0.4/mm/madvise.c
---- linux-4.0.4.orig/mm/madvise.c 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/mm/madvise.c 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/mm/madvise.c linux-4.0.5/mm/madvise.c
+--- linux-4.0.5.orig/mm/madvise.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/mm/madvise.c 2015-06-21 14:08:25.142432449 -0500
@@ -320,12 +320,12 @@
* vma's reference to the file) can go away as soon as we drop
* mmap_sem.
@@ -33565,9 +33076,9 @@ diff -Nur linux-4.0.4.orig/mm/madvise.c linux-4.0.4/mm/madvise.c
down_read(&current->mm->mmap_sem);
return error;
}
-diff -Nur linux-4.0.4.orig/mm/Makefile linux-4.0.4/mm/Makefile
---- linux-4.0.4.orig/mm/Makefile 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/mm/Makefile 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/mm/Makefile linux-4.0.5/mm/Makefile
+--- linux-4.0.5.orig/mm/Makefile 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/mm/Makefile 2015-06-21 14:08:25.142432449 -0500
@@ -21,7 +21,7 @@
mm_init.o mmu_context.o percpu.o slab_common.o \
compaction.o vmacache.o \
@@ -33577,9 +33088,9 @@ diff -Nur linux-4.0.4.orig/mm/Makefile linux-4.0.4/mm/Makefile
obj-y += init-mm.o
-diff -Nur linux-4.0.4.orig/mm/memory.c linux-4.0.4/mm/memory.c
---- linux-4.0.4.orig/mm/memory.c 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/mm/memory.c 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/mm/memory.c linux-4.0.5/mm/memory.c
+--- linux-4.0.5.orig/mm/memory.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/mm/memory.c 2015-06-21 14:08:25.142432449 -0500
@@ -2132,7 +2132,7 @@
}
@@ -33589,9 +33100,9 @@ diff -Nur linux-4.0.4.orig/mm/memory.c linux-4.0.4/mm/memory.c
}
return ret;
-diff -Nur linux-4.0.4.orig/mm/mmap.c linux-4.0.4/mm/mmap.c
---- linux-4.0.4.orig/mm/mmap.c 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/mm/mmap.c 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/mm/mmap.c linux-4.0.5/mm/mmap.c
+--- linux-4.0.5.orig/mm/mmap.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/mm/mmap.c 2015-06-21 14:08:25.142432449 -0500
@@ -274,7 +274,7 @@
if (vma->vm_ops && vma->vm_ops->close)
vma->vm_ops->close(vma);
@@ -33668,9 +33179,9 @@ diff -Nur linux-4.0.4.orig/mm/mmap.c linux-4.0.4/mm/mmap.c
if (new_vma->vm_ops && new_vma->vm_ops->open)
new_vma->vm_ops->open(new_vma);
vma_link(mm, new_vma, prev, rb_link, rb_parent);
-diff -Nur linux-4.0.4.orig/mm/msync.c linux-4.0.4/mm/msync.c
---- linux-4.0.4.orig/mm/msync.c 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/mm/msync.c 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/mm/msync.c linux-4.0.5/mm/msync.c
+--- linux-4.0.5.orig/mm/msync.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/mm/msync.c 2015-06-21 14:08:25.142432449 -0500
@@ -84,10 +84,10 @@
start = vma->vm_end;
if ((flags & MS_SYNC) && file &&
@@ -33684,9 +33195,9 @@ diff -Nur linux-4.0.4.orig/mm/msync.c linux-4.0.4/mm/msync.c
if (error || start >= end)
goto out;
down_read(&mm->mmap_sem);
-diff -Nur linux-4.0.4.orig/mm/nommu.c linux-4.0.4/mm/nommu.c
---- linux-4.0.4.orig/mm/nommu.c 2015-05-17 18:55:21.000000000 +0200
-+++ linux-4.0.4/mm/nommu.c 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/mm/nommu.c linux-4.0.5/mm/nommu.c
+--- linux-4.0.5.orig/mm/nommu.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/mm/nommu.c 2015-06-21 14:08:25.142432449 -0500
@@ -693,7 +693,7 @@
up_write(&nommu_region_sem);
@@ -33727,9 +33238,9 @@ diff -Nur linux-4.0.4.orig/mm/nommu.c linux-4.0.4/mm/nommu.c
kmem_cache_free(vm_area_cachep, vma);
kleave(" = %d", ret);
return ret;
-diff -Nur linux-4.0.4.orig/mm/prfile.c linux-4.0.4/mm/prfile.c
---- linux-4.0.4.orig/mm/prfile.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-4.0.4/mm/prfile.c 2015-05-30 22:11:30.000000000 +0200
+diff -Nur linux-4.0.5.orig/mm/prfile.c linux-4.0.5/mm/prfile.c
+--- linux-4.0.5.orig/mm/prfile.c 1969-12-31 18:00:00.000000000 -0600
++++ linux-4.0.5/mm/prfile.c 2015-06-21 14:08:25.142432449 -0500
@@ -0,0 +1,86 @@
+/*
+ * Mainly for aufs which mmap(2) diffrent file and wants to print different path
@@ -33757,7 +33268,6 @@ diff -Nur linux-4.0.4.orig/mm/prfile.c linux-4.0.4/mm/prfile.c
+#endif
+}
+
-+#ifdef CONFIG_MMU
+void vma_do_file_update_time(struct vm_area_struct *vma, const char func[],
+ int line)
+{
@@ -33797,7 +33307,8 @@ diff -Nur linux-4.0.4.orig/mm/prfile.c linux-4.0.4/mm/prfile.c
+ if (f && pr)
+ fput(pr);
+}
-+#else
++
++#ifndef CONFIG_MMU
+struct file *vmr_do_pr_or_file(struct vm_region *region, const char func[],
+ int line)
+{
@@ -33816,4 +33327,121 @@ diff -Nur linux-4.0.4.orig/mm/prfile.c linux-4.0.4/mm/prfile.c
+ if (f && pr)
+ fput(pr);
+}
-+#endif /* CONFIG_MMU */
++#endif /* !CONFIG_MMU */
+diff -Nur linux-4.0.5.orig/security/commoncap.c linux-4.0.5/security/commoncap.c
+--- linux-4.0.5.orig/security/commoncap.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/security/commoncap.c 2015-06-21 14:08:28.366432418 -0500
+@@ -975,9 +975,11 @@
+ }
+ return ret;
+ }
++EXPORT_SYMBOL(cap_mmap_addr);
+
+ int cap_mmap_file(struct file *file, unsigned long reqprot,
+ unsigned long prot, unsigned long flags)
+ {
+ return 0;
+ }
++EXPORT_SYMBOL(cap_mmap_file);
+diff -Nur linux-4.0.5.orig/security/device_cgroup.c linux-4.0.5/security/device_cgroup.c
+--- linux-4.0.5.orig/security/device_cgroup.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/security/device_cgroup.c 2015-06-21 14:08:28.366432418 -0500
+@@ -7,6 +7,7 @@
+ #include <linux/device_cgroup.h>
+ #include <linux/cgroup.h>
+ #include <linux/ctype.h>
++#include <linux/export.h>
+ #include <linux/list.h>
+ #include <linux/uaccess.h>
+ #include <linux/seq_file.h>
+@@ -849,6 +850,7 @@
+ return __devcgroup_check_permission(type, imajor(inode), iminor(inode),
+ access);
+ }
++EXPORT_SYMBOL(__devcgroup_inode_permission);
+
+ int devcgroup_inode_mknod(int mode, dev_t dev)
+ {
+diff -Nur linux-4.0.5.orig/security/security.c linux-4.0.5/security/security.c
+--- linux-4.0.5.orig/security/security.c 2015-06-06 10:21:22.000000000 -0500
++++ linux-4.0.5/security/security.c 2015-06-21 14:08:28.366432418 -0500
+@@ -430,6 +430,7 @@
+ return 0;
+ return security_ops->path_rmdir(dir, dentry);
+ }
++EXPORT_SYMBOL(security_path_rmdir);
+
+ int security_path_unlink(struct path *dir, struct dentry *dentry)
+ {
+@@ -446,6 +447,7 @@
+ return 0;
+ return security_ops->path_symlink(dir, dentry, old_name);
+ }
++EXPORT_SYMBOL(security_path_symlink);
+
+ int security_path_link(struct dentry *old_dentry, struct path *new_dir,
+ struct dentry *new_dentry)
+@@ -454,6 +456,7 @@
+ return 0;
+ return security_ops->path_link(old_dentry, new_dir, new_dentry);
+ }
++EXPORT_SYMBOL(security_path_link);
+
+ int security_path_rename(struct path *old_dir, struct dentry *old_dentry,
+ struct path *new_dir, struct dentry *new_dentry,
+@@ -481,6 +484,7 @@
+ return 0;
+ return security_ops->path_truncate(path);
+ }
++EXPORT_SYMBOL(security_path_truncate);
+
+ int security_path_chmod(struct path *path, umode_t mode)
+ {
+@@ -488,6 +492,7 @@
+ return 0;
+ return security_ops->path_chmod(path, mode);
+ }
++EXPORT_SYMBOL(security_path_chmod);
+
+ int security_path_chown(struct path *path, kuid_t uid, kgid_t gid)
+ {
+@@ -495,6 +500,7 @@
+ return 0;
+ return security_ops->path_chown(path, uid, gid);
+ }
++EXPORT_SYMBOL(security_path_chown);
+
+ int security_path_chroot(struct path *path)
+ {
+@@ -580,6 +586,7 @@
+ return 0;
+ return security_ops->inode_readlink(dentry);
+ }
++EXPORT_SYMBOL(security_inode_readlink);
+
+ int security_inode_follow_link(struct dentry *dentry, struct nameidata *nd)
+ {
+@@ -594,6 +601,7 @@
+ return 0;
+ return security_ops->inode_permission(inode, mask);
+ }
++EXPORT_SYMBOL(security_inode_permission);
+
+ int security_inode_setattr(struct dentry *dentry, struct iattr *attr)
+ {
+@@ -716,6 +724,7 @@
+
+ return fsnotify_perm(file, mask);
+ }
++EXPORT_SYMBOL(security_file_permission);
+
+ int security_file_alloc(struct file *file)
+ {
+@@ -775,6 +784,7 @@
+ return ret;
+ return ima_file_mmap(file, prot);
+ }
++EXPORT_SYMBOL(security_mmap_file);
+
+ int security_mmap_addr(unsigned long addr)
+ {