[packages/kernel] - updated aufs patch
baggins
baggins at pld-linux.org
Sun Jun 28 18:38:35 CEST 2015
commit 5527c038501e84d3608809658ed2ddeb73e78168
Author: Jan Rękorajski <baggins at pld-linux.org>
Date: Sun Jun 28 18:38:11 2015 +0200
- updated aufs patch
...fs3+vserver.patch => kernel-aufs4+vserver.patch | 0
kernel-aufs3.patch => kernel-aufs4.patch | 1712 +++++++++++---------
kernel.spec | 18 +-
3 files changed, 998 insertions(+), 732 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index 41145f1..984623f 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -196,20 +196,20 @@ Patch85: kernel-hostap.patch
Patch100: kernel-vserver-2.3.patch
Patch101: kernel-vserver-fixes.patch
-# git://aufs.git.sourceforge.net/gitroot/aufs/aufs3-standalone.git, read README
+# git://github.com/sfjro/aufs4-standalone.git, read README
# Patch creation:
-# git clone git://aufs.git.sourceforge.net/gitroot/aufs/aufs3-standalone.git
-# cd aufs3-standalone
-# git checkout -b aufs4.0 origin/aufs4.0
-# cat aufs3-kbuild.patch aufs3-base.patch aufs3-mmap.patch aufs3-standalone.patch > ~/rpm/packages/kernel/kernel-aufs3.patch
+# git clone git://github.com/sfjro/aufs4-standalone.git
+# cd aufs4-standalone
+# git checkout -b aufs4.1 origin/aufs4.1
+# cat aufs4-kbuild.patch aufs4-base.patch aufs4-mmap.patch aufs4-standalone.patch > ~/rpm/packages/kernel/kernel-aufs4.patch
# mkdir linux
# cp -a Documentation fs include linux
-# diff -urN /usr/share/empty linux >> ~/rpm/packages/kernel/kernel-aufs3.patch
+# diff -urN /usr/share/empty linux >> ~/rpm/packages/kernel/kernel-aufs4.patch
# drop hunk at the end of patch (hunk is patching include/linux/Kbuild with single line change)
-# cat aufs3-loopback.patch >> ~/rpm/packages/kernel/kernel-aufs3.patch
+# cat aufs4-loopback.patch >> ~/rpm/packages/kernel/kernel-aufs4.patch
#
-Patch145: kernel-aufs3.patch
-Patch146: kernel-aufs3+vserver.patch
+Patch145: kernel-aufs4.patch
+Patch146: kernel-aufs4+vserver.patch
%define uksm_major_version 0.1.2.3
%define uksm_version %{uksm_major_version}-for-v3.18
diff --git a/kernel-aufs3+vserver.patch b/kernel-aufs4+vserver.patch
similarity index 100%
rename from kernel-aufs3+vserver.patch
rename to kernel-aufs4+vserver.patch
diff --git a/kernel-aufs3.patch b/kernel-aufs4.patch
similarity index 96%
rename from kernel-aufs3.patch
rename to kernel-aufs4.patch
index 5381656..505b512 100644
--- a/kernel-aufs3.patch
+++ b/kernel-aufs4.patch
@@ -1,31 +1,31 @@
-aufs3.x-rcN kbuild patch
+aufs4.x-rcN kbuild patch
diff --git a/fs/Kconfig b/fs/Kconfig
-index ec35851..a059d62 100644
+index 011f433..b1083f6 100644
--- a/fs/Kconfig
+++ b/fs/Kconfig
-@@ -218,6 +218,7 @@ source "fs/sysv/Kconfig"
+@@ -218,6 +218,7 @@ source "fs/pstore/Kconfig"
+ source "fs/sysv/Kconfig"
source "fs/ufs/Kconfig"
source "fs/exofs/Kconfig"
- source "fs/f2fs/Kconfig"
+source "fs/aufs/Kconfig"
endif # MISC_FILESYSTEMS
diff --git a/fs/Makefile b/fs/Makefile
-index a88ac48..162500e 100644
+index cb92fd4..8c2df12 100644
--- a/fs/Makefile
+++ b/fs/Makefile
-@@ -126,3 +126,4 @@ obj-y += exofs/ # Multiple modules
+@@ -127,3 +127,4 @@ obj-y += exofs/ # Multiple modules
obj-$(CONFIG_CEPH_FS) += ceph/
obj-$(CONFIG_PSTORE) += pstore/
obj-$(CONFIG_EFIVAR_FS) += efivarfs/
+obj-$(CONFIG_AUFS_FS) += aufs/
diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild
-index 68ceb97..0352fa4 100644
+index 1a0006a..ddad01a 100644
--- a/include/uapi/linux/Kbuild
+++ b/include/uapi/linux/Kbuild
-@@ -58,6 +58,7 @@ header-y += atmsvc.h
+@@ -59,6 +59,7 @@ header-y += atmsvc.h
header-y += atm_tcp.h
header-y += atm_zatm.h
header-y += audit.h
@@ -33,13 +33,13 @@ index 68ceb97..0352fa4 100644
header-y += auto_fs4.h
header-y += auto_fs.h
header-y += auxvec.h
-aufs3.x-rcN base patch
+aufs4.x-rcN base patch
diff --git a/MAINTAINERS b/MAINTAINERS
-index efbcb50..30a1654 100644
+index d8afd29..feac5ea 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
-@@ -1864,6 +1864,20 @@ F: include/linux/audit.h
+@@ -1880,6 +1880,19 @@ F: include/linux/audit.h
F: include/uapi/linux/audit.h
F: kernel/audit*
@@ -48,8 +48,7 @@ index efbcb50..30a1654 100644
+L: linux-unionfs at vger.kernel.org
+L: aufs-users at lists.sourceforge.net (members only)
+W: http://aufs.sourceforge.net
-+T: git://git.code.sf.net/p/aufs/aufs3-linux
-+T: git://github.com/sfjro/aufs3-linux.git
++T: git://github.com/sfjro/aufs4-linux.git
+S: Supported
+F: Documentation/filesystems/aufs/
+F: Documentation/ABI/testing/debugfs-aufs
@@ -61,10 +60,10 @@ index efbcb50..30a1654 100644
M: Miguel Ojeda Sandonis <miguel.ojeda.sandonis at gmail.com>
W: http://miguelojeda.es/auxdisplay.htm
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
-index d1f168b..a0da519 100644
+index d7173cb..0160952 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
-@@ -592,6 +592,24 @@ static inline int is_loop_device(struct file *file)
+@@ -540,6 +540,24 @@ static inline int is_loop_device(struct file *file)
return i && S_ISBLK(i->i_mode) && MAJOR(i->i_rdev) == LOOP_MAJOR;
}
@@ -90,10 +89,10 @@ index d1f168b..a0da519 100644
static ssize_t loop_attr_show(struct device *dev, char *page,
diff --git a/fs/dcache.c b/fs/dcache.c
-index c71e373..b93a9f2 100644
+index 37b5afd..bc261e2 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
-@@ -1130,7 +1130,7 @@ enum d_walk_ret {
+@@ -1164,7 +1164,7 @@ enum d_walk_ret {
*
* The @enter() and @finish() callbacks are called with d_lock held.
*/
@@ -102,11 +101,44 @@ index c71e373..b93a9f2 100644
enum d_walk_ret (*enter)(void *, struct dentry *),
void (*finish)(void *))
{
+diff --git a/fs/read_write.c b/fs/read_write.c
+index 819ef3f..fd0414e 100644
+--- a/fs/read_write.c
++++ b/fs/read_write.c
+@@ -494,6 +494,28 @@ ssize_t __vfs_write(struct file *file, const char __user *p, size_t count,
+ }
+ EXPORT_SYMBOL(__vfs_write);
+
++vfs_readf_t vfs_readf(struct file *file)
++{
++ const struct file_operations *fop = file->f_op;
++
++ if (fop->read)
++ return fop->read;
++ if (fop->read_iter)
++ return new_sync_read;
++ return ERR_PTR(-ENOSYS);
++}
++
++vfs_writef_t vfs_writef(struct file *file)
++{
++ const struct file_operations *fop = file->f_op;
++
++ if (fop->write)
++ return fop->write;
++ if (fop->write_iter)
++ return new_sync_write;
++ return ERR_PTR(-ENOSYS);
++}
++
+ ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t *pos)
+ {
+ mm_segment_t old_fs;
diff --git a/fs/splice.c b/fs/splice.c
-index 7968da9..beb9993 100644
+index bfe62ae..fa5eee5 100644
--- a/fs/splice.c
+++ b/fs/splice.c
-@@ -1099,8 +1099,8 @@ EXPORT_SYMBOL(generic_splice_sendpage);
+@@ -1101,8 +1101,8 @@ EXPORT_SYMBOL(generic_splice_sendpage);
/*
* Attempt to initiate a splice from pipe to file.
*/
@@ -117,7 +149,7 @@ index 7968da9..beb9993 100644
{
ssize_t (*splice_write)(struct pipe_inode_info *, struct file *,
loff_t *, size_t, unsigned int);
-@@ -1116,9 +1116,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
+@@ -1118,9 +1118,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
/*
* Attempt to initiate a splice from a file to a pipe.
*/
@@ -142,6 +174,23 @@ index f87d308..9a290b3 100644
static inline void fput_light(struct file *file, int fput_needed)
{
+diff --git a/include/linux/fs.h b/include/linux/fs.h
+index 35ec87e..3229f97 100644
+--- a/include/linux/fs.h
++++ b/include/linux/fs.h
+@@ -1649,6 +1649,12 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
+ struct iovec *fast_pointer,
+ struct iovec **ret_pointer);
+
++typedef ssize_t (*vfs_readf_t)(struct file *, char __user *, size_t, loff_t *);
++typedef ssize_t (*vfs_writef_t)(struct file *, const char __user *, size_t,
++ loff_t *);
++vfs_readf_t vfs_readf(struct file *file);
++vfs_writef_t vfs_writef(struct file *file);
++
+ extern ssize_t __vfs_read(struct file *, char __user *, size_t, loff_t *);
+ extern ssize_t __vfs_write(struct file *, const char __user *, size_t, loff_t *);
+ extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *);
diff --git a/include/linux/splice.h b/include/linux/splice.h
index da2751d..2e0fca6 100644
--- a/include/linux/splice.h
@@ -157,10 +206,10 @@ index da2751d..2e0fca6 100644
+ struct pipe_inode_info *pipe, size_t len,
+ unsigned int flags);
#endif
-aufs3.x-rcN mmap patch
+aufs4.x-rcN mmap patch
diff --git a/fs/buffer.c b/fs/buffer.c
-index 20805db..363569f 100644
+index c7a5602..8c50a22 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -2450,7 +2450,7 @@ int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,
@@ -173,10 +222,10 @@ index 20805db..363569f 100644
ret = __block_page_mkwrite(vma, vmf, get_block);
sb_end_pagefault(sb);
diff --git a/fs/proc/base.c b/fs/proc/base.c
-index 3f3d7ae..426bcc7 100644
+index 093ca14..fc1ac03 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
-@@ -1735,7 +1735,7 @@ static int proc_map_files_get_link(struct dentry *dentry, struct path *path)
+@@ -1744,7 +1744,7 @@ static int proc_map_files_get_link(struct dentry *dentry, struct path *path)
down_read(&mm->mmap_sem);
vma = find_exact_vma(mm, vm_start, vm_end);
if (vma && vma->vm_file) {
@@ -243,10 +292,10 @@ index 599ec2e..1740207 100644
ino = inode->i_ino;
pgoff = (loff_t)vma->vm_pgoff << PAGE_SHIFT;
diff --git a/include/linux/mm.h b/include/linux/mm.h
-index 47a9392..c8f8b46 100644
+index 0755b9f..2ee5500 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
-@@ -1254,6 +1254,28 @@ static inline int fixup_user_fault(struct task_struct *tsk,
+@@ -1172,6 +1172,28 @@ static inline int fixup_user_fault(struct task_struct *tsk,
}
#endif
@@ -276,7 +325,7 @@ index 47a9392..c8f8b46 100644
extern int access_remote_vm(struct mm_struct *mm, unsigned long addr,
void *buf, int len, int write);
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
-index 199a03a..ed38ea3 100644
+index 8d37e26..ce89d4c 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -241,6 +241,7 @@ struct vm_region {
@@ -296,10 +345,10 @@ index 199a03a..ed38ea3 100644
#ifndef CONFIG_MMU
diff --git a/kernel/fork.c b/kernel/fork.c
-index cf65139..f28a048 100644
+index 03c1eaa..7e215ba 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
-@@ -430,7 +430,7 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
+@@ -456,7 +456,7 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
struct inode *inode = file_inode(file);
struct address_space *mapping = file->f_mapping;
@@ -309,7 +358,7 @@ index cf65139..f28a048 100644
atomic_dec(&inode->i_writecount);
i_mmap_lock_write(mapping);
diff --git a/mm/Makefile b/mm/Makefile
-index 15dbe99..88e25b5 100644
+index 98c4eae..3f0c9b9 100644
--- a/mm/Makefile
+++ b/mm/Makefile
@@ -21,7 +21,7 @@ obj-y := filemap.o mempool.o oom_kill.o \
@@ -322,10 +371,10 @@ index 15dbe99..88e25b5 100644
obj-y += init-mm.o
diff --git a/mm/filemap.c b/mm/filemap.c
-index ad72420..8885258 100644
+index 6bf5e42..a863d0f 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
-@@ -2064,7 +2064,7 @@ int filemap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
+@@ -2062,7 +2062,7 @@ int filemap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
int ret = VM_FAULT_LOCKED;
sb_start_pagefault(inode->i_sb);
@@ -354,10 +403,10 @@ index d551475..1ebf71b 100644
return error;
}
diff --git a/mm/memory.c b/mm/memory.c
-index 97839f5..5e5d491 100644
+index 22e037e..62096a2 100644
--- a/mm/memory.c
+++ b/mm/memory.c
-@@ -2034,7 +2034,7 @@ static inline int wp_page_reuse(struct m
+@@ -2034,7 +2034,7 @@ static inline int wp_page_reuse(struct mm_struct *mm,
}
if (!page_mkwrite)
@@ -367,7 +416,7 @@ index 97839f5..5e5d491 100644
return VM_FAULT_WRITE;
diff --git a/mm/mmap.c b/mm/mmap.c
-index 9ec50a3..4a6a641 100644
+index bb50cac..1ab5e596 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -274,7 +274,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)
@@ -437,7 +486,7 @@ index 9ec50a3..4a6a641 100644
out:
up_write(&mm->mmap_sem);
if (populate)
-@@ -2950,7 +2949,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
+@@ -2949,7 +2948,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
if (anon_vma_clone(new_vma, vma))
goto out_free_mempol;
if (new_vma->vm_file)
@@ -464,7 +513,7 @@ index bb04d53..5c24c54 100644
goto out;
down_read(&mm->mmap_sem);
diff --git a/mm/nommu.c b/mm/nommu.c
-index 3fba2dc..870ce96 100644
+index e544508..dd6f74a 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -693,7 +693,7 @@ static void __put_nommu_region(struct vm_region *region)
@@ -599,13 +648,13 @@ index 0000000..6aa5ab5
+ fput(pr);
+}
+#endif /* !CONFIG_MMU */
-aufs3.x-rcN standalone patch
+aufs4.x-rcN standalone patch
diff --git a/fs/dcache.c b/fs/dcache.c
-index b93a9f2..5a010ee 100644
+index bc261e2..8d7951d 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
-@@ -1235,6 +1235,7 @@ rename_retry:
+@@ -1269,6 +1269,7 @@ rename_retry:
seq = 1;
goto again;
}
@@ -614,7 +663,7 @@ index b93a9f2..5a010ee 100644
/*
* Search for at least 1 mount point in the dentry's subdirs.
diff --git a/fs/file_table.c b/fs/file_table.c
-index 3f85411..00e9dcf 100644
+index 294174d..3cea027 100644
--- a/fs/file_table.c
+++ b/fs/file_table.c
@@ -147,6 +147,7 @@ over:
@@ -634,7 +683,7 @@ index 3f85411..00e9dcf 100644
void __init files_init(unsigned long mempages)
{
diff --git a/fs/inode.c b/fs/inode.c
-index f00b16f..eb7b8b5 100644
+index ea37cd1..58f5f58 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -58,6 +58,7 @@ static struct hlist_head *inode_hashtable __read_mostly;
@@ -646,7 +695,7 @@ index f00b16f..eb7b8b5 100644
/*
* Empty aops. Can be used for the cases where the user does not
diff --git a/fs/namespace.c b/fs/namespace.c
-index 82ef140..a3aa4b9 100644
+index 1b9e111..d45b81b 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -463,6 +463,7 @@ void __mnt_drop_write(struct vfsmount *mnt)
@@ -657,7 +706,7 @@ index 82ef140..a3aa4b9 100644
/**
* mnt_drop_write - give up write access to a mount
-@@ -1718,6 +1719,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
+@@ -1768,6 +1769,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
}
return 0;
}
@@ -738,7 +787,7 @@ index 92e48c7..d2c4b68 100644
static int fsnotify_mark_destroy(void *ignored)
{
diff --git a/fs/open.c b/fs/open.c
-index 33f9cbf..fcc7eb4 100644
+index 98e5a52..a94e2e7 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -62,6 +62,7 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
@@ -749,7 +798,7 @@ index 33f9cbf..fcc7eb4 100644
long vfs_truncate(struct path *path, loff_t length)
{
-@@ -672,6 +673,7 @@ int open_check_o_direct(struct file *f)
+@@ -676,6 +677,7 @@ int open_check_o_direct(struct file *f)
}
return 0;
}
@@ -757,11 +806,31 @@ index 33f9cbf..fcc7eb4 100644
static int do_dentry_open(struct file *f,
int (*open)(struct inode *, struct file *),
+diff --git a/fs/read_write.c b/fs/read_write.c
+index fd0414e..8ace6ec 100644
+--- a/fs/read_write.c
++++ b/fs/read_write.c
+@@ -504,6 +504,7 @@ vfs_readf_t vfs_readf(struct file *file)
+ return new_sync_read;
+ return ERR_PTR(-ENOSYS);
+ }
++EXPORT_SYMBOL(vfs_readf);
+
+ vfs_writef_t vfs_writef(struct file *file)
+ {
+@@ -515,6 +516,7 @@ vfs_writef_t vfs_writef(struct file *file)
+ return new_sync_write;
+ return ERR_PTR(-ENOSYS);
+ }
++EXPORT_SYMBOL(vfs_writef);
+
+ ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t *pos)
+ {
diff --git a/fs/splice.c b/fs/splice.c
-index beb9993..813275a 100644
+index fa5eee5..bfb3324 100644
--- a/fs/splice.c
+++ b/fs/splice.c
-@@ -1112,6 +1112,7 @@ long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
+@@ -1114,6 +1114,7 @@ long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
return splice_write(pipe, out, ppos, len, flags);
}
@@ -769,7 +838,7 @@ index beb9993..813275a 100644
/*
* Attempt to initiate a splice from a file to a pipe.
-@@ -1138,6 +1139,7 @@ long do_splice_to(struct file *in, loff_t *ppos,
+@@ -1140,6 +1141,7 @@ long do_splice_to(struct file *in, loff_t *ppos,
return splice_read(in, ppos, pipe, len, flags);
}
@@ -790,7 +859,7 @@ index 4ef6985..6bb6303 100644
/* Compare an extended attribute value with the given value */
int vfs_xattr_cmp(struct dentry *dentry, const char *xattr_name,
diff --git a/security/commoncap.c b/security/commoncap.c
-index f66713b..fd4c4b8 100644
+index f2875cd..ebf06ec 100644
--- a/security/commoncap.c
+++ b/security/commoncap.c
@@ -975,9 +975,11 @@ int cap_mmap_addr(unsigned long addr)
@@ -826,7 +895,7 @@ index 188c1d2..426d9af 100644
int devcgroup_inode_mknod(int mode, dev_t dev)
{
diff --git a/security/security.c b/security/security.c
-index e81d5bb..0b7b840 100644
+index 8e9b1f4..c1c7cd1 100644
--- a/security/security.c
+++ b/security/security.c
@@ -430,6 +430,7 @@ int security_path_rmdir(struct path *dir, struct dentry *dentry)
@@ -911,7 +980,7 @@ index e81d5bb..0b7b840 100644
{
diff -urN /usr/share/empty/Documentation/ABI/testing/debugfs-aufs linux/Documentation/ABI/testing/debugfs-aufs
--- /usr/share/empty/Documentation/ABI/testing/debugfs-aufs 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/ABI/testing/debugfs-aufs 2014-01-30 21:10:02.794146538 +0100
++++ linux/Documentation/ABI/testing/debugfs-aufs 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,50 @@
+What: /debug/aufs/si_<id>/
+Date: March 2009
@@ -965,7 +1034,7 @@ diff -urN /usr/share/empty/Documentation/ABI/testing/debugfs-aufs linux/Document
+ will be empty. About XINO files, see the aufs manual.
diff -urN /usr/share/empty/Documentation/ABI/testing/sysfs-aufs linux/Documentation/ABI/testing/sysfs-aufs
--- /usr/share/empty/Documentation/ABI/testing/sysfs-aufs 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/ABI/testing/sysfs-aufs 2014-01-30 21:10:02.794146538 +0100
++++ linux/Documentation/ABI/testing/sysfs-aufs 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,31 @@
+What: /sys/fs/aufs/si_<id>/
+Date: March 2009
@@ -1000,7 +1069,7 @@ diff -urN /usr/share/empty/Documentation/ABI/testing/sysfs-aufs linux/Documentat
+ will be empty. About XINO files, see the aufs manual.
diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/01intro.txt linux/Documentation/filesystems/aufs/design/01intro.txt
--- /usr/share/empty/Documentation/filesystems/aufs/design/01intro.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/01intro.txt 2015-06-22 08:27:37.867501461 +0200
++++ linux/Documentation/filesystems/aufs/design/01intro.txt 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,170 @@
+
+# Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -1174,7 +1243,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/01intro.txt lin
+about it. But currently I have implemented it in kernel space.
diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/02struct.txt linux/Documentation/filesystems/aufs/design/02struct.txt
--- /usr/share/empty/Documentation/filesystems/aufs/design/02struct.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/02struct.txt 2015-06-22 08:27:37.867501461 +0200
++++ linux/Documentation/filesystems/aufs/design/02struct.txt 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,258 @@
+
+# Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -1436,7 +1505,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/02struct.txt li
+For this purpose, use "aumvdown" command in aufs-util.git.
diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/03atomic_open.txt linux/Documentation/filesystems/aufs/design/03atomic_open.txt
--- /usr/share/empty/Documentation/filesystems/aufs/design/03atomic_open.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/03atomic_open.txt 2015-06-22 08:27:37.870834875 +0200
++++ linux/Documentation/filesystems/aufs/design/03atomic_open.txt 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,85 @@
+
+# Copyright (C) 2015 Junjiro R. Okajima
@@ -1525,7 +1594,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/03atomic_open.t
+ be implemented in aufs, but not all I am afraid.
diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/03lookup.txt linux/Documentation/filesystems/aufs/design/03lookup.txt
--- /usr/share/empty/Documentation/filesystems/aufs/design/03lookup.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/03lookup.txt 2015-06-22 08:27:37.870834875 +0200
++++ linux/Documentation/filesystems/aufs/design/03lookup.txt 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,113 @@
+
+# Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -1642,7 +1711,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/03lookup.txt li
+ by over-mounting something (or another method).
diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/04branch.txt linux/Documentation/filesystems/aufs/design/04branch.txt
--- /usr/share/empty/Documentation/filesystems/aufs/design/04branch.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/04branch.txt 2015-06-22 08:27:37.870834875 +0200
++++ linux/Documentation/filesystems/aufs/design/04branch.txt 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,74 @@
+
+# Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -1720,7 +1789,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/04branch.txt li
+ same named entry on the upper branch.
diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/05wbr_policy.txt linux/Documentation/filesystems/aufs/design/05wbr_policy.txt
--- /usr/share/empty/Documentation/filesystems/aufs/design/05wbr_policy.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/05wbr_policy.txt 2015-06-22 08:27:37.870834875 +0200
++++ linux/Documentation/filesystems/aufs/design/05wbr_policy.txt 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,64 @@
+
+# Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -1788,7 +1857,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/05wbr_policy.tx
+ copyup policy.
diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06fhsm.txt linux/Documentation/filesystems/aufs/design/06fhsm.txt
--- /usr/share/empty/Documentation/filesystems/aufs/design/06fhsm.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/06fhsm.txt 2015-06-22 08:27:37.870834875 +0200
++++ linux/Documentation/filesystems/aufs/design/06fhsm.txt 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,120 @@
+
+# Copyright (C) 2011-2015 Junjiro R. Okajima
@@ -1912,7 +1981,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06fhsm.txt linu
+should restore the original file state after an error happens.
diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06mmap.txt linux/Documentation/filesystems/aufs/design/06mmap.txt
--- /usr/share/empty/Documentation/filesystems/aufs/design/06mmap.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/06mmap.txt 2015-06-22 08:27:37.870834875 +0200
++++ linux/Documentation/filesystems/aufs/design/06mmap.txt 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,72 @@
+
+# Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -1988,7 +2057,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06mmap.txt linu
+I have to give up this "looks-smater" approach.
diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06xattr.txt linux/Documentation/filesystems/aufs/design/06xattr.txt
--- /usr/share/empty/Documentation/filesystems/aufs/design/06xattr.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/06xattr.txt 2015-06-22 08:27:37.870834875 +0200
++++ linux/Documentation/filesystems/aufs/design/06xattr.txt 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,96 @@
+
+# Copyright (C) 2014-2015 Junjiro R. Okajima
@@ -2088,7 +2157,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06xattr.txt lin
+now, aufs implements the branch attributes to ignore the error.
diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/07export.txt linux/Documentation/filesystems/aufs/design/07export.txt
--- /usr/share/empty/Documentation/filesystems/aufs/design/07export.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/07export.txt 2015-06-22 08:27:37.870834875 +0200
++++ linux/Documentation/filesystems/aufs/design/07export.txt 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,58 @@
+
+# Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -2150,7 +2219,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/07export.txt li
+ lookup_one_len(), vfs_getattr(), encode_fh() and others.
diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/08shwh.txt linux/Documentation/filesystems/aufs/design/08shwh.txt
--- /usr/share/empty/Documentation/filesystems/aufs/design/08shwh.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/08shwh.txt 2015-06-22 08:27:37.870834875 +0200
++++ linux/Documentation/filesystems/aufs/design/08shwh.txt 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,52 @@
+
+# Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -2206,7 +2275,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/08shwh.txt linu
+initramfs will use it to replace the old one at the next boot.
diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/10dynop.txt linux/Documentation/filesystems/aufs/design/10dynop.txt
--- /usr/share/empty/Documentation/filesystems/aufs/design/10dynop.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/10dynop.txt 2015-06-22 08:27:37.870834875 +0200
++++ linux/Documentation/filesystems/aufs/design/10dynop.txt 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,47 @@
+
+# Copyright (C) 2010-2015 Junjiro R. Okajima
@@ -2255,73 +2324,12 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/10dynop.txt lin
+XIP (DAX) mainly.
+Currently this approach is applied to address_space_operations for
+regular files only.
-diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/99plan.txt linux/Documentation/filesystems/aufs/design/99plan.txt
---- /usr/share/empty/Documentation/filesystems/aufs/design/99plan.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/99plan.txt 2015-06-22 08:27:37.870834875 +0200
-@@ -0,0 +1,57 @@
-+
-+# Copyright (C) 2005-2015 Junjiro R. Okajima
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program. If not, see <http://www.gnu.org/licenses/>.
-+
-+Plan
-+
-+Restoring some features which was implemented in aufs1.
-+They were dropped in aufs2 in order to make source files simpler and
-+easier to be reviewed.
-+
-+
-+Being Another Aufs's Readonly Branch (robr)
-+----------------------------------------------------------------------
-+Aufs1 allows aufs to be another aufs's readonly branch.
-+This feature was developed by a user's request. But it may not be used
-+currently.
-+
-+
-+Refresh the Opened File (refrof)
-+----------------------------------------------------------------------
-+This option is implemented in aufs1 but incomplete.
-+
-+When user reads from a file, he expects to get its latest filedata
-+generally. If the file is removed and a new same named file is created,
-+the content he gets is unchanged, ie. the unlinked filedata.
-+
-+Let's try case study again.
-+- aufs has two branches.
-+ /au = /rw + /ro
-+- "fileA" exists under /ro, but /rw.
-+- user opened "/au/fileA".
-+- he or someone else inserts a branch (/new) between /rw and /ro.
-+ /au = /rw + /new + /ro
-+- the new branch contains "fileA".
-+- user reads from the opened "fileA"
-+- which filedata should aufs return, from /ro or /new?
-+
-+Some people says it has to be "from /ro" and it is a semantics of Unix.
-+The others say it should be "from /new" because the file is not removed
-+and it is equivalent to the case of someone else modifies the file.
-+
-+Here again I don't have a best and final answer. I got an idea to
-+implement 'refrof' and 'norefrof' option. When 'refrof' (REFResh the
-+Opened File) is specified (by default), aufs returns the filedata from
-+/new. Otherwise from /ro.
diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documentation/filesystems/aufs/README
--- /usr/share/empty/Documentation/filesystems/aufs/README 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/README 2015-06-22 08:27:37.867501461 +0200
-@@ -0,0 +1,384 @@
++++ linux/Documentation/filesystems/aufs/README 2015-06-28 17:35:44.344717109 +0200
+@@ -0,0 +1,383 @@
+
-+Aufs3 -- advanced multi layered unification filesystem version 3.x
++Aufs4 -- advanced multi layered unification filesystem version 4.x
+http://aufs.sf.net
+Junjiro R. Okajima
+
@@ -2337,7 +2345,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
+Unionfs is being developed by Professor Erez Zadok at Stony Brook
+University and his team.
+
-+Aufs3 supports linux-3.0 and later.
++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.
+
@@ -2399,7 +2407,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
+- userspace wrapper for pathconf(3)/fpathconf(3) with _PC_LINK_MAX.
+- and more...
+
-+Currently these features are dropped temporary from aufs3.
++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)
@@ -2417,65 +2425,64 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
+
+2. Download
+----------------------------------------
-+There were three GIT trees for aufs3, aufs3-linux.git,
-+aufs3-standalone.git, and aufs-util.git. Note that there is no "3" in
++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 aufs3-linux
-+or aufs3-standalone.
++While the aufs-util is always necessary, you need either of aufs4-linux
++or aufs4-standalone.
+
-+The aufs3-linux tree includes the whole linux mainline GIT tree,
++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 aufs3 as an external kernel module.
++build aufs4 as an external kernel module.
+Several extra patches are not included in this tree. Only
-+aufs3-standalong tree contains them. They are describe in the later
++aufs4-standalone tree contains them. They are describe in the later
+section "Configuration and Compilation."
+
-+On the other hand, the aufs3-standalone tree has only aufs source files
++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 "aufs3.x" where "x"
-+represents the linux kernel version, "linux-3.x". For instance,
-+"aufs3.0" is for linux-3.0. For latest "linux-3.x-rcN", use
-+"aufs3.x-rcN" branch.
++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 aufs3-linux tree
++o aufs4-linux tree
+$ git clone --reference /your/linux/git/tree \
-+ git://git.code.sf.net/p/aufs/aufs3-linux aufs3-linux.git
++ git://github.com/sfjro/aufs4-linux.git aufs4-linux.git
+- if you don't have linux GIT tree, then remove "--reference ..."
-+$ cd aufs3-linux.git
-+$ git checkout origin/aufs3.0
++$ 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 aufs3 https://github.com/sfjro/aufs3-linux.git
-+- aufs3-linux.git tree also exists on github.
-+$ git fetch aufs3
-+$ git checkout -b my3.14 v3.14
-+$ (add your change...)
-+$ git pull aufs3 aufs3.14
-+- now you have v3.14 + your_changes + aufs3.14 in you my3.14 branch.
++$ 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
-+ aufs3.14. in this case, git-rerere is recommended so that you can
-+ solve the similar confilicts automatically when you upgrade to 3.15 or
++ 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 aufs3-standalone tree
-+$ git clone git://git.code.sf.net/p/aufs/aufs3-standalone \
-+ aufs3-standalone.git
-+$ cd aufs3-standalone.git
-+$ git checkout origin/aufs3.0
++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
++$ 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/aufs3.0
++$ git checkout origin/aufs4.0
+
-+Note: The 3.x-rcN branch is to be used with `rc' kernel versions ONLY.
-+The minor version number, 'x' in '3.x', of aufs may not always
++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.
@@ -2487,8 +2494,8 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
+nearest lower number.
+
+For (an unreleased) example:
-+If you are using "linux-3.10" and the "aufs3.10" branch
-+does not exist in aufs-util repository, then "aufs3.9", "aufs3.8"
++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
@@ -2499,19 +2506,19 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
+----------------------------------------
+Make sure you have git-checkout'ed the correct branch.
+
-+For aufs3-linux tree,
++For aufs4-linux tree,
+- enable CONFIG_AUFS_FS.
+- set other aufs configurations if necessary.
+
-+For aufs3-standalone tree,
++For aufs4-standalone tree,
+There are several ways to build.
+
+1.
-+- apply ./aufs3-kbuild.patch to your kernel source files.
-+- apply ./aufs3-base.patch too.
-+- apply ./aufs3-mmap.patch too.
-+- apply ./aufs3-standalone.patch too, if you have a plan to set
-+ CONFIG_AUFS_FS=m. otherwise you don't need ./aufs3-standalone.patch.
++- 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
@@ -2528,9 +2535,9 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
+
+2.
+- module only (CONFIG_AUFS_FS=m).
-+- apply ./aufs3-base.patch to your kernel source files.
-+- apply ./aufs3-mmap.patch too.
-+- apply ./aufs3-standalone.patch too.
++- 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
@@ -2549,7 +2556,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
+ 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 aufs3-kbuild.patch, nor copying source files to your
++- 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
@@ -2569,9 +2576,9 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
+ then run "make install_ulib" too. And refer to the aufs manual in
+ detail.
+
-+There several other patches in aufs3-standalone.git. They are all
++There several other patches in aufs4-standalone.git. They are all
+optional. When you meet some problems, they will help you.
-+- aufs3-loopback.patch
++- 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".
@@ -2706,7 +2713,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
+# End: ;
diff -urN /usr/share/empty/fs/aufs/aufs.h linux/fs/aufs/aufs.h
--- /usr/share/empty/fs/aufs/aufs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/aufs.h 2015-06-22 08:27:37.874168290 +0200
++++ linux/fs/aufs/aufs.h 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -2769,8 +2776,8 @@ diff -urN /usr/share/empty/fs/aufs/aufs.h linux/fs/aufs/aufs.h
+#endif /* __AUFS_H__ */
diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
--- /usr/share/empty/fs/aufs/branch.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/branch.c 2015-06-22 08:29:23.703424266 +0200
-@@ -0,0 +1,1406 @@
++++ linux/fs/aufs/branch.c 2015-06-28 17:36:09.025073697 +0200
+@@ -0,0 +1,1414 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -2898,6 +2905,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+{
+ struct au_branch *add_branch;
+ struct dentry *root;
++ struct inode *inode;
+ int err;
+
+ err = -ENOMEM;
@@ -2929,8 +2937,10 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+ err = au_sbr_realloc(au_sbi(sb), new_nbranch);
+ if (!err)
+ err = au_di_realloc(au_di(root), new_nbranch);
-+ if (!err)
-+ err = au_ii_realloc(au_ii(root->d_inode), new_nbranch);
++ if (!err) {
++ inode = d_inode(root);
++ err = au_ii_realloc(au_ii(inode), new_nbranch);
++ }
+ if (!err)
+ return add_branch; /* success */
+
@@ -2972,7 +2982,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+{
+ int err;
+ aufs_bindex_t bend, bindex;
-+ struct dentry *root;
++ struct dentry *root, *h_dentry;
+ struct inode *inode, *h_inode;
+
+ root = sb->s_root;
@@ -3000,7 +3010,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+ goto out;
+ }
+
-+ inode = add->path.dentry->d_inode;
++ inode = d_inode(add->path.dentry);
+ err = -ENOENT;
+ if (unlikely(!inode->i_nlink)) {
+ pr_err("no existence %s\n", add->pathname);
@@ -3025,7 +3035,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+ goto out;
+ }
+
-+ err = test_br(add->path.dentry->d_inode, add->perm, add->pathname);
++ err = test_br(d_inode(add->path.dentry), add->perm, add->pathname);
+ if (unlikely(err))
+ goto out;
+
@@ -3042,7 +3052,8 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+
+ err = 0;
+ if (au_opt_test(au_mntflags(sb), WARN_PERM)) {
-+ h_inode = au_h_dptr(root, 0)->d_inode;
++ h_dentry = au_h_dptr(root, 0);
++ h_inode = d_inode(h_dentry);
+ if ((h_inode->i_mode & S_IALLUGO) != (inode->i_mode & S_IALLUGO)
+ || !uid_eq(h_inode->i_uid, inode->i_uid)
+ || !gid_eq(h_inode->i_gid, inode->i_gid))
@@ -3069,6 +3080,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+ struct mutex *h_mtx;
+ struct au_wbr *wbr;
+ struct au_hinode *hdir;
++ struct dentry *h_dentry;
+
+ err = vfsub_mnt_want_write(au_br_mnt(br));
+ if (unlikely(err))
@@ -3081,10 +3093,11 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+ h_mtx = NULL;
+ bindex = au_br_index(sb, br->br_id);
+ if (0 <= bindex) {
-+ hdir = au_hi(sb->s_root->d_inode, bindex);
++ hdir = au_hi(d_inode(sb->s_root), bindex);
+ au_hn_imtx_lock_nested(hdir, AuLsc_I_PARENT);
+ } else {
-+ h_mtx = &au_br_dentry(br)->d_inode->i_mutex;
++ h_dentry = au_br_dentry(br);
++ h_mtx = &d_inode(h_dentry)->i_mutex;
+ mutex_lock_nested(h_mtx, AuLsc_I_PARENT);
+ }
+ if (!wbr)
@@ -3147,6 +3160,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+ struct au_opt_add *add)
+{
+ int err;
++ struct inode *h_inode;
+
+ err = 0;
+ memset(&br->br_xino, 0, sizeof(br->br_xino));
@@ -3167,7 +3181,8 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+ }
+
+ if (au_opt_test(au_mntflags(sb), XINO)) {
-+ err = au_xino_br(sb, br, add->path.dentry->d_inode->i_ino,
++ h_inode = d_inode(add->path.dentry);
++ err = au_xino_br(sb, br, h_inode->i_ino,
+ au_sbr(sb, 0)->br_xino.xi_file, /*do_test*/1);
+ if (unlikely(err)) {
+ AuDebugOn(br->br_xino.xi_file);
@@ -3236,11 +3251,11 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+ aufs_bindex_t bindex)
+{
+ struct dentry *root, *h_dentry;
-+ struct inode *root_inode;
++ struct inode *root_inode, *h_inode;
+ aufs_bindex_t bend, amount;
+
+ root = sb->s_root;
-+ root_inode = root->d_inode;
++ root_inode = d_inode(root);
+ bend = au_sbend(sb);
+ amount = bend + 1 - bindex;
+ h_dentry = au_br_dentry(br);
@@ -3249,8 +3264,8 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+ au_br_do_add_hdp(au_di(root), bindex, bend, amount);
+ au_br_do_add_hip(au_ii(root_inode), bindex, bend, amount);
+ au_set_h_dptr(root, bindex, dget(h_dentry));
-+ au_set_h_iptr(root_inode, bindex, au_igrab(h_dentry->d_inode),
-+ /*flags*/0);
++ h_inode = d_inode(h_dentry);
++ au_set_h_iptr(root_inode, bindex, au_igrab(h_inode), /*flags*/0);
+ au_sbilist_unlock();
+}
+
@@ -3263,7 +3278,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+ struct au_branch *add_branch;
+
+ root = sb->s_root;
-+ root_inode = root->d_inode;
++ root_inode = d_inode(root);
+ IMustLock(root_inode);
+ err = test_add(sb, add, remount);
+ if (unlikely(err < 0))
@@ -3299,7 +3314,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+ au_cpup_attr_all(root_inode, /*force*/1);
+ sb->s_maxbytes = h_dentry->d_sb->s_maxbytes;
+ } else
-+ au_add_nlink(root_inode, h_dentry->d_inode);
++ au_add_nlink(root_inode, d_inode(h_dentry));
+
+ /*
+ * this test/set prevents aufs from handling unnecesary notify events
@@ -3386,7 +3401,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+static int au_test_dbusy(struct dentry *dentry, aufs_bindex_t bstart,
+ aufs_bindex_t bend)
+{
-+ return au_test_ibusy(dentry->d_inode, bstart, bend);
++ return au_test_ibusy(d_inode(dentry), bstart, bend);
+}
+
+/*
@@ -3519,7 +3534,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+
+ sigen = au_sigen(root->d_sb);
+ DiMustNoWaiters(root);
-+ IiMustNoWaiters(root->d_inode);
++ IiMustNoWaiters(d_inode(root));
+ di_write_unlock(root);
+ err = test_dentry_busy(root, bindex, sigen, verbose);
+ if (!err)
@@ -3730,7 +3745,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+ SiMustWriteLock(sb);
+
+ root = sb->s_root;
-+ inode = root->d_inode;
++ inode = d_inode(root);
+ sbinfo = au_sbi(sb);
+ bend = sbinfo->si_bend;
+
@@ -3846,10 +3861,10 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+ }
+
+ if (!bindex) {
-+ au_cpup_attr_all(root->d_inode, /*force*/1);
++ au_cpup_attr_all(d_inode(root), /*force*/1);
+ sb->s_maxbytes = au_sbr_sb(sb, 0)->s_maxbytes;
+ } else
-+ au_sub_nlink(root->d_inode, del->h_path.dentry->d_inode);
++ au_sub_nlink(d_inode(root), d_inode(del->h_path.dentry));
+ if (au_opt_test(mnt_flags, PLINK))
+ au_plink_half_refresh(sb, br_id);
+
@@ -4076,7 +4091,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+ }
+ AuDbg("bindex b%d\n", bindex);
+
-+ err = test_br(mod->h_root->d_inode, mod->perm, mod->path);
++ err = test_br(d_inode(mod->h_root), mod->perm, mod->path);
+ if (unlikely(err))
+ goto out;
+
@@ -4104,7 +4119,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+ if (!au_br_writable(mod->perm)) {
+ /* rw --> ro, file might be mmapped */
+ DiMustNoWaiters(root);
-+ IiMustNoWaiters(root->d_inode);
++ IiMustNoWaiters(d_inode(root));
+ di_write_unlock(root);
+ err = au_br_mod_files_ro(sb, bindex);
+ /* aufs_write_lock() calls ..._child() */
@@ -4179,7 +4194,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
+}
diff -urN /usr/share/empty/fs/aufs/branch.h linux/fs/aufs/branch.h
--- /usr/share/empty/fs/aufs/branch.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/branch.h 2015-06-22 08:29:23.703424266 +0200
++++ linux/fs/aufs/branch.h 2015-06-28 17:36:09.025073697 +0200
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -4369,10 +4384,10 @@ diff -urN /usr/share/empty/fs/aufs/branch.h linux/fs/aufs/branch.h
+static const loff_t au_loff_max = LLONG_MAX;
+
+int au_xib_trunc(struct super_block *sb);
-+ssize_t xino_fread(au_readf_t func, struct file *file, void *buf, size_t size,
++ssize_t xino_fread(vfs_readf_t func, struct file *file, void *buf, size_t size,
+ loff_t *pos);
-+ssize_t xino_fwrite(au_writef_t func, struct file *file, void *buf, size_t size,
-+ loff_t *pos);
++ssize_t xino_fwrite(vfs_writef_t func, struct file *file, void *buf,
++ size_t size, loff_t *pos);
+struct file *au_xino_create2(struct file *base_file, struct file *copy_src);
+struct file *au_xino_create(struct super_block *sb, char *fname, int silent);
+ino_t au_xino_new_ino(struct super_block *sb);
@@ -4462,7 +4477,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.h linux/fs/aufs/branch.h
+#endif /* __AUFS_BRANCH_H__ */
diff -urN /usr/share/empty/fs/aufs/conf.mk linux/fs/aufs/conf.mk
--- /usr/share/empty/fs/aufs/conf.mk 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/conf.mk 2015-06-22 08:27:37.874168290 +0200
++++ linux/fs/aufs/conf.mk 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,38 @@
+
+AuConfStr = CONFIG_AUFS_FS=${CONFIG_AUFS_FS}
@@ -4504,8 +4519,8 @@ diff -urN /usr/share/empty/fs/aufs/conf.mk linux/fs/aufs/conf.mk
+-include ${srctree}/${src}/conf_priv.mk
diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
--- /usr/share/empty/fs/aufs/cpup.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/cpup.c 2015-06-22 08:29:23.703424266 +0200
-@@ -0,0 +1,1308 @@
++++ linux/fs/aufs/cpup.c 2015-06-28 17:36:09.025073697 +0200
+@@ -0,0 +1,1319 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -4638,7 +4653,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+
+ dt->dt_dentry = dentry;
+ dt->dt_h_path = *h_path;
-+ h_inode = h_path->dentry->d_inode;
++ h_inode = d_inode(h_path->dentry);
+ dt->dt_atime = h_inode->i_atime;
+ dt->dt_mtime = h_inode->i_mtime;
+ /* smp_mb(); */
@@ -4683,10 +4698,10 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ struct au_branch *br;
+
+ h_path.dentry = au_h_dptr(dst, bindex);
-+ h_idst = h_path.dentry->d_inode;
++ h_idst = d_inode(h_path.dentry);
+ br = au_sbr(dst->d_sb, bindex);
+ h_path.mnt = au_br_mnt(br);
-+ h_isrc = h_src->d_inode;
++ h_isrc = d_inode(h_src);
+ ia.ia_valid = ATTR_FORCE | ATTR_UID | ATTR_GID
+ | ATTR_ATIME | ATTR_MTIME
+ | ATTR_ATIME_SET | ATTR_MTIME_SET;
@@ -4915,7 +4930,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ }
+
+ /* try stopping to update while we copyup */
-+ IMustLock(file[SRC].dentry->d_inode);
++ IMustLock(d_inode(file[SRC].dentry));
+ err = au_copy_file(file[DST].file, file[SRC].file, cpg->len);
+
+ fput(file[DST].file);
@@ -4937,7 +4952,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ struct inode *h_src_inode, *h_dst_inode;
+
+ err = 0;
-+ h_src_inode = au_h_iptr(cpg->dentry->d_inode, cpg->bsrc);
++ h_src_inode = au_h_iptr(d_inode(cpg->dentry), cpg->bsrc);
+ l = i_size_read(h_src_inode);
+ if (cpg->len == -1 || l < cpg->len)
+ cpg->len = l;
@@ -4949,7 +4964,13 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ h_path.dentry = au_h_dptr(cpg->dentry, cpg->bsrc);
+ h_path.mnt = au_sbr_mnt(cpg->dentry->d_sb, cpg->bsrc);
+ h_src_attr->iflags = h_src_inode->i_flags;
-+ err = vfs_getattr(&h_path, &h_src_attr->st);
++ if (!au_test_nfs(h_src_inode->i_sb))
++ err = vfs_getattr(&h_path, &h_src_attr->st);
++ else {
++ mutex_unlock(&h_src_inode->i_mutex);
++ err = vfs_getattr(&h_path, &h_src_attr->st);
++ mutex_lock_nested(&h_src_inode->i_mutex, AuLsc_I_CHILD);
++ }
+ if (unlikely(err)) {
+ mutex_unlock(&h_src_inode->i_mutex);
+ goto out;
@@ -4963,7 +4984,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ }
+ if (!err && (h_src_inode->i_state & I_LINKABLE)) {
+ h_path.dentry = au_h_dptr(cpg->dentry, cpg->bdst);
-+ h_dst_inode = h_path.dentry->d_inode;
++ h_dst_inode = d_inode(h_path.dentry);
+ spin_lock(&h_dst_inode->i_lock);
+ h_dst_inode->i_state |= I_LINKABLE;
+ spin_unlock(&h_dst_inode->i_lock);
@@ -4982,9 +5003,11 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ char *k;
+ char __user *u;
+ } sym;
++ struct inode *h_inode = d_inode(h_src);
++ const struct inode_operations *h_iop = h_inode->i_op;
+
+ err = -ENOSYS;
-+ if (unlikely(!h_src->d_inode->i_op->readlink))
++ if (unlikely(!h_iop->readlink))
+ goto out;
+
+ err = -ENOMEM;
@@ -4995,7 +5018,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ /* unnecessary to support mmap_sem since symlink is not mmap-able */
+ old_fs = get_fs();
+ set_fs(KERNEL_DS);
-+ symlen = h_src->d_inode->i_op->readlink(h_src, sym.u, PATH_MAX);
++ symlen = h_iop->readlink(h_src, sym.u, PATH_MAX);
+ err = symlen;
+ set_fs(old_fs);
+
@@ -5021,13 +5044,13 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ struct au_dtime dt;
+ struct path h_path;
+ struct dentry *h_src, *h_dst, *h_parent;
-+ struct inode *h_inode, *h_dir;
++ struct inode *h_inode, *h_dir, *dir, *inode;
+ struct super_block *sb;
+
+ /* bsrc branch can be ro/rw. */
+ h_src = au_h_dptr(cpg->dentry, cpg->bsrc);
-+ h_inode = h_src->d_inode;
-+ AuDebugOn(h_inode != au_h_iptr(cpg->dentry->d_inode, cpg->bsrc));
++ h_inode = d_inode(h_src);
++ AuDebugOn(h_inode != au_h_iptr(d_inode(cpg->dentry), cpg->bsrc));
+
+ /* try stopping to be referenced while we are creating */
+ h_dst = au_h_dptr(cpg->dentry, cpg->bdst);
@@ -5035,7 +5058,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ AuDebugOn(strncmp(h_dst->d_name.name, AUFS_WH_PFX,
+ AUFS_WH_PFX_LEN));
+ h_parent = h_dst->d_parent; /* dir inode is locked */
-+ h_dir = h_parent->d_inode;
++ h_dir = d_inode(h_parent);
+ IMustLock(h_dir);
+ AuDebugOn(h_parent != h_dst->d_parent);
+
@@ -5066,10 +5089,11 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ * strange behaviour from the users view,
+ * particularry setattr case
+ */
-+ if (au_ibstart(dst_parent->d_inode) == cpg->bdst)
-+ au_cpup_attr_nlink(dst_parent->d_inode,
-+ /*force*/1);
-+ au_cpup_attr_nlink(cpg->dentry->d_inode, /*force*/1);
++ dir = d_inode(dst_parent);
++ if (au_ibstart(dir) == cpg->bdst)
++ au_cpup_attr_nlink(dir, /*force*/1);
++ inode = d_inode(cpg->dentry);
++ au_cpup_attr_nlink(inode, /*force*/1);
+ }
+ break;
+ case S_IFLNK:
@@ -5095,7 +5119,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ && (h_inode->i_nlink == 1
+ || (h_inode->i_state & I_LINKABLE))
+ /* todo: unnecessary? */
-+ /* && cpg->dentry->d_inode->i_nlink == 1 */
++ /* && d_inode(cpg->dentry)->i_nlink == 1 */
+ && cpg->bdst < cpg->bsrc
+ && !au_ftest_cpup(cpg->flags, KEEPLINO))
+ au_xino_write(sb, cpg->bsrc, h_inode->i_ino, /*ino*/0);
@@ -5146,7 +5170,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ goto out;
+
+ h_parent = h_dentry->d_parent; /* dir inode is locked */
-+ h_dir = h_parent->d_inode;
++ h_dir = d_inode(h_parent);
+ IMustLock(h_dir);
+ AuDbg("%pd %pd\n", h_dentry, h_path->dentry);
+ /* no delegation since it is just created */
@@ -5170,7 +5194,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ aufs_bindex_t old_ibstart;
+ unsigned char isdir, plink;
+ struct dentry *h_src, *h_dst, *h_parent;
-+ struct inode *dst_inode, *h_dir, *inode, *delegated;
++ struct inode *dst_inode, *h_dir, *inode, *delegated, *src_inode;
+ struct super_block *sb;
+ struct au_branch *br;
+ /* to reuduce stack size */
@@ -5191,11 +5215,11 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ a->h_path.mnt = au_br_mnt(br);
+ h_dst = au_h_dptr(cpg->dentry, cpg->bdst);
+ h_parent = h_dst->d_parent; /* dir inode is locked */
-+ h_dir = h_parent->d_inode;
++ h_dir = d_inode(h_parent);
+ IMustLock(h_dir);
+
+ h_src = au_h_dptr(cpg->dentry, cpg->bsrc);
-+ inode = cpg->dentry->d_inode;
++ inode = d_inode(cpg->dentry);
+
+ if (!dst_parent)
+ dst_parent = dget_parent(cpg->dentry);
@@ -5220,7 +5244,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ err = PTR_ERR(h_src);
+ if (IS_ERR(h_src))
+ goto out_parent;
-+ if (unlikely(!h_src->d_inode)) {
++ if (unlikely(d_is_negative(h_src))) {
+ err = -EIO;
+ AuIOErr("i%lu exists on a upper branch "
+ "but not pseudo-linked\n",
@@ -5259,7 +5283,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ err = cpup_entry(cpg, dst_parent, &a->h_src_attr);
+ if (unlikely(err))
+ goto out_rev;
-+ dst_inode = h_dst->d_inode;
++ dst_inode = d_inode(h_dst);
+ mutex_lock_nested(&dst_inode->i_mutex, AuLsc_I_CHILD2);
+ /* todo: necessary? */
+ /* au_pin_hdir_unlock(cpg->pin); */
@@ -5294,9 +5318,10 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ if (unlikely(err))
+ goto out_rev;
+
++ src_inode = d_inode(h_src);
+ if (!isdir
-+ && (h_src->d_inode->i_nlink > 1
-+ || h_src->d_inode->i_state & I_LINKABLE)
++ && (src_inode->i_nlink > 1
++ || src_inode->i_state & I_LINKABLE)
+ && plink)
+ au_plink_append(inode, cpg->bdst, h_dst);
+
@@ -5313,7 +5338,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ au_dtime_store(&a->dt, dst_parent, &a->h_path);
+ a->h_path.dentry = h_dst;
+ rerr = 0;
-+ if (h_dst->d_inode) {
++ if (d_is_positive(h_dst)) {
+ if (!isdir) {
+ /* no delegation since it is just created */
+ rerr = vfsub_unlink(h_dir, &a->h_path,
@@ -5396,7 +5421,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ struct dentry *h_dentry;
+
+ h_dentry = au_h_dptr(cpg->dentry, cpg->bsrc);
-+ if (!au_cpup_sio_test(pin, h_dentry->d_inode->i_mode))
++ if (!au_cpup_sio_test(pin, d_inode(h_dentry)->i_mode))
+ err = au_cpup_single(cpg, dst_parent);
+ else {
+ struct au_cpup_single_args args = {
@@ -5477,9 +5502,9 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ }
+
+ parent = dget_parent(dentry);
-+ h_dir = au_h_iptr(parent->d_inode, cpg->bdst);
++ h_dir = au_h_iptr(d_inode(parent), cpg->bdst);
+ if (!au_test_h_perm_sio(h_dir, MAY_EXEC | MAY_WRITE)
-+ && !au_cpup_sio_test(cpg->pin, dentry->d_inode->i_mode))
++ && !au_cpup_sio_test(cpg->pin, d_inode(dentry)->i_mode))
+ err = au_cpup_simple(cpg);
+ else {
+ struct au_cpup_simple_args args = {
@@ -5510,7 +5535,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ for (bsrc = cpg->bdst + 1; bsrc <= bend; bsrc++) {
+ h_dentry = au_h_dptr(dentry, bsrc);
+ if (h_dentry) {
-+ AuDebugOn(!h_dentry->d_inode);
++ AuDebugOn(d_is_negative(h_dentry));
+ break;
+ }
+ }
@@ -5602,17 +5627,17 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ h_path.dentry = wh_dentry;
+ if (!d_is_dir(wh_dentry)) {
+ /* no delegation since it is just created */
-+ err = vfsub_unlink(h_parent->d_inode, &h_path,
++ err = vfsub_unlink(d_inode(h_parent), &h_path,
+ /*delegated*/NULL, /*force*/0);
+ } else
-+ err = vfsub_rmdir(h_parent->d_inode, &h_path);
++ err = vfsub_rmdir(d_inode(h_parent), &h_path);
+ if (unlikely(err)) {
+ AuIOErr("failed remove copied-up tmp file %pd(%d)\n",
+ wh_dentry, err);
+ err = -EIO;
+ }
+ au_dtime_revert(&dt);
-+ au_set_hi_wh(dentry->d_inode, bdst, wh_dentry);
++ au_set_hi_wh(d_inode(dentry), bdst, wh_dentry);
+
+out_wh:
+ dput(wh_dentry);
@@ -5648,7 +5673,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ dentry = cpg->dentry;
+ bdst = cpg->bdst;
+ parent = dget_parent(dentry);
-+ dir = parent->d_inode;
++ dir = d_inode(parent);
+ h_orph = NULL;
+ h_parent = NULL;
+ h_dir = au_igrab(au_h_iptr(dir, bdst));
@@ -5660,7 +5685,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+
+ h_parent = dget(au_h_dptr(parent, bdst));
+ au_set_h_dptr(parent, bdst, dget(h_orph));
-+ h_tmpdir = h_orph->d_inode;
++ h_tmpdir = d_inode(h_orph);
+ au_set_h_iptr(dir, bdst, au_igrab(h_tmpdir), /*flags*/0);
+
+ mutex_lock_nested(&h_tmpdir->i_mutex, AuLsc_I_PARENT3);
@@ -5673,7 +5698,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ }
+
+ if (!au_test_h_perm_sio(h_tmpdir, MAY_EXEC | MAY_WRITE)
-+ && !au_cpup_sio_test(cpg->pin, dentry->d_inode->i_mode))
++ && !au_cpup_sio_test(cpg->pin, d_inode(dentry)->i_mode))
+ err = au_cpup_wh(cpg, file);
+ else {
+ struct au_cpup_wh_args args = {
@@ -5714,7 +5739,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+{
+ int err;
+ struct au_pin pin;
-+ struct dentry *d, *parent, *h_parent, *real_parent;
++ struct dentry *d, *parent, *h_parent, *real_parent, *h_dentry;
+
+ err = 0;
+ parent = dget_parent(dentry);
@@ -5747,8 +5772,9 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ di_write_lock_child3(d);
+
+ /* somebody else might create while we were sleeping */
-+ if (!au_h_dptr(d, bdst) || !au_h_dptr(d, bdst)->d_inode) {
-+ if (au_h_dptr(d, bdst))
++ h_dentry = au_h_dptr(d, bdst);
++ if (!h_dentry || d_is_negative(h_dentry)) {
++ if (h_dentry)
+ au_update_dbstart(d);
+
+ au_pin_set_dentry(&pin, d);
@@ -5798,7 +5824,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+ struct inode *dir;
+
+ parent = dget_parent(dentry);
-+ dir = parent->d_inode;
++ dir = d_inode(parent);
+ err = 0;
+ if (au_h_iptr(dir, bdst))
+ goto out;
@@ -5816,7 +5842,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
+}
diff -urN /usr/share/empty/fs/aufs/cpup.h linux/fs/aufs/cpup.h
--- /usr/share/empty/fs/aufs/cpup.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/cpup.h 2015-06-22 08:27:37.874168290 +0200
++++ linux/fs/aufs/cpup.h 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -5914,7 +5940,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.h linux/fs/aufs/cpup.h
+#endif /* __AUFS_CPUP_H__ */
diff -urN /usr/share/empty/fs/aufs/dbgaufs.c linux/fs/aufs/dbgaufs.c
--- /usr/share/empty/fs/aufs/dbgaufs.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dbgaufs.c 2015-06-22 08:29:23.706757681 +0200
++++ linux/fs/aufs/dbgaufs.c 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,432 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -6350,7 +6376,7 @@ diff -urN /usr/share/empty/fs/aufs/dbgaufs.c linux/fs/aufs/dbgaufs.c
+}
diff -urN /usr/share/empty/fs/aufs/dbgaufs.h linux/fs/aufs/dbgaufs.h
--- /usr/share/empty/fs/aufs/dbgaufs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dbgaufs.h 2015-06-22 08:27:37.874168290 +0200
++++ linux/fs/aufs/dbgaufs.h 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -6402,7 +6428,7 @@ diff -urN /usr/share/empty/fs/aufs/dbgaufs.h linux/fs/aufs/dbgaufs.h
+#endif /* __DBGAUFS_H__ */
diff -urN /usr/share/empty/fs/aufs/dcsub.c linux/fs/aufs/dcsub.c
--- /usr/share/empty/fs/aufs/dcsub.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dcsub.c 2015-06-22 08:27:37.877501704 +0200
++++ linux/fs/aufs/dcsub.c 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -6630,8 +6656,8 @@ diff -urN /usr/share/empty/fs/aufs/dcsub.c linux/fs/aufs/dcsub.c
+}
diff -urN /usr/share/empty/fs/aufs/dcsub.h linux/fs/aufs/dcsub.h
--- /usr/share/empty/fs/aufs/dcsub.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dcsub.h 2015-06-22 08:29:23.706757681 +0200
-@@ -0,0 +1,132 @@
++++ linux/fs/aufs/dcsub.h 2015-06-28 17:36:09.025073697 +0200
+@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -6695,10 +6721,12 @@ diff -urN /usr/share/empty/fs/aufs/dcsub.h linux/fs/aufs/dcsub.h
+static inline int au_d_hashed_positive(struct dentry *d)
+{
+ int err;
-+ struct inode *inode = d->d_inode;
++ struct inode *inode = d_inode(d);
+
+ err = 0;
-+ if (unlikely(d_unhashed(d) || !inode || !inode->i_nlink))
++ if (unlikely(d_unhashed(d)
++ || d_is_negative(d)
++ || !inode->i_nlink))
+ err = -ENOENT;
+ return err;
+}
@@ -6706,11 +6734,11 @@ diff -urN /usr/share/empty/fs/aufs/dcsub.h linux/fs/aufs/dcsub.h
+static inline int au_d_linkable(struct dentry *d)
+{
+ int err;
-+ struct inode *inode = d->d_inode;
++ struct inode *inode = d_inode(d);
+
+ err = au_d_hashed_positive(d);
+ if (err
-+ && inode
++ && d_is_positive(d)
+ && (inode->i_state & I_LINKABLE))
+ err = 0;
+ return err;
@@ -6725,8 +6753,10 @@ diff -urN /usr/share/empty/fs/aufs/dcsub.h linux/fs/aufs/dcsub.h
+ if (!IS_ROOT(d))
+ err = au_d_hashed_positive(d);
+ else {
-+ inode = d->d_inode;
-+ if (unlikely(d_unlinked(d) || !inode || !inode->i_nlink))
++ inode = d_inode(d);
++ if (unlikely(d_unlinked(d)
++ || d_is_negative(d)
++ || !inode->i_nlink))
+ err = -ENOENT;
+ }
+ return err;
@@ -6737,7 +6767,7 @@ diff -urN /usr/share/empty/fs/aufs/dcsub.h linux/fs/aufs/dcsub.h
+ int err;
+
+ err = au_d_alive(d);
-+ if (unlikely(err || IS_DEADDIR(d->d_inode)))
++ if (unlikely(err || IS_DEADDIR(d_inode(d))))
+ err = -ENOENT;
+ return err;
+}
@@ -6766,8 +6796,8 @@ diff -urN /usr/share/empty/fs/aufs/dcsub.h linux/fs/aufs/dcsub.h
+#endif /* __AUFS_DCSUB_H__ */
diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
--- /usr/share/empty/fs/aufs/debug.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/debug.c 2015-06-22 08:29:23.706757681 +0200
-@@ -0,0 +1,438 @@
++++ linux/fs/aufs/debug.c 2015-06-28 17:36:09.025073697 +0200
+@@ -0,0 +1,440 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -6961,14 +6991,16 @@ diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
+ au_dcount(dentry), dentry->d_flags,
+ d_unhashed(dentry) ? "un" : "");
+ hn = -1;
-+ if (bindex >= 0 && dentry->d_inode && au_test_aufs(dentry->d_sb)) {
-+ iinfo = au_ii(dentry->d_inode);
++ if (bindex >= 0
++ && d_is_positive(dentry)
++ && au_test_aufs(dentry->d_sb)) {
++ iinfo = au_ii(d_inode(dentry));
+ if (iinfo) {
+ hn = !!au_hn(iinfo->ii_hinode + bindex);
+ wh = iinfo->ii_hinode[0 + bindex].hi_whdentry;
+ }
+ }
-+ do_pri_inode(bindex, dentry->d_inode, hn, wh);
++ do_pri_inode(bindex, d_inode(dentry), hn, wh);
+ return 0;
+}
+
@@ -7123,7 +7155,7 @@ diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
+
+void __au_dbg_verify_dinode(struct dentry *dentry, const char *func, int line)
+{
-+ struct inode *h_inode, *inode = dentry->d_inode;
++ struct inode *h_inode, *inode = d_inode(dentry);
+ struct dentry *h_dentry;
+ aufs_bindex_t bindex, bend, bi;
+
@@ -7144,7 +7176,7 @@ diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
+ if (!h_dentry)
+ continue;
+ h_inode = au_h_iptr(inode, bindex);
-+ if (unlikely(h_inode != h_dentry->d_inode)) {
++ if (unlikely(h_inode != d_inode(h_dentry))) {
+ au_debug_on();
+ AuDbg("b%d, %s:%d\n", bindex, func, line);
+ AuDbgDentry(dentry);
@@ -7208,8 +7240,8 @@ diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
+}
diff -urN /usr/share/empty/fs/aufs/debug.h linux/fs/aufs/debug.h
--- /usr/share/empty/fs/aufs/debug.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/debug.h 2015-06-22 08:27:37.877501704 +0200
-@@ -0,0 +1,228 @@
++++ linux/fs/aufs/debug.h 2015-06-28 17:35:44.348050491 +0200
+@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -7398,9 +7430,6 @@ diff -urN /usr/share/empty/fs/aufs/debug.h linux/fs/aufs/debug.h
+} while (0)
+#else
+AuStubVoid(au_dbg_verify_dinode, struct dentry *dentry)
-+AuStubVoid(au_dbg_verify_dir_parent, struct dentry *dentry, unsigned int sigen)
-+AuStubVoid(au_dbg_verify_nondir_parent, struct dentry *dentry,
-+ unsigned int sigen)
+AuStubVoid(au_dbg_verify_gen, struct dentry *parent, unsigned int sigen)
+AuStubVoid(au_dbg_verify_kthread, void)
+AuStubInt0(__init au_debug_init, void)
@@ -7440,8 +7469,8 @@ diff -urN /usr/share/empty/fs/aufs/debug.h linux/fs/aufs/debug.h
+#endif /* __AUFS_DEBUG_H__ */
diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
--- /usr/share/empty/fs/aufs/dentry.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dentry.c 2015-06-22 08:27:37.877501704 +0200
-@@ -0,0 +1,1097 @@
++++ linux/fs/aufs/dentry.c 2015-06-28 17:36:09.025073697 +0200
+@@ -0,0 +1,1105 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -7526,8 +7555,8 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+ goto out;
+ }
+
-+ h_inode = h_dentry->d_inode;
-+ if (!h_inode) {
++ h_inode = d_inode(h_dentry);
++ if (d_is_negative(h_dentry)) {
+ if (!allow_neg)
+ goto out_neg;
+ } else if (wh_found
@@ -7542,7 +7571,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+
+ if (!d_is_dir(h_dentry)
+ || !wh_able
-+ || (d_is_positive(dentry) && !d_is_dir(dentry)))
++ || (d_really_is_positive(dentry) && !d_is_dir(dentry)))
+ goto out; /* success */
+
+ mutex_lock_nested(&h_inode->i_mutex, AuLsc_I_CHILD);
@@ -7588,7 +7617,6 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+ };
+ const struct qstr *name = &dentry->d_name;
+ struct dentry *parent;
-+ struct inode *inode;
+ struct super_block *sb;
+
+ sb = dentry->d_sb;
@@ -7600,7 +7628,6 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+ if (unlikely(err))
+ goto out;
+
-+ inode = dentry->d_inode;
+ isdir = !!d_is_dir(dentry);
+ if (!type)
+ au_fset_lkup(args.flags, ALLOW_NEG);
@@ -7615,7 +7642,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+
+ h_dentry = au_h_dptr(dentry, bindex);
+ if (h_dentry) {
-+ if (h_dentry->d_inode)
++ if (d_is_positive(h_dentry))
+ npositive++;
+ if (type != S_IFDIR)
+ break;
@@ -7625,7 +7652,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+ if (!h_parent || !d_is_dir(h_parent))
+ continue;
+
-+ h_dir = h_parent->d_inode;
++ h_dir = d_inode(h_parent);
+ mutex_lock_nested(&h_dir->i_mutex, AuLsc_I_PARENT);
+ h_dentry = au_do_lookup(h_parent, dentry, bindex, &whname,
+ &args);
@@ -7642,9 +7669,9 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+ break;
+ if (!h_dentry)
+ continue;
-+ h_inode = h_dentry->d_inode;
-+ if (!h_inode)
++ if (d_is_negative(h_dentry))
+ continue;
++ h_inode = d_inode(h_dentry);
+ npositive++;
+ if (!args.type)
+ args.type = h_inode->i_mode & S_IFMT;
@@ -7682,7 +7709,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+ struct dentry *dentry;
+ int wkq_err;
+
-+ if (!au_test_h_perm_sio(parent->d_inode, MAY_EXEC))
++ if (!au_test_h_perm_sio(d_inode(parent), MAY_EXEC))
+ dentry = vfsub_lkup_one(name, parent);
+ else {
+ struct vfsub_lkup_one_args args = {
@@ -7718,7 +7745,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+ err = PTR_ERR(h_dentry);
+ if (IS_ERR(h_dentry))
+ goto out;
-+ if (unlikely(h_dentry->d_inode)) {
++ if (unlikely(d_is_positive(h_dentry))) {
+ err = -EIO;
+ AuIOErr("%pd should be negative on b%d.\n", h_dentry, bindex);
+ dput(h_dentry);
@@ -7793,10 +7820,11 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+ err = 0;
+ memset(&ia, -1, sizeof(ia));
+ h_sb = h_dentry->d_sb;
-+ h_inode = h_dentry->d_inode;
-+ if (h_inode)
++ h_inode = NULL;
++ if (d_is_positive(h_dentry)) {
++ h_inode = d_inode(h_dentry);
+ au_iattr_save(&ia, h_inode);
-+ else if (au_test_nfs(h_sb) || au_test_fuse(h_sb))
++ } else if (au_test_nfs(h_sb) || au_test_fuse(h_sb))
+ /* nfs d_revalidate may return 0 for negative dentry */
+ /* fuse d_revalidate always return 0 for negative dentry */
+ goto out;
@@ -7809,7 +7837,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+
+ err = 0;
+ if (unlikely(h_d != h_dentry
-+ || h_d->d_inode != h_inode
++ || d_inode(h_d) != h_inode
+ || (h_inode && au_iattr_test(&ia, h_inode))))
+ err = au_busy_or_stale();
+ dput(h_d);
@@ -7828,7 +7856,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+ if (udba == AuOpt_UDBA_REVAL
+ && !au_test_fs_remote(h_dentry->d_sb)) {
+ IMustLock(h_dir);
-+ err = (h_dentry->d_parent->d_inode != h_dir);
++ err = (d_inode(h_dentry->d_parent) != h_dir);
+ } else if (udba != AuOpt_UDBA_NONE)
+ err = au_h_verify_dentry(h_dentry, h_parent, br);
+
@@ -7920,9 +7948,9 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+{
+ struct inode *inode;
+
-+ inode = dentry->d_inode;
-+ if (inode) {
-+ if (!S_ISDIR(inode->i_mode)) {
++ if (d_really_is_positive(dentry)) {
++ inode = d_inode(dentry);
++ if (!d_is_dir(dentry)) {
+ if (inode->i_nlink && !d_unhashed(dentry))
+ drop_nlink(inode);
+ } else {
@@ -8019,20 +8047,26 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+
+ err = 0;
+ AuDebugOn(dinfo->di_bstart < 0);
-+ orig_h.dentry = dinfo->di_hdentry[dinfo->di_bstart].hd_dentry;
-+ orig_h.inode = orig_h.dentry->d_inode;
+ orig_h.mode = 0;
-+ if (orig_h.inode)
++ orig_h.dentry = dinfo->di_hdentry[dinfo->di_bstart].hd_dentry;
++ orig_h.inode = NULL;
++ if (d_is_positive(orig_h.dentry)) {
++ orig_h.inode = d_inode(orig_h.dentry);
+ orig_h.mode = orig_h.inode->i_mode & S_IFMT;
++ }
+ memset(&tmp_h, 0, sizeof(tmp_h));
+ if (tmp->di_bstart >= 0) {
+ tmp_h.dentry = tmp->di_hdentry[tmp->di_bstart].hd_dentry;
-+ tmp_h.inode = tmp_h.dentry->d_inode;
-+ if (tmp_h.inode)
++ tmp_h.inode = NULL;
++ if (d_is_positive(tmp_h.dentry)) {
++ tmp_h.inode = d_inode(tmp_h.dentry);
+ tmp_h.mode = tmp_h.inode->i_mode & S_IFMT;
++ }
+ }
+
-+ inode = dentry->d_inode;
++ inode = NULL;
++ if (d_really_is_positive(dentry))
++ inode = d_inode(dentry);
+ if (!orig_h.inode) {
+ AuDbg("nagative originally\n");
+ if (inode) {
@@ -8112,8 +8146,8 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+ h_dentry = hd[bindex].hd_dentry;
+ if (!h_dentry)
+ continue;
-+ h_inode = h_dentry->d_inode;
-+ AuDebugOn(!h_inode);
++ AuDebugOn(d_is_negative(h_dentry));
++ h_inode = d_inode(h_dentry);
+ AuDebugOn(orig_h.mode
+ != (h_inode->i_mode
+ & S_IFMT));
@@ -8147,10 +8181,9 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+
+ DiMustWriteLock(dentry);
+ AuDebugOn(IS_ROOT(dentry));
-+ AuDebugOn(!parent->d_inode);
++ AuDebugOn(d_really_is_negative(parent));
+
+ sb = dentry->d_sb;
-+ inode = dentry->d_inode;
+ sigen = au_sigen(sb);
+ err = au_digen_test(parent, sigen);
+ if (unlikely(err))
@@ -8166,8 +8199,10 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+
+ if (d_unhashed(dentry) || ebrange /* || dinfo->di_tmpfile */) {
+ AuDebugOn(au_dbstart(dentry) < 0 && au_dbend(dentry) >= 0);
-+ if (inode)
++ if (d_really_is_positive(dentry)) {
++ inode = d_inode(dentry);
+ err = au_refresh_hinode_self(inode);
++ }
+ au_dbg_verify_dinode(dentry);
+ if (!err)
+ goto out_dgen; /* success */
@@ -8324,10 +8359,12 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+ continue;
+
+ /* UDBA tests */
-+ h_inode = h_dentry->d_inode;
-+ if (unlikely(!!inode != !!h_inode))
++ if (unlikely(!!inode != d_is_positive(h_dentry)))
+ goto err;
+
++ h_inode = NULL;
++ if (d_is_positive(h_dentry))
++ h_inode = d_inode(h_dentry);
+ h_plus = plus;
+ h_mode = mode;
+ h_cached_inode = h_inode;
@@ -8386,7 +8423,6 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+{
+ int err;
+ struct dentry *d, *parent;
-+ struct inode *inode;
+
+ if (!au_ftest_si(au_sbi(dentry->d_sb), FAILED_REFRESH_DIR))
+ return simple_reval_dpath(dentry, sigen);
@@ -8405,7 +8441,6 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+ d = parent;
+ }
+
-+ inode = d->d_inode;
+ if (d != dentry)
+ di_write_lock_child2(d);
+
@@ -8462,7 +8497,9 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+ AuTraceErr(err);
+ goto out;
+ }
-+ inode = dentry->d_inode;
++ inode = NULL;
++ if (d_really_is_positive(dentry))
++ inode = d_inode(dentry);
+ if (unlikely(inode && is_bad_inode(inode))) {
+ err = -EINVAL;
+ AuTraceErr(err);
@@ -8541,7 +8578,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
+};
diff -urN /usr/share/empty/fs/aufs/dentry.h linux/fs/aufs/dentry.h
--- /usr/share/empty/fs/aufs/dentry.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dentry.h 2015-06-22 08:27:37.877501704 +0200
++++ linux/fs/aufs/dentry.h 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -8778,8 +8815,8 @@ diff -urN /usr/share/empty/fs/aufs/dentry.h linux/fs/aufs/dentry.h
+#endif /* __AUFS_DENTRY_H__ */
diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
--- /usr/share/empty/fs/aufs/dinfo.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dinfo.c 2015-06-22 08:27:37.877501704 +0200
-@@ -0,0 +1,544 @@
++++ linux/fs/aufs/dinfo.c 2015-06-28 17:36:09.025073697 +0200
+@@ -0,0 +1,550 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -9002,24 +9039,30 @@ diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
+
+void di_read_lock(struct dentry *d, int flags, unsigned int lsc)
+{
++ struct inode *inode;
++
+ au_rw_read_lock_nested(&au_di(d)->di_rwsem, lsc);
-+ if (d->d_inode) {
++ if (d_really_is_positive(d)) {
++ inode = d_inode(d);
+ if (au_ftest_lock(flags, IW))
-+ do_ii_write_lock(d->d_inode, lsc);
++ do_ii_write_lock(inode, lsc);
+ else if (au_ftest_lock(flags, IR))
-+ do_ii_read_lock(d->d_inode, lsc);
++ do_ii_read_lock(inode, lsc);
+ }
+}
+
+void di_read_unlock(struct dentry *d, int flags)
+{
-+ if (d->d_inode) {
++ struct inode *inode;
++
++ if (d_really_is_positive(d)) {
++ inode = d_inode(d);
+ if (au_ftest_lock(flags, IW)) {
+ au_dbg_verify_dinode(d);
-+ ii_write_unlock(d->d_inode);
++ ii_write_unlock(inode);
+ } else if (au_ftest_lock(flags, IR)) {
+ au_dbg_verify_dinode(d);
-+ ii_read_unlock(d->d_inode);
++ ii_read_unlock(inode);
+ }
+ }
+ au_rw_read_unlock(&au_di(d)->di_rwsem);
@@ -9027,30 +9070,30 @@ diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
+
+void di_downgrade_lock(struct dentry *d, int flags)
+{
-+ if (d->d_inode && au_ftest_lock(flags, IR))
-+ ii_downgrade_lock(d->d_inode);
++ if (d_really_is_positive(d) && au_ftest_lock(flags, IR))
++ ii_downgrade_lock(d_inode(d));
+ au_rw_dgrade_lock(&au_di(d)->di_rwsem);
+}
+
+void di_write_lock(struct dentry *d, unsigned int lsc)
+{
+ au_rw_write_lock_nested(&au_di(d)->di_rwsem, lsc);
-+ if (d->d_inode)
-+ do_ii_write_lock(d->d_inode, lsc);
++ if (d_really_is_positive(d))
++ do_ii_write_lock(d_inode(d), lsc);
+}
+
+void di_write_unlock(struct dentry *d)
+{
+ au_dbg_verify_dinode(d);
-+ if (d->d_inode)
-+ ii_write_unlock(d->d_inode);
++ if (d_really_is_positive(d))
++ ii_write_unlock(d_inode(d));
+ au_rw_write_unlock(&au_di(d)->di_rwsem);
+}
+
+void di_write_lock2_child(struct dentry *d1, struct dentry *d2, int isdir)
+{
+ AuDebugOn(d1 == d2
-+ || d1->d_inode == d2->d_inode
++ || d_inode(d1) == d_inode(d2)
+ || d1->d_sb != d2->d_sb);
+
+ if (isdir && au_test_subdir(d1, d2)) {
@@ -9066,7 +9109,7 @@ diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
+void di_write_lock2_parent(struct dentry *d1, struct dentry *d2, int isdir)
+{
+ AuDebugOn(d1 == d2
-+ || d1->d_inode == d2->d_inode
++ || d_inode(d1) == d_inode(d2)
+ || d1->d_sb != d2->d_sb);
+
+ if (isdir && au_test_subdir(d1, d2)) {
@@ -9082,7 +9125,7 @@ diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
+void di_write_unlock2(struct dentry *d1, struct dentry *d2)
+{
+ di_write_unlock(d1);
-+ if (d1->d_inode == d2->d_inode)
++ if (d_inode(d1) == d_inode(d2))
+ au_rw_write_unlock(&au_di(d2)->di_rwsem);
+ else
+ di_write_unlock(d2);
@@ -9114,8 +9157,7 @@ diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
+ struct dentry *h_dentry;
+ struct inode *inode, *h_inode;
+
-+ inode = dentry->d_inode;
-+ AuDebugOn(!inode);
++ AuDebugOn(d_really_is_negative(dentry));
+
+ h_dentry = NULL;
+ if (au_dbstart(dentry) <= bindex
@@ -9126,6 +9168,7 @@ diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
+ goto out; /* success */
+ }
+
++ inode = d_inode(dentry);
+ AuDebugOn(bindex < au_ibstart(inode));
+ AuDebugOn(au_ibend(inode) < bindex);
+ h_inode = au_h_iptr(inode, bindex);
@@ -9225,7 +9268,7 @@ diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
+
+ err = 0;
+ if (unlikely(au_digen(dentry) != sigen
-+ || au_iigen_test(dentry->d_inode, sigen)))
++ || au_iigen_test(d_inode(dentry), sigen)))
+ err = -EIO;
+
+ return err;
@@ -9256,7 +9299,7 @@ diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
+ bend = dinfo->di_bend;
+ for (bindex = dinfo->di_bstart; bindex <= bend; bindex++) {
+ h_d = hdp[0 + bindex].hd_dentry;
-+ if (h_d && !h_d->d_inode)
++ if (h_d && d_is_negative(h_d))
+ au_set_h_dptr(dentry, bindex, NULL);
+ }
+ }
@@ -9288,7 +9331,7 @@ diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
+ h_dentry = au_h_dptr(dentry, bindex);
+ if (!h_dentry)
+ continue;
-+ if (h_dentry->d_inode) {
++ if (d_is_positive(h_dentry)) {
+ au_set_dbstart(dentry, bindex);
+ return;
+ }
@@ -9306,7 +9349,7 @@ diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
+ h_dentry = au_h_dptr(dentry, bindex);
+ if (!h_dentry)
+ continue;
-+ if (h_dentry->d_inode) {
++ if (d_is_positive(h_dentry)) {
+ au_set_dbend(dentry, bindex);
+ return;
+ }
@@ -9326,8 +9369,8 @@ diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
+}
diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
--- /usr/share/empty/fs/aufs/dir.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dir.c 2015-06-22 08:29:23.706757681 +0200
-@@ -0,0 +1,751 @@
++++ linux/fs/aufs/dir.c 2015-06-28 17:36:09.025073697 +0200
+@@ -0,0 +1,753 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -9410,8 +9453,8 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
+ bindex <= bend && sz < KMALLOC_MAX_SIZE;
+ bindex++) {
+ h_dentry = au_h_dptr(dentry, bindex);
-+ if (h_dentry && h_dentry->d_inode)
-+ sz += i_size_read(h_dentry->d_inode);
++ if (h_dentry && d_is_positive(h_dentry))
++ sz += i_size_read(d_inode(h_dentry));
+ }
+ }
+ if (sz < KMALLOC_MAX_SIZE)
@@ -9443,12 +9486,12 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
+ aufs_bindex_t bstart, bindex;
+
+ sb = a->dentry->d_sb;
-+ dir = a->dentry->d_inode;
-+ if (!dir)
++ if (d_really_is_negative(a->dentry))
+ goto out;
-+ /* no dir->i_mutex lock */
+ aufs_read_lock(a->dentry, AuLock_DW | AuLock_DIR); /* noflush */
+
++ /* no dir->i_mutex lock */
++ dir = d_inode(a->dentry);
+ bstart = au_ibstart(dir);
+ bindex = au_br_index(sb, a->brid);
+ if (bindex < bstart)
@@ -9586,7 +9629,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
+
+ err = 0;
+ dentry = file->f_path.dentry;
-+ file->f_version = dentry->d_inode->i_version;
++ file->f_version = d_inode(dentry)->i_version;
+ bindex = au_dbstart(dentry);
+ au_set_fbstart(file, bindex);
+ btail = au_dbtaildir(dentry);
@@ -9710,7 +9753,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
+
+ err = 0;
+ sb = dentry->d_sb;
-+ inode = dentry->d_inode;
++ inode = d_inode(dentry);
+ IMustLock(inode);
+ bend = au_dbend(dentry);
+ for (bindex = au_dbstart(dentry); !err && bindex <= bend; bindex++) {
@@ -9764,12 +9807,14 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
+{
+ int err;
+ struct dentry *dentry;
++ struct inode *inode;
+ struct super_block *sb;
+ struct mutex *mtx;
+
+ err = 0;
+ dentry = file->f_path.dentry;
-+ mtx = &dentry->d_inode->i_mutex;
++ inode = d_inode(dentry);
++ mtx = &inode->i_mutex;
+ mutex_lock(mtx);
+ sb = dentry->d_sb;
+ si_noflush_read_lock(sb);
@@ -9779,7 +9824,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
+ di_write_lock_child(dentry);
+ err = au_do_fsync_dir_no_file(dentry, datasync);
+ }
-+ au_cpup_attr_timesizes(dentry->d_inode);
++ au_cpup_attr_timesizes(inode);
+ di_write_unlock(dentry);
+ if (file)
+ fi_write_unlock(file);
@@ -9801,7 +9846,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
+ AuDbg("%pD, ctx{%pf, %llu}\n", file, ctx->actor, ctx->pos);
+
+ dentry = file->f_path.dentry;
-+ inode = dentry->d_inode;
++ inode = d_inode(dentry);
+ IMustLock(inode);
+
+ sb = dentry->d_sb;
@@ -9957,7 +10002,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
+ struct inode *h_inode;
+
+ h_dentry = au_h_dptr(dentry, arg->bindex);
-+ h_inode = h_dentry->d_inode;
++ h_inode = d_inode(h_dentry);
+ /* todo: i_mode changes anytime? */
+ mutex_lock_nested(&h_inode->i_mutex, AuLsc_I_CHILD);
+ err = au_test_h_perm_sio(h_inode, MAY_EXEC | MAY_READ);
@@ -10022,7 +10067,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
+ struct dentry *h_dentry;
+
+ h_dentry = au_h_dptr(dentry, bindex);
-+ if (h_dentry && h_dentry->d_inode) {
++ if (h_dentry && d_is_positive(h_dentry)) {
+ arg.bindex = bindex;
+ err = test_empty(dentry, &arg);
+ }
@@ -10054,7 +10099,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
+ struct dentry *h_dentry;
+
+ h_dentry = au_h_dptr(dentry, bindex);
-+ if (h_dentry && h_dentry->d_inode) {
++ if (h_dentry && d_is_positive(h_dentry)) {
+ arg.bindex = bindex;
+ err = sio_test_empty(dentry, &arg);
+ }
@@ -10081,7 +10126,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
+};
diff -urN /usr/share/empty/fs/aufs/dir.h linux/fs/aufs/dir.h
--- /usr/share/empty/fs/aufs/dir.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dir.h 2015-06-22 08:27:37.877501704 +0200
++++ linux/fs/aufs/dir.h 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -10216,7 +10261,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.h linux/fs/aufs/dir.h
+#endif /* __AUFS_DIR_H__ */
diff -urN /usr/share/empty/fs/aufs/dynop.c linux/fs/aufs/dynop.c
--- /usr/share/empty/fs/aufs/dynop.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dynop.c 2015-06-22 08:29:23.706757681 +0200
++++ linux/fs/aufs/dynop.c 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,369 @@
+/*
+ * Copyright (C) 2010-2015 Junjiro R. Okajima
@@ -10589,7 +10634,7 @@ diff -urN /usr/share/empty/fs/aufs/dynop.c linux/fs/aufs/dynop.c
+}
diff -urN /usr/share/empty/fs/aufs/dynop.h linux/fs/aufs/dynop.h
--- /usr/share/empty/fs/aufs/dynop.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dynop.h 2015-06-22 08:29:23.706757681 +0200
++++ linux/fs/aufs/dynop.h 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2010-2015 Junjiro R. Okajima
@@ -10667,8 +10712,8 @@ diff -urN /usr/share/empty/fs/aufs/dynop.h linux/fs/aufs/dynop.h
+#endif /* __AUFS_DYNOP_H__ */
diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
--- /usr/share/empty/fs/aufs/export.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/export.c 2015-06-22 08:29:23.706757681 +0200
-@@ -0,0 +1,831 @@
++++ linux/fs/aufs/export.c 2015-06-28 17:36:09.025073697 +0200
+@@ -0,0 +1,832 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -10917,7 +10962,7 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
+ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) {
+ spin_lock(&d->d_lock);
+ if (!au_test_anon(d)
-+ && d->d_parent->d_inode->i_ino == dir_ino) {
++ && d_inode(d->d_parent)->i_ino == dir_ino) {
+ dentry = dget_dlock(d);
+ spin_unlock(&d->d_lock);
+ break;
@@ -11076,7 +11121,7 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
+ goto out_name;
+
+ /* do not call vfsub_lkup_one() */
-+ dir = parent->d_inode;
++ dir = d_inode(parent);
+ mutex_lock(&dir->i_mutex);
+ dentry = vfsub_lookup_one_len(arg.name, parent, arg.namelen);
+ mutex_unlock(&dir->i_mutex);
@@ -11084,7 +11129,7 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
+ if (IS_ERR(dentry))
+ goto out_name;
+ AuDebugOn(au_test_anon(dentry));
-+ if (unlikely(!dentry->d_inode)) {
++ if (unlikely(d_really_is_negative(dentry))) {
+ dput(dentry);
+ dentry = ERR_PTR(-ENOENT);
+ }
@@ -11225,10 +11270,10 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
+
+ dentry = ERR_PTR(-ENOENT);
+ AuDebugOn(au_test_anon(path.dentry));
-+ if (unlikely(!path.dentry->d_inode))
++ if (unlikely(d_really_is_negative(path.dentry)))
+ goto out_path;
+
-+ if (ino != path.dentry->d_inode->i_ino)
++ if (ino != d_inode(path.dentry)->i_ino)
+ dentry = au_lkup_by_ino(&path, ino, /*nsi_lock*/NULL);
+ else
+ dentry = dget(path.dentry);
@@ -11309,7 +11354,7 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
+
+accept:
+ if (!au_digen_test(dentry, au_sigen(sb))
-+ && dentry->d_inode->i_generation == fh[Fh_igen])
++ && d_inode(dentry)->i_generation == fh[Fh_igen])
+ goto out_unlock; /* success */
+
+ dput(dentry);
@@ -11393,7 +11438,8 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
+ dput(dentry);
+ if (unlikely(!parent))
+ goto out_unlock;
-+ dir = parent->d_inode;
++ if (d_really_is_positive(parent))
++ dir = d_inode(parent);
+ }
+
+ ii_read_lock_parent(dir);
@@ -11502,7 +11548,7 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
+}
diff -urN /usr/share/empty/fs/aufs/fhsm.c linux/fs/aufs/fhsm.c
--- /usr/share/empty/fs/aufs/fhsm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/fhsm.c 2015-06-22 08:27:37.880835119 +0200
++++ linux/fs/aufs/fhsm.c 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,426 @@
+/*
+ * Copyright (C) 2011-2015 Junjiro R. Okajima
@@ -11932,8 +11978,8 @@ diff -urN /usr/share/empty/fs/aufs/fhsm.c linux/fs/aufs/fhsm.c
+}
diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
--- /usr/share/empty/fs/aufs/file.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/file.c 2015-06-22 08:29:23.706757681 +0200
-@@ -0,0 +1,844 @@
++++ linux/fs/aufs/file.c 2015-06-28 17:36:09.025073697 +0200
+@@ -0,0 +1,841 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -11984,15 +12030,12 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
+ /* a race condition can happen between open and unlink/rmdir */
+ h_file = ERR_PTR(-ENOENT);
+ h_dentry = au_h_dptr(dentry, bindex);
-+ if (au_test_nfsd() && !h_dentry)
-+ goto out;
-+ h_inode = h_dentry->d_inode;
-+ if (au_test_nfsd() && !h_inode)
++ if (au_test_nfsd() && (!h_dentry || d_is_negative(h_dentry)))
+ goto out;
++ h_inode = d_inode(h_dentry);
+ spin_lock(&h_dentry->d_lock);
+ err = (!d_unhashed(dentry) && d_unlinked(h_dentry))
-+ || !h_inode
-+ /* || !dentry->d_inode->i_nlink */
++ /* || !d_inode(dentry)->i_nlink */
+ ;
+ spin_unlock(&h_dentry->d_lock);
+ if (unlikely(err))
@@ -12006,7 +12049,7 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
+ goto out;
+
+ /* drop flags for writing */
-+ if (au_test_ro(sb, bindex, dentry->d_inode)) {
++ if (au_test_ro(sb, bindex, d_inode(dentry))) {
+ if (force_wr && !(flags & O_WRONLY))
+ force_wr = 0;
+ flags = au_file_roflags(flags);
@@ -12069,7 +12112,7 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
+ struct au_hinode *hdir;
+
+ DiMustWriteLock(dentry);
-+ IiMustWriteLock(dentry->d_inode);
++ IiMustWriteLock(d_inode(dentry));
+
+ err = 0;
+ if (IS_ROOT(dentry))
@@ -12132,7 +12175,7 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
+
+ h_path.mnt = au_br_mnt(br);
+ h_path.dentry = au_h_dptr(dentry, cpg.bsrc);
-+ hdir = au_hi(parent->d_inode, cpg.bsrc);
++ hdir = au_hi(d_inode(parent), cpg.bsrc);
+ delegated = NULL;
+ err = vfsub_unlink(hdir->hi_inode, &h_path, &delegated, /*force*/1);
+ au_unpin(&pin);
@@ -12316,13 +12359,13 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
+ };
+
+ au_update_dbstart(cpg.dentry);
-+ inode = cpg.dentry->d_inode;
++ inode = d_inode(cpg.dentry);
+ h_inode = NULL;
+ if (au_dbstart(cpg.dentry) <= bcpup
+ && au_dbend(cpg.dentry) >= bcpup) {
+ h_dentry = au_h_dptr(cpg.dentry, bcpup);
-+ if (h_dentry)
-+ h_inode = h_dentry->d_inode;
++ if (h_dentry && d_is_positive(h_dentry))
++ h_inode = d_inode(h_dentry);
+ }
+ hi_wh = au_hi_wh(inode, bcpup);
+ if (!hi_wh && !h_inode)
@@ -12361,7 +12404,7 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
+ };
+
+ sb = cpg.dentry->d_sb;
-+ inode = cpg.dentry->d_inode;
++ inode = d_inode(cpg.dentry);
+ cpg.bsrc = au_fbstart(file);
+ err = au_test_ro(sb, cpg.bsrc, inode);
+ if (!err && (au_hf_top(file)->f_mode & FMODE_WRITE)) {
@@ -12482,7 +12525,7 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
+ err = 0;
+ finfo = au_fi(file);
+ sb = cpg.dentry->d_sb;
-+ inode = cpg.dentry->d_inode;
++ inode = d_inode(cpg.dentry);
+ cpg.bdst = au_ibstart(inode);
+ if (cpg.bdst == finfo->fi_btop || IS_ROOT(cpg.dentry))
+ goto out;
@@ -12662,7 +12705,7 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
+
+ err = 0;
+ dentry = file->f_path.dentry;
-+ inode = dentry->d_inode;
++ inode = d_inode(dentry);
+ sigen = au_sigen(dentry->d_sb);
+ fi_write_lock(file);
+ figen = au_figen(file);
@@ -12710,8 +12753,8 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
+}
+
+/* it will never be called, but necessary to support O_DIRECT */
-+static ssize_t aufs_direct_IO(int rw, struct kiocb *iocb,
-+ struct iov_iter *iter, loff_t offset)
++static ssize_t aufs_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
++ loff_t offset)
+{ BUG(); return 0; }
+
+/* they will never be called. */
@@ -12780,7 +12823,7 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
+};
diff -urN /usr/share/empty/fs/aufs/file.h linux/fs/aufs/file.h
--- /usr/share/empty/fs/aufs/file.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/file.h 2015-06-22 08:27:37.880835119 +0200
++++ linux/fs/aufs/file.h 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,291 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -13075,7 +13118,7 @@ diff -urN /usr/share/empty/fs/aufs/file.h linux/fs/aufs/file.h
+#endif /* __AUFS_FILE_H__ */
diff -urN /usr/share/empty/fs/aufs/finfo.c linux/fs/aufs/finfo.c
--- /usr/share/empty/fs/aufs/finfo.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/finfo.c 2015-06-22 08:29:23.706757681 +0200
++++ linux/fs/aufs/finfo.c 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -13236,8 +13279,8 @@ diff -urN /usr/share/empty/fs/aufs/finfo.c linux/fs/aufs/finfo.c
+}
diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
--- /usr/share/empty/fs/aufs/f_op.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/f_op.c 2015-06-22 08:29:23.706757681 +0200
-@@ -0,0 +1,748 @@
++++ linux/fs/aufs/f_op.c 2015-06-28 17:36:09.025073697 +0200
+@@ -0,0 +1,738 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -13545,8 +13588,6 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
+ ssize_t err;
+ struct file *file;
+ ssize_t (*iter)(struct kiocb *, struct iov_iter *);
-+ ssize_t (*aio)(struct kiocb *, const struct iovec *, unsigned long,
-+ loff_t);
+
+ err = security_file_permission(h_file, rw);
+ if (unlikely(err))
@@ -13554,14 +13595,10 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
+
+ err = -ENOSYS;
+ iter = NULL;
-+ aio = NULL;
-+ if (rw == MAY_READ) {
++ if (rw == MAY_READ)
+ iter = h_file->f_op->read_iter;
-+ aio = h_file->f_op->aio_read;
-+ } else if (rw == MAY_WRITE) {
++ else if (rw == MAY_WRITE)
+ iter = h_file->f_op->write_iter;
-+ aio = h_file->f_op->aio_write;
-+ }
+
+ file = kio->ki_filp;
+ kio->ki_filp = h_file;
@@ -13569,10 +13606,6 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
+ lockdep_off();
+ err = iter(kio, iov_iter);
+ lockdep_on();
-+ } else if (aio) {
-+ lockdep_off();
-+ err = aio(kio, iov_iter->iov, iov_iter->nr_segs, kio->ki_pos);
-+ lockdep_on();
+ } else
+ /* currently there is no such fs */
+ WARN_ON_ONCE(1);
@@ -13988,7 +14021,7 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
+};
diff -urN /usr/share/empty/fs/aufs/fstype.h linux/fs/aufs/fstype.h
--- /usr/share/empty/fs/aufs/fstype.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/fstype.h 2015-06-22 08:27:37.880835119 +0200
++++ linux/fs/aufs/fstype.h 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,400 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -14392,7 +14425,7 @@ diff -urN /usr/share/empty/fs/aufs/fstype.h linux/fs/aufs/fstype.h
+#endif /* __AUFS_FSTYPE_H__ */
diff -urN /usr/share/empty/fs/aufs/hfsnotify.c linux/fs/aufs/hfsnotify.c
--- /usr/share/empty/fs/aufs/hfsnotify.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/hfsnotify.c 2015-06-22 08:27:37.880835119 +0200
++++ linux/fs/aufs/hfsnotify.c 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,288 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -14684,7 +14717,7 @@ diff -urN /usr/share/empty/fs/aufs/hfsnotify.c linux/fs/aufs/hfsnotify.c
+};
diff -urN /usr/share/empty/fs/aufs/hfsplus.c linux/fs/aufs/hfsplus.c
--- /usr/share/empty/fs/aufs/hfsplus.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/hfsplus.c 2015-06-22 08:29:23.706757681 +0200
++++ linux/fs/aufs/hfsplus.c 2015-06-28 17:36:09.025073697 +0200
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2010-2015 Junjiro R. Okajima
@@ -14723,7 +14756,7 @@ diff -urN /usr/share/empty/fs/aufs/hfsplus.c linux/fs/aufs/hfsplus.c
+
+ h_dentry = au_h_dptr(dentry, bindex);
+ AuDebugOn(!h_dentry);
-+ AuDebugOn(!h_dentry->d_inode);
++ AuDebugOn(d_is_negative(h_dentry));
+
+ h_file = NULL;
+ if (au_test_hfsplus(h_dentry->d_sb)
@@ -14744,8 +14777,8 @@ diff -urN /usr/share/empty/fs/aufs/hfsplus.c linux/fs/aufs/hfsplus.c
+}
diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c
--- /usr/share/empty/fs/aufs/hnotify.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/hnotify.c 2015-06-22 08:29:23.706757681 +0200
-@@ -0,0 +1,714 @@
++++ linux/fs/aufs/hnotify.c 2015-06-28 17:36:09.025073697 +0200
+@@ -0,0 +1,710 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -14919,10 +14952,10 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c
+ continue;
+
+ au_digen_dec(d);
-+ if (d->d_inode)
++ if (d_really_is_positive(d))
+ /* todo: reset children xino?
+ cached children only? */
-+ au_iigen_dec(d->d_inode);
++ au_iigen_dec(d_inode(d));
+ }
+ }
+
@@ -15000,12 +15033,8 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c
+static int hn_gen_by_name(struct dentry *dentry, const unsigned int isdir)
+{
+ int err;
-+ struct inode *inode;
+
-+ inode = dentry->d_inode;
-+ if (IS_ROOT(dentry)
-+ /* || (inode && inode->i_ino == AUFS_ROOT_INO) */
-+ ) {
++ if (IS_ROOT(dentry)) {
+ pr_warn("branch root dir was changed\n");
+ return 0;
+ }
@@ -15013,11 +15042,11 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c
+ err = 0;
+ if (!isdir) {
+ au_digen_dec(dentry);
-+ if (inode)
-+ au_iigen_dec(inode);
++ if (d_really_is_positive(dentry))
++ au_iigen_dec(d_inode(dentry));
+ } else {
+ au_fset_si(au_sbi(dentry->d_sb), FAILED_REFRESH_DIR);
-+ if (inode)
++ if (d_really_is_positive(dentry))
+ err = hn_gen_tree(dentry);
+ }
+
@@ -15237,8 +15266,8 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c
+ dentry = lookup_wlock_by_name(a->h_child_name, a->h_child_nlen,
+ a->dir);
+ try_iput = 0;
-+ if (dentry)
-+ inode = dentry->d_inode;
++ if (dentry && d_really_is_positive(dentry))
++ inode = d_inode(dentry);
+ if (xino && !inode && h_ino
+ && (au_ftest_hnjob(a->flags[AuHn_CHILD], XINO0)
+ || au_ftest_hnjob(a->flags[AuHn_CHILD], TRYXINO0)
@@ -15462,7 +15491,7 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c
+}
diff -urN /usr/share/empty/fs/aufs/iinfo.c linux/fs/aufs/iinfo.c
--- /usr/share/empty/fs/aufs/iinfo.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/iinfo.c 2015-06-22 08:27:37.884168534 +0200
++++ linux/fs/aufs/iinfo.c 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -15743,8 +15772,8 @@ diff -urN /usr/share/empty/fs/aufs/iinfo.c linux/fs/aufs/iinfo.c
+}
diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
--- /usr/share/empty/fs/aufs/inode.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/inode.c 2015-06-22 08:27:37.884168534 +0200
-@@ -0,0 +1,495 @@
++++ linux/fs/aufs/inode.c 2015-06-28 17:36:09.025073697 +0200
+@@ -0,0 +1,500 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -15881,18 +15910,19 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
+ flags = au_hi_flags(inode, isdir);
+ bend = au_dbend(dentry);
+ for (bindex = au_dbstart(dentry); bindex <= bend; bindex++) {
-+ struct inode *h_i;
++ struct inode *h_i, *h_inode;
+ struct dentry *h_d;
+
+ h_d = au_h_dptr(dentry, bindex);
-+ if (!h_d || !h_d->d_inode)
++ if (!h_d || d_is_negative(h_d))
+ continue;
+
-+ AuDebugOn(mode != (h_d->d_inode->i_mode & S_IFMT));
++ h_inode = d_inode(h_d);
++ AuDebugOn(mode != (h_inode->i_mode & S_IFMT));
+ if (iinfo->ii_bstart <= bindex && bindex <= iinfo->ii_bend) {
+ h_i = au_h_iptr(inode, bindex);
+ if (h_i) {
-+ if (h_i == h_d->d_inode)
++ if (h_i == h_inode)
+ continue;
+ err = -EIO;
+ break;
@@ -15902,7 +15932,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
+ iinfo->ii_bstart = bindex;
+ if (iinfo->ii_bend < bindex)
+ iinfo->ii_bend = bindex;
-+ au_set_h_iptr(inode, bindex, au_igrab(h_d->d_inode), flags);
++ au_set_h_iptr(inode, bindex, au_igrab(h_inode), flags);
+ update = 1;
+ }
+ au_update_ibrange(inode, /*do_put_zero*/0);
@@ -15933,7 +15963,8 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
+ err = 0;
+ isdir = 0;
+ bstart = au_dbstart(dentry);
-+ h_inode = au_h_dptr(dentry, bstart)->d_inode;
++ h_dentry = au_h_dptr(dentry, bstart);
++ h_inode = d_inode(h_dentry);
+ mode = h_inode->i_mode;
+ switch (mode & S_IFMT) {
+ case S_IFREG:
@@ -15982,7 +16013,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
+ h_dentry = au_h_dptr(dentry, bindex);
+ if (h_dentry)
+ au_set_h_iptr(inode, bindex,
-+ au_igrab(h_dentry->d_inode), flags);
++ au_igrab(d_inode(h_dentry)), flags);
+ }
+ au_cpup_attr_all(inode, /*force*/1);
+ /*
@@ -16007,6 +16038,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
+ struct au_iigen iigen;
+ aufs_bindex_t bindex, bend;
+ struct inode *h_inode, *h_dinode;
++ struct dentry *h_dentry;
+
+ /*
+ * before this function, if aufs got any iinfo lock, it must be only
@@ -16019,7 +16051,8 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
+
+ err = 1;
+ ii_write_lock_new_child(inode);
-+ h_dinode = au_h_dptr(dentry, au_dbstart(dentry))->d_inode;
++ h_dentry = au_h_dptr(dentry, au_dbstart(dentry));
++ h_dinode = d_inode(h_dentry);
+ bend = au_ibend(inode);
+ for (bindex = au_ibstart(inode); bindex <= bend; bindex++) {
+ h_inode = au_h_iptr(inode, bindex);
@@ -16081,7 +16114,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
+/* todo: return with unlocked? */
+struct inode *au_new_inode(struct dentry *dentry, int must_new)
+{
-+ struct inode *inode;
++ struct inode *inode, *h_inode;
+ struct dentry *h_dentry;
+ struct super_block *sb;
+ struct mutex *mtx;
@@ -16092,7 +16125,8 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
+ sb = dentry->d_sb;
+ bstart = au_dbstart(dentry);
+ h_dentry = au_h_dptr(dentry, bstart);
-+ h_ino = h_dentry->d_inode->i_ino;
++ h_inode = d_inode(h_dentry);
++ h_ino = h_inode->i_ino;
+
+ /*
+ * stop 'race'-ing between hardlinks under different
@@ -16175,7 +16209,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
+ mutex_lock(mtx);
+ }
+
-+ if (unlikely(au_test_fs_unique_ino(h_dentry->d_inode)))
++ if (unlikely(au_test_fs_unique_ino(h_inode)))
+ AuWarn1("Warning: Un-notified UDBA or repeatedly renamed dir,"
+ " b%d, %s, %pd, hi%lu, i%lu.\n",
+ bstart, au_sbtype(h_dentry->d_sb), dentry,
@@ -16242,7 +16276,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
+}
diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
--- /usr/share/empty/fs/aufs/inode.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/inode.h 2015-06-22 08:27:37.884168534 +0200
++++ linux/fs/aufs/inode.h 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,673 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -16919,7 +16953,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
+#endif /* __AUFS_INODE_H__ */
diff -urN /usr/share/empty/fs/aufs/ioctl.c linux/fs/aufs/ioctl.c
--- /usr/share/empty/fs/aufs/ioctl.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/ioctl.c 2015-06-22 08:29:23.706757681 +0200
++++ linux/fs/aufs/ioctl.c 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -17142,8 +17176,8 @@ diff -urN /usr/share/empty/fs/aufs/ioctl.c linux/fs/aufs/ioctl.c
+#endif
diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
--- /usr/share/empty/fs/aufs/i_op_add.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op_add.c 2015-06-22 08:27:37.880835119 +0200
-@@ -0,0 +1,930 @@
++++ linux/fs/aufs/i_op_add.c 2015-06-28 17:36:09.025073697 +0200
+@@ -0,0 +1,932 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -17186,7 +17220,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
+ bwh = -1;
+ sb = dir->i_sb;
+ if (wh_dentry) {
-+ h_dir = wh_dentry->d_parent->d_inode; /* dir inode is locked */
++ h_dir = d_inode(wh_dentry->d_parent); /* dir inode is locked */
+ IMustLock(h_dir);
+ AuDebugOn(au_h_iptr(dir, bindex) != h_dir);
+ bwh = au_dbwh(dentry);
@@ -17201,7 +17235,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
+ inode = au_new_inode(dentry, /*must_new*/1);
+ if (!IS_ERR(inode)) {
+ d_instantiate(dentry, inode);
-+ dir = dentry->d_parent->d_inode; /* dir inode is locked */
++ dir = d_inode(dentry->d_parent); /* dir inode is locked */
+ IMustLock(dir);
+ au_dir_ts(dir, bindex);
+ dir->i_version++;
@@ -17235,7 +17269,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
+ err = 0;
+ if (unlikely(d_unhashed(dentry)))
+ err = -ENOENT;
-+ if (unlikely(dentry->d_inode))
++ if (unlikely(d_really_is_positive(dentry)))
+ err = -EEXIST;
+ return err;
+}
@@ -17257,15 +17291,17 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
+ goto out;
+
+ h_dentry = au_h_dptr(dentry, bindex);
-+ h_inode = h_dentry->d_inode;
-+ if (!dentry->d_inode) {
++ if (d_really_is_negative(dentry)) {
+ err = -EEXIST;
-+ if (unlikely(h_inode))
++ if (unlikely(d_is_positive(h_dentry)))
+ goto out;
+ } else {
+ /* rename(2) case */
+ err = -EIO;
-+ if (unlikely(!h_inode || !h_inode->i_nlink))
++ if (unlikely(d_is_negative(h_dentry)))
++ goto out;
++ h_inode = d_inode(h_dentry);
++ if (unlikely(!h_inode->i_nlink))
+ goto out;
+
+ h_mode = h_inode->i_mode;
@@ -17460,7 +17496,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
+ err = epilog(dir, bstart, wh_dentry, dentry);
+
+ /* revert */
-+ if (unlikely(created && err && a->h_path.dentry->d_inode)) {
++ if (unlikely(created && err && d_is_positive(a->h_path.dentry))) {
+ /* no delegation since it is just created */
+ rerr = vfsub_unlink(h_dir, &a->h_path, /*delegated*/NULL,
+ /*force*/0);
@@ -17573,7 +17609,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
+ parent = d_find_any_alias(dir);
+ AuDebugOn(!parent);
+ di_write_lock_parent(parent);
-+ if (unlikely(parent->d_inode != dir))
++ if (unlikely(d_inode(parent) != dir))
+ goto out_parent;
+
+ err = au_digen_test(parent, au_sigen(sb));
@@ -17599,7 +17635,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
+ goto out_parent;
+
+ h_parent = au_h_dptr(parent, bindex);
-+ err = inode_permission(h_parent->d_inode, MAY_WRITE | MAY_EXEC);
++ err = inode_permission(d_inode(h_parent), MAY_WRITE | MAY_EXEC);
+ if (unlikely(err))
+ goto out_mnt;
+
@@ -17716,7 +17752,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
+ plink = 0;
+ h_inode = NULL;
+ sb = src_dentry->d_sb;
-+ inode = src_dentry->d_inode;
++ inode = d_inode(src_dentry);
+ if (au_ibstart(inode) <= a->bdst)
+ h_inode = au_h_iptr(inode, a->bdst);
+ if (!h_inode || !h_inode->i_nlink) {
@@ -17730,7 +17766,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
+ au_set_h_dptr(dentry, a->bdst, NULL);
+ AuDbg("temporary d_inode...\n");
+ spin_lock(&dentry->d_lock);
-+ dentry->d_inode = src_dentry->d_inode; /* tmp */
++ dentry->d_inode = d_inode(src_dentry); /* tmp */
+ spin_unlock(&dentry->d_lock);
+ h_file = au_h_open_pre(dentry, a->bsrc, /*force_wr*/0);
+ if (IS_ERR(h_file))
@@ -17769,7 +17805,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
+ if (IS_ERR(h_src_dentry))
+ goto out;
+
-+ if (unlikely(!h_src_dentry->d_inode)) {
++ if (unlikely(d_is_negative(h_src_dentry))) {
+ dput(h_src_dentry);
+ h_src_dentry = NULL;
+ }
@@ -17815,7 +17851,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
+ };
+
+ IMustLock(dir);
-+ inode = src_dentry->d_inode;
++ inode = d_inode(src_dentry);
+ IMustLock(inode);
+
+ err = -ENOMEM;
@@ -17901,7 +17937,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
+ if (!err) {
+ h_src_dentry = au_h_dptr(src_dentry, a->bdst);
+ err = -ENOENT;
-+ if (h_src_dentry && h_src_dentry->d_inode) {
++ if (h_src_dentry && d_is_positive(h_src_dentry)) {
+ delegated = NULL;
+ err = vfsub_link(h_src_dentry,
+ au_pinned_h_dir(&a->pin),
@@ -18017,7 +18053,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
+
+ /* make the dir opaque */
+ diropq = 0;
-+ h_mtx = &h_path.dentry->d_inode->i_mutex;
++ h_mtx = &d_inode(h_path.dentry)->i_mutex;
+ if (wh_dentry
+ || au_opt_test(au_mntflags(sb), ALWAYS_DIROPQ)) {
+ mutex_lock_nested(h_mtx, AuLsc_I_CHILD);
@@ -18076,8 +18112,8 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
+}
diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
--- /usr/share/empty/fs/aufs/i_op.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op.c 2015-06-22 08:29:23.706757681 +0200
-@@ -0,0 +1,1445 @@
++++ linux/fs/aufs/i_op.c 2015-06-28 17:36:09.025073697 +0200
+@@ -0,0 +1,1447 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -18492,7 +18528,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ struct inode *h_dir;
+
+ if (add_entry)
-+ IMustLock(parent->d_inode);
++ IMustLock(d_inode(parent));
+ else
+ di_write_lock_parent(parent);
+
@@ -18507,7 +18543,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ }
+ if (!err && add_entry && !au_ftest_wrdir(add_entry, TMPFILE)) {
+ h_parent = au_h_dptr(parent, bcpup);
-+ h_dir = h_parent->d_inode;
++ h_dir = d_inode(h_parent);
+ mutex_lock_nested(&h_dir->i_mutex, AuLsc_I_PARENT);
+ err = au_lkup_neg(dentry, bcpup, /*wh*/0);
+ /* todo: no unlock here */
@@ -18515,7 +18551,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+
+ AuDbg("bcpup %d\n", bcpup);
+ if (!err) {
-+ if (!dentry->d_inode)
++ if (d_really_is_negative(dentry))
+ au_set_h_dptr(dentry, bstart, NULL);
+ au_update_dbrange(dentry, /*do_put_zero*/0);
+ }
@@ -18566,7 +18602,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ bcpup = err;
+ }
+
-+ if (bcpup < 0 || au_test_ro(sb, bcpup, dentry->d_inode)) {
++ if (bcpup < 0 || au_test_ro(sb, bcpup, d_inode(dentry))) {
+ if (add_entry)
+ err = AuWbrCopyup(sbinfo, dentry);
+ else {
@@ -18583,7 +18619,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ }
+ } else {
+ bcpup = args->force_btgt;
-+ AuDebugOn(au_test_ro(sb, bcpup, dentry->d_inode));
++ AuDebugOn(au_test_ro(sb, bcpup, d_inode(dentry)));
+ }
+
+ AuDbg("bstart %d, bcpup %d\n", bstart, bcpup);
@@ -18594,7 +18630,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ /* copyup the new parent into the branch we process */
+ err = au_wr_dir_cpup(dentry, parent, add_entry, bcpup, bstart);
+ if (err >= 0) {
-+ if (!dentry->d_inode) {
++ if (d_really_is_negative(dentry)) {
+ au_set_h_dptr(dentry, bstart, NULL);
+ au_set_dbstart(dentry, bcpup);
+ au_set_dbend(dentry, bcpup);
@@ -18629,7 +18665,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ au_hn_imtx_lock_nested(p->hdir, p->lsc_hi);
+
+ err = -EBUSY;
-+ if (unlikely(p->hdir->hi_inode != p->h_parent->d_inode))
++ if (unlikely(p->hdir->hi_inode != d_inode(p->h_parent)))
+ goto out;
+
+ err = 0;
@@ -18657,9 +18693,10 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ for (i = 0; !err && i < sizeof(h_d)/sizeof(*h_d); i++) {
+ if (!h_d[i])
+ continue;
-+ h_i = h_d[i]->d_inode;
-+ if (h_i)
++ if (d_is_positive(h_d[i])) {
++ h_i = d_inode(h_d[i]);
+ err = !h_i->i_nlink;
++ }
+ }
+
+out:
@@ -18747,7 +18784,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+
+ h_dir = NULL;
+ p->h_parent = au_h_dptr(p->parent, p->bindex);
-+ p->hdir = au_hi(p->parent->d_inode, p->bindex);
++ p->hdir = au_hi(d_inode(p->parent), p->bindex);
+ if (p->hdir)
+ h_dir = p->hdir->hi_inode;
+
@@ -18834,11 +18871,9 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+int au_reval_for_attr(struct dentry *dentry, unsigned int sigen)
+{
+ int err;
-+ struct inode *inode;
+ struct dentry *parent;
+
+ err = 0;
-+ inode = dentry->d_inode;
+ if (au_digen_test(dentry, sigen)) {
+ parent = dget_parent(dentry);
+ di_read_lock_parent(parent, AuLock_IR);
@@ -18868,7 +18903,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ au_fset_wrdir(wr_dir_args.flags, ISDIR);
+ /* plink or hi_wh() case */
+ bstart = au_dbstart(dentry);
-+ inode = dentry->d_inode;
++ inode = d_inode(dentry);
+ ibstart = au_ibstart(inode);
+ if (bstart != ibstart && !au_test_ro(inode->i_sb, ibstart, inode))
+ wr_dir_args.force_btgt = ibstart;
@@ -18893,8 +18928,8 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ goto out_parent;
+
+ a->h_path.dentry = au_h_dptr(dentry, bstart);
-+ a->h_inode = a->h_path.dentry->d_inode;
+ sz = -1;
++ a->h_inode = d_inode(a->h_path.dentry);
+ if (ia && (ia->ia_valid & ATTR_SIZE)) {
+ mutex_lock_nested(&a->h_inode->i_mutex, AuLsc_I_CHILD);
+ if (ia->ia_size < i_size_read(a->h_inode))
@@ -18948,7 +18983,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ a->h_path.dentry = hi_wh; /* do not dget here */
+
+out_unlock:
-+ a->h_inode = a->h_path.dentry->d_inode;
++ a->h_inode = d_inode(a->h_path.dentry);
+ if (!err)
+ goto out; /* success */
+ au_unpin(&a->pin);
@@ -18971,7 +19006,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ struct file *file;
+ struct au_icpup_args *a;
+
-+ inode = dentry->d_inode;
++ inode = d_inode(dentry);
+ IMustLock(inode);
+
+ err = -ENOMEM;
@@ -19119,7 +19154,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ struct au_icpup_args *a;
+ struct inode *inode, *h_inode;
+
-+ inode = dentry->d_inode;
++ inode = d_inode(dentry);
+ IMustLock(inode);
+
+ err = -ENOMEM;
@@ -19150,7 +19185,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ break;
+ case AU_ACL_SET:
+ err = -EOPNOTSUPP;
-+ h_inode = h_path.dentry->d_inode;
++ h_inode = d_inode(h_path.dentry);
+ if (h_inode->i_op->set_acl)
+ err = h_inode->i_op->set_acl(h_inode,
+ arg->u.acl_set.acl,
@@ -19253,7 +19288,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ } else
+ di_read_lock_child(dentry, AuLock_IR);
+
-+ inode = dentry->d_inode;
++ inode = d_inode(dentry);
+ bindex = au_ibstart(inode);
+ h_path->mnt = au_sbr_mnt(sb, bindex);
+ h_sb = h_path->mnt->mnt_sb;
@@ -19286,7 +19321,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ struct inode *inode;
+ struct super_block *sb;
+
-+ inode = dentry->d_inode;
++ inode = d_inode(dentry);
+ sb = dentry->d_sb;
+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM);
+ if (unlikely(err))
@@ -19298,13 +19333,13 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ /* illegally overlapped or something */
+ goto out_fill; /* pretending success */
+
-+ positive = !!h_path.dentry->d_inode;
++ positive = d_is_positive(h_path.dentry);
+ if (positive)
+ err = vfs_getattr(&h_path, st);
+ if (!err) {
+ if (positive)
+ au_refresh_iattr(inode, st,
-+ h_path.dentry->d_inode->i_nlink);
++ d_inode(h_path.dentry)->i_nlink);
+ goto out_fill; /* success */
+ }
+ AuTraceErr(err);
@@ -19329,10 +19364,12 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ int err;
+ struct super_block *sb;
+ struct dentry *h_dentry;
++ struct inode *inode, *h_inode;
+
+ err = -EINVAL;
+ h_dentry = au_h_dptr(dentry, bindex);
-+ if (unlikely(!h_dentry->d_inode->i_op->readlink))
++ h_inode = d_inode(h_dentry);
++ if (unlikely(!h_inode->i_op->readlink))
+ goto out;
+
+ err = security_inode_readlink(h_dentry);
@@ -19340,11 +19377,12 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+ goto out;
+
+ sb = dentry->d_sb;
-+ if (!au_test_ro(sb, bindex, dentry->d_inode)) {
++ inode = d_inode(dentry);
++ if (!au_test_ro(sb, bindex, inode)) {
+ vfsub_touch_atime(au_sbr_mnt(sb, bindex), h_dentry);
-+ fsstack_copy_attr_atime(dentry->d_inode, h_dentry->d_inode);
++ fsstack_copy_attr_atime(inode, h_inode);
+ }
-+ err = h_dentry->d_inode->i_op->readlink(h_dentry, buf, bufsiz);
++ err = h_inode->i_op->readlink(h_dentry, buf, bufsiz);
+
+out:
+ return err;
@@ -19525,8 +19563,8 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
+};
diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
--- /usr/share/empty/fs/aufs/i_op_del.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op_del.c 2015-06-22 08:27:37.884168534 +0200
-@@ -0,0 +1,506 @@
++++ linux/fs/aufs/i_op_del.c 2015-06-28 17:36:09.025073697 +0200
+@@ -0,0 +1,510 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -19570,7 +19608,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
+ bstart = au_dbstart(dentry);
+ if (*bcpup < 0) {
+ *bcpup = bstart;
-+ if (au_test_ro(sb, bstart, dentry->d_inode)) {
++ if (au_test_ro(sb, bstart, d_inode(dentry))) {
+ err = AuWbrCopyup(au_sbi(sb), dentry);
+ *bcpup = err;
+ if (unlikely(err < 0))
@@ -19578,7 +19616,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
+ }
+ } else
+ AuDebugOn(bstart < *bcpup
-+ || au_test_ro(sb, *bcpup, dentry->d_inode));
++ || au_test_ro(sb, *bcpup, d_inode(dentry)));
+ AuDbg("bcpup %d, bstart %d\n", *bcpup, bstart);
+
+ if (*bcpup != bstart) {
@@ -19622,10 +19660,12 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
+ struct inode *h_inode;
+
+ h_dentry = au_h_dptr(dentry, bindex);
-+ h_inode = h_dentry->d_inode;
-+ if (dentry->d_inode) {
++ if (d_really_is_positive(dentry)) {
+ err = -ENOENT;
-+ if (unlikely(!h_inode || !h_inode->i_nlink))
++ if (unlikely(d_is_negative(h_dentry)))
++ goto out;
++ h_inode = d_inode(h_dentry);
++ if (unlikely(!h_inode->i_nlink))
+ goto out;
+
+ h_mode = h_inode->i_mode;
@@ -19640,7 +19680,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
+ } else {
+ /* rename(2) case */
+ err = -EIO;
-+ if (unlikely(h_inode))
++ if (unlikely(d_is_positive(h_dentry)))
+ goto out;
+ }
+
@@ -19656,7 +19696,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
+ */
+ err = -EACCES;
+ if (unlikely(!au_opt_test(au_mntflags(dentry->d_sb), DIRPERM1)
-+ && au_test_h_perm(h_parent->d_inode,
++ && au_test_h_perm(d_inode(h_parent),
+ MAY_EXEC | MAY_WRITE)))
+ goto out;
+
@@ -19746,6 +19786,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
+ int rmdir_later, err, dirwh;
+ struct dentry *h_dentry;
+ struct super_block *sb;
++ struct inode *inode;
+
+ sb = dentry->d_sb;
+ SiMustAnyLock(sb);
@@ -19755,7 +19796,8 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
+ goto out;
+
+ /* stop monitoring */
-+ au_hn_free(au_hi(dentry->d_inode, bindex));
++ inode = d_inode(dentry);
++ au_hn_free(au_hi(inode, bindex));
+
+ if (!au_test_fs_remote(h_dentry->d_sb)) {
+ dirwh = au_sbi(sb)->si_dirwh;
@@ -19788,7 +19830,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
+{
+ struct inode *inode;
+
-+ inode = dentry->d_inode;
++ inode = d_inode(dentry);
+ d_drop(dentry);
+ inode->i_ctime = dir->i_ctime;
+
@@ -19848,7 +19890,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
+ err = au_d_hashed_positive(dentry);
+ if (unlikely(err))
+ goto out_unlock;
-+ inode = dentry->d_inode;
++ inode = d_inode(dentry);
+ IMustLock(inode);
+ err = -EISDIR;
+ if (unlikely(d_is_dir(dentry)))
@@ -19879,7 +19921,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
+ }
+ } else {
+ /* dir inode is locked */
-+ h_dir = wh_dentry->d_parent->d_inode;
++ h_dir = d_inode(wh_dentry->d_parent);
+ IMustLock(h_dir);
+ err = 0;
+ }
@@ -19892,7 +19934,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
+ if (bindex == bstart) {
+ vfsub_update_h_iattr(&a->h_path, /*did*/NULL);
+ /*ignore*/
-+ inode->i_ctime = a->h_path.dentry->d_inode->i_ctime;
++ inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime;
+ } else
+ /* todo: this timestamp may be reverted later */
+ inode->i_ctime = h_dir->i_ctime;
@@ -19949,7 +19991,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
+ err = au_alive_dir(dentry);
+ if (unlikely(err))
+ goto out_unlock;
-+ inode = dentry->d_inode;
++ inode = d_inode(dentry);
+ IMustLock(inode);
+ err = -ENOTDIR;
+ if (unlikely(!d_is_dir(dentry)))
@@ -19989,7 +20031,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
+ au_hn_free(au_hi(inode, bstart));
+
+ /* dir inode is locked */
-+ IMustLock(wh_dentry->d_parent->d_inode);
++ IMustLock(d_inode(wh_dentry->d_parent));
+ err = 0;
+ }
+
@@ -20035,8 +20077,8 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
+}
diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
--- /usr/share/empty/fs/aufs/i_op_ren.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op_ren.c 2015-06-22 08:27:37.884168534 +0200
-@@ -0,0 +1,1015 @@
++++ linux/fs/aufs/i_op_ren.c 2015-06-28 17:36:09.025073697 +0200
+@@ -0,0 +1,1017 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -20193,7 +20235,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
+ RevertFailure("lkup one %pd", a->dst_dentry);
+ return;
+ }
-+ if (a->h_path.dentry->d_inode) {
++ if (d_is_positive(a->h_path.dentry)) {
+ d_drop(a->h_path.dentry);
+ dput(a->h_path.dentry);
+ return;
@@ -20319,7 +20361,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
+
+ /* prepare workqueue args for asynchronous rmdir */
+ h_d = a->dst_h_dentry;
-+ if (au_ftest_ren(a->flags, ISDIR) && h_d->d_inode) {
++ if (au_ftest_ren(a->flags, ISDIR) && d_is_positive(h_d)) {
+ err = -ENOMEM;
+ a->thargs = au_whtmp_rmdir_alloc(a->src_dentry->d_sb, GFP_NOFS);
+ if (unlikely(!a->thargs))
@@ -20345,7 +20387,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
+ err = PTR_ERR(h_d);
+ if (IS_ERR(h_d))
+ goto out_whsrc;
-+ if (!h_d->d_inode)
++ if (d_is_negative(h_d))
+ dput(h_d);
+ else
+ a->dst_wh_dentry = h_d;
@@ -20365,7 +20407,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
+ a->dst_h_dentry = au_h_dptr(d, a->btgt);
+ }
+
-+ BUG_ON(a->dst_h_dentry->d_inode && a->src_bstart != a->btgt);
++ BUG_ON(d_is_positive(a->dst_h_dentry) && a->src_bstart != a->btgt);
+
+ /* rename by vfs_rename or cpup */
+ d = a->dst_dentry;
@@ -20392,7 +20434,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
+ AuDebugOn(au_dbstart(a->src_dentry) != a->btgt);
+ a->h_path.dentry = au_h_dptr(a->src_dentry, a->btgt);
+ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/
-+ a->src_inode->i_ctime = a->h_path.dentry->d_inode->i_ctime;
++ a->src_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime;
+
+ /* remove whiteout for dentry */
+ if (a->dst_wh_dentry) {
@@ -20565,20 +20607,18 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
+ goto out;
+
+ err = -EIO;
-+ h_inode = a->dst_h_dentry->d_inode;
+ isdir = !!au_ftest_ren(a->flags, ISDIR);
-+ if (!a->dst_dentry->d_inode) {
-+ if (unlikely(h_inode))
-+ goto out;
-+ err = au_may_add(a->dst_dentry, a->btgt, a->dst_h_parent,
-+ isdir);
++ if (d_really_is_negative(a->dst_dentry)) {
++ if (d_is_negative(a->dst_h_dentry))
++ err = au_may_add(a->dst_dentry, a->btgt,
++ a->dst_h_parent, isdir);
+ } else {
-+ if (unlikely(!h_inode || !h_inode->i_nlink))
-+ goto out;
-+ err = au_may_del(a->dst_dentry, a->btgt, a->dst_h_parent,
-+ isdir);
-+ if (unlikely(err))
++ if (unlikely(d_is_negative(a->dst_h_dentry)))
+ goto out;
++ h_inode = d_inode(a->dst_h_dentry);
++ if (h_inode->i_nlink)
++ err = au_may_del(a->dst_dentry, a->btgt,
++ a->dst_h_parent, isdir);
+ }
+
+out:
@@ -20639,16 +20679,16 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
+ a->h_trap = vfsub_lock_rename(a->src_h_parent, a->src_hdir,
+ a->dst_h_parent, a->dst_hdir);
+ udba = au_opt_udba(a->src_dentry->d_sb);
-+ if (unlikely(a->src_hdir->hi_inode != a->src_h_parent->d_inode
-+ || a->dst_hdir->hi_inode != a->dst_h_parent->d_inode))
++ if (unlikely(a->src_hdir->hi_inode != d_inode(a->src_h_parent)
++ || a->dst_hdir->hi_inode != d_inode(a->dst_h_parent)))
+ err = au_busy_or_stale();
+ if (!err && au_dbstart(a->src_dentry) == a->btgt)
+ err = au_h_verify(a->src_h_dentry, udba,
-+ a->src_h_parent->d_inode, a->src_h_parent,
++ d_inode(a->src_h_parent), a->src_h_parent,
+ a->br);
+ if (!err && au_dbstart(a->dst_dentry) == a->btgt)
+ err = au_h_verify(a->dst_h_dentry, udba,
-+ a->dst_h_parent->d_inode, a->dst_h_parent,
++ d_inode(a->dst_h_parent), a->dst_h_parent,
+ a->br);
+ if (!err)
+ goto out; /* success */
@@ -20755,7 +20795,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
+ struct au_branch *br;
+
+ parent = dentry->d_parent;
-+ IMustLock(parent->d_inode); /* dir is locked */
++ IMustLock(d_inode(parent)); /* dir is locked */
+
+ bdiropq = au_dbdiropq(parent);
+ bwh = au_dbwh(dentry);
@@ -20807,7 +20847,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
+
+ a->h_path.dentry = a->src_h_dentry;
+ au_dtime_store(a->src_dt + AuCHILD, a->src_dentry, &a->h_path);
-+ if (a->dst_h_dentry->d_inode) {
++ if (d_is_positive(a->dst_h_dentry)) {
+ au_fset_ren(a->flags, DT_DSTDIR);
+ a->h_path.dentry = a->dst_h_dentry;
+ au_dtime_store(a->dst_dt + AuCHILD, a->dst_dentry, &a->h_path);
@@ -20825,14 +20865,14 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
+
+ if (au_ftest_ren(a->flags, ISDIR) && err != -EIO) {
+ h_d = a->src_dt[AuCHILD].dt_h_path.dentry;
-+ h_mtx = &h_d->d_inode->i_mutex;
++ h_mtx = &d_inode(h_d)->i_mutex;
+ mutex_lock_nested(h_mtx, AuLsc_I_CHILD);
+ au_dtime_revert(a->src_dt + AuCHILD);
+ mutex_unlock(h_mtx);
+
+ if (au_ftest_ren(a->flags, DT_DSTDIR)) {
+ h_d = a->dst_dt[AuCHILD].dt_h_path.dentry;
-+ h_mtx = &h_d->d_inode->i_mutex;
++ h_mtx = &d_inode(h_d)->i_mutex;
+ mutex_lock_nested(h_mtx, AuLsc_I_CHILD);
+ au_dtime_revert(a->dst_dt + AuCHILD);
+ mutex_unlock(h_mtx);
@@ -20861,11 +20901,15 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
+
+ a->src_dir = _src_dir;
+ a->src_dentry = _src_dentry;
-+ a->src_inode = a->src_dentry->d_inode;
++ a->src_inode = NULL;
++ if (d_really_is_positive(a->src_dentry))
++ a->src_inode = d_inode(a->src_dentry);
+ a->src_parent = a->src_dentry->d_parent; /* dir inode is locked */
+ a->dst_dir = _dst_dir;
+ a->dst_dentry = _dst_dentry;
-+ a->dst_inode = a->dst_dentry->d_inode;
++ a->dst_inode = NULL;
++ if (d_really_is_positive(a->dst_dentry))
++ a->dst_inode = d_inode(a->dst_dentry);
+ a->dst_parent = a->dst_dentry->d_parent; /* dir inode is locked */
+ if (a->dst_inode) {
+ IMustLock(a->dst_inode);
@@ -20876,7 +20920,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
+ flags = AuLock_FLUSH | AuLock_NOPLM | AuLock_GEN;
+ if (d_is_dir(a->src_dentry)) {
+ au_fset_ren(a->flags, ISDIR);
-+ if (unlikely(d_is_positive(a->dst_dentry)
++ if (unlikely(d_really_is_positive(a->dst_dentry)
+ && !d_is_dir(a->dst_dentry)))
+ goto out_free;
+ err = aufs_read_and_write_lock2(a->dst_dentry, a->src_dentry,
@@ -20913,7 +20957,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
+ * there may exist a problem somewhere else.
+ */
+ err = -EINVAL;
-+ if (unlikely(a->dst_parent->d_inode == a->src_dentry->d_inode))
++ if (unlikely(d_inode(a->dst_parent) == d_inode(a->src_dentry)))
+ goto out_unlock;
+
+ au_fset_ren(a->flags, ISSAMEDIR); /* temporary */
@@ -21054,7 +21098,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
+}
diff -urN /usr/share/empty/fs/aufs/Kconfig linux/fs/aufs/Kconfig
--- /usr/share/empty/fs/aufs/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/Kconfig 2015-06-22 08:27:37.874168290 +0200
++++ linux/fs/aufs/Kconfig 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,185 @@
+config AUFS_FS
+ tristate "Aufs (Advanced multi layered unification filesystem) support"
@@ -21243,7 +21287,7 @@ diff -urN /usr/share/empty/fs/aufs/Kconfig linux/fs/aufs/Kconfig
+endif
diff -urN /usr/share/empty/fs/aufs/loop.c linux/fs/aufs/loop.c
--- /usr/share/empty/fs/aufs/loop.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/loop.c 2015-06-22 08:29:23.706757681 +0200
++++ linux/fs/aufs/loop.c 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -21392,7 +21436,7 @@ diff -urN /usr/share/empty/fs/aufs/loop.c linux/fs/aufs/loop.c
+}
diff -urN /usr/share/empty/fs/aufs/loop.h linux/fs/aufs/loop.h
--- /usr/share/empty/fs/aufs/loop.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/loop.h 2015-06-22 08:27:37.884168534 +0200
++++ linux/fs/aufs/loop.h 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -21448,7 +21492,7 @@ diff -urN /usr/share/empty/fs/aufs/loop.h linux/fs/aufs/loop.h
+#endif /* __AUFS_LOOP_H__ */
diff -urN /usr/share/empty/fs/aufs/magic.mk linux/fs/aufs/magic.mk
--- /usr/share/empty/fs/aufs/magic.mk 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/magic.mk 2015-06-22 08:27:37.884168534 +0200
++++ linux/fs/aufs/magic.mk 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,30 @@
+
+# defined in ${srctree}/fs/fuse/inode.c
@@ -21482,7 +21526,7 @@ diff -urN /usr/share/empty/fs/aufs/magic.mk linux/fs/aufs/magic.mk
+endif
diff -urN /usr/share/empty/fs/aufs/Makefile linux/fs/aufs/Makefile
--- /usr/share/empty/fs/aufs/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/Makefile 2015-06-22 08:27:37.874168290 +0200
++++ linux/fs/aufs/Makefile 2015-06-28 17:35:44.344717109 +0200
@@ -0,0 +1,44 @@
+
+include ${src}/magic.mk
@@ -21530,7 +21574,7 @@ diff -urN /usr/share/empty/fs/aufs/Makefile linux/fs/aufs/Makefile
+aufs-$(CONFIG_AUFS_MAGIC_SYSRQ) += sysrq.o
diff -urN /usr/share/empty/fs/aufs/module.c linux/fs/aufs/module.c
--- /usr/share/empty/fs/aufs/module.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/module.c 2015-06-22 08:27:37.884168534 +0200
++++ linux/fs/aufs/module.c 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -21744,7 +21788,7 @@ diff -urN /usr/share/empty/fs/aufs/module.c linux/fs/aufs/module.c
+module_exit(aufs_exit);
diff -urN /usr/share/empty/fs/aufs/module.h linux/fs/aufs/module.h
--- /usr/share/empty/fs/aufs/module.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/module.h 2015-06-22 08:27:37.884168534 +0200
++++ linux/fs/aufs/module.h 2015-06-28 17:35:44.348050491 +0200
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -21852,7 +21896,7 @@ diff -urN /usr/share/empty/fs/aufs/module.h linux/fs/aufs/module.h
+#endif /* __AUFS_MODULE_H__ */
diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c
--- /usr/share/empty/fs/aufs/mvdown.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/mvdown.c 2015-06-22 08:27:37.884168534 +0200
++++ linux/fs/aufs/mvdown.c 2015-06-28 17:36:09.025073697 +0200
@@ -0,0 +1,694 @@
+/*
+ * Copyright (C) 2011-2015 Junjiro R. Okajima
@@ -22006,7 +22050,7 @@ diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c
+ AuPin_MNT_WRITE | AuPin_DI_LOCKED);
+ err = au_do_pin(&a->mvd_pin_src);
+ AuTraceErr(err);
-+ a->mvd_h_src_dir = a->mvd_h_src_parent->d_inode;
++ a->mvd_h_src_dir = d_inode(a->mvd_h_src_parent);
+ if (unlikely(err)) {
+ AU_MVD_PR(dmsg, "pin_src failed\n");
+ goto out_dst;
@@ -22020,7 +22064,7 @@ diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c
+ au_opt_udba(a->sb),
+ AuPin_MNT_WRITE | AuPin_DI_LOCKED);
+ AuTraceErr(err);
-+ a->mvd_h_src_dir = a->mvd_h_src_parent->d_inode;
++ a->mvd_h_src_dir = d_inode(a->mvd_h_src_parent);
+ if (unlikely(err)) {
+ AU_MVD_PR(dmsg, "pin_src failed\n");
+ au_pin_hdir_lock(&a->mvd_pin_dst);
@@ -22114,10 +22158,10 @@ diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c
+ }
+
+ err = 0;
-+ if (h_path.dentry->d_inode) {
++ if (d_is_positive(h_path.dentry)) {
+ h_path.mnt = au_br_mnt(br);
+ delegated = NULL;
-+ err = vfsub_unlink(a->mvd_h_dst_parent->d_inode, &h_path,
++ err = vfsub_unlink(d_inode(a->mvd_h_dst_parent), &h_path,
+ &delegated, /*force*/0);
+ if (unlikely(err == -EWOULDBLOCK)) {
+ pr_warn("cannot retry for NFSv4 delegation"
@@ -22499,13 +22543,13 @@ diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c
+ args->mvdown.flags &= ~(AUFS_MVDOWN_ROLOWER_R | AUFS_MVDOWN_ROUPPER_R);
+ args->mvdown.au_errno = 0;
+ args->dentry = dentry;
-+ args->inode = dentry->d_inode;
++ args->inode = d_inode(dentry);
+ args->sb = dentry->d_sb;
+
+ err = -ENOENT;
+ dmsg = !!(args->mvdown.flags & AUFS_MVDOWN_DMSG);
+ args->parent = dget_parent(dentry);
-+ args->dir = args->parent->d_inode;
++ args->dir = d_inode(args->parent);
+ mutex_lock_nested(&args->dir->i_mutex, I_MUTEX_PARENT);
+ dput(args->parent);
+ if (unlikely(args->parent != dentry->d_parent)) {
@@ -22550,8 +22594,8 @@ diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c
+}
diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
--- /usr/share/empty/fs/aufs/opts.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/opts.c 2015-06-22 08:29:23.710091096 +0200
-@@ -0,0 +1,1854 @@
++++ linux/fs/aufs/opts.c 2015-06-28 17:36:09.028407078 +0200
+@@ -0,0 +1,1835 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -22598,7 +22642,6 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
+ Opt_warn_perm, Opt_nowarn_perm,
+ Opt_wbr_copyup, Opt_wbr_create,
+ Opt_fhsm_sec,
-+ Opt_refrof, Opt_norefrof,
+ Opt_verbose, Opt_noverbose,
+ Opt_sum, Opt_nosum, Opt_wsum,
+ Opt_dirperm1, Opt_nodirperm1,
@@ -22682,9 +22725,6 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
+ {Opt_dirperm1, "dirperm1"},
+ {Opt_nodirperm1, "nodirperm1"},
+
-+ {Opt_refrof, "refrof"},
-+ {Opt_norefrof, "norefrof"},
-+
+ {Opt_verbose, "verbose"},
+ {Opt_verbose, "v"},
+ {Opt_noverbose, "noverbose"},
@@ -23250,12 +23290,6 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
+ case Opt_nowarn_perm:
+ AuLabel(nowarn_perm);
+ break;
-+ case Opt_refrof:
-+ AuLabel(refrof);
-+ break;
-+ case Opt_norefrof:
-+ AuLabel(norefrof);
-+ break;
+ case Opt_verbose:
+ AuLabel(verbose);
+ break;
@@ -23742,8 +23776,6 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
+ case Opt_diropq_w:
+ case Opt_warn_perm:
+ case Opt_nowarn_perm:
-+ case Opt_refrof:
-+ case Opt_norefrof:
+ case Opt_verbose:
+ case Opt_noverbose:
+ case Opt_sum:
@@ -23933,13 +23965,6 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
+ au_opt_clr(sbinfo->si_mntflags, WARN_PERM);
+ break;
+
-+ case Opt_refrof:
-+ au_opt_set(sbinfo->si_mntflags, REFROF);
-+ break;
-+ case Opt_norefrof:
-+ au_opt_clr(sbinfo->si_mntflags, REFROF);
-+ break;
-+
+ case Opt_verbose:
+ au_opt_set(sbinfo->si_mntflags, VERBOSE);
+ break;
@@ -24172,7 +24197,7 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
+ err = 0;
+ fhsm = 0;
+ root = sb->s_root;
-+ dir = root->d_inode;
++ dir = d_inode(root);
+ do_plink = !!au_opt_test(sbinfo->si_mntflags, PLINK);
+ bend = au_sbend(sb);
+ for (bindex = 0; !err && bindex <= bend; bindex++) {
@@ -24345,7 +24370,7 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
+ /* go on even if err */
+ }
+ if (au_opt_test(tmp, UDBA_HNOTIFY)) {
-+ dir = sb->s_root->d_inode;
++ dir = d_inode(sb->s_root);
+ au_hn_reset(dir, au_hi_flags(dir, /*isdir*/1) & ~AuHi_XINO);
+ }
+
@@ -24363,7 +24388,7 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
+
+ SiMustWriteLock(sb);
+
-+ dir = sb->s_root->d_inode;
++ dir = d_inode(sb->s_root);
+ sbinfo = au_sbi(sb);
+ err = 0;
+ opt_xino = NULL;
@@ -24408,8 +24433,8 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
+}
diff -urN /usr/share/empty/fs/aufs/opts.h linux/fs/aufs/opts.h
--- /usr/share/empty/fs/aufs/opts.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/opts.h 2015-06-22 08:27:37.887501948 +0200
-@@ -0,0 +1,211 @@
++++ linux/fs/aufs/opts.h 2015-06-28 17:35:44.351383872 +0200
+@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -24454,7 +24479,6 @@ diff -urN /usr/share/empty/fs/aufs/opts.h linux/fs/aufs/opts.h
+#define AuOpt_PLINK (1 << 6) /* pseudo-link */
+#define AuOpt_DIRPERM1 (1 << 7) /* ignore the lower dir's perm
+ bits */
-+#define AuOpt_REFROF (1 << 8) /* unimplemented */
+#define AuOpt_ALWAYS_DIROPQ (1 << 9) /* policy to creating diropq */
+#define AuOpt_SUM (1 << 10) /* summation for statfs(2) */
+#define AuOpt_SUM_W (1 << 11) /* unimplemented */
@@ -24623,8 +24647,8 @@ diff -urN /usr/share/empty/fs/aufs/opts.h linux/fs/aufs/opts.h
+#endif /* __AUFS_OPTS_H__ */
diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
--- /usr/share/empty/fs/aufs/plink.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/plink.c 2015-06-22 08:27:37.887501948 +0200
-@@ -0,0 +1,532 @@
++++ linux/fs/aufs/plink.c 2015-06-28 17:36:09.028407078 +0200
+@@ -0,0 +1,528 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -24829,7 +24853,7 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
+ struct dentry *h_dentry;
+ struct mutex *h_mtx;
+
-+ h_mtx = &h_parent->d_inode->i_mutex;
++ h_mtx = &d_inode(h_parent)->i_mutex;
+ mutex_lock_nested(h_mtx, AuLsc_I_CHILD2);
+ h_dentry = vfsub_lkup_one(tgtname, h_parent);
+ mutex_unlock(h_mtx);
@@ -24847,7 +24871,6 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
+{
+ struct dentry *h_dentry, *h_parent;
+ struct au_branch *br;
-+ struct inode *h_dir;
+ int wkq_err;
+ char a[PLINK_NAME_LEN];
+ struct qstr tgtname = QSTR_INIT(a, 0);
@@ -24856,7 +24879,6 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
+
+ br = au_sbr(inode->i_sb, bindex);
+ h_parent = br->br_wbr->wbr_plink;
-+ h_dir = h_parent->d_inode;
+ tgtname.len = plink_name(a, sizeof(a), inode, bindex);
+
+ if (!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) {
@@ -24886,7 +24908,7 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
+ };
+ struct inode *h_dir, *delegated;
+
-+ h_dir = h_parent->d_inode;
++ h_dir = d_inode(h_parent);
+ mutex_lock_nested(&h_dir->i_mutex, AuLsc_I_CHILD2);
+again:
+ h_path.dentry = vfsub_lkup_one(tgt, h_parent);
@@ -24897,8 +24919,8 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
+ err = 0;
+ /* wh.plink dir is not monitored */
+ /* todo: is it really safe? */
-+ if (h_path.dentry->d_inode
-+ && h_path.dentry->d_inode != h_dentry->d_inode) {
++ if (d_is_positive(h_path.dentry)
++ && d_inode(h_path.dentry) != d_inode(h_dentry)) {
+ delegated = NULL;
+ err = vfsub_unlink(h_dir, &h_path, &delegated, /*force*/0);
+ if (unlikely(err == -EWOULDBLOCK)) {
@@ -24911,7 +24933,7 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
+ if (!err)
+ goto again;
+ }
-+ if (!err && !h_path.dentry->d_inode) {
++ if (!err && d_is_negative(h_path.dentry)) {
+ delegated = NULL;
+ err = vfsub_link(h_dentry, h_dir, &h_path, &delegated);
+ if (unlikely(err == -EWOULDBLOCK)) {
@@ -24947,13 +24969,11 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
+ int err, wkq_err;
+ struct au_wbr *wbr;
+ struct dentry *h_parent;
-+ struct inode *h_dir;
+ char a[PLINK_NAME_LEN];
+ struct qstr tgtname = QSTR_INIT(a, 0);
+
+ wbr = au_sbr(inode->i_sb, bindex)->br_wbr;
+ h_parent = wbr->wbr_plink;
-+ h_dir = h_parent->d_inode;
+ tgtname.len = plink_name(a, sizeof(a), inode, bindex);
+
+ /* always superio. */
@@ -25159,7 +25179,7 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
+}
diff -urN /usr/share/empty/fs/aufs/poll.c linux/fs/aufs/poll.c
--- /usr/share/empty/fs/aufs/poll.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/poll.c 2015-06-22 08:29:23.710091096 +0200
++++ linux/fs/aufs/poll.c 2015-06-28 17:35:44.351383872 +0200
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -25215,7 +25235,7 @@ diff -urN /usr/share/empty/fs/aufs/poll.c linux/fs/aufs/poll.c
+}
diff -urN /usr/share/empty/fs/aufs/posix_acl.c linux/fs/aufs/posix_acl.c
--- /usr/share/empty/fs/aufs/posix_acl.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/posix_acl.c 2015-06-22 08:27:37.887501948 +0200
++++ linux/fs/aufs/posix_acl.c 2015-06-28 17:35:44.351383872 +0200
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2014-2015 Junjiro R. Okajima
@@ -25318,7 +25338,7 @@ diff -urN /usr/share/empty/fs/aufs/posix_acl.c linux/fs/aufs/posix_acl.c
+}
diff -urN /usr/share/empty/fs/aufs/procfs.c linux/fs/aufs/procfs.c
--- /usr/share/empty/fs/aufs/procfs.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/procfs.c 2015-06-22 08:27:37.887501948 +0200
++++ linux/fs/aufs/procfs.c 2015-06-28 17:35:44.351383872 +0200
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2010-2015 Junjiro R. Okajima
@@ -25491,7 +25511,7 @@ diff -urN /usr/share/empty/fs/aufs/procfs.c linux/fs/aufs/procfs.c
+}
diff -urN /usr/share/empty/fs/aufs/rdu.c linux/fs/aufs/rdu.c
--- /usr/share/empty/fs/aufs/rdu.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/rdu.c 2015-06-22 08:29:23.710091096 +0200
++++ linux/fs/aufs/rdu.c 2015-06-28 17:36:09.028407078 +0200
@@ -0,0 +1,388 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -25652,7 +25672,7 @@ diff -urN /usr/share/empty/fs/aufs/rdu.c linux/fs/aufs/rdu.c
+ goto out;
+
+ dentry = file->f_path.dentry;
-+ inode = dentry->d_inode;
++ inode = d_inode(dentry);
+#if 1
+ mutex_lock(&inode->i_mutex);
+#else
@@ -25883,7 +25903,7 @@ diff -urN /usr/share/empty/fs/aufs/rdu.c linux/fs/aufs/rdu.c
+#endif
diff -urN /usr/share/empty/fs/aufs/rwsem.h linux/fs/aufs/rwsem.h
--- /usr/share/empty/fs/aufs/rwsem.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/rwsem.h 2015-06-22 08:27:37.887501948 +0200
++++ linux/fs/aufs/rwsem.h 2015-06-28 17:35:44.351383872 +0200
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -26078,8 +26098,8 @@ diff -urN /usr/share/empty/fs/aufs/rwsem.h linux/fs/aufs/rwsem.h
+#endif /* __AUFS_RWSEM_H__ */
diff -urN /usr/share/empty/fs/aufs/sbinfo.c linux/fs/aufs/sbinfo.c
--- /usr/share/empty/fs/aufs/sbinfo.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sbinfo.c 2015-06-22 08:27:37.887501948 +0200
-@@ -0,0 +1,354 @@
++++ linux/fs/aufs/sbinfo.c 2015-06-28 17:36:09.028407078 +0200
+@@ -0,0 +1,356 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -26245,13 +26265,15 @@ diff -urN /usr/share/empty/fs/aufs/sbinfo.c linux/fs/aufs/sbinfo.c
+unsigned int au_sigen_inc(struct super_block *sb)
+{
+ unsigned int gen;
++ struct inode *inode;
+
+ SiMustWriteLock(sb);
+
+ gen = ++au_sbi(sb)->si_generation;
+ au_update_digen(sb->s_root);
-+ au_update_iigen(sb->s_root->d_inode, /*half*/0);
-+ sb->s_root->d_inode->i_version++;
++ inode = d_inode(sb->s_root);
++ au_update_iigen(inode, /*half*/0);
++ inode->i_version++;
+ return gen;
+}
+
@@ -26436,7 +26458,7 @@ diff -urN /usr/share/empty/fs/aufs/sbinfo.c linux/fs/aufs/sbinfo.c
+}
diff -urN /usr/share/empty/fs/aufs/spl.h linux/fs/aufs/spl.h
--- /usr/share/empty/fs/aufs/spl.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/spl.h 2015-06-22 08:27:37.887501948 +0200
++++ linux/fs/aufs/spl.h 2015-06-28 17:35:44.351383872 +0200
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -26551,8 +26573,8 @@ diff -urN /usr/share/empty/fs/aufs/spl.h linux/fs/aufs/spl.h
+#endif /* __AUFS_SPL_H__ */
diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
--- /usr/share/empty/fs/aufs/super.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/super.c 2015-06-22 08:29:23.710091096 +0200
-@@ -0,0 +1,1007 @@
++++ linux/fs/aufs/super.c 2015-06-28 17:36:09.028407078 +0200
+@@ -0,0 +1,1004 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -26813,7 +26835,6 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
+ AuBool(PLINK, plink);
+ AuBool(DIO, dio);
+ AuBool(DIRPERM1, dirperm1);
-+ /* AuBool(REFROF, refrof); */
+
+ v = sbinfo->si_wbr_create;
+ if (v != AuWbrCreate_Def)
@@ -27128,7 +27149,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
+ di_read_lock_parent(parent, AuLock_IR);
+ err = au_refresh_dentry(dentry, parent);
+ if (!err && dir_flags)
-+ au_hn_reset(dentry->d_inode, dir_flags);
++ au_hn_reset(d_inode(dentry), dir_flags);
+ di_read_unlock(parent, AuLock_IR);
+ di_write_unlock(dentry);
+
@@ -27141,14 +27162,12 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
+{
+ int err;
+ struct dentry *parent;
-+ struct inode *inode;
+
+ err = 0;
+ parent = dget_parent(dentry);
+ if (!au_digen_test(parent, sigen) && au_digen_test(dentry, sigen)) {
-+ inode = dentry->d_inode;
-+ if (inode) {
-+ if (!S_ISDIR(inode->i_mode))
++ if (d_really_is_positive(dentry)) {
++ if (!d_is_dir(dentry))
+ err = au_do_refresh(dentry, /*dir_flags*/0,
+ parent);
+ else {
@@ -27175,7 +27194,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
+ struct dentry **dentries, *d;
+ struct au_sbinfo *sbinfo;
+ struct dentry *root = sb->s_root;
-+ const unsigned int dir_flags = au_hi_flags(root->d_inode, /*isdir*/1);
++ const unsigned int dir_flags = au_hi_flags(d_inode(root), /*isdir*/1);
+
+ err = au_dpages_init(&dpages, GFP_NOFS);
+ if (unlikely(err))
@@ -27256,7 +27275,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
+
+ root = sb->s_root;
+ DiMustNoWaiters(root);
-+ inode = root->d_inode;
++ inode = d_inode(root);
+ IiMustNoWaiters(inode);
+
+ udba = au_opt_udba(sb);
@@ -27336,7 +27355,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
+ goto out_opts;
+
+ sbinfo = au_sbi(sb);
-+ inode = root->d_inode;
++ inode = d_inode(root);
+ mutex_lock(&inode->i_mutex);
+ err = si_write_lock(sb, AuLock_FLUSH | AuLock_NOPLM);
+ if (unlikely(err))
@@ -27462,7 +27481,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
+ goto out_info;
+ }
+ root = sb->s_root;
-+ inode = root->d_inode;
++ inode = d_inode(root);
+
+ /*
+ * actually we can parse options regardless aufs lock here.
@@ -27562,8 +27581,8 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
+};
diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
--- /usr/share/empty/fs/aufs/super.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/super.h 2015-06-22 08:27:37.887501948 +0200
-@@ -0,0 +1,638 @@
++++ linux/fs/aufs/super.h 2015-06-28 17:36:09.028407078 +0200
+@@ -0,0 +1,635 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -27591,14 +27610,11 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
+#ifdef __KERNEL__
+
+#include <linux/fs.h>
++#include <linux/kobject.h>
+#include "rwsem.h"
+#include "spl.h"
+#include "wkq.h"
+
-+typedef ssize_t (*au_readf_t)(struct file *, char __user *, size_t, loff_t *);
-+typedef ssize_t (*au_writef_t)(struct file *, const char __user *, size_t,
-+ loff_t *);
-+
+/* policies to select one among multiple writable branches */
+struct au_wbr_copyup_operations {
+ int (*copyup)(struct dentry *dentry);
@@ -27713,8 +27729,8 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
+ unsigned int si_mntflags;
+
+ /* external inode number (bitmap and translation table) */
-+ au_readf_t si_xread;
-+ au_writef_t si_xwrite;
++ vfs_readf_t si_xread;
++ vfs_writef_t si_xwrite;
+ struct file *si_xib;
+ struct mutex si_xib_mtx; /* protect xib members */
+ unsigned long *si_xib_buf;
@@ -28204,7 +28220,7 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
+#endif /* __AUFS_SUPER_H__ */
diff -urN /usr/share/empty/fs/aufs/sysaufs.c linux/fs/aufs/sysaufs.c
--- /usr/share/empty/fs/aufs/sysaufs.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sysaufs.c 2015-06-22 08:27:37.887501948 +0200
++++ linux/fs/aufs/sysaufs.c 2015-06-28 17:35:44.351383872 +0200
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -28312,7 +28328,7 @@ diff -urN /usr/share/empty/fs/aufs/sysaufs.c linux/fs/aufs/sysaufs.c
+}
diff -urN /usr/share/empty/fs/aufs/sysaufs.h linux/fs/aufs/sysaufs.h
--- /usr/share/empty/fs/aufs/sysaufs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sysaufs.h 2015-06-22 08:27:37.887501948 +0200
++++ linux/fs/aufs/sysaufs.h 2015-06-28 17:35:44.351383872 +0200
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -28417,7 +28433,7 @@ diff -urN /usr/share/empty/fs/aufs/sysaufs.h linux/fs/aufs/sysaufs.h
+#endif /* __SYSAUFS_H__ */
diff -urN /usr/share/empty/fs/aufs/sysfs.c linux/fs/aufs/sysfs.c
--- /usr/share/empty/fs/aufs/sysfs.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sysfs.c 2015-06-22 08:29:23.710091096 +0200
++++ linux/fs/aufs/sysfs.c 2015-06-28 17:35:44.351383872 +0200
@@ -0,0 +1,372 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -28793,7 +28809,7 @@ diff -urN /usr/share/empty/fs/aufs/sysfs.c linux/fs/aufs/sysfs.c
+}
diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
--- /usr/share/empty/fs/aufs/sysrq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sysrq.c 2015-06-22 08:27:37.887501948 +0200
++++ linux/fs/aufs/sysrq.c 2015-06-28 17:36:09.028407078 +0200
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -28845,7 +28861,7 @@ diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
+ pr("root dentry\n");
+ au_dpri_dentry(sb->s_root);
+ pr("root inode\n");
-+ au_dpri_inode(sb->s_root->d_inode);
++ au_dpri_inode(d_inode(sb->s_root));
+#endif
+
+#if 0
@@ -28954,7 +28970,7 @@ diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
+}
diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
--- /usr/share/empty/fs/aufs/vdir.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/vdir.c 2015-06-22 08:29:23.710091096 +0200
++++ linux/fs/aufs/vdir.c 2015-06-28 17:35:44.351383872 +0200
@@ -0,0 +1,888 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -29846,8 +29862,8 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
+}
diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
--- /usr/share/empty/fs/aufs/vfsub.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/vfsub.c 2015-06-22 08:29:23.710091096 +0200
-@@ -0,0 +1,846 @@
++++ linux/fs/aufs/vfsub.c 2015-06-28 17:36:09.028407078 +0200
+@@ -0,0 +1,848 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
@@ -29904,7 +29920,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
+ current_cred());
+ if (!IS_ERR_OR_NULL(file)
+ && (file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ)
-+ i_readcount_inc(path->dentry->d_inode);
++ i_readcount_inc(d_inode(path->dentry));
+
+ return file;
+}
@@ -29982,7 +29998,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
+ int err;
+
+ err = kern_path(name, flags, path);
-+ if (!err && path->dentry->d_inode)
++ if (!err && d_is_positive(path->dentry))
+ vfsub_update_h_iattr(path, /*did*/NULL); /*ignore*/
+ return err;
+}
@@ -29995,12 +30011,12 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
+ };
+
+ /* VFS checks it too, but by WARN_ON_ONCE() */
-+ IMustLock(parent->d_inode);
++ IMustLock(d_inode(parent));
+
+ path.dentry = lookup_one_len(name, parent, len);
+ if (IS_ERR(path.dentry))
+ goto out;
-+ if (path.dentry->d_inode)
++ if (d_is_positive(path.dentry))
+ vfsub_update_h_iattr(&path, /*did*/NULL); /*ignore*/
+
+out:
@@ -30161,7 +30177,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
+
+ IMustLock(dir);
+
-+ err = au_test_nlink(src_dentry->d_inode);
++ err = au_test_nlink(d_inode(src_dentry));
+ if (unlikely(err))
<Skipped 890 lines>
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/kernel.git/commitdiff/5527c038501e84d3608809658ed2ddeb73e78168
More information about the pld-cvs-commit
mailing list