From 0c3ec466e69be22e05fbcda066466fef09e36a68 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= Date: Sun, 22 Jul 2012 22:42:18 +0200 Subject: [PATCH] - builds now (without vserver) --- kernel-apparmor.patch | 6 +- kernel-aufs3.patch | 757 ++++++++++++++++++++++++---------------- kernel-esfq.patch | 4 +- kernel-multiarch.config | 2 +- kernel-unionfs.patch | 6 +- 5 files changed, 465 insertions(+), 310 deletions(-) diff --git a/kernel-apparmor.patch b/kernel-apparmor.patch index a22e790b..49f4be30 100644 --- a/kernel-apparmor.patch +++ b/kernel-apparmor.patch @@ -684,9 +684,9 @@ index 0000000..084232b + struct apparmor_audit_data aad = { }; + struct lsm_network_audit net = { }; + if (sk) { -+ COMMON_AUDIT_DATA_INIT(&sa, NET); ++ sa.type = LSM_AUDIT_DATA_NET; + } else { -+ COMMON_AUDIT_DATA_INIT(&sa, NONE); ++ sa.type = LSM_AUDIT_DATA_NONE; + } + /* todo fill in socket addr info */ + sa.aad = &aad; @@ -1372,7 +1372,7 @@ index 0000000..63d8493 + complain_error(error) : error; + } + -+ COMMON_AUDIT_DATA_INIT(&sa, NONE); ++ sa.type = LSM_AUDIT_DATA_NONE; + sa.aad = &aad; + sa.aad->op = op; + sa.aad->name = name; diff --git a/kernel-aufs3.patch b/kernel-aufs3.patch index b84ccd4f..61ba23c5 100644 --- a/kernel-aufs3.patch +++ b/kernel-aufs3.patch @@ -1,4 +1,4 @@ -aufs3.4 kbuild patch +aufs3.x-rcN kbuild patch diff --git a/fs/Kconfig b/fs/Kconfig index f95ae3a..6d8a9a5 100644 @@ -22,7 +22,7 @@ index 2fb9779..abefac5 100644 obj-$(CONFIG_PSTORE) += pstore/ +obj-$(CONFIG_AUFS_FS) += aufs/ diff --git a/include/linux/Kbuild b/include/linux/Kbuild -index 3c9b616..8704efa 100644 +index 8760be3..a1b8446 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild @@ -66,6 +66,7 @@ header-y += atmppp.h @@ -33,13 +33,26 @@ index 3c9b616..8704efa 100644 header-y += auto_fs.h header-y += auto_fs4.h header-y += auxvec.h -aufs3.4 base patch +aufs3.x-rcN base patch +diff --git a/fs/inode.c b/fs/inode.c +index c99163b..7f772fd 100644 +--- a/fs/inode.c ++++ b/fs/inode.c +@@ -1491,7 +1491,7 @@ static int relatime_need_update(struct vfsmount *mnt, struct inode *inode, + * This does the actual work of updating an inodes time or version. Must have + * had called mnt_want_write() before calling this. + */ +-static int update_time(struct inode *inode, struct timespec *time, int flags) ++int update_time(struct inode *inode, struct timespec *time, int flags) + { + if (inode->i_op->update_time) + return inode->i_op->update_time(inode, time, flags); diff --git a/fs/namei.c b/fs/namei.c -index c427919..7ff959b 100644 +index 7d69419..18c9782 100644 --- a/fs/namei.c +++ b/fs/namei.c -@@ -1831,7 +1831,7 @@ int vfs_path_lookup(struct dentry *dentry, struct vfsmount *mnt, +@@ -1864,7 +1864,7 @@ int vfs_path_lookup(struct dentry *dentry, struct vfsmount *mnt, * needs parent already locked. Doesn't follow mounts. * SMP-safe. */ @@ -49,10 +62,10 @@ index c427919..7ff959b 100644 return __lookup_hash(&nd->last, nd->path.dentry, nd); } diff --git a/fs/splice.c b/fs/splice.c -index f847684..f871233 100644 +index c9f1318..490239f 100644 --- a/fs/splice.c +++ b/fs/splice.c -@@ -1084,8 +1084,8 @@ EXPORT_SYMBOL(generic_splice_sendpage); +@@ -1086,8 +1086,8 @@ EXPORT_SYMBOL(generic_splice_sendpage); /* * Attempt to initiate a splice from pipe to file. */ @@ -63,7 +76,7 @@ index f847684..f871233 100644 { ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); -@@ -1112,9 +1112,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out, +@@ -1114,9 +1114,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. */ @@ -76,6 +89,18 @@ index f847684..f871233 100644 { ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); +diff --git a/include/linux/fs.h b/include/linux/fs.h +index 17fd887..9c75a47 100644 +--- a/include/linux/fs.h ++++ b/include/linux/fs.h +@@ -2591,6 +2591,7 @@ extern int inode_change_ok(const struct inode *, struct iattr *); + extern int inode_newsize_ok(const struct inode *, loff_t offset); + extern void setattr_copy(struct inode *inode, const struct iattr *attr); + ++extern int update_time(struct inode *, struct timespec *, int); + extern int file_update_time(struct file *file); + + extern int generic_show_options(struct seq_file *m, struct dentry *root); diff --git a/include/linux/namei.h b/include/linux/namei.h index ffc0213..ef35a31 100644 --- a/include/linux/namei.h @@ -103,13 +128,21 @@ index 26e5b61..3ffef2f 100644 + struct pipe_inode_info *pipe, size_t len, + unsigned int flags); #endif -aufs3.4 standalone patch +aufs3.x-rcN standalone patch diff --git a/fs/file_table.c b/fs/file_table.c -index 70f2a0f..146a3d7 100644 +index a305d9e..6a768be 100644 --- a/fs/file_table.c +++ b/fs/file_table.c -@@ -442,6 +442,8 @@ void file_sb_list_del(struct file *file) +@@ -35,6 +35,7 @@ struct files_stat_struct files_stat = { + }; + + DEFINE_LGLOCK(files_lglock); ++EXPORT_SYMBOL(files_lglock); + + /* SLAB cache for file structures */ + static struct kmem_cache *filp_cachep __read_mostly; +@@ -441,6 +442,8 @@ void file_sb_list_del(struct file *file) } } @@ -119,7 +152,7 @@ index 70f2a0f..146a3d7 100644 /* diff --git a/fs/inode.c b/fs/inode.c -index 9f4f5fe..bb0f3ba 100644 +index 7f772fd..e789d2f 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -56,6 +56,7 @@ static struct hlist_head *inode_hashtable __read_mostly; @@ -130,11 +163,19 @@ index 9f4f5fe..bb0f3ba 100644 /* * Empty aops. Can be used for the cases where the user does not +@@ -1507,6 +1508,7 @@ int update_time(struct inode *inode, struct timespec *time, int flags) + mark_inode_dirty_sync(inode); + return 0; + } ++EXPORT_SYMBOL(update_time); + + /** + * touch_atime - update the access time diff --git a/fs/namei.c b/fs/namei.c -index 7ff959b..b170167 100644 +index 18c9782..f09edf3 100644 --- a/fs/namei.c +++ b/fs/namei.c -@@ -1835,6 +1835,7 @@ struct dentry *lookup_hash(struct nameidata *nd) +@@ -1868,6 +1868,7 @@ struct dentry *lookup_hash(struct nameidata *nd) { return __lookup_hash(&nd->last, nd->path.dentry, nd); } @@ -143,10 +184,18 @@ index 7ff959b..b170167 100644 /** * lookup_one_len - filesystem helper to lookup single pathname component diff --git a/fs/namespace.c b/fs/namespace.c -index e608199..38fcc2e 100644 +index 1e4a5fe..06aa768 100644 --- a/fs/namespace.c +++ b/fs/namespace.c -@@ -1339,6 +1339,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg, +@@ -50,6 +50,7 @@ EXPORT_SYMBOL_GPL(fs_kobj); + * tree or hash is modified or when a vfsmount structure is modified. + */ + DEFINE_BRLOCK(vfsmount_lock); ++EXPORT_SYMBOL(vfsmount_lock); + + static inline unsigned long hash(struct vfsmount *mnt, struct dentry *dentry) + { +@@ -1341,6 +1342,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg, } return 0; } @@ -216,7 +265,7 @@ index f104d56..54f36db 100644 static int fsnotify_mark_destroy(void *ignored) { diff --git a/fs/open.c b/fs/open.c -index 5720854..ec59242 100644 +index d6c79a0..9004a15 100644 --- a/fs/open.c +++ b/fs/open.c @@ -60,6 +60,7 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs, @@ -228,10 +277,10 @@ index 5720854..ec59242 100644 static long do_sys_truncate(const char __user *pathname, loff_t length) { diff --git a/fs/splice.c b/fs/splice.c -index f871233..70f5481 100644 +index 490239f..701d34a 100644 --- a/fs/splice.c +++ b/fs/splice.c -@@ -1108,6 +1108,7 @@ long do_splice_from(struct pipe_inode_info *pipe, struct file *out, +@@ -1110,6 +1110,7 @@ long do_splice_from(struct pipe_inode_info *pipe, struct file *out, return splice_write(pipe, out, ppos, len, flags); } @@ -239,7 +288,7 @@ index f871233..70f5481 100644 /* * Attempt to initiate a splice from a file to a pipe. -@@ -1134,6 +1135,7 @@ long do_splice_to(struct file *in, loff_t *ppos, +@@ -1136,6 +1137,7 @@ long do_splice_to(struct file *in, loff_t *ppos, return splice_read(in, ppos, pipe, len, flags); } @@ -248,16 +297,23 @@ index f871233..70f5481 100644 /** * splice_direct_to_actor - splices data directly between two non-pipes diff --git a/security/commoncap.c b/security/commoncap.c -index 71a166a..5d63aac 100644 +index 6dbae46..9f4f29a 100644 --- a/security/commoncap.c +++ b/security/commoncap.c -@@ -972,3 +972,4 @@ int cap_file_mmap(struct file *file, unsigned long reqprot, +@@ -979,9 +979,11 @@ int cap_mmap_addr(unsigned long addr) } return ret; } -+EXPORT_SYMBOL(cap_file_mmap); ++EXPORT_SYMBOL(cap_mmap_addr); + + int cap_mmap_file(struct file *file, unsigned long reqprot, + unsigned long prot, unsigned long flags) + { + return 0; + } ++EXPORT_SYMBOL(cap_mmap_file); diff --git a/security/device_cgroup.c b/security/device_cgroup.c -index c43a332..0c37289 100644 +index 442204c..e644a1c 100644 --- a/security/device_cgroup.c +++ b/security/device_cgroup.c @@ -7,6 +7,7 @@ @@ -268,7 +324,7 @@ index c43a332..0c37289 100644 #include #include #include -@@ -499,6 +500,7 @@ found: +@@ -493,6 +494,7 @@ found: return -EPERM; } @@ -277,10 +333,10 @@ index c43a332..0c37289 100644 int devcgroup_inode_mknod(int mode, dev_t dev) { diff --git a/security/security.c b/security/security.c -index bf619ff..60b996a 100644 +index 3efc9b1..c7afd35 100644 --- a/security/security.c +++ b/security/security.c -@@ -380,6 +380,7 @@ int security_path_rmdir(struct path *dir, struct dentry *dentry) +@@ -383,6 +383,7 @@ int security_path_rmdir(struct path *dir, struct dentry *dentry) return 0; return security_ops->path_rmdir(dir, dentry); } @@ -288,7 +344,7 @@ index bf619ff..60b996a 100644 int security_path_unlink(struct path *dir, struct dentry *dentry) { -@@ -396,6 +397,7 @@ int security_path_symlink(struct path *dir, struct dentry *dentry, +@@ -399,6 +400,7 @@ int security_path_symlink(struct path *dir, struct dentry *dentry, return 0; return security_ops->path_symlink(dir, dentry, old_name); } @@ -296,7 +352,7 @@ index bf619ff..60b996a 100644 int security_path_link(struct dentry *old_dentry, struct path *new_dir, struct dentry *new_dentry) -@@ -404,6 +406,7 @@ int security_path_link(struct dentry *old_dentry, struct path *new_dir, +@@ -407,6 +409,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); } @@ -304,7 +360,7 @@ index bf619ff..60b996a 100644 int security_path_rename(struct path *old_dir, struct dentry *old_dentry, struct path *new_dir, struct dentry *new_dentry) -@@ -422,6 +425,7 @@ int security_path_truncate(struct path *path) +@@ -425,6 +428,7 @@ int security_path_truncate(struct path *path) return 0; return security_ops->path_truncate(path); } @@ -312,7 +368,7 @@ index bf619ff..60b996a 100644 int security_path_chmod(struct path *path, umode_t mode) { -@@ -429,6 +433,7 @@ int security_path_chmod(struct path *path, umode_t mode) +@@ -432,6 +436,7 @@ int security_path_chmod(struct path *path, umode_t mode) return 0; return security_ops->path_chmod(path, mode); } @@ -320,7 +376,7 @@ index bf619ff..60b996a 100644 int security_path_chown(struct path *path, uid_t uid, gid_t gid) { -@@ -436,6 +441,7 @@ int security_path_chown(struct path *path, uid_t uid, gid_t gid) +@@ -439,6 +444,7 @@ int security_path_chown(struct path *path, uid_t uid, gid_t gid) return 0; return security_ops->path_chown(path, uid, gid); } @@ -328,7 +384,7 @@ index bf619ff..60b996a 100644 int security_path_chroot(struct path *path) { -@@ -512,6 +518,7 @@ int security_inode_readlink(struct dentry *dentry) +@@ -515,6 +521,7 @@ int security_inode_readlink(struct dentry *dentry) return 0; return security_ops->inode_readlink(dentry); } @@ -336,7 +392,7 @@ index bf619ff..60b996a 100644 int security_inode_follow_link(struct dentry *dentry, struct nameidata *nd) { -@@ -526,6 +533,7 @@ int security_inode_permission(struct inode *inode, int mask) +@@ -529,6 +536,7 @@ int security_inode_permission(struct inode *inode, int mask) return 0; return security_ops->inode_permission(inode, mask); } @@ -344,7 +400,7 @@ index bf619ff..60b996a 100644 int security_inode_setattr(struct dentry *dentry, struct iattr *attr) { -@@ -641,6 +649,7 @@ int security_file_permission(struct file *file, int mask) +@@ -644,6 +652,7 @@ int security_file_permission(struct file *file, int mask) return fsnotify_perm(file, mask); } @@ -352,17 +408,17 @@ index bf619ff..60b996a 100644 int security_file_alloc(struct file *file) { -@@ -668,6 +677,7 @@ int security_file_mmap(struct file *file, unsigned long reqprot, +@@ -704,6 +713,7 @@ int security_mmap_file(struct file *file, unsigned long prot, return ret; return ima_file_mmap(file, prot); } -+EXPORT_SYMBOL(security_file_mmap); ++EXPORT_SYMBOL(security_mmap_file); - int security_file_mprotect(struct vm_area_struct *vma, unsigned long reqprot, - unsigned long prot) + int security_mmap_addr(unsigned long addr) + { 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 2012-05-22 09:06:08.864125478 +0200 ++++ linux/Documentation/ABI/testing/debugfs-aufs 2012-07-22 19:57:03.161004529 +0200 @@ -0,0 +1,37 @@ +What: /debug/aufs/si_/ +Date: March 2009 @@ -403,7 +459,7 @@ diff -urN /usr/share/empty/Documentation/ABI/testing/debugfs-aufs linux/Document + will be empty. About XINO files, see the aufs manual. diff -urN /usr/share/empty/Documentation/ABI/testing/sysfs-aufs linux/Documentation/ABI/testing/sysfs-aufs --- /usr/share/empty/Documentation/ABI/testing/sysfs-aufs 1970-01-01 01:00:00.000000000 +0100 -+++ linux/Documentation/ABI/testing/sysfs-aufs 2012-05-22 09:06:08.864125478 +0200 ++++ linux/Documentation/ABI/testing/sysfs-aufs 2012-07-22 19:57:03.161004529 +0200 @@ -0,0 +1,24 @@ +What: /sys/fs/aufs/si_/ +Date: March 2009 @@ -431,7 +487,7 @@ diff -urN /usr/share/empty/Documentation/ABI/testing/sysfs-aufs linux/Documentat + will be empty. About XINO files, see the aufs manual. diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/01intro.txt linux/Documentation/filesystems/aufs/design/01intro.txt --- /usr/share/empty/Documentation/filesystems/aufs/design/01intro.txt 1970-01-01 01:00:00.000000000 +0100 -+++ linux/Documentation/filesystems/aufs/design/01intro.txt 2012-05-22 09:06:08.864125478 +0200 ++++ linux/Documentation/filesystems/aufs/design/01intro.txt 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,162 @@ + +# Copyright (C) 2005-2011 Junjiro R. Okajima @@ -597,7 +653,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/01intro.txt lin +about it. But currently I have implemented it in kernel space. diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/02struct.txt linux/Documentation/filesystems/aufs/design/02struct.txt --- /usr/share/empty/Documentation/filesystems/aufs/design/02struct.txt 1970-01-01 01:00:00.000000000 +0100 -+++ linux/Documentation/filesystems/aufs/design/02struct.txt 2012-05-22 09:06:08.864125478 +0200 ++++ linux/Documentation/filesystems/aufs/design/02struct.txt 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,226 @@ + +# Copyright (C) 2005-2011 Junjiro R. Okajima @@ -827,7 +883,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/02struct.txt li +dir, aufs reverts it after copy-up. 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 2012-05-22 09:06:08.864125478 +0200 ++++ linux/Documentation/filesystems/aufs/design/03lookup.txt 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,106 @@ + +# Copyright (C) 2005-2011 Junjiro R. Okajima @@ -937,7 +993,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/03lookup.txt li + by over-mounting something (or another method). diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/04branch.txt linux/Documentation/filesystems/aufs/design/04branch.txt --- /usr/share/empty/Documentation/filesystems/aufs/design/04branch.txt 1970-01-01 01:00:00.000000000 +0100 -+++ linux/Documentation/filesystems/aufs/design/04branch.txt 2012-05-22 09:06:08.864125478 +0200 ++++ linux/Documentation/filesystems/aufs/design/04branch.txt 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,76 @@ + +# Copyright (C) 2005-2011 Junjiro R. Okajima @@ -1017,7 +1073,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/04branch.txt li + same named entry on the upper branch. diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/05wbr_policy.txt linux/Documentation/filesystems/aufs/design/05wbr_policy.txt --- /usr/share/empty/Documentation/filesystems/aufs/design/05wbr_policy.txt 1970-01-01 01:00:00.000000000 +0100 -+++ linux/Documentation/filesystems/aufs/design/05wbr_policy.txt 2012-05-22 09:06:08.864125478 +0200 ++++ linux/Documentation/filesystems/aufs/design/05wbr_policy.txt 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,65 @@ + +# Copyright (C) 2005-2011 Junjiro R. Okajima @@ -1086,7 +1142,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/05wbr_policy.tx + copyup policy. 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 2012-05-22 09:06:08.864125478 +0200 ++++ linux/Documentation/filesystems/aufs/design/06mmap.txt 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,47 @@ + +# Copyright (C) 2005-2011 Junjiro R. Okajima @@ -1137,7 +1193,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06mmap.txt linu +switching the approach. 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 2012-05-22 09:06:08.864125478 +0200 ++++ linux/Documentation/filesystems/aufs/design/07export.txt 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,59 @@ + +# Copyright (C) 2005-2011 Junjiro R. Okajima @@ -1200,7 +1256,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/07export.txt li + lookup_one_len(), vfs_getattr(), encode_fh() and others. diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/08shwh.txt linux/Documentation/filesystems/aufs/design/08shwh.txt --- /usr/share/empty/Documentation/filesystems/aufs/design/08shwh.txt 1970-01-01 01:00:00.000000000 +0100 -+++ linux/Documentation/filesystems/aufs/design/08shwh.txt 2012-05-22 09:06:08.864125478 +0200 ++++ linux/Documentation/filesystems/aufs/design/08shwh.txt 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,53 @@ + +# Copyright (C) 2005-2011 Junjiro R. Okajima @@ -1257,7 +1313,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/08shwh.txt linu +initramfs will use it to replace the old one at the next boot. diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/10dynop.txt linux/Documentation/filesystems/aufs/design/10dynop.txt --- /usr/share/empty/Documentation/filesystems/aufs/design/10dynop.txt 1970-01-01 01:00:00.000000000 +0100 -+++ linux/Documentation/filesystems/aufs/design/10dynop.txt 2012-05-22 09:06:08.864125478 +0200 ++++ linux/Documentation/filesystems/aufs/design/10dynop.txt 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,47 @@ + +# Copyright (C) 2010-2011 Junjiro R. Okajima @@ -1308,7 +1364,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/10dynop.txt lin +vm_operations_struct for regular files only. diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/99plan.txt linux/Documentation/filesystems/aufs/design/99plan.txt --- /usr/share/empty/Documentation/filesystems/aufs/design/99plan.txt 1970-01-01 01:00:00.000000000 +0100 -+++ linux/Documentation/filesystems/aufs/design/99plan.txt 2012-05-22 09:06:08.864125478 +0200 ++++ linux/Documentation/filesystems/aufs/design/99plan.txt 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,96 @@ + +# Copyright (C) 2005-2011 Junjiro R. Okajima @@ -1408,7 +1464,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/99plan.txt linu +Otherwise from /new. 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 2012-05-22 09:06:08.864125478 +0200 ++++ linux/Documentation/filesystems/aufs/README 2012-07-22 19:57:03.161004529 +0200 @@ -0,0 +1,330 @@ + +Aufs3 -- advanced multi layered unification filesystem version 3.x @@ -1742,7 +1798,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta +# End: ; diff -urN /usr/share/empty/fs/aufs/aufs.h linux/fs/aufs/aufs.h --- /usr/share/empty/fs/aufs/aufs.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/aufs.h 2012-05-22 09:06:08.864125478 +0200 ++++ linux/fs/aufs/aufs.h 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -1806,7 +1862,7 @@ diff -urN /usr/share/empty/fs/aufs/aufs.h linux/fs/aufs/aufs.h +#endif /* __AUFS_H__ */ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c --- /usr/share/empty/fs/aufs/branch.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/branch.c 2012-05-22 09:06:08.864125478 +0200 ++++ linux/fs/aufs/branch.c 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,1169 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -2061,14 +2117,14 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c + if (au_opt_test(au_mntflags(sb), WARN_PERM)) { + h_inode = au_h_dptr(root, 0)->d_inode; + if ((h_inode->i_mode & S_IALLUGO) != (inode->i_mode & S_IALLUGO) -+ || h_inode->i_uid != inode->i_uid -+ || h_inode->i_gid != inode->i_gid) -+ pr_warning("uid/gid/perm %s %u/%u/0%o, %u/%u/0%o\n", -+ add->pathname, -+ inode->i_uid, inode->i_gid, -+ (inode->i_mode & S_IALLUGO), -+ h_inode->i_uid, h_inode->i_gid, -+ (h_inode->i_mode & S_IALLUGO)); ++ || !uid_eq(h_inode->i_uid, inode->i_uid) ++ || !gid_eq(h_inode->i_gid, inode->i_gid)) ++ pr_warn("uid/gid/perm %s %u/%u/0%o, %u/%u/0%o\n", ++ add->pathname, ++ i_uid_read(inode), i_gid_read(inode), ++ (inode->i_mode & S_IALLUGO), ++ i_uid_read(h_inode), i_gid_read(h_inode), ++ (h_inode->i_mode & S_IALLUGO)); + } + +out: @@ -2663,8 +2719,8 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c + /* revert */ + rerr = au_br_init_wh(sb, br, br->br_perm, del->h_path.dentry); + if (rerr) -+ pr_warning("failed re-creating base whiteout, %s. (%d)\n", -+ del->pathname, rerr); ++ pr_warn("failed re-creating base whiteout, %s. (%d)\n", ++ del->pathname, rerr); +out: + return err; +} @@ -2775,7 +2831,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c + + n = 0; + p = a; -+ lg_global_lock(files_lglock); ++ lg_global_lock(&files_lglock); + do_file_list_for_each_entry(sb, f) { + if (au_fi(f) + && file_count(f) @@ -2786,7 +2842,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c + AuDebugOn(n > max); + } + } while_file_list_for_each_entry; -+ lg_global_unlock(files_lglock); ++ lg_global_unlock(&files_lglock); + + return n; +} @@ -2979,7 +3035,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c +} diff -urN /usr/share/empty/fs/aufs/branch.h linux/fs/aufs/branch.h --- /usr/share/empty/fs/aufs/branch.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/branch.h 2012-05-22 09:06:08.864125478 +0200 ++++ linux/fs/aufs/branch.h 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,230 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -3213,7 +3269,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.h linux/fs/aufs/branch.h +#endif /* __AUFS_BRANCH_H__ */ diff -urN /usr/share/empty/fs/aufs/conf.mk linux/fs/aufs/conf.mk --- /usr/share/empty/fs/aufs/conf.mk 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/conf.mk 2012-05-22 09:06:08.864125478 +0200 ++++ linux/fs/aufs/conf.mk 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,38 @@ + +AuConfStr = CONFIG_AUFS_FS=${CONFIG_AUFS_FS} @@ -3255,7 +3311,7 @@ diff -urN /usr/share/empty/fs/aufs/conf.mk linux/fs/aufs/conf.mk +-include ${srctree}/${src}/conf_priv.mk diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c --- /usr/share/empty/fs/aufs/cpup.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/cpup.c 2012-05-22 09:06:08.864125478 +0200 ++++ linux/fs/aufs/cpup.c 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,1084 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -3403,7 +3459,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c + + err = vfsub_notify_change(&dt->dt_h_path, &attr); + if (unlikely(err)) -+ pr_warning("restoring timestamps failed(%d). ignored\n", err); ++ pr_warn("restoring timestamps failed(%d). ignored\n", err); +} + +/* ---------------------------------------------------------------------- */ @@ -4343,7 +4399,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c +} diff -urN /usr/share/empty/fs/aufs/cpup.h linux/fs/aufs/cpup.h --- /usr/share/empty/fs/aufs/cpup.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/cpup.h 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/cpup.h 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -4428,7 +4484,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.h linux/fs/aufs/cpup.h +#endif /* __AUFS_CPUP_H__ */ diff -urN /usr/share/empty/fs/aufs/dbgaufs.c linux/fs/aufs/dbgaufs.c --- /usr/share/empty/fs/aufs/dbgaufs.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/dbgaufs.c 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/dbgaufs.c 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,334 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -4766,7 +4822,7 @@ diff -urN /usr/share/empty/fs/aufs/dbgaufs.c linux/fs/aufs/dbgaufs.c +} diff -urN /usr/share/empty/fs/aufs/dbgaufs.h linux/fs/aufs/dbgaufs.h --- /usr/share/empty/fs/aufs/dbgaufs.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/dbgaufs.h 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/dbgaufs.h 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -4819,7 +4875,7 @@ diff -urN /usr/share/empty/fs/aufs/dbgaufs.h linux/fs/aufs/dbgaufs.h +#endif /* __DBGAUFS_H__ */ diff -urN /usr/share/empty/fs/aufs/dcsub.c linux/fs/aufs/dcsub.c --- /usr/share/empty/fs/aufs/dcsub.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/dcsub.c 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/dcsub.c 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,243 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -5066,7 +5122,7 @@ diff -urN /usr/share/empty/fs/aufs/dcsub.c linux/fs/aufs/dcsub.c +} diff -urN /usr/share/empty/fs/aufs/dcsub.h linux/fs/aufs/dcsub.h --- /usr/share/empty/fs/aufs/dcsub.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/dcsub.h 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/dcsub.h 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -5164,7 +5220,7 @@ diff -urN /usr/share/empty/fs/aufs/dcsub.h linux/fs/aufs/dcsub.h +#endif /* __AUFS_DCSUB_H__ */ diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c --- /usr/share/empty/fs/aufs/debug.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/debug.c 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/debug.c 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,489 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -5646,7 +5702,7 @@ diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c + AuDebugOn(destr.len < NAME_MAX); + +#ifdef CONFIG_4KSTACKS -+ pr_warning("CONFIG_4KSTACKS is defined.\n"); ++ pr_warn("CONFIG_4KSTACKS is defined.\n"); +#endif + +#ifdef AuForceNoBrs @@ -5657,7 +5713,7 @@ diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c +} diff -urN /usr/share/empty/fs/aufs/debug.h linux/fs/aufs/debug.h --- /usr/share/empty/fs/aufs/debug.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/debug.h 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/debug.h 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,242 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -5724,7 +5780,7 @@ diff -urN /usr/share/empty/fs/aufs/debug.h linux/fs/aufs/debug.h +#define AuWarn1(fmt, ...) do { \ + static unsigned char _c; \ + if (!_c++) \ -+ pr_warning(fmt, ##__VA_ARGS__); \ ++ pr_warn(fmt, ##__VA_ARGS__); \ +} while (0) + +#define AuErr1(fmt, ...) do { \ @@ -5903,7 +5959,7 @@ diff -urN /usr/share/empty/fs/aufs/debug.h linux/fs/aufs/debug.h +#endif /* __AUFS_DEBUG_H__ */ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c --- /usr/share/empty/fs/aufs/dentry.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/dentry.c 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/dentry.c 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,1140 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -6253,8 +6309,8 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c +struct au_iattr { + unsigned long i_ino; + /* unsigned int i_nlink; */ -+ uid_t i_uid; -+ gid_t i_gid; ++ kuid_t i_uid; ++ kgid_t i_gid; + u64 i_version; +/* + loff_t i_size; @@ -6281,8 +6337,8 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c +{ + return ia->i_ino != h_inode->i_ino + /* || ia->i_nlink != h_inode->i_nlink */ -+ || ia->i_uid != h_inode->i_uid -+ || ia->i_gid != h_inode->i_gid ++ || !uid_eq(ia->i_uid, h_inode->i_uid) ++ || !uid_eq(ia->i_gid, h_inode->i_gid) + || ia->i_version != h_inode->i_version +/* + || ia->i_size != h_inode->i_size @@ -7047,7 +7103,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c +}; diff -urN /usr/share/empty/fs/aufs/dentry.h linux/fs/aufs/dentry.h --- /usr/share/empty/fs/aufs/dentry.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/dentry.h 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/dentry.h 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,237 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -7288,7 +7344,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.h linux/fs/aufs/dentry.h +#endif /* __AUFS_DENTRY_H__ */ diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c --- /usr/share/empty/fs/aufs/dinfo.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/dinfo.c 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/dinfo.c 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,543 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -7835,7 +7891,7 @@ diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c +} diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c --- /usr/share/empty/fs/aufs/dir.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/dir.c 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/dir.c 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,636 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -8475,7 +8531,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c +}; diff -urN /usr/share/empty/fs/aufs/dir.h linux/fs/aufs/dir.h --- /usr/share/empty/fs/aufs/dir.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/dir.h 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/dir.h 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -8616,7 +8672,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.h linux/fs/aufs/dir.h +#endif /* __AUFS_DIR_H__ */ diff -urN /usr/share/empty/fs/aufs/dynop.c linux/fs/aufs/dynop.c --- /usr/share/empty/fs/aufs/dynop.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/dynop.c 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/dynop.c 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,377 @@ +/* + * Copyright (C) 2010-2012 Junjiro R. Okajima @@ -8997,7 +9053,7 @@ diff -urN /usr/share/empty/fs/aufs/dynop.c linux/fs/aufs/dynop.c +} diff -urN /usr/share/empty/fs/aufs/dynop.h linux/fs/aufs/dynop.h --- /usr/share/empty/fs/aufs/dynop.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/dynop.h 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/dynop.h 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2010-2012 Junjiro R. Okajima @@ -9077,8 +9133,8 @@ diff -urN /usr/share/empty/fs/aufs/dynop.h linux/fs/aufs/dynop.h +#endif /* __AUFS_DYNOP_H__ */ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c --- /usr/share/empty/fs/aufs/export.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/export.c 2012-05-22 09:06:08.867458905 +0200 -@@ -0,0 +1,803 @@ ++++ linux/fs/aufs/export.c 2012-07-22 19:57:03.164337936 +0200 +@@ -0,0 +1,810 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima + * @@ -9367,9 +9423,9 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c + }; + + get_fs_root(current->fs, &root); -+ br_read_lock(vfsmount_lock); ++ br_read_lock(&vfsmount_lock); + err = iterate_mounts(au_compare_mnt, &args, root.mnt); -+ br_read_unlock(vfsmount_lock); ++ br_read_unlock(&vfsmount_lock); + path_put(&root); + AuDebugOn(!err); + AuDebugOn(!args.mnt); @@ -9737,19 +9793,16 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c + +/* ---------------------------------------------------------------------- */ + -+static int aufs_encode_fh(struct dentry *dentry, __u32 *fh, int *max_len, -+ int connectable) ++static int aufs_encode_fh(struct inode *inode, __u32 *fh, int *max_len, ++ struct inode *dir) +{ + int err; -+ aufs_bindex_t bindex, bend; ++ aufs_bindex_t bindex; + struct super_block *sb, *h_sb; -+ struct inode *inode; -+ struct dentry *parent, *h_parent; ++ struct dentry *dentry, *parent, *h_parent; ++ struct inode *h_dir; + struct au_branch *br; + -+ AuDebugOn(au_test_anon(dentry)); -+ -+ parent = NULL; + err = -ENOSPC; + if (unlikely(*max_len <= Fh_tail)) { + AuWarn1("NFSv2 client (max_len %d)?\n", *max_len); @@ -9757,49 +9810,58 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c + } + + err = FILEID_ROOT; -+ if (IS_ROOT(dentry)) { -+ AuDebugOn(dentry->d_inode->i_ino != AUFS_ROOT_INO); ++ if (inode->i_ino == AUFS_ROOT_INO) { ++ AuDebugOn(inode->i_ino != AUFS_ROOT_INO); + goto out; + } + + h_parent = NULL; -+ err = aufs_read_lock(dentry, AuLock_FLUSH | AuLock_IR | AuLock_GEN); ++ sb = inode->i_sb; ++ err = si_read_lock(sb, AuLock_FLUSH); + if (unlikely(err)) + goto out; + -+ inode = dentry->d_inode; -+ AuDebugOn(!inode); -+ sb = dentry->d_sb; +#ifdef CONFIG_AUFS_DEBUG + if (unlikely(!au_opt_test(au_mntflags(sb), XINO))) + AuWarn1("NFS-exporting requires xino\n"); +#endif + err = -EIO; -+ parent = dget_parent(dentry); -+ di_read_lock_parent(parent, !AuLock_IR); -+ bend = au_dbtaildir(parent); -+ for (bindex = au_dbstart(parent); bindex <= bend; bindex++) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (h_parent) { -+ dget(h_parent); -+ break; -+ } ++ parent = NULL; ++ ii_read_lock_child(inode); ++ bindex = au_ibstart(inode); ++ if (!dir) { ++ dentry = d_find_alias(inode); ++ if (unlikely(!dentry)) ++ goto out_unlock; ++ AuDebugOn(au_test_anon(dentry)); ++ parent = dget_parent(dentry); ++ dput(dentry); ++ if (unlikely(!parent)) ++ goto out_unlock; ++ dir = parent->d_inode; + } ++ ++ ii_read_lock_parent(dir); ++ h_dir = au_h_iptr(dir, bindex); ++ ii_read_unlock(dir); ++ if (unlikely(!h_dir)) ++ goto out_parent; ++ h_parent = d_find_alias(h_dir); + if (unlikely(!h_parent)) -+ goto out_unlock; ++ goto out_hparent; + + err = -EPERM; + br = au_sbr(sb, bindex); + h_sb = br->br_mnt->mnt_sb; + if (unlikely(!h_sb->s_export_op)) { + AuErr1("%s branch is not exportable\n", au_sbtype(h_sb)); -+ goto out_dput; ++ goto out_hparent; + } + + fh[Fh_br_id] = br->br_id; + fh[Fh_sigen] = au_sigen(sb); + encode_ino(fh + Fh_ino, inode->i_ino); -+ encode_ino(fh + Fh_dir_ino, parent->d_inode->i_ino); ++ encode_ino(fh + Fh_dir_ino, dir->i_ino); + fh[Fh_igen] = inode->i_generation; + + *max_len -= Fh_tail; @@ -9814,12 +9876,13 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c + else + AuWarn1("%s encode_fh failed\n", au_sbtype(h_sb)); + -+out_dput: ++out_hparent: + dput(h_parent); -+out_unlock: -+ di_read_unlock(parent, !AuLock_IR); ++out_parent: + dput(parent); -+ aufs_read_unlock(dentry, AuLock_IR); ++out_unlock: ++ ii_read_unlock(inode); ++ si_read_unlock(sb); +out: + if (unlikely(err < 0)) + err = 255; @@ -9884,7 +9947,7 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c +} diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c --- /usr/share/empty/fs/aufs/file.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/file.c 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/file.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,676 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -10564,8 +10627,8 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c +}; diff -urN /usr/share/empty/fs/aufs/file.h linux/fs/aufs/file.h --- /usr/share/empty/fs/aufs/file.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/file.h 2012-05-22 09:06:08.867458905 +0200 -@@ -0,0 +1,298 @@ ++++ linux/fs/aufs/file.h 2012-07-22 19:57:03.164337936 +0200 +@@ -0,0 +1,306 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima + * @@ -10649,6 +10712,14 @@ diff -urN /usr/share/empty/fs/aufs/file.h linux/fs/aufs/file.h +int au_do_flush(struct file *file, fl_owner_t id, + int (*flush)(struct file *file, fl_owner_t id)); + ++#if defined(CONFIG_SECURITY) && defined(CONFIG_MMU) ++/* security.c */ ++int au_security_mmap_file(struct file *h_file, struct vm_area_struct *vma); ++#else ++AuStubInt0(au_security_mmap_file, struct file *h_file, ++ struct vm_area_struct *vma); ++#endif ++ +/* poll.c */ +#ifdef CONFIG_AUFS_POLL +unsigned int aufs_poll(struct file *file, poll_table *wait); @@ -10795,7 +10866,7 @@ diff -urN /usr/share/empty/fs/aufs/file.h linux/fs/aufs/file.h +{ + if (atomic_inc_return(&au_fi(f)->fi_mmapped)) + return; -+ pr_warning("fi_mmapped wrapped around\n"); ++ pr_warn("fi_mmapped wrapped around\n"); + while (!atomic_inc_return(&au_fi(f)->fi_mmapped)) + ; +} @@ -10866,7 +10937,7 @@ diff -urN /usr/share/empty/fs/aufs/file.h linux/fs/aufs/file.h +#endif /* __AUFS_FILE_H__ */ diff -urN /usr/share/empty/fs/aufs/finfo.c linux/fs/aufs/finfo.c --- /usr/share/empty/fs/aufs/finfo.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/finfo.c 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/finfo.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -11026,8 +11097,8 @@ diff -urN /usr/share/empty/fs/aufs/finfo.c linux/fs/aufs/finfo.c +} diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c --- /usr/share/empty/fs/aufs/f_op.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/f_op.c 2012-05-22 09:06:08.867458905 +0200 -@@ -0,0 +1,729 @@ ++++ linux/fs/aufs/f_op.c 2012-07-22 19:57:03.164337936 +0200 +@@ -0,0 +1,692 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima + * @@ -11475,45 +11546,9 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c + * The similar scenario is applied to aufs_readlink() too. + */ + -+/* cf. linux/include/linux/mman.h: calc_vm_prot_bits() */ -+#define AuConv_VM_PROT(f, b) _calc_vm_trans(f, VM_##b, PROT_##b) -+ -+static unsigned long au_arch_prot_conv(unsigned long flags) -+{ -+ /* currently ppc64 only */ -+#ifdef CONFIG_PPC64 -+ /* cf. linux/arch/powerpc/include/asm/mman.h */ -+ AuDebugOn(arch_calc_vm_prot_bits(-1) != VM_SAO); -+ return AuConv_VM_PROT(flags, SAO); -+#else -+ AuDebugOn(arch_calc_vm_prot_bits(-1)); -+ return 0; -+#endif -+} -+ -+static unsigned long au_prot_conv(unsigned long flags) -+{ -+ return AuConv_VM_PROT(flags, READ) -+ | AuConv_VM_PROT(flags, WRITE) -+ | AuConv_VM_PROT(flags, EXEC) -+ | au_arch_prot_conv(flags); -+} -+ -+/* cf. linux/include/linux/mman.h: calc_vm_flag_bits() */ -+#define AuConv_VM_MAP(f, b) _calc_vm_trans(f, VM_##b, MAP_##b) -+ -+static unsigned long au_flag_conv(unsigned long flags) -+{ -+ return AuConv_VM_MAP(flags, GROWSDOWN) -+ | AuConv_VM_MAP(flags, DENYWRITE) -+ | AuConv_VM_MAP(flags, EXECUTABLE) -+ | AuConv_VM_MAP(flags, LOCKED); -+} -+ +static int aufs_mmap(struct file *file, struct vm_area_struct *vma) +{ + int err; -+ unsigned long prot; + aufs_bindex_t bstart; + const unsigned char wlock + = (file->f_mode & FMODE_WRITE) && (vma->vm_flags & VM_SHARED); @@ -11553,9 +11588,8 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c + lockdep_on(); + + au_vm_file_reset(vma, h_file); -+ prot = au_prot_conv(vma->vm_flags); -+ err = security_file_mmap(h_file, /*reqprot*/prot, prot, -+ au_flag_conv(vma->vm_flags), vma->vm_start, 0); ++ /* todo: bad approach, I am not sure this is really necessary */ ++ err = au_security_mmap_file(h_file, vma); + if (!err) + err = h_file->f_op->mmap(h_file, vma); + if (unlikely(err)) @@ -11759,8 +11793,8 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c +}; diff -urN /usr/share/empty/fs/aufs/f_op_sp.c linux/fs/aufs/f_op_sp.c --- /usr/share/empty/fs/aufs/f_op_sp.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/f_op_sp.c 2012-05-22 09:06:08.867458905 +0200 -@@ -0,0 +1,298 @@ ++++ linux/fs/aufs/f_op_sp.c 2012-07-22 19:57:03.164337936 +0200 +@@ -0,0 +1,295 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima + * @@ -11837,9 +11871,6 @@ diff -urN /usr/share/empty/fs/aufs/f_op_sp.c linux/fs/aufs/f_op_sp.c + /* do not change the file in kio */ + AuDebugOn(!h_file->f_op || !h_file->f_op->aio_write); + err = h_file->f_op->aio_write(kio, iov, nv, pos); -+ if (err > 0 && wbr) -+ file_update_time(h_file); -+ + return err; +} + @@ -12061,7 +12092,7 @@ diff -urN /usr/share/empty/fs/aufs/f_op_sp.c linux/fs/aufs/f_op_sp.c +} diff -urN /usr/share/empty/fs/aufs/fstype.h linux/fs/aufs/fstype.h --- /usr/share/empty/fs/aufs/fstype.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/fstype.h 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/fstype.h 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,496 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -12561,8 +12592,8 @@ diff -urN /usr/share/empty/fs/aufs/fstype.h linux/fs/aufs/fstype.h +#endif /* __AUFS_FSTYPE_H__ */ diff -urN /usr/share/empty/fs/aufs/hfsnotify.c linux/fs/aufs/hfsnotify.c --- /usr/share/empty/fs/aufs/hfsnotify.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/hfsnotify.c 2012-05-22 09:06:08.867458905 +0200 -@@ -0,0 +1,260 @@ ++++ linux/fs/aufs/hfsnotify.c 2012-07-22 19:57:03.164337936 +0200 +@@ -0,0 +1,257 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima + * @@ -12708,10 +12739,7 @@ diff -urN /usr/share/empty/fs/aufs/hfsnotify.c linux/fs/aufs/hfsnotify.c + struct au_hnotify *hnotify; + struct inode *h_dir, *h_inode; + __u32 mask; -+ struct qstr h_child_qstr = { -+ .name = event->file_name, -+ .len = event->name_len -+ }; ++ struct qstr h_child_qstr = QSTR_INIT(event->file_name, event->name_len); + + AuDebugOn(event->data_type != FSNOTIFY_EVENT_INODE); + @@ -12825,7 +12853,7 @@ diff -urN /usr/share/empty/fs/aufs/hfsnotify.c linux/fs/aufs/hfsnotify.c +}; diff -urN /usr/share/empty/fs/aufs/hfsplus.c linux/fs/aufs/hfsplus.c --- /usr/share/empty/fs/aufs/hfsplus.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/hfsplus.c 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/hfsplus.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2010-2012 Junjiro R. Okajima @@ -12886,7 +12914,7 @@ diff -urN /usr/share/empty/fs/aufs/hfsplus.c linux/fs/aufs/hfsplus.c +} diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c --- /usr/share/empty/fs/aufs/hnotify.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/hnotify.c 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/hnotify.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,712 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -12998,7 +13026,7 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c + + err = 0; + if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { -+ pr_warning("branch root dir was changed\n"); ++ pr_warn("branch root dir was changed\n"); + goto out; + } + @@ -13093,7 +13121,7 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c + + err = 1; + if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { -+ pr_warning("branch root dir was changed\n"); ++ pr_warn("branch root dir was changed\n"); + err = 0; + goto out; + } @@ -13149,7 +13177,7 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c + if (IS_ROOT(dentry) + /* || (inode && inode->i_ino == AUFS_ROOT_INO) */ + ) { -+ pr_warning("branch root dir was changed\n"); ++ pr_warn("branch root dir was changed\n"); + return 0; + } + @@ -13248,8 +13276,8 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c + if (au_ftest_hnjob(a->flags, MNTPNT) + && a->dentry + && d_mountpoint(a->dentry)) -+ pr_warning("mount-point %.*s is removed or renamed\n", -+ AuDLNPair(a->dentry)); ++ pr_warn("mount-point %.*s is removed or renamed\n", ++ AuDLNPair(a->dentry)); + + return 0; +} @@ -13311,7 +13339,7 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c + goto out; + + if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { -+ pr_warning("wrong root branch\n"); ++ pr_warn("wrong root branch\n"); + iput(inode); + inode = NULL; + goto out; @@ -13602,7 +13630,7 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c +} diff -urN /usr/share/empty/fs/aufs/iinfo.c linux/fs/aufs/iinfo.c --- /usr/share/empty/fs/aufs/iinfo.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/iinfo.c 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/iinfo.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,264 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -13870,7 +13898,7 @@ diff -urN /usr/share/empty/fs/aufs/iinfo.c linux/fs/aufs/iinfo.c +} diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c --- /usr/share/empty/fs/aufs/inode.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/inode.c 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/inode.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,471 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -14330,7 +14358,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c + +int au_test_h_perm(struct inode *h_inode, int mask) +{ -+ if (!current_fsuid()) ++ if (current_fsuid() == GLOBAL_ROOT_GID) + return 0; + return inode_permission(h_inode, mask); +} @@ -14345,7 +14373,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c +} diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h --- /usr/share/empty/fs/aufs/inode.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/inode.h 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/inode.h 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,560 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -14909,7 +14937,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h +#endif /* __AUFS_INODE_H__ */ diff -urN /usr/share/empty/fs/aufs/ioctl.c linux/fs/aufs/ioctl.c --- /usr/share/empty/fs/aufs/ioctl.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/ioctl.c 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/ioctl.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,196 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -15109,7 +15137,7 @@ diff -urN /usr/share/empty/fs/aufs/ioctl.c linux/fs/aufs/ioctl.c +#endif diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c --- /usr/share/empty/fs/aufs/i_op_add.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/i_op_add.c 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/i_op_add.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,712 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -15825,8 +15853,8 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c +} diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c --- /usr/share/empty/fs/aufs/i_op.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/i_op.c 2012-05-22 09:06:08.867458905 +0200 -@@ -0,0 +1,993 @@ ++++ linux/fs/aufs/i_op.c 2012-07-22 19:57:03.164337936 +0200 +@@ -0,0 +1,1014 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima + * @@ -16532,7 +16560,8 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c + goto out_unlock; + } else if ((ia->ia_valid & (ATTR_UID | ATTR_GID)) + && (ia->ia_valid & ATTR_CTIME)) { -+ err = security_path_chown(&a->h_path, ia->ia_uid, ia->ia_gid); ++ err = security_path_chown(&a->h_path, vfsub_ia_uid(ia), ++ vfsub_ia_gid(ia)); + if (unlikely(err)) + goto out_unlock; + } @@ -16582,8 +16611,8 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c + unsigned int n; + + inode->i_mode = st->mode; -+ inode->i_uid = st->uid; -+ inode->i_gid = st->gid; ++ i_uid_write(inode, st->uid); ++ i_gid_write(inode, st->gid); + inode->i_atime = st->atime; + inode->i_mtime = st->mtime; + inode->i_ctime = st->ctime; @@ -16780,11 +16809,25 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c + +/* ---------------------------------------------------------------------- */ + -+static void aufs_truncate_range(struct inode *inode __maybe_unused, -+ loff_t start __maybe_unused, -+ loff_t end __maybe_unused) ++static int aufs_update_time(struct inode *inode, struct timespec *ts, int flags) +{ -+ AuUnsupport(); ++ int err; ++ struct super_block *sb; ++ struct inode *h_inode; ++ ++ sb = inode->i_sb; ++ /* mmap_sem might be acquired already, cf. aufs_mmap() */ ++ lockdep_off(); ++ si_read_lock(sb, AuLock_FLUSH); ++ ii_write_lock_child(inode); ++ lockdep_on(); ++ h_inode = au_h_iptr(inode, au_ibstart(inode)); ++ err = vfsub_update_time(h_inode, ts, flags); ++ lockdep_off(); ++ ii_write_unlock(inode); ++ si_read_unlock(sb); ++ lockdep_on(); ++ return err; +} + +/* ---------------------------------------------------------------------- */ @@ -16793,9 +16836,12 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c + .permission = aufs_permission, + .setattr = aufs_setattr, + .getattr = aufs_getattr, ++ + .readlink = aufs_readlink, + .follow_link = aufs_follow_link, -+ .put_link = aufs_put_link ++ .put_link = aufs_put_link, ++ ++ /* .update_time = aufs_update_time */ +}; + +struct inode_operations aufs_dir_iop = { @@ -16811,18 +16857,21 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c + + .permission = aufs_permission, + .setattr = aufs_setattr, -+ .getattr = aufs_getattr ++ .getattr = aufs_getattr, ++ ++ .update_time = aufs_update_time +}; + +struct inode_operations aufs_iop = { + .permission = aufs_permission, + .setattr = aufs_setattr, + .getattr = aufs_getattr, -+ .truncate_range = aufs_truncate_range ++ ++ .update_time = aufs_update_time +}; 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 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/i_op_del.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,478 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -17304,7 +17353,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c +} diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c --- /usr/share/empty/fs/aufs/i_op_ren.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/i_op_ren.c 2012-05-22 09:06:08.867458905 +0200 ++++ linux/fs/aufs/i_op_ren.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,1026 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -17562,8 +17611,8 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c + || au_test_fs_remote(a->h_dst->d_sb)) { + err = au_whtmp_rmdir(dir, a->btgt, a->h_dst, &a->whlist); + if (unlikely(err)) -+ pr_warning("failed removing whtmp dir %.*s (%d), " -+ "ignored.\n", AuDLNPair(a->h_dst), err); ++ pr_warn("failed removing whtmp dir %.*s (%d), " ++ "ignored.\n", AuDLNPair(a->h_dst), err); + } else { + au_nhash_wh_free(&a->thargs->whlist); + a->thargs->whlist = a->whlist; @@ -18334,7 +18383,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c +} diff -urN /usr/share/empty/fs/aufs/Kconfig linux/fs/aufs/Kconfig --- /usr/share/empty/fs/aufs/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/Kconfig 2012-05-22 09:06:08.864125478 +0200 ++++ linux/fs/aufs/Kconfig 2012-07-22 19:57:03.161004531 +0200 @@ -0,0 +1,203 @@ +config AUFS_FS + tristate "Aufs (Advanced multi layered unification filesystem) support" @@ -18541,7 +18590,7 @@ diff -urN /usr/share/empty/fs/aufs/Kconfig linux/fs/aufs/Kconfig +endif diff -urN /usr/share/empty/fs/aufs/loop.c linux/fs/aufs/loop.c --- /usr/share/empty/fs/aufs/loop.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/loop.c 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/loop.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -18652,8 +18701,8 @@ diff -urN /usr/share/empty/fs/aufs/loop.c linux/fs/aufs/loop.c + +pr: + spin_unlock(&spin); -+ pr_warning("you may want to try another patch for loopback file " -+ "on %s(0x%lx) branch\n", au_sbtype(h_sb), magic); ++ pr_warn("you may want to try another patch for loopback file " ++ "on %s(0x%lx) branch\n", au_sbtype(h_sb), magic); +} + +int au_loopback_init(void) @@ -18678,7 +18727,7 @@ diff -urN /usr/share/empty/fs/aufs/loop.c linux/fs/aufs/loop.c +} diff -urN /usr/share/empty/fs/aufs/loop.h linux/fs/aufs/loop.h --- /usr/share/empty/fs/aufs/loop.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/loop.h 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/loop.h 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -18732,7 +18781,7 @@ diff -urN /usr/share/empty/fs/aufs/loop.h linux/fs/aufs/loop.h +#endif /* __AUFS_LOOP_H__ */ diff -urN /usr/share/empty/fs/aufs/magic.mk linux/fs/aufs/magic.mk --- /usr/share/empty/fs/aufs/magic.mk 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/magic.mk 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/magic.mk 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,54 @@ + +# defined in ${srctree}/fs/fuse/inode.c @@ -18790,8 +18839,8 @@ diff -urN /usr/share/empty/fs/aufs/magic.mk linux/fs/aufs/magic.mk +endif diff -urN /usr/share/empty/fs/aufs/Makefile linux/fs/aufs/Makefile --- /usr/share/empty/fs/aufs/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/Makefile 2012-05-22 09:06:08.864125478 +0200 -@@ -0,0 +1,42 @@ ++++ linux/fs/aufs/Makefile 2012-07-22 19:57:03.161004531 +0200 +@@ -0,0 +1,45 @@ + +include ${src}/magic.mk +ifeq (${CONFIG_AUFS_FS},m) @@ -18831,12 +18880,15 @@ diff -urN /usr/share/empty/fs/aufs/Makefile linux/fs/aufs/Makefile +aufs-$(CONFIG_AUFS_POLL) += poll.o +aufs-$(CONFIG_AUFS_RDU) += rdu.o +aufs-$(CONFIG_AUFS_SP_IATTR) += f_op_sp.o ++ifdef CONFIG_MMU ++aufs-$(CONFIG_SECURITY) += security.o ++endif +aufs-$(CONFIG_AUFS_BR_HFSPLUS) += hfsplus.o +aufs-$(CONFIG_AUFS_DEBUG) += debug.o +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 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/module.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,196 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -19036,7 +19088,7 @@ diff -urN /usr/share/empty/fs/aufs/module.c linux/fs/aufs/module.c +module_exit(aufs_exit); diff -urN /usr/share/empty/fs/aufs/module.h linux/fs/aufs/module.h --- /usr/share/empty/fs/aufs/module.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/module.h 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/module.h 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -19145,7 +19197,7 @@ diff -urN /usr/share/empty/fs/aufs/module.h linux/fs/aufs/module.h +#endif /* __AUFS_MODULE_H__ */ diff -urN /usr/share/empty/fs/aufs/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 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/opts.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,1677 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -19363,7 +19415,7 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c + else { + if (p) + *p = '+'; -+ pr_warning("ignored branch attribute %s\n", str); ++ pr_warn("ignored branch attribute %s\n", str); + break; + } + if (p) @@ -19386,7 +19438,7 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c + if (!val) { + if (p) + *p = '+'; -+ pr_warning("ignored branch permission %s\n", perm); ++ pr_warn("ignored branch permission %s\n", perm); + val = AuBrPerm_RO; + goto out; + } @@ -20272,7 +20324,7 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c + break; + + case Opt_ignore: -+ pr_warning("ignored %s\n", opt_str); ++ pr_warn("ignored %s\n", opt_str); + /*FALLTHROUGH*/ + case Opt_ignore_silent: + skipped = 1; @@ -20608,14 +20660,14 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c + + if (!(sb_flags & MS_RDONLY)) { + if (unlikely(!au_br_writable(au_sbr_perm(sb, 0)))) -+ pr_warning("first branch should be rw\n"); ++ pr_warn("first branch should be rw\n"); + if (unlikely(au_opt_test(sbinfo->si_mntflags, SHWH))) -+ pr_warning("shwh should be used with ro\n"); ++ pr_warn("shwh should be used with ro\n"); + } + + if (au_opt_test((sbinfo->si_mntflags | pending), UDBA_HNOTIFY) + && !au_opt_test(sbinfo->si_mntflags, XINO)) -+ pr_warning("udba=*notify requires xino\n"); ++ pr_warn("udba=*notify requires xino\n"); + + err = 0; + root = sb->s_root; @@ -20826,7 +20878,7 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c +} diff -urN /usr/share/empty/fs/aufs/opts.h linux/fs/aufs/opts.h --- /usr/share/empty/fs/aufs/opts.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/opts.h 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/opts.h 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,209 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -21039,8 +21091,8 @@ diff -urN /usr/share/empty/fs/aufs/opts.h linux/fs/aufs/opts.h +#endif /* __AUFS_OPTS_H__ */ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c --- /usr/share/empty/fs/aufs/plink.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/plink.c 2012-05-22 09:06:08.870792417 +0200 -@@ -0,0 +1,515 @@ ++++ linux/fs/aufs/plink.c 2012-07-22 19:57:03.164337936 +0200 +@@ -0,0 +1,511 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima + * @@ -21271,9 +21323,7 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c + struct inode *h_dir; + int wkq_err; + char a[PLINK_NAME_LEN]; -+ struct qstr tgtname = { -+ .name = a -+ }; ++ struct qstr tgtname = QSTR_INIT(a, 0); + + AuDebugOn(au_plink_maint(inode->i_sb, AuLock_NOPLM)); + @@ -21282,7 +21332,7 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c + h_dir = h_parent->d_inode; + tgtname.len = plink_name(a, sizeof(a), inode, bindex); + -+ if (current_fsuid()) { ++ if (current_fsuid() != GLOBAL_ROOT_GID) { + struct au_do_plink_lkup_args args = { + .errp = &h_dentry, + .tgtname = &tgtname, @@ -21359,9 +21409,7 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c + struct dentry *h_parent; + struct inode *h_dir; + char a[PLINK_NAME_LEN]; -+ struct qstr tgtname = { -+ .name = a -+ }; ++ struct qstr tgtname = QSTR_INIT(a, 0); + + wbr = au_sbr(inode->i_sb, bindex)->br_wbr; + h_parent = wbr->wbr_plink; @@ -21369,7 +21417,7 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c + tgtname.len = plink_name(a, sizeof(a), inode, bindex); + + /* always superio. */ -+ if (current_fsuid()) { ++ if (current_fsuid() != GLOBAL_ROOT_GID) { + struct do_whplink_args args = { + .errp = &err, + .tgt = &tgtname, @@ -21467,7 +21515,7 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c + +out: + if (unlikely(err)) { -+ pr_warning("err %d, damaged pseudo link.\n", err); ++ pr_warn("err %d, damaged pseudo link.\n", err); + if (tmp) { + au_spl_del_rcu(&tmp->list, &sbinfo->si_plink); + call_rcu(&tmp->rcu, do_put_plink_rcu); @@ -21558,7 +21606,7 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c +} diff -urN /usr/share/empty/fs/aufs/poll.c linux/fs/aufs/poll.c --- /usr/share/empty/fs/aufs/poll.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/poll.c 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/poll.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -21618,7 +21666,7 @@ diff -urN /usr/share/empty/fs/aufs/poll.c linux/fs/aufs/poll.c +} diff -urN /usr/share/empty/fs/aufs/procfs.c linux/fs/aufs/procfs.c --- /usr/share/empty/fs/aufs/procfs.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/procfs.c 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/procfs.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2010-2012 Junjiro R. Okajima @@ -21792,7 +21840,7 @@ diff -urN /usr/share/empty/fs/aufs/procfs.c linux/fs/aufs/procfs.c +} diff -urN /usr/share/empty/fs/aufs/rdu.c linux/fs/aufs/rdu.c --- /usr/share/empty/fs/aufs/rdu.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/rdu.c 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/rdu.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,384 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -22180,7 +22228,7 @@ diff -urN /usr/share/empty/fs/aufs/rdu.c linux/fs/aufs/rdu.c +#endif diff -urN /usr/share/empty/fs/aufs/rwsem.h linux/fs/aufs/rwsem.h --- /usr/share/empty/fs/aufs/rwsem.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/rwsem.h 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/rwsem.h 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -22372,7 +22420,7 @@ diff -urN /usr/share/empty/fs/aufs/rwsem.h linux/fs/aufs/rwsem.h +#endif /* __AUFS_RWSEM_H__ */ diff -urN /usr/share/empty/fs/aufs/sbinfo.c linux/fs/aufs/sbinfo.c --- /usr/share/empty/fs/aufs/sbinfo.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/sbinfo.c 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/sbinfo.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,343 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -22717,9 +22765,105 @@ diff -urN /usr/share/empty/fs/aufs/sbinfo.c linux/fs/aufs/sbinfo.c + p = radix_tree_delete(&sbinfo->au_si_pid.tree, current->pid); + spin_unlock(&sbinfo->au_si_pid.tree_lock); +} +diff -urN /usr/share/empty/fs/aufs/security.c linux/fs/aufs/security.c +--- /usr/share/empty/fs/aufs/security.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux/fs/aufs/security.c 2012-07-22 19:57:03.164337936 +0200 +@@ -0,0 +1,92 @@ ++/* ++ * Copyright (C) 2012 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++/* ++ * securityf_file_mmap ++ */ ++ ++#include ++#include ++#include "aufs.h" ++ ++/* cf. linux/include/linux/mman.h: calc_vm_prot_bits() */ ++#define AuConv_VM_PROT(f, b) _calc_vm_trans(f, VM_##b, PROT_##b) ++ ++static unsigned long au_arch_prot_conv(unsigned long flags) ++{ ++ /* currently ppc64 only */ ++#ifdef CONFIG_PPC64 ++ /* cf. linux/arch/powerpc/include/asm/mman.h */ ++ AuDebugOn(arch_calc_vm_prot_bits(-1) != VM_SAO); ++ return AuConv_VM_PROT(flags, SAO); ++#else ++ AuDebugOn(arch_calc_vm_prot_bits(-1)); ++ return 0; ++#endif ++} ++ ++static unsigned long au_prot_conv(unsigned long flags) ++{ ++ return AuConv_VM_PROT(flags, READ) ++ | AuConv_VM_PROT(flags, WRITE) ++ | AuConv_VM_PROT(flags, EXEC) ++ | au_arch_prot_conv(flags); ++} ++ ++/* cf. linux/include/linux/mman.h: calc_vm_flag_bits() */ ++#define AuConv_VM_MAP(f, b) _calc_vm_trans(f, VM_##b, MAP_##b) ++ ++static unsigned long au_flag_conv(unsigned long flags) ++{ ++ return AuConv_VM_MAP(flags, GROWSDOWN) ++ | AuConv_VM_MAP(flags, DENYWRITE) ++ | AuConv_VM_MAP(flags, EXECUTABLE) ++ | AuConv_VM_MAP(flags, LOCKED); ++} ++ ++struct au_security_mmap_file_args { ++ int *errp; ++ struct file *h_file; ++ struct vm_area_struct *vma; ++}; ++ ++/* ++ * unnecessary to call security_mmap_file() since it doesn't have file as its ++ * argument. ++ */ ++static void au_call_security_mmap_file(void *args) ++{ ++ struct au_security_mmap_file_args *a = args; ++ *a->errp = security_mmap_file(a->h_file, au_prot_conv(a->vma->vm_flags), ++ au_flag_conv(a->vma->vm_flags)); ++} ++ ++int au_security_mmap_file(struct file *h_file, struct vm_area_struct *vma) ++{ ++ int err, wkq_err; ++ struct au_security_mmap_file_args args = { ++ .errp = &err, ++ .h_file = h_file, ++ .vma = vma ++ }; ++ ++ wkq_err = au_wkq_wait(au_call_security_mmap_file, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ return err; ++} 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 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/spl.h 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -22785,7 +22929,7 @@ diff -urN /usr/share/empty/fs/aufs/spl.h linux/fs/aufs/spl.h +#endif /* __AUFS_SPL_H__ */ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c --- /usr/share/empty/fs/aufs/super.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/super.c 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/super.c 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,962 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -23751,7 +23895,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c +}; diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h --- /usr/share/empty/fs/aufs/super.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/super.h 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/super.h 2012-07-22 19:57:03.164337936 +0200 @@ -0,0 +1,546 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -24301,7 +24445,7 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h +#endif /* __AUFS_SUPER_H__ */ diff -urN /usr/share/empty/fs/aufs/sysaufs.c linux/fs/aufs/sysaufs.c --- /usr/share/empty/fs/aufs/sysaufs.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/sysaufs.c 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/sysaufs.c 2012-07-22 19:57:03.167671344 +0200 @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -24410,7 +24554,7 @@ diff -urN /usr/share/empty/fs/aufs/sysaufs.c linux/fs/aufs/sysaufs.c +} diff -urN /usr/share/empty/fs/aufs/sysaufs.h linux/fs/aufs/sysaufs.h --- /usr/share/empty/fs/aufs/sysaufs.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/sysaufs.h 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/sysaufs.h 2012-07-22 19:57:03.167671344 +0200 @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -24518,7 +24662,7 @@ diff -urN /usr/share/empty/fs/aufs/sysaufs.h linux/fs/aufs/sysaufs.h +#endif /* __SYSAUFS_H__ */ diff -urN /usr/share/empty/fs/aufs/sysfs.c linux/fs/aufs/sysfs.c --- /usr/share/empty/fs/aufs/sysfs.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/sysfs.c 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/sysfs.c 2012-07-22 19:57:03.167671344 +0200 @@ -0,0 +1,257 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -24773,13 +24917,13 @@ diff -urN /usr/share/empty/fs/aufs/sysfs.c linux/fs/aufs/sysfs.c + "%d", bindex); + err = sysfs_create_file(kobj, &br->br_attr); + if (unlikely(err)) -+ pr_warning("failed %s under sysfs(%d)\n", -+ br->br_name, err); ++ pr_warn("failed %s under sysfs(%d)\n", ++ br->br_name, err); + } +} 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 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/sysrq.c 2012-07-22 19:57:03.167671344 +0200 @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -24867,14 +25011,14 @@ diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c + } +#endif + printk(KERN_WARNING AUFS_NAME ": files\n"); -+ lg_global_lock(files_lglock); ++ lg_global_lock(&files_lglock); + do_file_list_for_each_entry(sb, file) { + umode_t mode; + mode = file->f_dentry->d_inode->i_mode; + if (!special_file(mode) || au_special_file(mode)) + au_dpri_file(file); + } while_file_list_for_each_entry; -+ lg_global_unlock(files_lglock); ++ lg_global_unlock(&files_lglock); + printk(KERN_WARNING AUFS_NAME ": done\n"); + + au_plevel = plevel; @@ -24931,7 +25075,7 @@ diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c +} diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c --- /usr/share/empty/fs/aufs/vdir.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/vdir.c 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/vdir.c 2012-07-22 19:57:03.167671344 +0200 @@ -0,0 +1,885 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -25820,7 +25964,7 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c +} diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c --- /usr/share/empty/fs/aufs/vfsub.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux/fs/aufs/vfsub.c 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/vfsub.c 2012-07-22 19:57:03.167671344 +0200 @@ -0,0 +1,832 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -26656,8 +26800,8 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c +} 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 2012-05-22 09:06:08.870792417 +0200 -@@ -0,0 +1,232 @@ ++++ linux/fs/aufs/vfsub.h 2012-07-22 19:57:03.167671344 +0200 +@@ -0,0 +1,252 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima + * @@ -26691,12 +26835,12 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h + +/* copied from linux/fs/internal.h */ +/* todo: BAD approach!! */ -+DECLARE_BRLOCK(vfsmount_lock); ++extern struct lglock vfsmount_lock; +extern void file_sb_list_del(struct file *f); +extern spinlock_t inode_sb_list_lock; + +/* copied from linux/fs/file_table.c */ -+DECLARE_LGLOCK(files_lglock); ++extern struct lglock files_lglock; +#ifdef CONFIG_SMP +/* + * These macros iterate all files on all CPUs for a given superblock. @@ -26762,6 +26906,19 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h + +/* ---------------------------------------------------------------------- */ + ++/* cf. i_[ug]id_read() in linux/include/fs.h */ ++static inline uid_t vfsub_ia_uid(struct iattr *ia) ++{ ++ return from_kuid(&init_user_ns, ia->ia_uid); ++} ++ ++static inline gid_t vfsub_ia_gid(struct iattr *ia) ++{ ++ return from_kgid(&init_user_ns, ia->ia_gid); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ +int vfsub_update_h_iattr(struct path *h_path, int *did); +struct file *vfsub_dentry_open(struct path *path, int flags); +struct file *vfsub_filp_open(const char *path, int oflags, int mode); @@ -26831,6 +26988,13 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h + vfsub_update_h_iattr(&h_path, /*did*/NULL); /*ignore*/ +} + ++static inline int vfsub_update_time(struct inode *h_inode, struct timespec *ts, ++ int flags) ++{ ++ return update_time(h_inode, ts, flags); ++ /* no vfsub_update_h_iattr() since we don't have struct path */ ++} ++ +long vfsub_splice_to(struct file *in, loff_t *ppos, + struct pipe_inode_info *pipe, size_t len, + unsigned int flags); @@ -26892,7 +27056,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h +#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 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/wbr_policy.c 2012-07-22 19:57:03.167671344 +0200 @@ -0,0 +1,700 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -27596,8 +27760,8 @@ diff -urN /usr/share/empty/fs/aufs/wbr_policy.c linux/fs/aufs/wbr_policy.c +}; 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 2012-05-22 09:06:08.870792417 +0200 -@@ -0,0 +1,1049 @@ ++++ linux/fs/aufs/whout.c 2012-07-22 19:57:03.167671344 +0200 +@@ -0,0 +1,1041 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima + * @@ -27628,10 +27792,8 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c + * If a directory contains this file, then it is opaque. We start with the + * .wh. flag so that it is blocked by lookup. + */ -+static struct qstr diropq_name = { -+ .name = AUFS_WH_DIROPQ, -+ .len = sizeof(AUFS_WH_DIROPQ) - 1 -+}; ++static struct qstr diropq_name = QSTR_INIT(AUFS_WH_DIROPQ, ++ sizeof(AUFS_WH_DIROPQ) - 1); + +/* + * generate whiteout name, which is NOT terminated by NULL. @@ -27756,7 +27918,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c + goto out_name; + dput(dentry); + } -+ /* pr_warning("could not get random name\n"); */ ++ /* pr_warn("could not get random name\n"); */ + dentry = ERR_PTR(-EEXIST); + AuDbg("%.*s\n", AuLNPair(&qs)); + BUG(); @@ -27814,7 +27976,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c + * this may be a violation of unix fs semantics. + */ + force = (h_dir->i_mode & S_ISVTX) -+ && h_path->dentry->d_inode->i_uid != current_fsuid(); ++ && !uid_eq(current_fsuid(), h_path->dentry->d_inode->i_uid); + return vfsub_unlink(h_dir, h_path, force); +} + @@ -27874,8 +28036,8 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c + mnt_drop_write(whpath->mnt); + } + if (unlikely(err)) -+ pr_warning("failed removing %.*s (%d), ignored.\n", -+ AuDLNPair(whpath->dentry), err); ++ pr_warn("failed removing %.*s (%d), ignored.\n", ++ AuDLNPair(whpath->dentry), err); +} + +static int test_linkable(struct dentry *h_root) @@ -28048,18 +28210,12 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c + struct inode *h_dir; + struct au_wbr *wbr = br->br_wbr; + static const struct qstr base_name[] = { -+ [AuBrWh_BASE] = { -+ .name = AUFS_BASE_NAME, -+ .len = sizeof(AUFS_BASE_NAME) - 1 -+ }, -+ [AuBrWh_PLINK] = { -+ .name = AUFS_PLINKDIR_NAME, -+ .len = sizeof(AUFS_PLINKDIR_NAME) - 1 -+ }, -+ [AuBrWh_ORPH] = { -+ .name = AUFS_ORPHDIR_NAME, -+ .len = sizeof(AUFS_ORPHDIR_NAME) - 1 -+ } ++ [AuBrWh_BASE] = QSTR_INIT(AUFS_BASE_NAME, ++ sizeof(AUFS_BASE_NAME) - 1), ++ [AuBrWh_PLINK] = QSTR_INIT(AUFS_PLINKDIR_NAME, ++ sizeof(AUFS_PLINKDIR_NAME) - 1), ++ [AuBrWh_ORPH] = QSTR_INIT(AUFS_ORPHDIR_NAME, ++ sizeof(AUFS_ORPHDIR_NAME) - 1) + }; + struct au_wh_base base[] = { + [AuBrWh_BASE] = { @@ -28179,8 +28335,8 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c + mnt_drop_write(a->br->br_mnt); + } + } else { -+ pr_warning("%.*s is moved, ignored\n", -+ AuDLNPair(wbr->wbr_whbase)); ++ pr_warn("%.*s is moved, ignored\n", ++ AuDLNPair(wbr->wbr_whbase)); + err = 0; + } + dput(wbr->wbr_whbase); @@ -28571,8 +28727,8 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c + return 0; /* success */ + } + -+ pr_warning("failed removing %.*s(%d), ignored\n", -+ AuDLNPair(wh_dentry), err); ++ pr_warn("failed removing %.*s(%d), ignored\n", ++ AuDLNPair(wh_dentry), err); + return err; +} + @@ -28642,14 +28798,14 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c + args->wh_dentry = dget(wh_dentry); + wkq_err = au_wkq_nowait(call_rmdir_whtmp, args, sb, /*flags*/0); + if (unlikely(wkq_err)) { -+ pr_warning("rmdir error %.*s (%d), ignored\n", -+ AuDLNPair(wh_dentry), wkq_err); ++ pr_warn("rmdir error %.*s (%d), ignored\n", ++ AuDLNPair(wh_dentry), wkq_err); + au_whtmp_rmdir_free(args); + } +} 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 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/whout.h 2012-07-22 19:57:03.167671344 +0200 @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -28741,7 +28897,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.h linux/fs/aufs/whout.h +#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 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/wkq.c 2012-07-22 19:57:03.167671344 +0200 @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -28791,7 +28947,7 @@ diff -urN /usr/share/empty/fs/aufs/wkq.c linux/fs/aufs/wkq.c +{ + struct au_wkinfo *wkinfo = container_of(wk, struct au_wkinfo, wk); + -+ AuDebugOn(current_fsuid()); ++ AuDebugOn(current_fsuid() != GLOBAL_ROOT_GID); + AuDebugOn(rlimit(RLIMIT_FSIZE) != RLIM_INFINITY); + + wkinfo->func(wkinfo->args); @@ -28959,7 +29115,7 @@ diff -urN /usr/share/empty/fs/aufs/wkq.c linux/fs/aufs/wkq.c +} 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 2012-05-22 09:06:08.870792417 +0200 ++++ linux/fs/aufs/wkq.h 2012-07-22 19:57:03.167671344 +0200 @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -29055,7 +29211,7 @@ diff -urN /usr/share/empty/fs/aufs/wkq.h linux/fs/aufs/wkq.h +#endif /* __AUFS_WKQ_H__ */ 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 2012-05-22 09:06:08.874125894 +0200 ++++ linux/fs/aufs/xino.c 2012-07-22 19:57:03.167671344 +0200 @@ -0,0 +1,1264 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -29375,7 +29531,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c + + ii_read_unlock(dir); + if (unlikely(err)) -+ pr_warning("err b%d, (%d)\n", bindex, err); ++ pr_warn("err b%d, (%d)\n", bindex, err); + atomic_dec(&br->br_xino_running); + atomic_dec(&br->br_count); + si_write_unlock(sb); @@ -30323,7 +30479,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c +} diff -urN /usr/share/empty/include/linux/aufs_type.h linux/include/linux/aufs_type.h --- /usr/share/empty/include/linux/aufs_type.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux/include/linux/aufs_type.h 2012-05-23 12:07:43.277739181 +0200 ++++ linux/include/linux/aufs_type.h 2012-07-22 19:57:03.167671344 +0200 @@ -0,0 +1,233 @@ +/* + * Copyright (C) 2005-2012 Junjiro R. Okajima @@ -30366,7 +30522,7 @@ diff -urN /usr/share/empty/include/linux/aufs_type.h linux/include/linux/aufs_ty + +#include + -+#define AUFS_VERSION "3.4-20120521" ++#define AUFS_VERSION "3.x-rcN-20120618" + +/* todo? move this to linux-2.6.19/include/magic.h */ +#define AUFS_SUPER_MAGIC ('a' << 24 | 'u' << 16 | 'f' << 8 | 's') @@ -30558,4 +30714,3 @@ diff -urN /usr/share/empty/include/linux/aufs_type.h linux/include/linux/aufs_ty +#define AUFS_CTL_IBUSY _IOWR(AuCtlType, AuCtl_IBUSY, struct aufs_ibusy) + +#endif /* __AUFS_TYPE_H__ */ - diff --git a/kernel-esfq.patch b/kernel-esfq.patch index 73f1eaaa..531b8121 100644 --- a/kernel-esfq.patch +++ b/kernel-esfq.patch @@ -753,8 +753,8 @@ diff -Naur linux-2.6.24.orig/net/sched/sch_esfq.c linux-2.6.24/net/sched/sch_esf + opt.flows = q->depth; + opt.hash_kind = q->hash_kind; + -+ NLA_PUT(skb, TCA_OPTIONS, sizeof(opt), &opt); -+ ++ if (nla_put(skb, TCA_OPTIONS, sizeof(opt), &opt)) ++ goto nla_put_failure; + return skb->len; + +nla_put_failure: diff --git a/kernel-multiarch.config b/kernel-multiarch.config index 55a18ffc..b9d59562 100644 --- a/kernel-multiarch.config +++ b/kernel-multiarch.config @@ -5072,7 +5072,7 @@ COMEDI_NI_TIO all=m COMEDI_NI_LABPC all=m COMEDI_AMPLC_DIO200 all=m COMEDI_AMPLC_PC236 all=m -COMEDI_AMPLC_PC263 all=m +COMEDI_AMPLC_PC263_PCI all=m #- #- *** FILE: drivers/staging/cptm1217/Kconfig *** diff --git a/kernel-unionfs.patch b/kernel-unionfs.patch index 3cdb4769..d82d8e0f 100644 --- a/kernel-unionfs.patch +++ b/kernel-unionfs.patch @@ -4602,10 +4602,10 @@ index 0000000..f583c8f + goto out; + } + saved_vm_ops = vma->vm_ops; -+ err = do_munmap(current->mm, vma->vm_start, ++ err = vm_munmap(vma->vm_start, + vma->vm_end - vma->vm_start); + if (err) { -+ printk(KERN_ERR "unionfs: do_munmap failed %d\n", err); ++ printk(KERN_ERR "unionfs: vm_munmap failed %d\n", err); + goto out; + } + } @@ -9317,7 +9317,7 @@ index 0000000..b99f14d + struct unionfs_dir_state *rdstate; + + truncate_inode_pages(&inode->i_data, 0); -+ end_writeback(inode); ++ clear_inode(inode); + + list_for_each_safe(pos, n, &UNIONFS_I(inode)->readdircache) { + rdstate = list_entry(pos, struct unionfs_dir_state, cache); -- 2.44.0