-From d29d73fa5d7b5d016f9c17236fff2a741acea247 Mon Sep 17 00:00:00 2001
+From e37c855a09ba7a8fa69334e9e3c7f5b0f66de896 Mon Sep 17 00:00:00 2001
From: John Johansen <john.johansen@canonical.com>
Date: Mon, 4 Oct 2010 15:03:36 -0700
-Subject: [PATCH 1/3] UBUNTU: SAUCE: AppArmor: basic networking rules
+Subject: UBUNTU: SAUCE: AppArmor: basic networking rules
Base support for network mediation.
Signed-off-by: John Johansen <john.johansen@canonical.com>
-Conflicts:
- security/apparmor/Makefile
- security/apparmor/policy.c
----
- security/apparmor/.gitignore | 1 +
- security/apparmor/Makefile | 42 +++++++++-
- security/apparmor/apparmorfs.c | 1 +
- security/apparmor/include/audit.h | 4 +
- security/apparmor/include/net.h | 44 ++++++++++
- security/apparmor/include/policy.h | 3 +
- security/apparmor/lsm.c | 112 +++++++++++++++++++++++++
- security/apparmor/net.c | 162 +++++++++++++++++++++++++++++++++++++
- security/apparmor/policy.c | 1 +
- security/apparmor/policy_unpack.c | 46 +++++++++++
- 10 files changed, 414 insertions(+), 2 deletions(-)
- create mode 100644 security/apparmor/include/net.h
- create mode 100644 security/apparmor/net.c
-
diff --git a/security/apparmor/.gitignore b/security/apparmor/.gitignore
index 9cdec70..d5b291e 100644
--- a/security/apparmor/.gitignore
+ $(call cmd,make-af)
+ $(call cmd,make-sock)
diff --git a/security/apparmor/apparmorfs.c b/security/apparmor/apparmorfs.c
-index 7db9954..18fc02c 100644
+index ad4fa49..6362c5a 100644
--- a/security/apparmor/apparmorfs.c
+++ b/security/apparmor/apparmorfs.c
@@ -806,6 +806,7 @@ static struct aa_fs_entry aa_fs_entry_features[] = {
AA_FS_DIR("rlimit", aa_fs_entry_rlimit),
AA_FS_DIR("caps", aa_fs_entry_caps),
diff --git a/security/apparmor/include/audit.h b/security/apparmor/include/audit.h
-index 30e8d76..61abec5 100644
+index ba3dfd1..5d3c419 100644
--- a/security/apparmor/include/audit.h
+++ b/security/apparmor/include/audit.h
-@@ -126,6 +126,10 @@ struct apparmor_audit_data {
+@@ -125,6 +125,10 @@ struct apparmor_audit_data {
u32 denied;
kuid_t ouid;
} fs;
unsigned char *hash;
diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
-index fb99e18..de55a7f 100644
+index dec607c..47fd244 100644
--- a/security/apparmor/lsm.c
+++ b/security/apparmor/lsm.c
@@ -32,6 +32,7 @@
#include "include/path.h"
#include "include/policy.h"
#include "include/procattr.h"
-@@ -615,6 +616,104 @@ static int apparmor_task_setrlimit(struct task_struct *task,
+@@ -605,6 +606,104 @@ static int apparmor_task_setrlimit(struct task_struct *task,
return error;
}
+ return aa_revalidate_sk(OP_SOCK_SHUTDOWN, sk);
+}
+
- static struct security_operations apparmor_ops = {
- .name = "apparmor",
-
-@@ -647,6 +746,19 @@ static struct security_operations apparmor_ops = {
- .getprocattr = apparmor_getprocattr,
- .setprocattr = apparmor_setprocattr,
+ static struct security_hook_list apparmor_hooks[] = {
+ LSM_HOOK_INIT(ptrace_access_check, apparmor_ptrace_access_check),
+ LSM_HOOK_INIT(ptrace_traceme, apparmor_ptrace_traceme),
+@@ -634,6 +733,19 @@ static struct security_hook_list apparmor_hooks[] = {
+ LSM_HOOK_INIT(getprocattr, apparmor_getprocattr),
+ LSM_HOOK_INIT(setprocattr, apparmor_setprocattr),
-+ .socket_create = apparmor_socket_create,
-+ .socket_bind = apparmor_socket_bind,
-+ .socket_connect = apparmor_socket_connect,
-+ .socket_listen = apparmor_socket_listen,
-+ .socket_accept = apparmor_socket_accept,
-+ .socket_sendmsg = apparmor_socket_sendmsg,
-+ .socket_recvmsg = apparmor_socket_recvmsg,
-+ .socket_getsockname = apparmor_socket_getsockname,
-+ .socket_getpeername = apparmor_socket_getpeername,
-+ .socket_getsockopt = apparmor_socket_getsockopt,
-+ .socket_setsockopt = apparmor_socket_setsockopt,
-+ .socket_shutdown = apparmor_socket_shutdown,
-+
- .cred_alloc_blank = apparmor_cred_alloc_blank,
- .cred_free = apparmor_cred_free,
- .cred_prepare = apparmor_cred_prepare,
++ LSM_HOOK_INIT(socket_create, apparmor_socket_create),
++ LSM_HOOK_INIT(socket_bind, apparmor_socket_bind),
++ LSM_HOOK_INIT(socket_connect, apparmor_socket_connect),
++ LSM_HOOK_INIT(socket_listen, apparmor_socket_listen),
++ LSM_HOOK_INIT(socket_accept, apparmor_socket_accept),
++ LSM_HOOK_INIT(socket_sendmsg, apparmor_socket_sendmsg),
++ LSM_HOOK_INIT(socket_recvmsg, apparmor_socket_recvmsg),
++ LSM_HOOK_INIT(socket_getsockname, apparmor_socket_getsockname),
++ LSM_HOOK_INIT(socket_getpeername, apparmor_socket_getpeername),
++ LSM_HOOK_INIT(socket_getsockopt, apparmor_socket_getsockopt),
++ LSM_HOOK_INIT(socket_setsockopt, apparmor_socket_setsockopt),
++ LSM_HOOK_INIT(socket_shutdown, apparmor_socket_shutdown),
++
+ LSM_HOOK_INIT(cred_alloc_blank, apparmor_cred_alloc_blank),
+ LSM_HOOK_INIT(cred_free, apparmor_cred_free),
+ LSM_HOOK_INIT(cred_prepare, apparmor_cred_prepare),
diff --git a/security/apparmor/net.c b/security/apparmor/net.c
new file mode 100644
index 0000000..003dd18
/* generic policy dfa - optional and may be NULL */
profile->policy.dfa = unpack_dfa(e);
--
-1.8.3.2
+cgit v0.10.2
-From b452a37e97af826ba6c7548230e07c95bd13d9c4 Mon Sep 17 00:00:00 2001
+From 6b77d90baf3807b70ca17309ad6c0bd39f3297e7 Mon Sep 17 00:00:00 2001
From: John Johansen <john.johansen@canonical.com>
Date: Fri, 29 Jun 2012 17:34:00 -0700
-Subject: [PATCH 2/3] apparmor: Fix quieting of audit messages for network
- mediation
+Subject: apparmor: Fix quieting of audit messages for network mediation
If a profile specified a quieting of network denials for a given rule by
either the quiet or deny rule qualifiers, the resultant quiet mask for
they had been specifically marked as quieted.
Signed-off-by: John Johansen <john.johansen@canonical.com>
----
- security/apparmor/net.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/security/apparmor/net.c b/security/apparmor/net.c
index 003dd18..6e6e5c9 100644
if (denied & kill_mask)
audit_type = AUDIT_APPARMOR_KILL;
--
-1.8.3.2
+cgit v0.10.2
-From 0f113c1f052be315f5097d8b7294a620b0adda87 Mon Sep 17 00:00:00 2001
+From a71049ba973b214e88eae89f9cb0c4965d184ead Mon Sep 17 00:00:00 2001
From: John Johansen <john.johansen@canonical.com>
Date: Wed, 16 May 2012 10:58:05 -0700
-Subject: [PATCH 3/3] UBUNTU: SAUCE: apparmor: Add the ability to mediate mount
+Subject: UBUNTU: SAUCE: apparmor: Add the ability to mediate mount
Add the ability for apparmor to do mediation of mount operations. Mount
rules require an updated apparmor_parser (2.8 series) for policy compilation.
Signed-off-by: John Johansen <john.johansen@canonical.com>
Acked-by: Kees Cook <kees@ubuntu.com>
-Conflicts:
- security/apparmor/Makefile
- security/apparmor/apparmorfs.c
----
- security/apparmor/Makefile | 2 +-
- security/apparmor/apparmorfs.c | 15 +-
- security/apparmor/audit.c | 4 +
- security/apparmor/domain.c | 2 +-
- security/apparmor/include/apparmor.h | 3 +-
- security/apparmor/include/audit.h | 11 +
- security/apparmor/include/domain.h | 2 +
- security/apparmor/include/mount.h | 54 +++
- security/apparmor/lsm.c | 59 ++++
- security/apparmor/mount.c | 620 +++++++++++++++++++++++++++++++++++
- 10 files changed, 768 insertions(+), 4 deletions(-)
- create mode 100644 security/apparmor/include/mount.h
- create mode 100644 security/apparmor/mount.c
-
diff --git a/security/apparmor/Makefile b/security/apparmor/Makefile
index 5dbb72f..89b3445 100644
--- a/security/apparmor/Makefile
clean-files := capability_names.h rlim_names.h net_names.h
diff --git a/security/apparmor/apparmorfs.c b/security/apparmor/apparmorfs.c
-index 18fc02c..e709030 100644
+index 6362c5a..4917747 100644
--- a/security/apparmor/apparmorfs.c
+++ b/security/apparmor/apparmorfs.c
@@ -799,7 +799,18 @@ static struct aa_fs_entry aa_fs_entry_domain[] = {
AA_FS_DIR("rlimit", aa_fs_entry_rlimit),
AA_FS_DIR("caps", aa_fs_entry_caps),
diff --git a/security/apparmor/audit.c b/security/apparmor/audit.c
-index 031d2d9..02d804c 100644
+index 89c7865..7fdb5d7 100644
--- a/security/apparmor/audit.c
+++ b/security/apparmor/audit.c
@@ -44,6 +44,10 @@ const char *const op_table[] = {
"post_create",
"bind",
diff --git a/security/apparmor/domain.c b/security/apparmor/domain.c
-index 26c607c..23936c5 100644
+index dc0027b..a2e3813 100644
--- a/security/apparmor/domain.c
+++ b/security/apparmor/domain.c
-@@ -238,7 +238,7 @@ static const char *next_name(int xtype, const char *name)
+@@ -236,7 +236,7 @@ static const char *next_name(int xtype, const char *name)
*
* Returns: refcounted profile, or NULL on failure (MAYBE NULL)
*/
struct aa_profile *new_profile = NULL;
struct aa_namespace *ns = profile->ns;
diff --git a/security/apparmor/include/apparmor.h b/security/apparmor/include/apparmor.h
-index 8fb1488..22b172c 100644
+index e4ea626..ce6ff6a 100644
--- a/security/apparmor/include/apparmor.h
+++ b/security/apparmor/include/apparmor.h
@@ -30,8 +30,9 @@
/* Control parameters settable through module/boot flags */
extern enum audit_mode aa_g_audit;
diff --git a/security/apparmor/include/audit.h b/security/apparmor/include/audit.h
-index 61abec5..a9835c3 100644
+index 5d3c419..b9f1d57 100644
--- a/security/apparmor/include/audit.h
+++ b/security/apparmor/include/audit.h
@@ -72,6 +72,10 @@ enum aa_ops {
OP_CREATE,
OP_POST_CREATE,
OP_BIND,
-@@ -121,6 +125,13 @@ struct apparmor_audit_data {
+@@ -120,6 +124,13 @@ struct apparmor_audit_data {
unsigned long max;
} rlim;
struct {
+
+#endif /* __AA_MOUNT_H */
diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
-index de55a7f..e0dd95f 100644
+index 47fd244..fb92441 100644
--- a/security/apparmor/lsm.c
+++ b/security/apparmor/lsm.c
@@ -36,6 +36,7 @@
/* Flag indicating whether initialization completed */
int apparmor_initialized __initdata;
-@@ -502,6 +503,60 @@ static int apparmor_file_mprotect(struct vm_area_struct *vma,
+@@ -492,6 +493,60 @@ static int apparmor_file_mprotect(struct vm_area_struct *vma,
!(vma->vm_flags & VM_SHARED) ? MAP_PRIVATE : 0);
}
static int apparmor_getprocattr(struct task_struct *task, char *name,
char **value)
{
-@@ -722,6 +777,10 @@ static struct security_operations apparmor_ops = {
- .capget = apparmor_capget,
- .capable = apparmor_capable,
+@@ -710,6 +765,10 @@ static struct security_hook_list apparmor_hooks[] = {
+ LSM_HOOK_INIT(capget, apparmor_capget),
+ LSM_HOOK_INIT(capable, apparmor_capable),
-+ .sb_mount = apparmor_sb_mount,
-+ .sb_umount = apparmor_sb_umount,
-+ .sb_pivotroot = apparmor_sb_pivotroot,
-+
- .path_link = apparmor_path_link,
- .path_unlink = apparmor_path_unlink,
- .path_symlink = apparmor_path_symlink,
++ LSM_HOOK_INIT(sb_mount, apparmor_sb_mount),
++ LSM_HOOK_INIT(sb_umount, apparmor_sb_umount),
++ LSM_HOOK_INIT(sb_pivotroot, apparmor_sb_pivotroot),
++
+ LSM_HOOK_INIT(path_link, apparmor_path_link),
+ LSM_HOOK_INIT(path_unlink, apparmor_path_unlink),
+ LSM_HOOK_INIT(path_symlink, apparmor_path_symlink),
diff --git a/security/apparmor/mount.c b/security/apparmor/mount.c
new file mode 100644
index 0000000..478aa4d
+ return error;
+}
--
-1.8.3.2
+cgit v0.10.2
endif # MISC_FILESYSTEMS
diff --git a/fs/Makefile b/fs/Makefile
-index cb92fd4..8c2df12 100644
+index cb20e4b..dd81418 100644
--- a/fs/Makefile
+++ b/fs/Makefile
-@@ -127,3 +127,4 @@ obj-y += exofs/ # Multiple modules
+@@ -126,3 +126,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 1a0006a..ddad01a 100644
+index 1ff9942..31efc0a 100644
--- a/include/uapi/linux/Kbuild
+++ b/include/uapi/linux/Kbuild
@@ -59,6 +59,7 @@ header-y += atmsvc.h
aufs4.x-rcN base patch
diff --git a/MAINTAINERS b/MAINTAINERS
-index d8afd29..feac5ea 100644
+index 8133cef..04beb19 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
-@@ -1880,6 +1880,19 @@ F: include/linux/audit.h
+@@ -1939,6 +1939,19 @@ F: include/linux/audit.h
F: include/uapi/linux/audit.h
F: kernel/audit*
M: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>
W: http://miguelojeda.es/auxdisplay.htm
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
-index d7173cb..0160952 100644
+index f7a4c9d..23103ad 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
-@@ -540,6 +540,24 @@ static inline int is_loop_device(struct file *file)
+@@ -560,6 +560,24 @@ static inline int is_loop_device(struct file *file)
return i && S_ISBLK(i->i_mode) && MAJOR(i->i_rdev) == LOOP_MAJOR;
}
static ssize_t loop_attr_show(struct device *dev, char *page,
diff --git a/fs/dcache.c b/fs/dcache.c
-index 37b5afd..bc261e2 100644
+index 7a3f3e5..0b40298 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1164,7 +1164,7 @@ enum d_walk_ret {
{
mm_segment_t old_fs;
diff --git a/fs/splice.c b/fs/splice.c
-index bfe62ae..fa5eee5 100644
+index 5fc1e50..5f8385a 100644
--- a/fs/splice.c
+++ b/fs/splice.c
-@@ -1101,8 +1101,8 @@ EXPORT_SYMBOL(generic_splice_sendpage);
+@@ -1102,8 +1102,8 @@ EXPORT_SYMBOL(generic_splice_sendpage);
/*
* Attempt to initiate a splice from pipe to file.
*/
{
ssize_t (*splice_write)(struct pipe_inode_info *, struct file *,
loff_t *, size_t, unsigned int);
-@@ -1118,9 +1118,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
+@@ -1119,9 +1119,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.
*/
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
+index a0653e5..86080ea 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,
+@@ -1661,6 +1661,12 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
struct iovec *fast_pointer,
struct iovec **ret_pointer);
aufs4.x-rcN mmap patch
diff --git a/fs/buffer.c b/fs/buffer.c
-index c7a5602..8c50a22 100644
+index 1cf7a53..076aff86 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,
+@@ -2473,7 +2473,7 @@ int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,
* Update file times before taking page lock. We may end up failing the
* fault so this update may be superfluous but who really cares...
*/
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 093ca14..fc1ac03 100644
+index 87782e8..b287e64 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
-@@ -1744,7 +1744,7 @@ static int proc_map_files_get_link(struct dentry *dentry, struct path *path)
+@@ -1934,7 +1934,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) {
rc = 0;
}
diff --git a/fs/proc/nommu.c b/fs/proc/nommu.c
-index d4a3574..1397181 100644
+index f8595e8..cb8eda0 100644
--- a/fs/proc/nommu.c
+++ b/fs/proc/nommu.c
@@ -45,7 +45,10 @@ static int nommu_region_show(struct seq_file *m, struct vm_region *region)
ino = inode->i_ino;
}
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
-index 6dee68d..9afa35d 100644
+index ca1e091..8940e47 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -279,7 +279,10 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid)
struct mm_walk walk = {
.hugetlb_entry = gather_hugetlb_stats,
diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c
-index 599ec2e..1740207 100644
+index e0d64c9..7aa92db 100644
--- a/fs/proc/task_nommu.c
+++ b/fs/proc/task_nommu.c
@@ -160,7 +160,10 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma,
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 0755b9f..2ee5500 100644
+index 2e872f9..2494ed2 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
-@@ -1172,6 +1172,28 @@ static inline int fixup_user_fault(struct task_struct *tsk,
+@@ -1173,6 +1173,28 @@ static inline int fixup_user_fault(struct task_struct *tsk,
}
#endif
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 8d37e26..ce89d4c 100644
+index 0038ac7..409940d 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
-@@ -241,6 +241,7 @@ struct vm_region {
+@@ -259,6 +259,7 @@ struct vm_region {
unsigned long vm_top; /* region allocated to here */
unsigned long vm_pgoff; /* the offset in vm_file corresponding to vm_start */
struct file *vm_file; /* the backing file or NULL */
int vm_usage; /* region usage count (access under nommu_region_sem) */
bool vm_icache_flushed : 1; /* true if the icache has been flushed for
-@@ -305,6 +306,7 @@ struct vm_area_struct {
+@@ -323,6 +324,7 @@ struct vm_area_struct {
unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE
units, *not* PAGE_CACHE_SIZE */
struct file * vm_file; /* File we map to (can be NULL). */
#ifndef CONFIG_MMU
diff --git a/kernel/fork.c b/kernel/fork.c
-index 03c1eaa..7e215ba 100644
+index 1bfefc6..a86bd7f 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -456,7 +456,7 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
obj-y += init-mm.o
diff --git a/mm/filemap.c b/mm/filemap.c
-index 6bf5e42..a863d0f 100644
+index 1283fc8..128f18f 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
-@@ -2062,7 +2062,7 @@ int filemap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
+@@ -2089,7 +2089,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);
lock_page(page);
if (page->mapping != inode->i_mapping) {
unlock_page(page);
-diff --git a/mm/madvise.c b/mm/madvise.c
-index d551475..1ebf71b 100644
---- a/mm/madvise.c
-+++ b/mm/madvise.c
-@@ -320,12 +320,12 @@ static long madvise_remove(struct vm_area_struct *vma,
- * vma's reference to the file) can go away as soon as we drop
- * mmap_sem.
- */
-- get_file(f);
-+ vma_get_file(vma);
- up_read(¤t->mm->mmap_sem);
- error = vfs_fallocate(f,
- FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
- offset, end - start);
-- fput(f);
-+ vma_fput(vma);
- down_read(¤t->mm->mmap_sem);
- return error;
- }
diff --git a/mm/memory.c b/mm/memory.c
-index 22e037e..62096a2 100644
+index a84fbb7..13973d2 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -2034,7 +2034,7 @@ static inline int wp_page_reuse(struct mm_struct *mm,
return VM_FAULT_WRITE;
diff --git a/mm/mmap.c b/mm/mmap.c
-index bb50cac..1ab5e596 100644
+index aa632ad..3ff75d3 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)
if (new_vma->vm_ops && new_vma->vm_ops->open)
new_vma->vm_ops->open(new_vma);
vma_link(mm, new_vma, prev, rb_link, rb_parent);
-diff --git a/mm/msync.c b/mm/msync.c
-index bb04d53..5c24c54 100644
---- a/mm/msync.c
-+++ b/mm/msync.c
-@@ -84,10 +84,10 @@ SYSCALL_DEFINE3(msync, unsigned long, start, size_t, len, int, flags)
- start = vma->vm_end;
- if ((flags & MS_SYNC) && file &&
- (vma->vm_flags & VM_SHARED)) {
-- get_file(file);
-+ vma_get_file(vma);
- up_read(&mm->mmap_sem);
- error = vfs_fsync_range(file, fstart, fend, 1);
-- fput(file);
-+ vma_fput(vma);
- if (error || start >= end)
- goto out;
- down_read(&mm->mmap_sem);
diff --git a/mm/nommu.c b/mm/nommu.c
-index e544508..dd6f74a 100644
+index 58ea364..f937b7e 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
-@@ -693,7 +693,7 @@ static void __put_nommu_region(struct vm_region *region)
+@@ -671,7 +671,7 @@ static void __put_nommu_region(struct vm_region *region)
up_write(&nommu_region_sem);
if (region->vm_file)
/* IO memory and memory shared directly out of the pagecache
* from ramfs/tmpfs mustn't be released here */
-@@ -858,7 +858,7 @@ static void delete_vma(struct mm_struct *mm, struct vm_area_struct *vma)
+@@ -829,7 +829,7 @@ static void delete_vma(struct mm_struct *mm, struct vm_area_struct *vma)
if (vma->vm_ops && vma->vm_ops->close)
vma->vm_ops->close(vma);
if (vma->vm_file)
put_nommu_region(vma->vm_region);
kmem_cache_free(vm_area_cachep, vma);
}
-@@ -1398,7 +1398,7 @@ unsigned long do_mmap_pgoff(struct file *file,
+@@ -1354,7 +1354,7 @@ unsigned long do_mmap_pgoff(struct file *file,
goto error_just_free;
}
}
kmem_cache_free(vm_region_jar, region);
region = pregion;
result = start;
-@@ -1474,10 +1474,10 @@ error_just_free:
+@@ -1429,10 +1429,10 @@ error_just_free:
up_write(&nommu_region_sem);
error:
if (region->vm_file)
- fput(vma->vm_file);
+ vma_fput(vma);
kmem_cache_free(vm_area_cachep, vma);
- kleave(" = %d", ret);
return ret;
+
diff --git a/mm/prfile.c b/mm/prfile.c
new file mode 100644
-index 0000000..6aa5ab5
+index 0000000..b323b8a
--- /dev/null
+++ b/mm/prfile.c
@@ -0,0 +1,86 @@
+{
+#ifdef PRFILE_TRACE
+ if (pr)
-+ pr_info("%s:%d: %s, %p\n", func, line, func2,
++ pr_info("%s:%d: %s, %s\n", func, line, func2,
+ f ? (char *)f->f_path.dentry->d_name.name : "(null)");
+#endif
+}
aufs4.x-rcN standalone patch
diff --git a/fs/dcache.c b/fs/dcache.c
-index bc261e2..8d7951d 100644
+index 0b40298..4844e61 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1269,6 +1269,7 @@ rename_retry:
/*
* 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 294174d..3cea027 100644
+index 7f9d407..8c9ec1d 100644
--- a/fs/file_table.c
+++ b/fs/file_table.c
-@@ -147,6 +147,7 @@ over:
+@@ -146,6 +146,7 @@ over:
}
return ERR_PTR(-ENFILE);
}
/**
* alloc_file - allocate and initialize a 'struct file'
-@@ -308,6 +309,7 @@ void put_filp(struct file *file)
+@@ -307,6 +308,7 @@ void put_filp(struct file *file)
file_free(file);
}
}
void __init files_init(unsigned long mempages)
{
diff --git a/fs/inode.c b/fs/inode.c
-index ea37cd1..58f5f58 100644
+index d30640f..1ecc715 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -58,6 +58,7 @@ static struct hlist_head *inode_hashtable __read_mostly;
/*
* Empty aops. Can be used for the cases where the user does not
diff --git a/fs/namespace.c b/fs/namespace.c
-index 1b9e111..d45b81b 100644
+index c7cb8a5..08723de 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -463,6 +463,7 @@ void __mnt_drop_write(struct vfsmount *mnt)
/**
* mnt_drop_write - give up write access to a mount
-@@ -1768,6 +1769,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
+@@ -1779,6 +1780,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
}
return 0;
}
static int fsnotify_mark_destroy(void *ignored)
{
diff --git a/fs/open.c b/fs/open.c
-index 98e5a52..a94e2e7 100644
+index e33dab2..b84b828 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,
+@@ -64,6 +64,7 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
mutex_unlock(&dentry->d_inode->i_mutex);
return ret;
}
long vfs_truncate(struct path *path, loff_t length)
{
-@@ -676,6 +677,7 @@ int open_check_o_direct(struct file *f)
+@@ -678,6 +679,7 @@ int open_check_o_direct(struct file *f)
}
return 0;
}
+EXPORT_SYMBOL(open_check_o_direct);
static int do_dentry_open(struct file *f,
- int (*open)(struct inode *, struct file *),
+ struct inode *inode,
diff --git a/fs/read_write.c b/fs/read_write.c
index fd0414e..8ace6ec 100644
--- a/fs/read_write.c
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 fa5eee5..bfb3324 100644
+index 5f8385a..f76067e 100644
--- a/fs/splice.c
+++ b/fs/splice.c
-@@ -1114,6 +1114,7 @@ long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
+@@ -1115,6 +1115,7 @@ long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
return splice_write(pipe, out, ppos, len, flags);
}
/*
* Attempt to initiate a splice from a file to a pipe.
-@@ -1140,6 +1141,7 @@ long do_splice_to(struct file *in, loff_t *ppos,
+@@ -1141,6 +1142,7 @@ long do_splice_to(struct file *in, loff_t *ppos,
return splice_read(in, ppos, pipe, len, flags);
}
/**
* splice_direct_to_actor - splices data directly between two non-pipes
diff --git a/fs/xattr.c b/fs/xattr.c
-index 4ef6985..6bb6303 100644
+index 072fee1..a7677af 100644
--- a/fs/xattr.c
+++ b/fs/xattr.c
@@ -207,6 +207,7 @@ vfs_getxattr_alloc(struct dentry *dentry, const char *name, char **xattr_value,
/* 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 f2875cd..ebf06ec 100644
+index d103f5a4..393654e 100644
--- a/security/commoncap.c
+++ b/security/commoncap.c
-@@ -975,9 +975,11 @@ int cap_mmap_addr(unsigned long addr)
+@@ -970,12 +970,14 @@ int cap_mmap_addr(unsigned long addr)
}
return ret;
}
return 0;
}
+EXPORT_SYMBOL(cap_mmap_file);
+
+ #ifdef CONFIG_SECURITY
+
diff --git a/security/device_cgroup.c b/security/device_cgroup.c
index 188c1d2..426d9af 100644
--- a/security/device_cgroup.c
int devcgroup_inode_mknod(int mode, dev_t dev)
{
diff --git a/security/security.c b/security/security.c
-index 8e9b1f4..c1c7cd1 100644
+index 595fffa..346bad6 100644
--- a/security/security.c
+++ b/security/security.c
-@@ -430,6 +430,7 @@ int security_path_rmdir(struct path *dir, struct dentry *dentry)
+@@ -438,6 +438,7 @@ int security_path_rmdir(struct path *dir, struct dentry *dentry)
return 0;
- return security_ops->path_rmdir(dir, dentry);
+ return call_int_hook(path_rmdir, 0, dir, dentry);
}
+EXPORT_SYMBOL(security_path_rmdir);
int security_path_unlink(struct path *dir, struct dentry *dentry)
{
-@@ -446,6 +447,7 @@ int security_path_symlink(struct path *dir, struct dentry *dentry,
+@@ -454,6 +455,7 @@ int security_path_symlink(struct path *dir, struct dentry *dentry,
return 0;
- return security_ops->path_symlink(dir, dentry, old_name);
+ return call_int_hook(path_symlink, 0, dir, dentry, old_name);
}
+EXPORT_SYMBOL(security_path_symlink);
int security_path_link(struct dentry *old_dentry, struct path *new_dir,
struct dentry *new_dentry)
-@@ -454,6 +456,7 @@ int security_path_link(struct dentry *old_dentry, struct path *new_dir,
+@@ -462,6 +464,7 @@ int security_path_link(struct dentry *old_dentry, struct path *new_dir,
return 0;
- return security_ops->path_link(old_dentry, new_dir, new_dentry);
+ return call_int_hook(path_link, 0, old_dentry, new_dir, new_dentry);
}
+EXPORT_SYMBOL(security_path_link);
int security_path_rename(struct path *old_dir, struct dentry *old_dentry,
struct path *new_dir, struct dentry *new_dentry,
-@@ -481,6 +484,7 @@ int security_path_truncate(struct path *path)
+@@ -489,6 +492,7 @@ int security_path_truncate(struct path *path)
return 0;
- return security_ops->path_truncate(path);
+ return call_int_hook(path_truncate, 0, path);
}
+EXPORT_SYMBOL(security_path_truncate);
int security_path_chmod(struct path *path, umode_t mode)
{
-@@ -488,6 +492,7 @@ int security_path_chmod(struct path *path, umode_t mode)
+@@ -496,6 +500,7 @@ int security_path_chmod(struct path *path, umode_t mode)
return 0;
- return security_ops->path_chmod(path, mode);
+ return call_int_hook(path_chmod, 0, path, mode);
}
+EXPORT_SYMBOL(security_path_chmod);
int security_path_chown(struct path *path, kuid_t uid, kgid_t gid)
{
-@@ -495,6 +500,7 @@ int security_path_chown(struct path *path, kuid_t uid, kgid_t gid)
+@@ -503,6 +508,7 @@ int security_path_chown(struct path *path, kuid_t uid, kgid_t gid)
return 0;
- return security_ops->path_chown(path, uid, gid);
+ return call_int_hook(path_chown, 0, path, uid, gid);
}
+EXPORT_SYMBOL(security_path_chown);
int security_path_chroot(struct path *path)
{
-@@ -580,6 +586,7 @@ int security_inode_readlink(struct dentry *dentry)
+@@ -588,6 +594,7 @@ int security_inode_readlink(struct dentry *dentry)
return 0;
- return security_ops->inode_readlink(dentry);
+ return call_int_hook(inode_readlink, 0, dentry);
}
+EXPORT_SYMBOL(security_inode_readlink);
- int security_inode_follow_link(struct dentry *dentry, struct nameidata *nd)
- {
-@@ -594,6 +601,7 @@ int security_inode_permission(struct inode *inode, int mask)
+ int security_inode_follow_link(struct dentry *dentry, struct inode *inode,
+ bool rcu)
+@@ -603,6 +610,7 @@ int security_inode_permission(struct inode *inode, int mask)
return 0;
- return security_ops->inode_permission(inode, mask);
+ return call_int_hook(inode_permission, 0, inode, mask);
}
+EXPORT_SYMBOL(security_inode_permission);
int security_inode_setattr(struct dentry *dentry, struct iattr *attr)
{
-@@ -716,6 +724,7 @@ int security_file_permission(struct file *file, int mask)
+@@ -741,6 +749,7 @@ int security_file_permission(struct file *file, int mask)
return fsnotify_perm(file, mask);
}
int security_file_alloc(struct file *file)
{
-@@ -775,6 +784,7 @@ int security_mmap_file(struct file *file, unsigned long prot,
+@@ -800,6 +809,7 @@ int security_mmap_file(struct file *file, unsigned long prot,
return ret;
return ima_file_mmap(file, prot);
}
{
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 2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/ABI/testing/debugfs-aufs 2015-09-24 10:47:58.244719488 +0200
@@ -0,0 +1,50 @@
+What: /debug/aufs/si_<id>/
+Date: March 2009
+ 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 2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/ABI/testing/sysfs-aufs 2015-09-24 10:47:58.244719488 +0200
@@ -0,0 +1,31 @@
+What: /sys/fs/aufs/si_<id>/
+Date: March 2009
+ 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-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/01intro.txt 2015-09-24 10:47:58.244719488 +0200
@@ -0,0 +1,170 @@
+
+# Copyright (C) 2005-2015 Junjiro R. Okajima
+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-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/02struct.txt 2015-09-24 10:47:58.244719488 +0200
@@ -0,0 +1,258 @@
+
+# Copyright (C) 2005-2015 Junjiro R. Okajima
+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-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/03atomic_open.txt 2015-09-24 10:47:58.244719488 +0200
@@ -0,0 +1,85 @@
+
+# Copyright (C) 2015 Junjiro R. Okajima
+ 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-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/03lookup.txt 2015-09-24 10:47:58.244719488 +0200
@@ -0,0 +1,113 @@
+
+# Copyright (C) 2005-2015 Junjiro R. Okajima
+ 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-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/04branch.txt 2015-09-24 10:47:58.244719488 +0200
@@ -0,0 +1,74 @@
+
+# Copyright (C) 2005-2015 Junjiro R. Okajima
+ 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-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/05wbr_policy.txt 2015-09-24 10:47:58.244719488 +0200
@@ -0,0 +1,64 @@
+
+# Copyright (C) 2005-2015 Junjiro R. Okajima
+ 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-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/06fhsm.txt 2015-09-24 10:47:58.244719488 +0200
@@ -0,0 +1,120 @@
+
+# Copyright (C) 2011-2015 Junjiro R. Okajima
+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-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/06mmap.txt 2015-09-24 10:47:58.244719488 +0200
@@ -0,0 +1,72 @@
+
+# Copyright (C) 2005-2015 Junjiro R. Okajima
+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-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/06xattr.txt 2015-09-24 10:47:58.244719488 +0200
@@ -0,0 +1,96 @@
+
+# Copyright (C) 2014-2015 Junjiro R. Okajima
+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-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/07export.txt 2015-09-24 10:47:58.248052907 +0200
@@ -0,0 +1,58 @@
+
+# Copyright (C) 2005-2015 Junjiro R. Okajima
+ 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-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/08shwh.txt 2015-09-24 10:47:58.248052907 +0200
@@ -0,0 +1,52 @@
+
+# Copyright (C) 2005-2015 Junjiro R. Okajima
+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-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/10dynop.txt 2015-09-24 10:47:58.248052907 +0200
@@ -0,0 +1,47 @@
+
+# Copyright (C) 2010-2015 Junjiro R. Okajima
+regular files only.
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-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/README 2015-09-24 10:47:58.244719488 +0200
@@ -0,0 +1,383 @@
+
+Aufs4 -- advanced multi layered unification filesystem version 4.x
+The Parted Magic Project made a donation (2013/9 and 11).
+Pavel Barta made a donation (2013/10).
+Nikolay Pertsev made a donation (2014/5).
-+James B made a donation (2014/7).
++James B made a donation (2014/7 and 2015/7).
+Stefano Di Biase made a donation (2014/8).
+Daniel Epellei made a donation (2015/1).
+
+# 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-28 17:35:44.344717109 +0200
++++ linux/fs/aufs/aufs.h 2015-09-24 10:47:58.248052907 +0200
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/branch.c 2015-09-24 10:47:58.248052907 +0200
@@ -0,0 +1,1414 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/branch.h 2015-09-24 10:47:58.248052907 +0200
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/conf.mk 2015-09-24 10:47:58.248052907 +0200
@@ -0,0 +1,38 @@
+
+AuConfStr = CONFIG_AUFS_FS=${CONFIG_AUFS_FS}
+-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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/cpup.c 2015-09-24 10:47:58.248052907 +0200
@@ -0,0 +1,1319 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/cpup.h 2015-09-24 10:47:58.248052907 +0200
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/dbgaufs.c 2015-09-24 10:47:58.248052907 +0200
@@ -0,0 +1,432 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/dbgaufs.h 2015-09-24 10:47:58.248052907 +0200
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/dcsub.c 2015-09-24 10:47:58.248052907 +0200
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/dcsub.h 2015-09-24 10:47:58.251386326 +0200
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/debug.c 2015-09-24 10:47:58.251386326 +0200
@@ -0,0 +1,440 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/debug.h 2015-09-24 10:47:58.251386326 +0200
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/dentry.c 2015-09-24 10:47:58.251386326 +0200
@@ -0,0 +1,1105 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+};
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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/dentry.h 2015-09-24 10:47:58.251386326 +0200
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/dinfo.c 2015-09-24 10:47:58.251386326 +0200
@@ -0,0 +1,550 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/dir.c 2015-09-24 10:47:58.251386326 +0200
@@ -0,0 +1,753 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+};
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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/dir.h 2015-09-24 10:47:58.251386326 +0200
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/dynop.c 2015-09-24 10:47:58.251386326 +0200
@@ -0,0 +1,369 @@
+/*
+ * Copyright (C) 2010-2015 Junjiro R. Okajima
+}
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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/dynop.h 2015-09-24 10:47:58.251386326 +0200
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2010-2015 Junjiro R. Okajima
+#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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/export.c 2015-09-24 10:47:58.251386326 +0200
@@ -0,0 +1,832 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/fhsm.c 2015-09-24 10:47:58.251386326 +0200
@@ -0,0 +1,426 @@
+/*
+ * Copyright (C) 2011-2015 Junjiro R. Okajima
+}
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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/file.c 2015-09-24 10:47:58.251386326 +0200
@@ -0,0 +1,841 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+};
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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/file.h 2015-09-24 10:47:58.251386326 +0200
@@ -0,0 +1,291 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/finfo.c 2015-09-24 10:47:58.251386326 +0200
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/f_op.c 2015-09-24 10:47:58.251386326 +0200
@@ -0,0 +1,738 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+};
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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/fstype.h 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,400 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/hfsnotify.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,288 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+};
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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/hfsplus.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2010-2015 Junjiro R. Okajima
+}
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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/hnotify.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,710 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/iinfo.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/inode.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,500 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/inode.h 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,673 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/ioctl.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/i_op_add.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,932 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:36:09.025073697 +0200
-@@ -0,0 +1,1447 @@
++++ linux/fs/aufs/i_op.c 2015-09-24 10:47:58.254719746 +0200
+@@ -0,0 +1,1483 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
+
+/* ---------------------------------------------------------------------- */
+
-+static int h_readlink(struct dentry *dentry, int bindex, char __user *buf,
-+ int bufsiz)
-+{
-+ int err;
-+ struct super_block *sb;
-+ struct dentry *h_dentry;
-+ struct inode *inode, *h_inode;
++/*
++ * Assumption:
++ * - the number of symlinks is not so many.
++ *
++ * Structure:
++ * - sbinfo (instead of iinfo) contains an hlist of struct au_symlink.
++ * If iinfo contained the hlist, then it would be rather large waste of memory
++ * I am afraid.
++ * - struct au_symlink contains the necessary info for h_inode follow_link() and
++ * put_link().
++ */
+
-+ err = -EINVAL;
-+ h_dentry = au_h_dptr(dentry, bindex);
-+ h_inode = d_inode(h_dentry);
-+ if (unlikely(!h_inode->i_op->readlink))
-+ goto out;
++struct au_symlink {
++ union {
++ struct hlist_node hlist;
++ struct rcu_head rcu;
++ };
+
-+ err = security_inode_readlink(h_dentry);
-+ if (unlikely(err))
-+ goto out;
++ struct inode *h_inode;
++ void *h_cookie;
++};
+
-+ sb = dentry->d_sb;
-+ 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(inode, h_inode);
-+ }
-+ err = h_inode->i_op->readlink(h_dentry, buf, bufsiz);
++static void au_symlink_add(struct super_block *sb, struct au_symlink *slink,
++ struct inode *h_inode, void *cookie)
++{
++ struct au_sbinfo *sbinfo;
+
-+out:
-+ return err;
++ ihold(h_inode);
++ slink->h_inode = h_inode;
++ slink->h_cookie = cookie;
++ sbinfo = au_sbi(sb);
++ au_sphl_add(&slink->hlist, &sbinfo->si_symlink);
+}
+
-+static int aufs_readlink(struct dentry *dentry, char __user *buf, int bufsiz)
++static void au_symlink_del(struct super_block *sb, struct au_symlink *slink)
+{
-+ int err;
-+
-+ err = aufs_read_lock(dentry, AuLock_IR | AuLock_GEN);
-+ if (unlikely(err))
-+ goto out;
-+ err = au_d_hashed_positive(dentry);
-+ if (!err)
-+ err = h_readlink(dentry, au_dbstart(dentry), buf, bufsiz);
-+ aufs_read_unlock(dentry, AuLock_IR);
++ struct au_sbinfo *sbinfo;
+
-+out:
-+ return err;
++ /* do not iput() within rcu */
++ iput(slink->h_inode);
++ slink->h_inode = NULL;
++ sbinfo = au_sbi(sb);
++ au_sphl_del_rcu(&slink->hlist, &sbinfo->si_symlink);
++ kfree_rcu(slink, rcu);
+}
+
-+static void *aufs_follow_link(struct dentry *dentry, struct nameidata *nd)
++static const char *aufs_follow_link(struct dentry *dentry, void **cookie)
+{
++ const char *ret;
++ struct inode *inode, *h_inode;
++ struct dentry *h_dentry;
++ struct au_symlink *slink;
+ int err;
-+ mm_segment_t old_fs;
-+ union {
-+ char *k;
-+ char __user *u;
-+ } buf;
-+
-+ err = -ENOMEM;
-+ buf.k = (void *)__get_free_page(GFP_NOFS);
-+ if (unlikely(!buf.k))
-+ goto out;
++ aufs_bindex_t bindex;
+
++ ret = NULL; /* supress a warning */
+ err = aufs_read_lock(dentry, AuLock_IR | AuLock_GEN);
+ if (unlikely(err))
-+ goto out_name;
++ goto out;
+
+ err = au_d_hashed_positive(dentry);
-+ if (!err) {
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+ err = h_readlink(dentry, au_dbstart(dentry), buf.u, PATH_MAX);
-+ set_fs(old_fs);
++ if (unlikely(err))
++ goto out_unlock;
++
++ err = -EINVAL;
++ inode = d_inode(dentry);
++ bindex = au_ibstart(inode);
++ h_inode = au_h_iptr(inode, bindex);
++ if (unlikely(!h_inode->i_op->follow_link))
++ goto out_unlock;
++
++ err = -ENOMEM;
++ slink = kmalloc(sizeof(*slink), GFP_NOFS);
++ if (unlikely(!slink))
++ goto out_unlock;
++
++ err = -EBUSY;
++ h_dentry = NULL;
++ if (au_dbstart(dentry) <= bindex) {
++ h_dentry = au_h_dptr(dentry, bindex);
++ if (h_dentry)
++ dget(h_dentry);
+ }
-+ aufs_read_unlock(dentry, AuLock_IR);
++ if (!h_dentry) {
++ h_dentry = d_find_any_alias(h_inode);
++ if (IS_ERR(h_dentry)) {
++ err = PTR_ERR(h_dentry);
++ goto out_free;
++ }
++ }
++ if (unlikely(!h_dentry))
++ goto out_free;
+
-+ if (err >= 0) {
-+ buf.k[err] = 0;
-+ /* will be freed by put_link */
-+ nd_set_link(nd, buf.k);
-+ return NULL; /* success */
++ err = 0;
++ AuDbg("%pf\n", h_inode->i_op->follow_link);
++ AuDbgDentry(h_dentry);
++ ret = h_inode->i_op->follow_link(h_dentry, cookie);
++ dput(h_dentry);
++
++ if (!IS_ERR_OR_NULL(ret)) {
++ au_symlink_add(inode->i_sb, slink, h_inode, *cookie);
++ *cookie = slink;
++ AuDbg("slink %p\n", slink);
++ goto out_unlock; /* success */
+ }
+
-+out_name:
-+ free_page((unsigned long)buf.k);
++out_free:
++ slink->h_inode = NULL;
++ kfree_rcu(slink, rcu);
++out_unlock:
++ aufs_read_unlock(dentry, AuLock_IR);
+out:
-+ AuTraceErr(err);
-+ return ERR_PTR(err);
++ if (unlikely(err))
++ ret = ERR_PTR(err);
++ AuTraceErrPtr(ret);
++ return ret;
+}
+
-+static void aufs_put_link(struct dentry *dentry __maybe_unused,
-+ struct nameidata *nd, void *cookie __maybe_unused)
++static void aufs_put_link(struct inode *inode, void *cookie)
+{
-+ char *p;
++ struct au_symlink *slink;
++ struct inode *h_inode;
+
-+ p = nd_get_link(nd);
-+ if (!IS_ERR_OR_NULL(p))
-+ free_page((unsigned long)p);
++ slink = cookie;
++ AuDbg("slink %p\n", slink);
++ h_inode = slink->h_inode;
++ AuDbg("%pf\n", h_inode->i_op->put_link);
++ AuDbgInode(h_inode);
++ if (h_inode->i_op->put_link)
++ h_inode->i_op->put_link(h_inode, slink->h_cookie);
++ au_symlink_del(inode->i_sb, slink);
+}
+
+/* ---------------------------------------------------------------------- */
+ .removexattr = aufs_removexattr,
+#endif
+
-+ .readlink = aufs_readlink,
++ .readlink = generic_readlink,
+ .follow_link = aufs_follow_link,
+ .put_link = aufs_put_link,
+
+};
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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/i_op_del.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,510 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/i_op_ren.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,1017 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:35:44.344717109 +0200
++++ linux/fs/aufs/Kconfig 2015-09-24 10:47:58.248052907 +0200
@@ -0,0 +1,185 @@
+config AUFS_FS
+ tristate "Aufs (Advanced multi layered unification filesystem) support"
+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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/loop.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/loop.h 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/magic.mk 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,30 @@
+
+# defined in ${srctree}/fs/fuse/inode.c
+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-28 17:35:44.344717109 +0200
++++ linux/fs/aufs/Makefile 2015-09-24 10:47:58.248052907 +0200
@@ -0,0 +1,44 @@
+
+include ${src}/magic.mk
+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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/module.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+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-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/module.h 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/mvdown.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,694 @@
+/*
+ * Copyright (C) 2011-2015 Junjiro R. Okajima
+}
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-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/opts.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,1835 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/opts.h 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/plink.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,528 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/poll.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/posix_acl.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2014-2015 Junjiro R. Okajima
+}
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-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/procfs.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2010-2015 Junjiro R. Okajima
+}
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-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/rdu.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,388 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/rwsem.h 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:36:09.028407078 +0200
-@@ -0,0 +1,356 @@
++++ linux/fs/aufs/sbinfo.c 2015-09-24 10:47:58.254719746 +0200
+@@ -0,0 +1,360 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
+ AuDebugOn(!hlist_empty(&sbinfo->si_plink[i].head));
+ AuDebugOn(atomic_read(&sbinfo->si_nowait.nw_len));
+
++ AuDebugOn(!hlist_empty(&sbinfo->si_symlink.head));
++
+ au_rw_write_lock(&sbinfo->si_rwsem);
+ au_br_free(sbinfo);
+ au_rw_write_unlock(&sbinfo->si_rwsem);
+
+ sbinfo->si_mntflags = au_opts_plink(AuOpt_Def);
+
++ au_sphl_init(&sbinfo->si_symlink);
++
+ sbinfo->si_xino_jiffy = jiffies;
+ sbinfo->si_xino_expire
+ = msecs_to_jiffies(AUFS_XINO_DEF_SEC * MSEC_PER_SEC);
+}
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-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/spl.h 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/super.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,1004 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+};
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-28 17:36:09.028407078 +0200
-@@ -0,0 +1,635 @@
++++ linux/fs/aufs/super.h 2015-09-24 10:47:58.254719746 +0200
+@@ -0,0 +1,638 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
+ /* include/asm-ia64/siginfo.h defines a macro named si_flags */
+ unsigned int si_mntflags;
+
++ /* symlink to follow_link() and put_link() */
++ struct au_sphlhead si_symlink;
++
+ /* external inode number (bitmap and translation table) */
+ vfs_readf_t si_xread;
+ vfs_writef_t si_xwrite;
+#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-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/sysaufs.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/sysaufs.h 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#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-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/sysfs.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,372 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/sysrq.c 2015-09-24 10:47:58.254719746 +0200
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/vdir.c 2015-09-24 10:47:58.258053165 +0200
@@ -0,0 +1,888 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
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-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/vfsub.c 2015-09-24 10:47:58.258053165 +0200
@@ -0,0 +1,848 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
--- /usr/share/empty/fs/aufs/vfsub.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/vfsub.h 2015-06-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/vfsub.h 2015-09-24 10:47:58.258053165 +0200
@@ -0,0 +1,286 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#endif /* __AUFS_VFSUB_H__ */
diff -urN /usr/share/empty/fs/aufs/wbr_policy.c linux/fs/aufs/wbr_policy.c
--- /usr/share/empty/fs/aufs/wbr_policy.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/wbr_policy.c 2015-06-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/wbr_policy.c 2015-09-24 10:47:58.258053165 +0200
@@ -0,0 +1,765 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+};
diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
--- /usr/share/empty/fs/aufs/whout.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/whout.c 2015-06-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/whout.c 2015-09-24 10:47:58.258053165 +0200
@@ -0,0 +1,1063 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
diff -urN /usr/share/empty/fs/aufs/whout.h linux/fs/aufs/whout.h
--- /usr/share/empty/fs/aufs/whout.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/whout.h 2015-06-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/whout.h 2015-09-24 10:47:58.258053165 +0200
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#endif /* __AUFS_WHOUT_H__ */
diff -urN /usr/share/empty/fs/aufs/wkq.c linux/fs/aufs/wkq.c
--- /usr/share/empty/fs/aufs/wkq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/wkq.c 2015-06-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/wkq.c 2015-09-24 10:47:58.258053165 +0200
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
diff -urN /usr/share/empty/fs/aufs/wkq.h linux/fs/aufs/wkq.h
--- /usr/share/empty/fs/aufs/wkq.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/wkq.h 2015-06-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/wkq.h 2015-09-24 10:47:58.258053165 +0200
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#endif /* __AUFS_WKQ_H__ */
diff -urN /usr/share/empty/fs/aufs/xattr.c linux/fs/aufs/xattr.c
--- /usr/share/empty/fs/aufs/xattr.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/xattr.c 2015-06-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/xattr.c 2015-09-24 10:47:58.258053165 +0200
@@ -0,0 +1,344 @@
+/*
+ * Copyright (C) 2014-2015 Junjiro R. Okajima
+#endif
diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
--- /usr/share/empty/fs/aufs/xino.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/xino.c 2015-06-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/xino.c 2015-09-24 10:47:58.258053165 +0200
@@ -0,0 +1,1297 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+}
diff -urN /usr/share/empty/include/uapi/linux/aufs_type.h linux/include/uapi/linux/aufs_type.h
--- /usr/share/empty/include/uapi/linux/aufs_type.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/include/uapi/linux/aufs_type.h 2015-06-28 17:36:09.028407078 +0200
++++ linux/include/uapi/linux/aufs_type.h 2015-09-24 10:47:58.258053165 +0200
@@ -0,0 +1,419 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+
+#include <linux/limits.h>
+
-+#define AUFS_VERSION "4.x-rcN-20150622"
++#define AUFS_VERSION "4.x-rcN-20150921"
+
+/* todo? move this to linux-2.6.19/include/magic.h */
+#define AUFS_SUPER_MAGIC ('a' << 24 | 'u' << 16 | 'f' << 8 | 's')
aufs4.x-rcN loopback patch
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
-index 0160952..866f8e2 100644
+index 23103ad..5c3263f 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
-@@ -419,7 +419,7 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq)
+@@ -417,7 +417,7 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq)
}
struct switch_request {
struct completion wait;
};
-@@ -439,6 +439,7 @@ static void do_loop_switch(struct loop_device *lo, struct switch_request *p)
+@@ -437,6 +437,7 @@ static void do_loop_switch(struct loop_device *lo, struct switch_request *p)
mapping = file->f_mapping;
mapping_set_gfp_mask(old_file->f_mapping, lo->old_gfp_mask);
lo->lo_backing_file = file;
lo->lo_blocksize = S_ISBLK(mapping->host->i_mode) ?
mapping->host->i_bdev->bd_block_size : PAGE_SIZE;
lo->old_gfp_mask = mapping_gfp_mask(mapping);
-@@ -450,11 +451,13 @@ static void do_loop_switch(struct loop_device *lo, struct switch_request *p)
+@@ -448,11 +449,13 @@ static void do_loop_switch(struct loop_device *lo, struct switch_request *p)
* First it needs to flush existing IO, it does this by sending a magic
* BIO down the pipe. The completion of this BIO does the actual switch.
*/
/* freeze queue and wait for completion of scheduled requests */
blk_mq_freeze_queue(lo->lo_queue);
-@@ -473,7 +476,16 @@ static int loop_switch(struct loop_device *lo, struct file *file)
+@@ -471,7 +474,16 @@ static int loop_switch(struct loop_device *lo, struct file *file)
*/
static int loop_flush(struct loop_device *lo)
{
+ return f;
}
- /*
-@@ -488,6 +500,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+ static void loop_reread_partitions(struct loop_device *lo,
+@@ -508,6 +520,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
unsigned int arg)
{
struct file *file, *old_file;
struct inode *inode;
int error;
-@@ -504,9 +517,16 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -524,9 +537,16 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
file = fget(arg);
if (!file)
goto out;
error = -EINVAL;
-@@ -518,17 +538,21 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -538,17 +558,21 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
goto out_putf;
/* and ... switch */
+ if (old_virt_file)
+ fput(old_virt_file);
if (lo->lo_flags & LO_FLAGS_PARTSCAN)
- ioctl_by_bdev(bdev, BLKRRPART, 0);
+ loop_reread_partitions(lo, bdev);
return 0;
out_putf:
out:
return error;
}
-@@ -689,7 +713,7 @@ static void loop_config_discard(struct loop_device *lo)
+@@ -709,7 +733,7 @@ static void loop_config_discard(struct loop_device *lo)
static int loop_set_fd(struct loop_device *lo, fmode_t mode,
struct block_device *bdev, unsigned int arg)
{
struct inode *inode;
struct address_space *mapping;
unsigned lo_blocksize;
-@@ -704,6 +728,12 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
+@@ -724,6 +748,12 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
file = fget(arg);
if (!file)
goto out;
error = -EBUSY;
if (lo->lo_state != Lo_unbound)
-@@ -752,6 +782,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
+@@ -778,6 +808,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
lo->lo_device = bdev;
lo->lo_flags = lo_flags;
lo->lo_backing_file = file;
lo->transfer = NULL;
lo->ioctl = NULL;
lo->lo_sizelimit = 0;
-@@ -783,6 +814,8 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
+@@ -809,6 +840,8 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
out_putf:
fput(file);
out:
/* This is safe: open() is still holding a reference. */
module_put(THIS_MODULE);
-@@ -829,6 +862,7 @@ loop_init_xfer(struct loop_device *lo, struct loop_func_table *xfer,
+@@ -855,6 +888,7 @@ loop_init_xfer(struct loop_device *lo, struct loop_func_table *xfer,
static int loop_clr_fd(struct loop_device *lo)
{
struct file *filp = lo->lo_backing_file;
gfp_t gfp = lo->old_gfp_mask;
struct block_device *bdev = lo->lo_device;
-@@ -857,6 +891,7 @@ static int loop_clr_fd(struct loop_device *lo)
+@@ -886,6 +920,7 @@ static int loop_clr_fd(struct loop_device *lo)
spin_lock_irq(&lo->lo_lock);
lo->lo_state = Lo_rundown;
lo->lo_backing_file = NULL;
spin_unlock_irq(&lo->lo_lock);
loop_release_xfer(lo);
-@@ -898,6 +933,8 @@ static int loop_clr_fd(struct loop_device *lo)
+@@ -931,6 +966,8 @@ static int loop_clr_fd(struct loop_device *lo)
* bd_mutex which is usually taken before lo_ctl_mutex.
*/
fput(filp);
}
diff --git a/drivers/block/loop.h b/drivers/block/loop.h
-index 301c27f..df84aa0 100644
+index 25e8997..93b6fce 100644
--- a/drivers/block/loop.h
+++ b/drivers/block/loop.h
@@ -46,7 +46,7 @@ struct loop_device {
/* ---------------------------------------------------------------------- */
diff --git a/include/linux/fs.h b/include/linux/fs.h
-index 3229f97..f63cc0d 100644
+index 86080ea..5f8e0f2 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
-@@ -1696,6 +1696,10 @@ struct super_operations {
+@@ -1708,6 +1708,10 @@ struct super_operations {
struct shrink_control *);
long (*free_cached_objects)(struct super_block *,
struct shrink_control *);
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
-index df51d60..e937550 100644
+index c18f9e6..ec43bde 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
-@@ -220,6 +220,125 @@ config RIONET_RX_SIZE
+@@ -234,6 +234,125 @@ config RIONET_RX_SIZE
depends on RIONET
default "128"
tristate "Universal TUN/TAP device driver support"
depends on INET
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
-index e25fdd7..b411742 100644
+index c12cb22..03b82c6 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -10,6 +10,7 @@ obj-$(CONFIG_IPVLAN) += ipvlan/
obj-$(CONFIG_MII) += mii.o
diff --git a/drivers/net/imq.c b/drivers/net/imq.c
new file mode 100644
-index 0000000..b010f39
+index 0000000..c60929b
--- /dev/null
+++ b/drivers/net/imq.c
-@@ -0,0 +1,903 @@
+@@ -0,0 +1,908 @@
+/*
+ * Pseudo-driver for the intermediate queue device.
+ *
+ entry->skb = skb;
+ }
+
-+ skb->nf_queue_entry = entry;
-+
+ dev->stats.rx_bytes += skb->len;
+ dev->stats.rx_packets++;
+
+ if (unlikely(!q->enqueue))
+ goto packet_not_eaten_by_imq_dev;
+
++ skb->nf_queue_entry = entry;
+ root_lock = qdisc_lock(q);
+ spin_lock(root_lock);
+
+ /* backup skb->cb, as qdisc layer will overwrite it */
+ skb_save_cb(skb_shared);
+ qdisc_enqueue_root(skb_shared, q); /* might kfree_skb */
-+
+ if (likely(atomic_read(&skb_shared->users) == users + 1)) {
+ bool validate;
+
+ */
+ if (imq_dev_accurate_stats && txq->xmit_lock_owner != cpu) {
+ HARD_TX_LOCK(dev, txq, cpu);
-+ dev_hard_start_xmit(skb_popd, dev, txq, &dummy_ret);
++ if (!netif_xmit_frozen_or_stopped(txq)) {
++ dev_hard_start_xmit(skb_popd, dev, txq, &dummy_ret);
++ }
+ HARD_TX_UNLOCK(dev, txq);
+ } else {
-+ dev_hard_start_xmit(skb_popd, dev, txq, &dummy_ret);
++ if (!netif_xmit_frozen_or_stopped(txq)) {
++ dev_hard_start_xmit(skb_popd, dev, txq, &dummy_ret);
++ }
+ }
+ }
++ } else {
++ /* No ready skb, then schedule it */
++ __netif_schedule(q);
+ }
+#endif
+ rcu_read_unlock_bh();
+#endif /* _IMQ_H */
+
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
-index 05b9a69..0c35dff 100644
+index e20979d..9c8f9a1 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
-@@ -3276,6 +3276,19 @@ static inline void netif_tx_unlock_bh(struct net_device *dev)
+@@ -3279,6 +3279,19 @@ static inline void netif_tx_unlock_bh(struct net_device *dev)
} \
}
+#endif /* _IP6T_IMQ_H */
+
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
-index f15154a..d76d31a 100644
+index 9b88536..61686b0 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
-@@ -35,6 +35,9 @@
- #include <linux/netdev_features.h>
- #include <linux/sched.h>
- #include <net/flow_keys.h>
+@@ -37,6 +37,9 @@
+ #include <net/flow_dissector.h>
+ #include <linux/splice.h>
+ #include <linux/in6.h>
+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
+#include <linux/imq.h>
+#endif
/* A. Checksumming of received packets by device.
*
-@@ -540,6 +543,9 @@ struct sk_buff {
+@@ -548,6 +551,9 @@ struct sk_buff {
* first. This is owned by whoever has the skb queued ATM.
*/
char cb[48] __aligned(8);
unsigned long _skb_refdst;
void (*destructor)(struct sk_buff *skb);
-@@ -549,6 +555,9 @@ struct sk_buff {
+@@ -557,6 +563,9 @@ struct sk_buff {
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
struct nf_conntrack *nfct;
#endif
#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
struct nf_bridge_info *nf_bridge;
#endif
-@@ -616,6 +625,9 @@ struct sk_buff {
+@@ -624,6 +633,9 @@ struct sk_buff {
__u8 inner_protocol_type:1;
__u8 remcsum_offload:1;
/* 3 or 5 bit hole */
#ifdef CONFIG_NET_SCHED
__u16 tc_index; /* traffic control index */
-@@ -766,6 +778,12 @@ void kfree_skb_list(struct sk_buff *segs);
+@@ -774,6 +786,12 @@ void kfree_skb_list(struct sk_buff *segs);
void skb_tx_error(struct sk_buff *skb);
void consume_skb(struct sk_buff *skb);
void __kfree_skb(struct sk_buff *skb);
extern struct kmem_cache *skbuff_head_cache;
void kfree_skb_partial(struct sk_buff *skb, bool head_stolen);
-@@ -3216,6 +3234,10 @@ static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src,
+@@ -3232,6 +3250,10 @@ static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src,
if (copy)
dst->nfctinfo = src->nfctinfo;
#endif
dst->nf_bridge = src->nf_bridge;
nf_bridge_get(src->nf_bridge);
diff --git a/include/net/netfilter/nf_queue.h b/include/net/netfilter/nf_queue.h
-index d81d584..1adc20d 100644
+index e863585..40904cb 100644
--- a/include/net/netfilter/nf_queue.h
+++ b/include/net/netfilter/nf_queue.h
-@@ -29,6 +29,12 @@ struct nf_queue_handler {
+@@ -31,6 +31,12 @@ struct nf_queue_handler {
void nf_register_queue_handler(const struct nf_queue_handler *qh);
void nf_unregister_queue_handler(void);
void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict);
static inline void qdisc_run(struct Qdisc *q)
{
if (qdisc_run_begin(q))
+diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
+index 2738f6f..cc0af3e 100644
+--- a/include/net/sch_generic.h
++++ b/include/net/sch_generic.h
+@@ -501,6 +501,12 @@ static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch)
+ return sch->enqueue(skb, sch);
+ }
+
++static inline int qdisc_enqueue_root(struct sk_buff *skb, struct Qdisc *sch)
++{
++ qdisc_skb_cb(skb)->pkt_len = skb->len;
++ return qdisc_enqueue(skb, sch) & NET_XMIT_MASK;
++}
++
+ static inline bool qdisc_is_percpu_stats(const struct Qdisc *q)
+ {
+ return q->flags & TCQ_F_CPUSTATS;
diff --git a/include/uapi/linux/netfilter.h b/include/uapi/linux/netfilter.h
-index ef1b1f8..079e5ff 100644
+index d93f949..23fb6d1 100644
--- a/include/uapi/linux/netfilter.h
+++ b/include/uapi/linux/netfilter.h
-@@ -13,7 +13,8 @@
+@@ -14,7 +14,8 @@
#define NF_QUEUE 3
#define NF_REPEAT 4
#define NF_STOP 5
/* we overload the higher bits for encoding auxiliary data such as the queue
* number or errno values. Not nice, but better than additional function
diff --git a/net/core/dev.c b/net/core/dev.c
-index aa82f9a..c931d04 100644
+index a8e4dd4..f84cd5a 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
-@@ -135,6 +135,9 @@
- #include <linux/if_macvlan.h>
+@@ -136,6 +136,9 @@
#include <linux/errqueue.h>
#include <linux/hrtimer.h>
+ #include <linux/netfilter_ingress.h>
+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
+#include <linux/imq.h>
+#endif
#include "net-sysfs.h"
-@@ -2646,7 +2649,12 @@ static int xmit_one(struct sk_buff *skb, struct net_device *dev,
+@@ -2675,7 +2678,12 @@ static int xmit_one(struct sk_buff *skb, struct net_device *dev,
unsigned int len;
int rc;
dev_queue_xmit_nit(skb, dev);
len = skb->len;
-@@ -2684,6 +2692,7 @@ out:
+@@ -2713,6 +2721,7 @@ out:
*ret = rc;
return skb;
}
static struct sk_buff *validate_xmit_vlan(struct sk_buff *skb,
netdev_features_t features)
-@@ -2772,6 +2781,7 @@ struct sk_buff *validate_xmit_skb_list(struct sk_buff *skb, struct net_device *d
+@@ -2801,6 +2810,7 @@ struct sk_buff *validate_xmit_skb_list(struct sk_buff *skb, struct net_device *d
}
return head;
}
static void qdisc_pkt_len_init(struct sk_buff *skb)
{
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
-index 41ec022..307f02d 100644
+index 7b84330..a313d22 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
-@@ -79,6 +79,86 @@
+@@ -79,6 +79,87 @@
struct kmem_cache *skbuff_head_cache __read_mostly;
static struct kmem_cache *skbuff_fclone_cache __read_mostly;
+}
+EXPORT_SYMBOL(skb_restore_cb);
+
++static void skb_copy_stored_cb(struct sk_buff * , const struct sk_buff * ) __attribute__ ((unused));
+static void skb_copy_stored_cb(struct sk_buff *new, const struct sk_buff *__old)
+{
+ struct skb_cb_table *next;
/**
* skb_panic - private function for out-of-line support
-@@ -691,6 +771,28 @@ static void skb_release_head_state(struct sk_buff *skb)
+@@ -643,6 +724,28 @@ static void skb_release_head_state(struct sk_buff *skb)
WARN_ON(in_irq());
skb->destructor(skb);
}
+ while (skb->cb_next != NULL) {
+ if (net_ratelimit())
+ pr_warn("IMQ: kfree_skb: skb->cb_next: %08x\n",
-+ (unsigned int)skb->cb_next);
++ (unsigned int)(uintptr_t)skb->cb_next);
+
+ skb_restore_cb(skb);
+ }
#if IS_ENABLED(CONFIG_NF_CONNTRACK)
nf_conntrack_put(skb->nfct);
#endif
-@@ -813,6 +915,10 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
+@@ -765,6 +868,10 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
new->sp = secpath_get(old->sp);
#endif
__nf_copy(new, old, false);
/* Note : this field could be in headers_start/headers_end section
* It is not yet because we do not want to have a 16 bit hole
-@@ -3342,6 +3448,13 @@ void __init skb_init(void)
+@@ -3324,6 +3431,13 @@ void __init skb_init(void)
0,
SLAB_HWCACHE_ALIGN|SLAB_PANIC,
NULL);
/**
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
-index bc09cb9..9b6ef9f 100644
+index d5f7716..dd12857 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -64,9 +64,6 @@ static int ip6_finish_output2(struct sock *sk, struct sk_buff *skb)
NULL, dev,
ip6_finish_output,
diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig
-index a0f3e6a3..64239c0 100644
+index 6eae69a..ca3b763 100644
--- a/net/netfilter/Kconfig
+++ b/net/netfilter/Kconfig
-@@ -771,6 +771,18 @@ config NETFILTER_XT_TARGET_LOG
+@@ -784,6 +784,18 @@ config NETFILTER_XT_TARGET_LOG
To compile it as a module, choose M here. If unsure, say N.
tristate '"MARK" target support'
depends on NETFILTER_ADVANCED
diff --git a/net/netfilter/Makefile b/net/netfilter/Makefile
-index a87d8b8..d1080ff 100644
+index 70d026d..5469b14 100644
--- a/net/netfilter/Makefile
+++ b/net/netfilter/Makefile
-@@ -109,6 +109,7 @@ obj-$(CONFIG_NETFILTER_XT_TARGET_CT) += xt_CT.o
+@@ -110,6 +110,7 @@ obj-$(CONFIG_NETFILTER_XT_TARGET_CT) += xt_CT.o
obj-$(CONFIG_NETFILTER_XT_TARGET_DSCP) += xt_DSCP.o
obj-$(CONFIG_NETFILTER_XT_TARGET_HL) += xt_HL.o
obj-$(CONFIG_NETFILTER_XT_TARGET_HMARK) += xt_HMARK.o
obj-$(CONFIG_NETFILTER_XT_TARGET_LOG) += xt_LOG.o
obj-$(CONFIG_NETFILTER_XT_TARGET_NETMAP) += xt_NETMAP.o
diff --git a/net/netfilter/core.c b/net/netfilter/core.c
-index e616301..302798c 100644
+index a0e5497..a24276c 100644
--- a/net/netfilter/core.c
+++ b/net/netfilter/core.c
-@@ -178,9 +178,11 @@ next_hook:
+@@ -206,9 +206,11 @@ next_hook:
ret = NF_DROP_GETERR(verdict);
if (ret == 0)
ret = -EPERM;
if (err == -ECANCELED)
goto next_hook;
diff --git a/net/netfilter/nf_internals.h b/net/netfilter/nf_internals.h
-index ea7f367..06fe0d6 100644
+index 3992106..35cbc7b 100644
--- a/net/netfilter/nf_internals.h
+++ b/net/netfilter/nf_internals.h
@@ -18,7 +18,7 @@ unsigned int nf_iterate(struct list_head *head, struct sk_buff *skb,
int nf_queue(struct sk_buff *skb, struct nf_hook_ops *elem,
- struct nf_hook_state *state, unsigned int queuenum);
+ struct nf_hook_state *state, unsigned int queuenum, unsigned int queuetype);
+ void nf_queue_nf_hook_drop(struct nf_hook_ops *ops);
int __init netfilter_queue_init(void);
- /* nf_log.c */
diff --git a/net/netfilter/nf_queue.c b/net/netfilter/nf_queue.c
-index 2e88032..8524715 100644
+index 8a8b2ab..91ba768 100644
--- a/net/netfilter/nf_queue.c
+++ b/net/netfilter/nf_queue.c
@@ -28,6 +28,23 @@
/* return EBUSY when somebody else is registered, return EEXIST if the
* same handler is registered, return 0 in case of success. */
void nf_register_queue_handler(const struct nf_queue_handler *qh)
-@@ -112,7 +129,8 @@ EXPORT_SYMBOL_GPL(nf_queue_entry_get_refs);
+@@ -129,7 +146,8 @@ void nf_queue_nf_hook_drop(struct nf_hook_ops *ops)
int nf_queue(struct sk_buff *skb,
struct nf_hook_ops *elem,
struct nf_hook_state *state,
{
int status = -ENOENT;
struct nf_queue_entry *entry = NULL;
-@@ -122,7 +140,17 @@ int nf_queue(struct sk_buff *skb,
+@@ -139,7 +157,17 @@ int nf_queue(struct sk_buff *skb,
/* QUEUE == DROP if no one is waiting, to be safe. */
rcu_read_lock();
if (!qh) {
status = -ESRCH;
goto err_unlock;
-@@ -208,8 +236,10 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)
+@@ -225,8 +253,10 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)
local_bh_enable();
break;
case NF_QUEUE:
CC_STACKPROTECTOR_NONE all=n
CC_STACKPROTECTOR_REGULAR all=n
CC_STACKPROTECTOR_STRONG all=y
+DEBUG_ENTRY all=n
EARLY_PRINTK_EFI all=n
EFI_MIXED all=y
IOSF_MBI all=m
KVM_DEBUG_FS all=n
KVM_DEVICE_ASSIGNMENT all=y
PHYSICAL_ALIGN all=0x1000000
+PUNIT_ATOM_DEBUG all=m
X86_AMD_PLATFORM_DEVICE all=y
+X86_DEBUG_FPU all=n
X86_DEBUG_STATIC_CPU_HAS all=n
X86_SYSFB all=y
XEN_PVH all=y
CRYPTO_AEAD all=m
CRYPTO_BLKCIPHER all=m
CRYPTO_HASH all=y
+CRYPTO_RSA all=m
CRYPTO_MANAGER all=y
CRYPTO_USER all=m
CRYPTO_MANAGER_DISABLE_TESTS all=y
#- Authenticated Encryption with Associated Data
CRYPTO_CCM all=m
CRYPTO_GCM all=m
+CRYPTO_CHACHA20POLY1305 all=m
CRYPTO_SEQIV all=m
+CRYPTO_ECHAINIV all=m
#- Block modes
CRYPTO_CBC all=m
CRYPTO_CTR all=m
CRYPTO_CRCT10DIF all=m
CRYPTO_CRCT10DIF_PCLMUL all=m
CRYPTO_GHASH all=m
+CRYPTO_POLY1305 all=m
CRYPTO_MD4 all=m
CRYPTO_MD5 all=y
CRYPTO_MICHAEL_MIC all=m
CRYPTO_SALSA20 all=m
CRYPTO_SALSA20_586 all=m
CRYPTO_SALSA20_X86_64 x86_64=m
+CRYPTO_CHACHA20 all=m
CRYPTO_SEED all=m
CRYPTO_SERPENT all=m
CRYPTO_SERPENT_SSE2_X86_64 all=m
CRYPTO_DEFLATE all=m
CRYPTO_ZLIB all=m
CRYPTO_LZO all=y
+CRYPTO_842 all=m
CRYPTO_LZ4 all=m
CRYPTO_LZ4HC all=m
#- Random Number Generation
CRYPTO_DRBG_HMAC all=y
CRYPTO_DRBG_HASH all=y
CRYPTO_DRBG_CTR all=y
+CRYPTO_JITTERENTROPY all=m
CRYPTO_USER_API_HASH all=m
CRYPTO_USER_API_SKCIPHER all=m
CRYPTO_USER_API_RNG all=m
+CRYPTO_USER_API_AEAD all=m
#- file drivers/crypto/Kconfig goes here
#- file crypto/asymmetric_keys/Kconfig goes here
ACPI ia64=y x86=y
ACPI_SLEEP x86=y
ACPI_PROCFS_POWER ia64=y x86=y
+ACPI_REV_OVERRIDE_POSSIBLE all=y
ACPI_EC_DEBUGFS all=m
ACPI_AC x86=m
ACPI_BATTERY x86=m
ACPI_SBS x86=m
ACPI_CUSTOM_METHOD all=m
ACPI_BGRT all=y
+ACPI_NFIT all=m
#- file drivers/acpi/apei/Kconfig goes here
ACPI_EXTLOG all=m
PMIC_OPREGION all=y
BLK_DEV_RAM_COUNT all=16
BLK_DEV_RAM_SIZE all=16384
BLK_DEV_RAM_DAX all=y
-BLK_DEV_PMEM all=m
CDROM_PKTCDVD all=m
CDROM_PKTCDVD_BUFFERS all=8
CDROM_PKTCDVD_WCACHE all=y
#-
ZRAM all=m
ZRAM_LZ4_COMPRESS all=y
-ZRAM_DEBUG all=n
#-
#- *** FILE: drivers/bluetooth/Kconfig ***
#-
BT_HCIBTUSB all=m
BT_HCIBTUSB_BCM all=y
+BT_HCIBTUSB_RTL all=y
BT_HCIBTSDIO all=m
BT_HCIUART all=m
BT_HCIUART_H4 all=y
COMMON_CLK_SI5351 all=m
COMMON_CLK_PWM all=m
COMMON_CLK_CDCE706 all=m
-#- file drivers/clk/qcom/Kconfig goes here
#- file drivers/clk/bcm/Kconfig goes here
+#- file drivers/clk/hisilicon/Kconfig goes here
+#- file drivers/clk/qcom/Kconfig goes here
#- file drivers/clk/mvebu/Kconfig goes here
#- file drivers/clk/samsung/Kconfig goes here
+#- file drivers/clk/tegra/Kconfig goes here
#-
#- *** FILE: drivers/connector/Kconfig ***
DMI_SYSFS all=m
ISCSI_IBFT_FIND all=y
ISCSI_IBFT all=m
+#- file drivers/firmware/broadcom/Kconfig goes here
#- file drivers/firmware/google/Kconfig goes here
#- file drivers/firmware/efi/Kconfig goes here
DRM_R128 all=m
DRM_RADEON all=m
#- file drivers/gpu/drm/radeon/Kconfig goes here
+DRM_AMDGPU all=m
+#- file drivers/gpu/drm/amd/amdgpu/Kconfig goes here
#- file drivers/gpu/drm/nouveau/Kconfig goes here
DRM_I810 i386=m x86_64=m
#- file drivers/gpu/drm/i915/Kconfig goes here
#- file drivers/gpu/drm/tilcdc/Kconfig goes here
#- file drivers/gpu/drm/qxl/Kconfig goes here
#- file drivers/gpu/drm/bochs/Kconfig goes here
+#- file drivers/gpu/drm/virtio/Kconfig goes here
#- file drivers/gpu/drm/msm/Kconfig goes here
#- file drivers/gpu/drm/tegra/Kconfig goes here
#- file drivers/gpu/drm/panel/Kconfig goes here
#- file drivers/gpu/drm/amd/amdkfd/Kconfig goes here
#- file drivers/gpu/drm/imx/Kconfig goes here
+#-
+#- *** FILE: drivers/gpu/drm/amd/amdgpu/Kconfig ***
+#-
+DRM_AMDGPU_CIK all=y
+DRM_AMDGPU_USERPTR all=y
+
#-
#- *** FILE: drivers/gpu/drm/amd/amdkfd/Kconfig ***
#-
#-
DRM_UDL all=m
+#-
+#- *** FILE: drivers/gpu/drm/virtio/Kconfig ***
+#-
+DRM_VIRTIO_GPU all=m
+
#-
#- *** FILE: drivers/gpu/drm/vmwgfx/Kconfig ***
#-
SENSORS_AMC6821 all=m
SENSORS_INA209 all=m
SENSORS_INA2XX all=m
+SENSORS_TC74 all=m
SENSORS_THMC50 all=m
SENSORS_TMP102 all=m
SENSORS_TMP103 all=m
KXCJK1013 all=m
MMA9551 all=m
MMA9553 all=m
+STK8312 all=m
+STK8BA50 all=m
#-
#- *** FILE: drivers/iio/adc/Kconfig ***
AD5764 all=m
AD5791 all=m
AD7303 all=m
+M62332 all=m
MAX517 all=m
MCP4725 all=m
MCP4922 all=m
#-
#- *** FILE: drivers/iio/light/Kconfig ***
#-
+ACPI_ALS all=m
ADJD_S311 all=m
AL3320A all=m
APDS9300 all=m
+BH1750 all=m
CM32181 all=m
CM3232 all=m
CM3323 all=m
JSA1212 all=m
SENSORS_LM3533 all=m
LTR501 all=m
+STK3310 all=m
TCS3414 all=m
TCS3472 all=m
SENSORS_TSL2563 all=m
AK09911 all=m
MAG3110 all=m
HID_SENSOR_MAGNETOMETER_3D all=m
+MMC35240 all=m
IIO_ST_MAGN_3AXIS all=m
+BMC150_MAGN all=m
#-
#- *** FILE: drivers/iio/orientation/Kconfig ***
#- *** FILE: drivers/input/Kconfig ***
#-
INPUT all=y
+INPUT_LEDS all=m
INPUT_FF_MEMLESS all=m
INPUT_POLLDEV all=m
INPUT_SPARSEKMAP all=m
INPUT_IDEAPAD_SLIDEBAR all=m
INPUT_SOC_BUTTON_ARRAY all=m
INPUT_DRV260X_HAPTICS all=m
+INPUT_DRV2665_HAPTICS all=m
INPUT_DRV2667_HAPTICS all=m
#-
TOUCHSCREEN_TI_AM335X_TSC all=m
TOUCHSCREEN_UCB1400 all=m sparc=n
TOUCHSCREEN_PIXCIR all=m
+TOUCHSCREEN_WDT87XX_I2C all=m
TOUCHSCREEN_WM831X all=m
TOUCHSCREEN_WM97XX all=m
TOUCHSCREEN_WM9705 all=y
LEDS_DELL_NETBOOKS all=m
LEDS_MC13783 all=m
LEDS_TCA6507 all=m
+LEDS_TLC591XX all=m
LEDS_LM355x all=m
LEDS_OT200 all=m
LEDS_MENF21BMC all=m
DM_THIN_PROVISIONING all=m
DM_CACHE all=m
DM_CACHE_MQ all=m
+DM_CACHE_SMQ all=m
DM_CACHE_CLEANER all=m
DM_ERA all=m
DM_MIRROR all=m
#- file drivers/media/pci/saa7146/Kconfig goes here
#- file drivers/media/pci/solo6x10/Kconfig goes here
#- file drivers/media/pci/tw68/Kconfig goes here
+#- file drivers/media/pci/dt3155/Kconfig goes here
#- Media capture/analog/hybrid TV support
#- file drivers/media/pci/cx18/Kconfig goes here
#- file drivers/media/pci/cx23885/Kconfig goes here
#- file drivers/media/pci/bt8xx/Kconfig goes here
#- file drivers/media/pci/saa7134/Kconfig goes here
#- file drivers/media/pci/saa7164/Kconfig goes here
+#- file drivers/media/pci/cobalt/Kconfig goes here
#- Media digital TV PCI Adapters
#- file drivers/media/pci/ttpci/Kconfig goes here
#- file drivers/media/pci/b2c2/Kconfig goes here
VIDEO_BT848 all=m sparc=n
DVB_BT8XX all=m
+#-
+#- *** FILE: drivers/media/pci/cobalt/Kconfig ***
+#-
+VIDEO_COBALT all=m
+
#-
#- *** FILE: drivers/media/pci/cx18/Kconfig ***
#-
#-
DVB_DM1105 all=m
+#-
+#- *** FILE: drivers/media/pci/dt3155/Kconfig ***
+#-
+VIDEO_DT3155 all=m
+
#-
#- *** FILE: drivers/media/pci/ivtv/Kconfig ***
#-
VIDEO_ADV_DEBUG all=n
VIDEO_FIXED_MINOR_RANGES all=n
VIDEO_TUNER all=m sparc=
+V4L2_FLASH_LED_CLASS all=m
VIDEOBUF2_CORE all=m
VIDEOBUF2_MEMOPS all=m
VIDEOBUF2_VMALLOC all=m
#- file drivers/misc/cb710/Kconfig goes here
#- file drivers/misc/ti-st/Kconfig goes here
#- file drivers/misc/lis3lv02d/Kconfig goes here
-#- file drivers/misc/carma/Kconfig goes here
#- file drivers/misc/altera-stapl/Kconfig goes here
#- file drivers/misc/mei/Kconfig goes here
#- file drivers/misc/vmw_vmci/Kconfig goes here
#-
#- Intel MIC Bus Driver
INTEL_MIC_BUS all=m
+#- SCIF Bus Driver
+SCIF_BUS all=m
#- Intel MIC Host Driver
INTEL_MIC_HOST all=m
#- Intel MIC Card Driver
INTEL_MIC_CARD all=m
+#- SCIF Driver
+SCIF all=m
#-
#- *** FILE: drivers/misc/ti-st/Kconfig ***
MMC_REALTEK_PCI all=m
MMC_REALTEK_USB all=m
MMC_TOSHIBA_PCI all=m
+MMC_MTK all=m
#-
#- *** FILE: drivers/mtd/Kconfig ***
MACVTAP all=m
IPVLAN all=m
VXLAN all=m
+GENEVE all=m
NETCONSOLE all=m
NETCONSOLE_DYNAMIC all=y
NTB_NETDEV all=m
RIONET_TX_SIZE all=128
RIONET_RX_SIZE all=128
TUN all=m
+TUN_VNET_CROSS_LE all=n
VETH all=m
VIRTIO_NET all=m
NLMON all=m
#- file drivers/net/ethernet/broadcom/Kconfig goes here
#- file drivers/net/ethernet/brocade/Kconfig goes here
#- file drivers/net/ethernet/calxeda/Kconfig goes here
+#- file drivers/net/ethernet/cavium/Kconfig goes here
#- file drivers/net/ethernet/chelsio/Kconfig goes here
#- file drivers/net/ethernet/cirrus/Kconfig goes here
#- file drivers/net/ethernet/cisco/Kconfig goes here
#- file drivers/net/ethernet/dec/Kconfig goes here
#- file drivers/net/ethernet/dlink/Kconfig goes here
#- file drivers/net/ethernet/emulex/Kconfig goes here
+#- file drivers/net/ethernet/ezchip/Kconfig goes here
#- file drivers/net/ethernet/neterion/Kconfig goes here
#- file drivers/net/ethernet/faraday/Kconfig goes here
#- file drivers/net/ethernet/freescale/Kconfig goes here
#-
NET_CALXEDA_XGMAC all=m
+#-
+#- *** FILE: drivers/net/ethernet/cavium/Kconfig ***
+#-
+NET_VENDOR_CAVIUM all=m
+THUNDER_NIC_PF all=m
+THUNDER_NIC_VF all=m
+LIQUIDIO all=m
+
#-
#- *** FILE: drivers/net/ethernet/chelsio/Kconfig ***
#-
#- *** FILE: drivers/net/ethernet/emulex/benet/Kconfig ***
#-
BE2NET all=m
+BE2NET_HWMON all=y
BE2NET_VXLAN all=y
+#-
+#- *** FILE: drivers/net/ethernet/ezchip/Kconfig ***
+#-
+NET_VENDOR_EZCHIP all=y
+
#-
#- *** FILE: drivers/net/ethernet/freescale/Kconfig ***
#-
MLX4_EN_VXLAN all=y
MLX4_CORE all=m
+#-
+#- *** FILE: drivers/net/ethernet/mellanox/mlx5/core/Kconfig ***
+#-
+MLX5_CORE all=m
+MLX5_CORE_EN all=y
+
#-
#- *** FILE: drivers/net/ethernet/micrel/Kconfig ***
#-
#-
#- *** FILE: drivers/net/ethernet/renesas/Kconfig ***
#-
+NET_VENDOR_RENESAS all=y
SH_ETH all=m
#-
SFC_MTD all=y
SFC_MCDI_MON all=y
SFC_SRIOV all=y
+SFC_MCDI_LOGGING all=y
#-
#- *** FILE: drivers/net/ethernet/silan/Kconfig ***
IEEE802154_AT86RF230 all=m
IEEE802154_MRF24J40 all=m
IEEE802154_CC2520 all=m
+IEEE802154_ATUSB all=m
#-
#- *** FILE: drivers/net/irda/Kconfig ***
#- MII PHY device drivers
AT803X_PHY all=m
AMD_PHY all=m
-AMD_XGBE_PHY all=m
MARVELL_PHY all=m
DAVICOM_PHY all=m
QSEMI_PHY all=m
STE10XP all=m
LSI_ET1011C_PHY all=m
MICREL_PHY all=m
+DP83867_PHY all=m
FIXED_PHY all=y
MDIO_BITBANG all=m
MDIO_GPIO all=m
#- file drivers/net/wireless/orinoco/Kconfig goes here
#- file drivers/net/wireless/p54/Kconfig goes here
#- file drivers/net/wireless/rt2x00/Kconfig goes here
+#- file drivers/net/wireless/mediatek/Kconfig goes here
#- file drivers/net/wireless/rtlwifi/Kconfig goes here
#- file drivers/net/wireless/ti/Kconfig goes here
#- file drivers/net/wireless/zd1211rw/Kconfig goes here
LIBERTAS_DEBUG all=n
LIBERTAS_MESH all=y
+#-
+#- *** FILE: drivers/net/wireless/mediatek/Kconfig ***
+#-
+WL_MEDIATEK all=y
+#- file drivers/net/wireless/mediatek/mt7601u/Kconfig goes here
+
+#-
+#- *** FILE: drivers/net/wireless/mediatek/mt7601u/Kconfig ***
+#-
+MT7601U all=m
+
#-
#- *** FILE: drivers/net/wireless/mwifiex/Kconfig ***
#-
#- file drivers/nfc/microread/Kconfig goes here
#- file drivers/nfc/nfcmrvl/Kconfig goes here
#- file drivers/nfc/st21nfca/Kconfig goes here
-#- file drivers/nfc/st21nfcb/Kconfig goes here
+#- file drivers/nfc/st-nci/Kconfig goes here
#- file drivers/nfc/nxp-nci/Kconfig goes here
#-
#-
NFC_MRVL all=m
NFC_MRVL_USB all=m
+NFC_MRVL_UART all=m
#-
#- *** FILE: drivers/nfc/nxp-nci/Kconfig ***
NFC_PN544_I2C all=m
NFC_PN544_MEI all=m
+#-
+#- *** FILE: drivers/nfc/st-nci/Kconfig ***
+#-
+NFC_ST_NCI all=m
+NFC_ST_NCI_I2C all=m
+
#-
#- *** FILE: drivers/nfc/st21nfca/Kconfig ***
#-
NFC_ST21NFCA_I2C all=m
#-
-#- *** FILE: drivers/nfc/st21nfcb/Kconfig ***
+#- *** FILE: drivers/ntb/Kconfig ***
#-
-NFC_ST21NFCB all=m
-NFC_ST21NFCB_I2C all=m
+NTB all=m
+#- file drivers/ntb/hw/Kconfig goes here
+#- file drivers/ntb/test/Kconfig goes here
+NTB_TRANSPORT all=m
#-
-#- *** FILE: drivers/ntb/Kconfig ***
+#- *** FILE: drivers/ntb/hw/intel/Kconfig ***
#-
-NTB all=m
+NTB_INTEL all=m
+
+#-
+#- *** FILE: drivers/ntb/test/Kconfig ***
+#-
+NTB_PINGPONG all=m
+NTB_TOOL all=m
+
+#-
+#- *** FILE: drivers/nvdimm/Kconfig ***
+#-
+BLK_DEV_PMEM all=m
+ND_BLK all=m
+BTT all=y
+
+#-
+#- *** FILE: drivers/of/Kconfig ***
+#-
+OF all=n
#-
#- *** FILE: drivers/parisc/Kconfig ***
#-
GENERIC_PHY all=y
PHY_EXYNOS_MIPI_VIDEO all=m
+PHY_PXA_28NM_HSIC all=m
+PHY_PXA_28NM_USB2 all=m
OMAP_USB2 all=m
TWL4030_USB all=m
BCM_KONA_USB2_PHY all=m
PHY_SAMSUNG_USB2 all=m
+PHY_TUSB1210 all=m
#-
#- *** FILE: drivers/pinctrl/Kconfig ***
DELL_WMI all=m
DELL_WMI_AIO all=m
DELL_SMO8800 all=m
+DELL_RBTN all=m
FUJITSU_LAPTOP all=m
FUJITSU_LAPTOP_DEBUG all=n
FUJITSU_TABLET all=m
INTEL_RST all=m
INTEL_SMARTCONNECT all=m
PVPANIC all=m
+INTEL_PMC_IPC all=m
#-
#- *** FILE: drivers/pnp/Kconfig ***
CHARGER_MANAGER all=y
CHARGER_BQ2415X all=m
CHARGER_BQ24190 all=m
+CHARGER_BQ24257 all=m
CHARGER_BQ24735 all=m
+CHARGER_BQ25890 all=m
CHARGER_SMB347 all=m
BATTERY_GAUGE_LTC2941 all=m
AB8500_BM all=n
BATTERY_GOLDFISH all=m
+CHARGER_RT9455 all=m
#- file drivers/power/reset/Kconfig goes here
#- file drivers/power/avs/Kconfig goes here
REGULATOR_PCF50633 all=m
REGULATOR_PFUZE100 all=m
REGULATOR_PWM all=m
+REGULATOR_QCOM_SPMI all=m
REGULATOR_RN5T618 all=m
REGULATOR_SKY81452 all=m
REGULATOR_TPS51632 all=m
RTC_LIB all=y
RTC_CLASS all=y
RTC_HCTOSYS all=y
-RTC_SYSTOHC all=y
RTC_HCTOSYS_DEVICE all="rtc0"
+RTC_SYSTOHC all=y
+RTC_SYSTOHC_DEVICE all="rtc0"
RTC_DEBUG all=n
#- RTC interfaces
RTC_INTF_SYSFS all=y
RTC_DRV_PCAP all=m
RTC_DRV_MC13XXX all=m
RTC_DRV_MOXART all=m
+RTC_DRV_MT6397 all=m
RTC_DRV_XGENE all=m
#- HID Sensor RTC drivers
RTC_DRV_HID_SENSOR_TIME all=m
LIBFCOE all=m
FCOE all=m
FCOE_FNIC all=m
+SCSI_SNIC all=m
+SCSI_SNIC_DEBUG_FS all=y
SCSI_DMX3191D all=m
SCSI_DTC3280 alpha=m i386=m
SCSI_EATA all=m
SPI_TOPCLIFF_PCH all=m
SPI_XCOMM all=m
SPI_XILINX all=m
+SPI_ZYNQMP_GQSPI all=m
SPI_DESIGNWARE all=y
SPI_DW_PCI all=m
SPI_DW_MID_DMA all=y
#- file drivers/staging/unisys/Kconfig goes here
#- file drivers/staging/clocking-wizard/Kconfig goes here
#- file drivers/staging/fbtft/Kconfig goes here
-#- file drivers/staging/i2o/Kconfig goes here
#- file drivers/staging/fsl-mc/Kconfig goes here
+#- file drivers/staging/wilc1000/Kconfig goes here
#-
#- *** FILE: drivers/staging/comedi/Kconfig ***
COMEDI_USBDUXFAST all=m
COMEDI_USBDUXSIGMA all=m
COMEDI_VMK80XX all=m
+COMEDI_8255_SA all=m
COMEDI_KCOMEDILIB all=m
COMEDI_AMPLC_DIO200 all=m
COMEDI_AMPLC_PC236 all=m
FB_TFT_HX8340BN all=m
FB_TFT_HX8347D all=m
FB_TFT_HX8353D all=m
+FB_TFT_HX8357D all=m
FB_TFT_ILI9163 all=m
FB_TFT_ILI9320 all=m
FB_TFT_ILI9325 all=m
#-
GS_FPGABOOT all=m
-#-
-#- *** FILE: drivers/staging/i2o/Kconfig ***
-#-
-I2O all=m sparc=n
-I2O_LCT_NOTIFY_ON_CHANGES all=y
-I2O_EXT_ADAPTEC all=y
-I2O_EXT_ADAPTEC_DMA64 all=y
-I2O_CONFIG all=m sparc64=n
-I2O_CONFIG_OLD_IOCTL all=y x86_64=n
-I2O_BUS all=m
-I2O_BLOCK all=m
-I2O_SCSI all=m
-I2O_PROC all=m
-
#-
#- *** FILE: drivers/staging/iio/Kconfig ***
#-
#- file drivers/staging/media/bcm2048/Kconfig goes here
#- file drivers/staging/media/cxd2099/Kconfig goes here
#- file drivers/staging/media/davinci_vpfe/Kconfig goes here
-#- file drivers/staging/media/dt3155v4l/Kconfig goes here
#- file drivers/staging/media/mn88472/Kconfig goes here
#- file drivers/staging/media/mn88473/Kconfig goes here
#- file drivers/staging/media/omap4iss/Kconfig goes here
#-
DVB_CXD2099 all=m
-#-
-#- *** FILE: drivers/staging/media/dt3155v4l/Kconfig ***
-#-
-VIDEO_DT3155 all=m
-DT3155_CCIR all=y
-DT3155_STREAMING all=y
-
#-
#- *** FILE: drivers/staging/media/lirc/Kconfig ***
#-
#- *** FILE: drivers/staging/unisys/Kconfig ***
#-
UNISYSSPAR all=y
-#- file drivers/staging/unisys/visorutil/Kconfig goes here
-#- file drivers/staging/unisys/visorchannel/Kconfig goes here
-#- file drivers/staging/unisys/visorchipset/Kconfig goes here
-#- file drivers/staging/unisys/uislib/Kconfig goes here
-#- file drivers/staging/unisys/virtpci/Kconfig goes here
-#- file drivers/staging/unisys/virthba/Kconfig goes here
+#- file drivers/staging/unisys/visorbus/Kconfig goes here
+#- file drivers/staging/unisys/visornic/Kconfig goes here
#-
-#- *** FILE: drivers/staging/unisys/uislib/Kconfig ***
+#- *** FILE: drivers/staging/unisys/visorbus/Kconfig ***
#-
-UNISYS_UISLIB all=m
+UNISYS_VISORBUS all=m
#-
-#- *** FILE: drivers/staging/unisys/virthba/Kconfig ***
+#- *** FILE: drivers/staging/unisys/visornic/Kconfig ***
#-
-UNISYS_VIRTHBA all=m
-
-#-
-#- *** FILE: drivers/staging/unisys/virtpci/Kconfig ***
-#-
-UNISYS_VIRTPCI all=m
-
-#-
-#- *** FILE: drivers/staging/unisys/visorchannel/Kconfig ***
-#-
-UNISYS_VISORCHANNEL all=m
-
-#-
-#- *** FILE: drivers/staging/unisys/visorchipset/Kconfig ***
-#-
-UNISYS_VISORCHIPSET all=m
-
-#-
-#- *** FILE: drivers/staging/unisys/visorutil/Kconfig ***
-#-
-UNISYS_VISORUTIL all=m
+UNISYS_VISORNIC all=m
#-
#- *** FILE: drivers/staging/vme/devices/Kconfig ***
#- *** FILE: drivers/thermal/Kconfig ***
#-
THERMAL all=y
+THERMAL_WRITABLE_TRIPS all=y
THERMAL_DEFAULT_GOV_STEP_WISE all=y
THERMAL_DEFAULT_GOV_FAIR_SHARE all=n
THERMAL_DEFAULT_GOV_USER_SPACE all=n
+THERMAL_DEFAULT_GOV_POWER_ALLOCATOR all=n
THERMAL_GOV_FAIR_SHARE all=y
THERMAL_GOV_BANG_BANG all=y
THERMAL_GOV_USER_SPACE all=y
+THERMAL_GOV_POWER_ALLOCATOR all=y
CPU_THERMAL all=y
THERMAL_EMULATION all=n
INTEL_POWERCLAMP all=m
HVC_DRIVER ppc64=y
HVC_CONSOLE ppc64=n
HVC_RTAS ppc=y ppc64=y
-HVC_BEAT ppc64=n
HVC_XEN all=y
HVC_XEN_FRONTEND all=y
HVC_UDBG all=n
SERIAL_OF_PLATFORM_NWPSERIAL powerpc=m
SERIAL_SCCNXP all=m
SERIAL_SC16IS7XX all=m
+SERIAL_SC16IS7XX_I2C all=y
+SERIAL_SC16IS7XX_SPI all=y
SERIAL_TIMBERDALE all=m
SERIAL_ALTERA_JTAGUART all=m
SERIAL_ALTERA_UART all=m
UIO_SERCOS3 all=m
UIO_PCI_GENERIC all=m
UIO_NETX all=m
+UIO_PRUSS all=m
UIO_MF624 all=m
#-
USB_OTG_WHITELIST all=y
USB_OTG_BLACKLIST_HUB all=n
USB_OTG_FSM all=m
+USB_ULPI_BUS all=m
#-
#- *** FILE: drivers/usb/dwc2/Kconfig ***
#- *** FILE: drivers/usb/dwc3/Kconfig ***
#-
USB_DWC3 all=m
+USB_DWC3_ULPI all=y
USB_DWC3_HOST all=n
USB_DWC3_GADGET all=n
USB_DWC3_DUAL_ROLE all=y
#-
VHOST_NET all=m
VHOST_SCSI all=m
+VHOST_CROSS_ENDIAN_LEGACY all=n
#-
#- *** FILE: drivers/video/Kconfig ***
DW_WATCHDOG all=m
RN5T618_WATCHDOG all=m
TWL4030_WATCHDOG powerpc=m
+MAX63XX_WATCHDOG all=m
RETU_WATCHDOG all=m
ACQUIRE_WDT i386=m x86_64=m
ADVANTECH_WDT i386=m x86_64=m
#- file fs/btrfs/Kconfig goes here
#- file fs/nilfs2/Kconfig goes here
#- file fs/f2fs/Kconfig goes here
-#- file fs/aufs/Kconfig goes here
FS_DAX all=y
FS_POSIX_ACL all=y
FILE_LOCKING all=y
#- file fs/sysv/Kconfig goes here
#- file fs/ufs/Kconfig goes here
#- file fs/exofs/Kconfig goes here
+#- file fs/aufs/Kconfig goes here
#- file fs/exofs/Kconfig.ore goes here
NETWORK_FILESYSTEMS all=y
#- file fs/nfs/Kconfig goes here
CIFS_DEBUG2 all=n
CIFS_DFS_UPCALL all=n
CIFS_SMB2 all=y
+CIFS_SMB311 all=y
CIFS_FSCACHE all=y
#-
F2FS_FS_POSIX_ACL all=y
F2FS_FS_SECURITY all=y
F2FS_CHECK_FS all=y
+F2FS_FS_ENCRYPTION all=y
F2FS_IO_TRACE all=y
#-
PROC_FS all=y
PROC_KCORE all=y
PROC_SYSCTL all=y
+PROC_CHILDREN all=y
#-
#- *** FILE: fs/pstore/Kconfig ***
TASK_XACCT all=y
TASK_IO_ACCOUNTING all=y
TREE_RCU all=y
+RCU_EXPERT all=n
TASKS_RCU all=n
RCU_USER_QS all=n
RCU_FANOUT all=32 alpha=64 ia64=64 ppc64=64 sparc64=64 x86_64=64
RCU_FANOUT_LEAF all=16
-RCU_FANOUT_EXACT all=n
RCU_FAST_NO_HZ all=y
RCU_KTHREAD_PRIO all=0
RCU_NOCB_CPU all=n
DEBUG_CREDENTIALS all=n
SPARSE_RCU_POINTER all=n
RCU_TORTURE_TEST all=m
+RCU_TORTURE_TEST_SLOW_PREINIT all=n
RCU_TORTURE_TEST_SLOW_INIT all=n
+RCU_TORTURE_TEST_SLOW_CLEANUP all=n
RCU_CPU_STALL_TIMEOUT all=60
RCU_CPU_STALL_INFO all=n
RCU_TRACE all=n
+RCU_EQS_DEBUG all=n
DEBUG_BLOCK_EXT_DEVT all=n
NOTIFIER_ERROR_INJECTION all=m
CPU_NOTIFIER_ERROR_INJECT all=m
ZSMALLOC all=y
PGTABLE_MAPPING all=n
ZSMALLOC_STAT all=y
+DEFERRED_STRUCT_PAGE_INIT all=n
#-
#- *** FILE: mm/Kconfig.debug ***
NET_IPVTI all=m
NET_FOU all=m
NET_FOU_IP_TUNNELS all=y
-GENEVE all=m
+GENEVE_CORE all=m
INET_AH all=m
INET_ESP all=m
INET_IPCOMP all=m
TCP_CONG_YEAH all=m
TCP_CONG_ILLINOIS all=m
TCP_CONG_DCTCP all=m
+TCP_CONG_CDG all=m
DEFAULT_BIC all=n
DEFAULT_CUBIC all=y
DEFAULT_HTCP all=n
#-
#- *** FILE: net/netfilter/Kconfig ***
#-
+NETFILTER_INGRESS all=y
NETFILTER_NETLINK_ACCT all=m
NETFILTER_NETLINK_QUEUE all=m
NETFILTER_NETLINK_LOG all=m
NF_NAT_REDIRECT all=m
NF_TABLES all=m
NF_TABLES_INET all=m
+NF_TABLES_NETDEV all=m
NFT_EXTHDR all=m
NFT_META all=m
NFT_CT all=m
#-
NFC_NCI all=m
NFC_NCI_SPI all=y
+NFC_NCI_UART all=m
#-
#- *** FILE: net/openvswitch/Kconfig ***
NET_CLS_FLOW all=m
NET_CLS_CGROUP all=y
NET_CLS_BPF all=m
+NET_CLS_FLOWER all=m
NET_EMATCH all=y
NET_EMATCH_STACK all=32
NET_EMATCH_CMP all=m
SUNRPC_GSS all=m
RPCSEC_GSS_KRB5 all=m
SUNRPC_DEBUG all=y
-SUNRPC_XPRT_RDMA_CLIENT all=m
-SUNRPC_XPRT_RDMA_SERVER all=m
+SUNRPC_XPRT_RDMA all=m
#-
#- *** FILE: net/switchdev/Kconfig ***
SND_FIREWORKS all=m
SND_BEBOB all=m
+#-
+#- *** FILE: sound/hda/Kconfig ***
+#-
+SND_HDA_PREALLOC_SIZE all=2048
+
#-
#- *** FILE: sound/isa/Kconfig ***
#-
#- *** FILE: sound/pci/hda/Kconfig ***
#-
SND_HDA_INTEL all=m sparc=n
-SND_HDA_PREALLOC_SIZE all=2048
SND_HDA_HWDEP all=y
SND_HDA_RECONFIG all=y
SND_HDA_INPUT_BEEP all=y
SND_HDA_INPUT_BEEP_MODE all=1
-SND_HDA_INPUT_JACK all=y
SND_HDA_PATCH_LOADER all=y
SND_HDA_CODEC_REALTEK all=m
#- Set to Y if you want auto-loading the codec driver
#- file sound/soc/omap/Kconfig goes here
#- file sound/soc/kirkwood/Kconfig goes here
#- file sound/soc/intel/Kconfig goes here
+#- file sound/soc/mediatek/Kconfig goes here
#- file sound/soc/mxs/Kconfig goes here
#- file sound/soc/pxa/Kconfig goes here
#- file sound/soc/qcom/Kconfig goes here
#- file sound/soc/txx9/Kconfig goes here
#- file sound/soc/ux500/Kconfig goes here
#- file sound/soc/xtensa/Kconfig goes here
+#- file sound/soc/zte/Kconfig goes here
#- file sound/soc/codecs/Kconfig goes here
#- file sound/soc/generic/Kconfig goes here
#- *** FILE: sound/soc/codecs/Kconfig ***
#-
SND_SOC_ALL_CODECS all=m
+SND_SOC_AC97_CODEC all=m
SND_SOC_ADAU1701 all=m
SND_SOC_AK4104 all=m
SND_SOC_AK4554 all=m
SND_SOC_STA350 all=m
SND_SOC_TAS2552 all=m
SND_SOC_TAS5086 all=m
+SND_SOC_TAS571X all=m
SND_SOC_TFA9879 all=m
SND_SOC_TLV320AIC23 all=m
SND_SOC_TLV320AIC23_I2C all=m
SND_SOC_INTEL_BYTCR_RT5640_MACH all=m
SND_SOC_INTEL_CHT_BSW_RT5672_MACH all=m
SND_SOC_INTEL_CHT_BSW_RT5645_MACH all=m
+SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH all=m
#-
#- *** FILE: sound/soc/qcom/Kconfig ***
#-
#- *** PROBABLY REMOVED OPTIONS ***
#-
+AMD_XGBE_PHY all=m
ARM_AT91_ETHER all=m
BLK_DEV_CELLEB ppc64=m
BLK_DEV_XIP all=y
+DT3155_CCIR all=y
+DT3155_STREAMING all=y
DWC3_HOST_USB3_LPM_ENABLE all=y
EXT2_FS_XIP all=y
FS_XIP all=y
HID_HUION all=m
+HVC_BEAT ppc64=n
+I2O all=m sparc=n
+I2O_BLOCK all=m
+I2O_BUS all=m
+I2O_CONFIG all=m sparc64=n
+I2O_CONFIG_OLD_IOCTL all=y x86_64=n
+I2O_EXT_ADAPTEC all=y
+I2O_EXT_ADAPTEC_DMA64 all=y
+I2O_LCT_NOTIFY_ON_CHANGES all=y
+I2O_PROC all=m
+I2O_SCSI all=m
INIT_FALLBACK all=y
INTEL_MID_DMAC all=m
KEYS_DEBUG_PROC_KEYS all=n
LINE6_USB all=m
LINE6_USB_IMPULSE_RESPONSE all=n
MEDIA_PARPORT_SUPPORT all=y
+NFC_ST21NFCB all=m
+NFC_ST21NFCB_I2C all=m
PATA_SCC ppc64=m
+RCU_FANOUT_EXACT all=n
SERIAL_MFD_HSU all=m
SERIAL_MRST_MAX3110 all=m
+SND_HDA_INPUT_JACK all=y
+SUNRPC_XPRT_RDMA_CLIENT all=m
+SUNRPC_XPRT_RDMA_SERVER all=m
TCG_ST33_I2C all=m
TCG_TIS_I2C_ST33 all=m
TCM_USER all=m
TIPC_PORTS all=8191
TOUCHSCREEN_CLEARPAD_TM1217 all=m
UNISYS_CHANNELSTUB all=m
+UNISYS_UISLIB all=m
+UNISYS_VIRTHBA all=m
+UNISYS_VIRTPCI all=m
+UNISYS_VISORCHANNEL all=m
+UNISYS_VISORCHIPSET all=m
+UNISYS_VISORUTIL all=m
VIDEO_BTCX all=m sparc=
VIDEO_BWQCAM all=m
VIDEO_CQCAM all=m
VIDEO_SAA7191 all=m
VIDEO_TLG2300 all=m
VIDEO_W9966 all=m
+ZRAM_DEBUG all=n