]> git.pld-linux.org Git - packages/kernel.git/commitdiff
- up to 3.5.3. auto/th/kernel-3.5.3-1
authorArkadiusz Miśkiewicz <arekm@maven.pl>
Sun, 26 Aug 2012 07:25:04 +0000 (09:25 +0200)
committerArkadiusz Miśkiewicz <arekm@maven.pl>
Sun, 26 Aug 2012 07:25:04 +0000 (09:25 +0200)
kernel-apparmor.patch
kernel-aufs3.patch
kernel-small_fixes.patch
kernel.spec

index 49f4be306944c85f5461279a6cfd066f5cb0bd09..b5352e4430a342cb72ab443a102a9e2e4a030b45 100644 (file)
@@ -1,27 +1,45 @@
-From 8de755e4dfdbc40bfcaca848ae6b5aeaf0ede0e8 Mon Sep 17 00:00:00 2001
+From 05bf1eb7276886a3eda0588a8e012b558b693e96 Mon Sep 17 00:00:00 2001
 From: John Johansen <john.johansen@canonical.com>
 Date: Thu, 22 Jul 2010 02:32:02 -0700
-Subject: [PATCH 1/3] UBUNTU: SAUCE: AppArmor: Add profile introspection file
to interface
+Subject: [PATCH] UBUNTU: SAUCE: AppArmor: Add profile introspection file to
+ interface
 
 Add the dynamic profiles file to the interace, to allow load policy
 introspection.
 
 Signed-off-by: John Johansen <john.johansen@canonical.com>
 Acked-by: Kees Cook <kees@ubuntu.com>
-Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
 ---
- security/apparmor/apparmorfs.c |  227 ++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 227 insertions(+)
+ security/apparmor/Kconfig      |    9 ++
+ security/apparmor/apparmorfs.c |  231 ++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 240 insertions(+), 0 deletions(-)
 
+diff --git a/security/apparmor/Kconfig b/security/apparmor/Kconfig
+index 9b9013b..51ebf96 100644
+--- a/security/apparmor/Kconfig
++++ b/security/apparmor/Kconfig
+@@ -29,3 +29,12 @@ config SECURITY_APPARMOR_BOOTPARAM_VALUE
+         boot.
+         If you are unsure how to answer this question, answer 1.
++
++config SECURITY_APPARMOR_COMPAT_24
++      bool "Enable AppArmor 2.4 compatability"
++      depends on SECURITY_APPARMOR
++      default y
++      help
++        This option enables compatability with AppArmor 2.4.  It is
++          recommended if compatability with older versions of AppArmor
++          is desired.
 diff --git a/security/apparmor/apparmorfs.c b/security/apparmor/apparmorfs.c
-index 16c15ec..89bdc62 100644
+index 16c15ec..42b7c9f 100644
 --- a/security/apparmor/apparmorfs.c
 +++ b/security/apparmor/apparmorfs.c
-@@ -182,6 +182,232 @@ const struct file_operations aa_fs_seq_file_ops = {
+@@ -182,6 +182,234 @@ const struct file_operations aa_fs_seq_file_ops = {
        .release        = single_release,
  };
  
++#ifdef CONFIG_SECURITY_APPARMOR_COMPAT_24
 +/**
 + * __next_namespace - find the next namespace to list
 + * @root: root namespace to stop search at (NOT NULL)
@@ -247,25 +265,28 @@ index 16c15ec..89bdc62 100644
 +      .llseek = seq_lseek,
 +      .release = profiles_release,
 +};
++#endif /* CONFIG_SECURITY_APPARMOR_COMPAT_24 */
 +
  /** Base file system setup **/
  
  static struct aa_fs_entry aa_fs_entry_file[] = {
-@@ -210,6 +436,7 @@ static struct aa_fs_entry aa_fs_entry_apparmor[] = {
+@@ -210,6 +438,9 @@ static struct aa_fs_entry aa_fs_entry_apparmor[] = {
        AA_FS_FILE_FOPS(".load", 0640, &aa_fs_profile_load),
        AA_FS_FILE_FOPS(".replace", 0640, &aa_fs_profile_replace),
        AA_FS_FILE_FOPS(".remove", 0640, &aa_fs_profile_remove),
++#ifdef CONFIG_SECURITY_APPARMOR_COMPAT_24
 +      AA_FS_FILE_FOPS("profiles", 0640, &aa_fs_profiles_fops),
++#endif
        AA_FS_DIR("features", aa_fs_entry_features),
        { }
  };
 -- 
-1.7.9.5
+1.7.6.5
 
-From 423e2cb454d75d6185eecd0c1b5cf6ccc2d8482d Mon Sep 17 00:00:00 2001
+From 4facdf9db37c12ff655c91270d9030e2ed805ca2 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 2/3] UBUNTU: SAUCE: AppArmor: basic networking rules
+Subject: [PATCH] UBUNTU: SAUCE: AppArmor: basic networking rules
 
 Base support for network mediation.
 
@@ -370,10 +391,10 @@ index 806bd19..19daa85 100644
 +      $(call cmd,make-af)
 +      $(call cmd,make-sock)
 diff --git a/security/apparmor/apparmorfs.c b/security/apparmor/apparmorfs.c
-index 89bdc62..c66315d 100644
+index 42b7c9f..114fb23 100644
 --- a/security/apparmor/apparmorfs.c
 +++ b/security/apparmor/apparmorfs.c
-@@ -427,6 +427,7 @@ static struct aa_fs_entry aa_fs_entry_domain[] = {
+@@ -429,6 +429,7 @@ static struct aa_fs_entry aa_fs_entry_domain[] = {
  static struct aa_fs_entry aa_fs_entry_features[] = {
        AA_FS_DIR("domain",                     aa_fs_entry_domain),
        AA_FS_DIR("file",                       aa_fs_entry_file),
@@ -382,10 +403,10 @@ index 89bdc62..c66315d 100644
        AA_FS_DIR("rlimit",                     aa_fs_entry_rlimit),
        { }
 diff --git a/security/apparmor/include/audit.h b/security/apparmor/include/audit.h
-index 3868b1e..c1ff09c 100644
+index 4b7e189..17734f9 100644
 --- a/security/apparmor/include/audit.h
 +++ b/security/apparmor/include/audit.h
-@@ -126,6 +126,10 @@ struct apparmor_audit_data {
+@@ -127,6 +127,10 @@ struct apparmor_audit_data {
                        u32 denied;
                        uid_t ouid;
                } fs;
@@ -475,7 +496,7 @@ index bda4569..eb13a73 100644
  };
  
 diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
-index ad05d39..3cde194 100644
+index 8ea39aa..f628734 100644
 --- a/security/apparmor/lsm.c
 +++ b/security/apparmor/lsm.c
 @@ -32,6 +32,7 @@
@@ -486,7 +507,7 @@ index ad05d39..3cde194 100644
  #include "include/path.h"
  #include "include/policy.h"
  #include "include/procattr.h"
-@@ -622,6 +623,104 @@ static int apparmor_task_setrlimit(struct task_struct *task,
+@@ -614,6 +615,104 @@ static int apparmor_task_setrlimit(struct task_struct *task,
        return error;
  }
  
@@ -591,7 +612,7 @@ index ad05d39..3cde194 100644
  static struct security_operations apparmor_ops = {
        .name =                         "apparmor",
  
-@@ -653,6 +752,19 @@ static struct security_operations apparmor_ops = {
+@@ -646,6 +745,19 @@ static struct security_operations apparmor_ops = {
        .getprocattr =                  apparmor_getprocattr,
        .setprocattr =                  apparmor_setprocattr,
  
@@ -613,7 +634,7 @@ index ad05d39..3cde194 100644
        .cred_prepare =                 apparmor_cred_prepare,
 diff --git a/security/apparmor/net.c b/security/apparmor/net.c
 new file mode 100644
-index 0000000..084232b
+index 0000000..003dd18
 --- /dev/null
 +++ b/security/apparmor/net.c
 @@ -0,0 +1,162 @@
@@ -780,7 +801,7 @@ index 0000000..084232b
 +      return error;
 +}
 diff --git a/security/apparmor/policy.c b/security/apparmor/policy.c
-index f1f7506..b8100a7 100644
+index cf5fd22..27c8161 100644
 --- a/security/apparmor/policy.c
 +++ b/security/apparmor/policy.c
 @@ -745,6 +745,7 @@ static void free_profile(struct aa_profile *profile)
@@ -792,7 +813,7 @@ index f1f7506..b8100a7 100644
  
        aa_free_sid(profile->sid);
 diff --git a/security/apparmor/policy_unpack.c b/security/apparmor/policy_unpack.c
-index deab7c7..8f8e9c1 100644
+index 329b1fd..1b90dfa 100644
 --- a/security/apparmor/policy_unpack.c
 +++ b/security/apparmor/policy_unpack.c
 @@ -193,6 +193,19 @@ fail:
@@ -863,13 +884,12 @@ index deab7c7..8f8e9c1 100644
                /* generic policy dfa - optional and may be NULL */
                profile->policy.dfa = unpack_dfa(e);
 -- 
-1.7.9.5
+1.7.7.6
 
-From a94d5e11c0484af59e5feebf144cc48c186892ad Mon Sep 17 00:00:00 2001
+From 888a3d71db1ffd3a19d9f621b07e60c4ab9e1c44 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: [PATCH] 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.
@@ -937,10 +957,10 @@ index 19daa85..63e0a4c 100644
  clean-files := capability_names.h rlim_names.h net_names.h
  
 diff --git a/security/apparmor/apparmorfs.c b/security/apparmor/apparmorfs.c
-index c66315d..ff19009 100644
+index 114fb23..ee77ec9 100644
 --- a/security/apparmor/apparmorfs.c
 +++ b/security/apparmor/apparmorfs.c
-@@ -424,10 +424,23 @@ static struct aa_fs_entry aa_fs_entry_domain[] = {
+@@ -426,10 +426,23 @@ static struct aa_fs_entry aa_fs_entry_domain[] = {
        { }
  };
  
@@ -965,7 +985,7 @@ index c66315d..ff19009 100644
        AA_FS_DIR("rlimit",                     aa_fs_entry_rlimit),
        { }
 diff --git a/security/apparmor/audit.c b/security/apparmor/audit.c
-index cc3520d..b9f5ee9 100644
+index 3ae28db..e267963 100644
 --- a/security/apparmor/audit.c
 +++ b/security/apparmor/audit.c
 @@ -44,6 +44,10 @@ const char *const op_table[] = {
@@ -980,7 +1000,7 @@ index cc3520d..b9f5ee9 100644
        "post_create",
        "bind",
 diff --git a/security/apparmor/domain.c b/security/apparmor/domain.c
-index 6327685..dfdc47b 100644
+index b81ea10..afa8671 100644
 --- a/security/apparmor/domain.c
 +++ b/security/apparmor/domain.c
 @@ -242,7 +242,7 @@ static const char *next_name(int xtype, const char *name)
@@ -1008,7 +1028,7 @@ index 40aedd9..e243d96 100644
  /* 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 c1ff09c..7b90900c 100644
+index 17734f9..66a738c 100644
 --- a/security/apparmor/include/audit.h
 +++ b/security/apparmor/include/audit.h
 @@ -73,6 +73,10 @@ enum aa_ops {
@@ -1022,7 +1042,7 @@ index c1ff09c..7b90900c 100644
        OP_CREATE,
        OP_POST_CREATE,
        OP_BIND,
-@@ -121,6 +125,13 @@ struct apparmor_audit_data {
+@@ -122,6 +126,13 @@ struct apparmor_audit_data {
                        unsigned long max;
                } rlim;
                struct {
@@ -1110,7 +1130,7 @@ index 0000000..bc17a53
 +
 +#endif /* __AA_MOUNT_H */
 diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
-index 3cde194..4512cc6 100644
+index f628734..65ff9e4 100644
 --- a/security/apparmor/lsm.c
 +++ b/security/apparmor/lsm.c
 @@ -36,6 +36,7 @@
@@ -1121,7 +1141,7 @@ index 3cde194..4512cc6 100644
  
  /* Flag indicating whether initialization completed */
  int apparmor_initialized __initdata;
-@@ -512,6 +513,60 @@ static int apparmor_file_mprotect(struct vm_area_struct *vma,
+@@ -504,6 +505,60 @@ static int apparmor_file_mprotect(struct vm_area_struct *vma,
                           !(vma->vm_flags & VM_SHARED) ? MAP_PRIVATE : 0);
  }
  
@@ -1182,7 +1202,7 @@ index 3cde194..4512cc6 100644
  static int apparmor_getprocattr(struct task_struct *task, char *name,
                                char **value)
  {
-@@ -729,6 +784,10 @@ static struct security_operations apparmor_ops = {
+@@ -721,6 +776,10 @@ static struct security_operations apparmor_ops = {
        .capget =                       apparmor_capget,
        .capable =                      apparmor_capable,
  
@@ -1195,7 +1215,7 @@ index 3cde194..4512cc6 100644
        .path_symlink =                 apparmor_path_symlink,
 diff --git a/security/apparmor/mount.c b/security/apparmor/mount.c
 new file mode 100644
-index 0000000..63d8493
+index 0000000..478aa4d
 --- /dev/null
 +++ b/security/apparmor/mount.c
 @@ -0,0 +1,620 @@
@@ -1339,7 +1359,7 @@ index 0000000..63d8493
 +                     struct file_perms *perms, const char *info, int error)
 +{
 +      int audit_type = AUDIT_APPARMOR_AUTO;
-+      struct common_audit_data sa;
++      struct common_audit_data sa = { };
 +      struct apparmor_audit_data aad = { };
 +
 +      if (likely(!error)) {
@@ -1820,5 +1840,5 @@ index 0000000..63d8493
 +      return error;
 +}
 -- 
-1.7.9.5
+1.7.7.6
 
index 61ba23c5eda1bbe80844915b0b25c6cc7e70889b..4b8e02623f5c967500399522ad1ec455b6a85a67 100644 (file)
@@ -1,4 +1,4 @@
-aufs3.x-rcN kbuild patch
+aufs3.5 kbuild patch
 
 diff --git a/fs/Kconfig b/fs/Kconfig
 index f95ae3a..6d8a9a5 100644
@@ -33,7 +33,7 @@ index 8760be3..a1b8446 100644
  header-y += auto_fs.h
  header-y += auto_fs4.h
  header-y += auxvec.h
-aufs3.x-rcN base patch
+aufs3.5 base patch
 
 diff --git a/fs/inode.c b/fs/inode.c
 index c99163b..7f772fd 100644
@@ -62,10 +62,10 @@ index 7d69419..18c9782 100644
        return __lookup_hash(&nd->last, nd->path.dentry, nd);
  }
 diff --git a/fs/splice.c b/fs/splice.c
-index c9f1318..490239f 100644
+index 7bf08fa..e3c40b5 100644
 --- a/fs/splice.c
 +++ b/fs/splice.c
-@@ -1086,8 +1086,8 @@ EXPORT_SYMBOL(generic_splice_sendpage);
+@@ -1090,8 +1090,8 @@ EXPORT_SYMBOL(generic_splice_sendpage);
  /*
   * Attempt to initiate a splice from pipe to file.
   */
@@ -76,7 +76,7 @@ index c9f1318..490239f 100644
  {
        ssize_t (*splice_write)(struct pipe_inode_info *, struct file *,
                                loff_t *, size_t, unsigned int);
-@@ -1114,9 +1114,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
+@@ -1118,9 +1118,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
  /*
   * Attempt to initiate a splice from a file to a pipe.
   */
@@ -114,10 +114,10 @@ index ffc0213..ef35a31 100644
  
  extern int follow_down_one(struct path *);
 diff --git a/include/linux/splice.h b/include/linux/splice.h
-index 26e5b61..3ffef2f 100644
+index 09a545a..1ac5727 100644
 --- a/include/linux/splice.h
 +++ b/include/linux/splice.h
-@@ -91,4 +91,10 @@ extern void splice_shrink_spd(struct pipe_inode_info *,
+@@ -91,4 +91,10 @@ extern void splice_shrink_spd(struct splice_pipe_desc *);
  extern void spd_release_page(struct splice_pipe_desc *, unsigned int);
  
  extern const struct pipe_buf_operations page_cache_pipe_buf_ops;
@@ -128,7 +128,7 @@ index 26e5b61..3ffef2f 100644
 +                       struct pipe_inode_info *pipe, size_t len,
 +                       unsigned int flags);
  #endif
-aufs3.x-rcN standalone patch
+aufs3.5 standalone patch
 
 diff --git a/fs/file_table.c b/fs/file_table.c
 index a305d9e..6a768be 100644
@@ -265,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 d6c79a0..9004a15 100644
+index 1540632..2463289 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,
@@ -277,10 +277,10 @@ index d6c79a0..9004a15 100644
  static long do_sys_truncate(const char __user *pathname, loff_t length)
  {
 diff --git a/fs/splice.c b/fs/splice.c
-index 490239f..701d34a 100644
+index e3c40b5..3afc547 100644
 --- a/fs/splice.c
 +++ b/fs/splice.c
-@@ -1110,6 +1110,7 @@ long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
+@@ -1114,6 +1114,7 @@ long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
  
        return splice_write(pipe, out, ppos, len, flags);
  }
@@ -288,7 +288,7 @@ index 490239f..701d34a 100644
  
  /*
   * Attempt to initiate a splice from a file to a pipe.
-@@ -1136,6 +1137,7 @@ long do_splice_to(struct file *in, loff_t *ppos,
+@@ -1140,6 +1141,7 @@ long do_splice_to(struct file *in, loff_t *ppos,
  
        return splice_read(in, ppos, pipe, len, flags);
  }
@@ -333,10 +333,10 @@ index 442204c..e644a1c 100644
  int devcgroup_inode_mknod(int mode, dev_t dev)
  {
 diff --git a/security/security.c b/security/security.c
-index 3efc9b1..c7afd35 100644
+index 860aeb3..ffb57bf 100644
 --- a/security/security.c
 +++ b/security/security.c
-@@ -383,6 +383,7 @@ int security_path_rmdir(struct path *dir, struct dentry *dentry)
+@@ -384,6 +384,7 @@ int security_path_rmdir(struct path *dir, struct dentry *dentry)
                return 0;
        return security_ops->path_rmdir(dir, dentry);
  }
@@ -344,7 +344,7 @@ index 3efc9b1..c7afd35 100644
  
  int security_path_unlink(struct path *dir, struct dentry *dentry)
  {
-@@ -399,6 +400,7 @@ int security_path_symlink(struct path *dir, struct dentry *dentry,
+@@ -400,6 +401,7 @@ int security_path_symlink(struct path *dir, struct dentry *dentry,
                return 0;
        return security_ops->path_symlink(dir, dentry, old_name);
  }
@@ -352,7 +352,7 @@ index 3efc9b1..c7afd35 100644
  
  int security_path_link(struct dentry *old_dentry, struct path *new_dir,
                       struct dentry *new_dentry)
-@@ -407,6 +409,7 @@ int security_path_link(struct dentry *old_dentry, struct path *new_dir,
+@@ -408,6 +410,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);
  }
@@ -360,7 +360,7 @@ index 3efc9b1..c7afd35 100644
  
  int security_path_rename(struct path *old_dir, struct dentry *old_dentry,
                         struct path *new_dir, struct dentry *new_dentry)
-@@ -425,6 +428,7 @@ int security_path_truncate(struct path *path)
+@@ -426,6 +429,7 @@ int security_path_truncate(struct path *path)
                return 0;
        return security_ops->path_truncate(path);
  }
@@ -368,7 +368,7 @@ index 3efc9b1..c7afd35 100644
  
  int security_path_chmod(struct path *path, umode_t mode)
  {
-@@ -432,6 +436,7 @@ int security_path_chmod(struct path *path, umode_t mode)
+@@ -433,6 +437,7 @@ int security_path_chmod(struct path *path, umode_t mode)
                return 0;
        return security_ops->path_chmod(path, mode);
  }
@@ -376,7 +376,7 @@ index 3efc9b1..c7afd35 100644
  
  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)
+@@ -440,6 +445,7 @@ int security_path_chown(struct path *path, uid_t uid, gid_t gid)
                return 0;
        return security_ops->path_chown(path, uid, gid);
  }
@@ -384,7 +384,7 @@ index 3efc9b1..c7afd35 100644
  
  int security_path_chroot(struct path *path)
  {
-@@ -515,6 +521,7 @@ int security_inode_readlink(struct dentry *dentry)
+@@ -516,6 +522,7 @@ int security_inode_readlink(struct dentry *dentry)
                return 0;
        return security_ops->inode_readlink(dentry);
  }
@@ -392,7 +392,7 @@ index 3efc9b1..c7afd35 100644
  
  int security_inode_follow_link(struct dentry *dentry, struct nameidata *nd)
  {
-@@ -529,6 +536,7 @@ int security_inode_permission(struct inode *inode, int mask)
+@@ -530,6 +537,7 @@ int security_inode_permission(struct inode *inode, int mask)
                return 0;
        return security_ops->inode_permission(inode, mask);
  }
@@ -400,7 +400,7 @@ index 3efc9b1..c7afd35 100644
  
  int security_inode_setattr(struct dentry *dentry, struct iattr *attr)
  {
-@@ -644,6 +652,7 @@ int security_file_permission(struct file *file, int mask)
+@@ -645,6 +653,7 @@ int security_file_permission(struct file *file, int mask)
  
        return fsnotify_perm(file, mask);
  }
@@ -408,7 +408,7 @@ index 3efc9b1..c7afd35 100644
  
  int security_file_alloc(struct file *file)
  {
-@@ -704,6 +713,7 @@ int security_mmap_file(struct file *file, unsigned long prot,
+@@ -705,6 +714,7 @@ int security_mmap_file(struct file *file, unsigned long prot,
                return ret;
        return ima_file_mmap(file, prot);
  }
@@ -418,7 +418,7 @@ index 3efc9b1..c7afd35 100644
  {
 diff -urN /usr/share/empty/Documentation/ABI/testing/debugfs-aufs linux/Documentation/ABI/testing/debugfs-aufs
 --- /usr/share/empty/Documentation/ABI/testing/debugfs-aufs    1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/ABI/testing/debugfs-aufs       2012-07-22 19:57:03.161004529 +0200
++++ linux/Documentation/ABI/testing/debugfs-aufs       2012-08-26 08:39:00.753841216 +0200
 @@ -0,0 +1,37 @@
 +What:         /debug/aufs/si_<id>/
 +Date:         March 2009
@@ -459,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-07-22 19:57:03.161004529 +0200
++++ linux/Documentation/ABI/testing/sysfs-aufs 2012-08-26 08:39:00.753841216 +0200
 @@ -0,0 +1,24 @@
 +What:         /sys/fs/aufs/si_<id>/
 +Date:         March 2009
@@ -487,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-07-22 19:57:03.161004531 +0200
++++ linux/Documentation/filesystems/aufs/design/01intro.txt    2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,162 @@
 +
 +# Copyright (C) 2005-2011 Junjiro R. Okajima
@@ -653,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-07-22 19:57:03.161004531 +0200
++++ linux/Documentation/filesystems/aufs/design/02struct.txt   2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,226 @@
 +
 +# Copyright (C) 2005-2011 Junjiro R. Okajima
@@ -883,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-07-22 19:57:03.161004531 +0200
++++ linux/Documentation/filesystems/aufs/design/03lookup.txt   2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,106 @@
 +
 +# Copyright (C) 2005-2011 Junjiro R. Okajima
@@ -993,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-07-22 19:57:03.161004531 +0200
++++ linux/Documentation/filesystems/aufs/design/04branch.txt   2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,76 @@
 +
 +# Copyright (C) 2005-2011 Junjiro R. Okajima
@@ -1073,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-07-22 19:57:03.161004531 +0200
++++ linux/Documentation/filesystems/aufs/design/05wbr_policy.txt       2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,65 @@
 +
 +# Copyright (C) 2005-2011 Junjiro R. Okajima
@@ -1142,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-07-22 19:57:03.161004531 +0200
++++ linux/Documentation/filesystems/aufs/design/06mmap.txt     2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,47 @@
 +
 +# Copyright (C) 2005-2011 Junjiro R. Okajima
@@ -1193,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-07-22 19:57:03.161004531 +0200
++++ linux/Documentation/filesystems/aufs/design/07export.txt   2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,59 @@
 +
 +# Copyright (C) 2005-2011 Junjiro R. Okajima
@@ -1256,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-07-22 19:57:03.161004531 +0200
++++ linux/Documentation/filesystems/aufs/design/08shwh.txt     2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,53 @@
 +
 +# Copyright (C) 2005-2011 Junjiro R. Okajima
@@ -1313,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-07-22 19:57:03.161004531 +0200
++++ linux/Documentation/filesystems/aufs/design/10dynop.txt    2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,47 @@
 +
 +# Copyright (C) 2010-2011 Junjiro R. Okajima
@@ -1364,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-07-22 19:57:03.161004531 +0200
++++ linux/Documentation/filesystems/aufs/design/99plan.txt     2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,96 @@
 +
 +# Copyright (C) 2005-2011 Junjiro R. Okajima
@@ -1464,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-07-22 19:57:03.161004529 +0200
++++ linux/Documentation/filesystems/aufs/README        2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,330 @@
 +
 +Aufs3 -- advanced multi layered unification filesystem version 3.x
@@ -1777,7 +1777,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
 +Pavel Pronskiy made a donation (2011/2).
 +Iridium and Inmarsat satellite phone retailer (www.mailasail.com), Nippy
 +      Networks (Ed Wildgoose) made a donation for hardware (2011/3).
-+Max Lekomcev (DOM-TV project) made a donation (2011/7, 12 and 2012/3).
++Max Lekomcev (DOM-TV project) made a donation (2011/7, 12 and 2012/3, 6).
 +Sam Liddicott made a donation (2011/9).
 +
 +Thank you very much.
@@ -1798,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/aufs.h       2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,60 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -1862,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/branch.c     2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,1169 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -3035,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/branch.h     2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,230 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -3269,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/conf.mk      2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,38 @@
 +
 +AuConfStr = CONFIG_AUFS_FS=${CONFIG_AUFS_FS}
@@ -3311,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/cpup.c       2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,1084 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -4399,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/cpup.h       2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,81 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -4484,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/dbgaufs.c    2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,334 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -4822,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/dbgaufs.h    2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,49 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -4875,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/dcsub.c      2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,243 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -5122,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/dcsub.h      2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,94 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -5220,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/debug.c      2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,489 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -5713,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/debug.h      2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,242 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -5959,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/dentry.c     2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,1140 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -6338,7 +6338,7 @@ 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 */
 +              || !uid_eq(ia->i_uid, h_inode->i_uid)
-+              || !uid_eq(ia->i_gid, h_inode->i_gid)
++              || !gid_eq(ia->i_gid, h_inode->i_gid)
 +              || ia->i_version != h_inode->i_version
 +/*
 +              || ia->i_size != h_inode->i_size
@@ -7103,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/dentry.h     2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,237 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -7344,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/dinfo.c      2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,543 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -7891,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/dir.c        2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,636 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -8531,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/dir.h        2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,137 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -8672,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/dynop.c      2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,377 @@
 +/*
 + * Copyright (C) 2010-2012 Junjiro R. Okajima
@@ -9053,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/dynop.h      2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,76 @@
 +/*
 + * Copyright (C) 2010-2012 Junjiro R. Okajima
@@ -9133,7 +9133,7 @@ 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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/export.c     2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,810 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -9947,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/file.c       2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,676 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -10627,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-07-22 19:57:03.164337936 +0200
-@@ -0,0 +1,306 @@
++++ linux/fs/aufs/file.h       2012-08-26 08:39:00.760508065 +0200
+@@ -0,0 +1,298 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
 + *
@@ -10712,14 +10712,6 @@ 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);
@@ -10937,7 +10929,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/finfo.c      2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,156 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -11097,8 +11089,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-07-22 19:57:03.164337936 +0200
-@@ -0,0 +1,692 @@
++++ linux/fs/aufs/f_op.c       2012-08-26 08:39:00.760508065 +0200
+@@ -0,0 +1,727 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
 + *
@@ -11546,6 +11538,41 @@ 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;
@@ -11588,8 +11615,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);
-+      /* todo: bad approach, I am not sure this is really necessary */
-+      err = au_security_mmap_file(h_file, vma);
++      err = security_mmap_file(h_file, au_prot_conv(vma->vm_flags),
++                               au_flag_conv(vma->vm_flags));
 +      if (!err)
 +              err = h_file->f_op->mmap(h_file, vma);
 +      if (unlikely(err))
@@ -11793,7 +11820,7 @@ 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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/f_op_sp.c    2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,295 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -12092,7 +12119,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/fstype.h     2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,496 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -12592,7 +12619,7 @@ diff -urN /usr/share/empty/fs/aufs/fstype.h linux/fs/aufs/fstype.h
 +#endif /* __AUFS_FSTYPE_H__ */
 diff -urN /usr/share/empty/fs/aufs/hfsnotify.c linux/fs/aufs/hfsnotify.c
 --- /usr/share/empty/fs/aufs/hfsnotify.c       1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/hfsnotify.c  2012-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/hfsnotify.c  2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,257 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -12853,7 +12880,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/hfsplus.c    2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,57 @@
 +/*
 + * Copyright (C) 2010-2012 Junjiro R. Okajima
@@ -12914,7 +12941,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/hnotify.c    2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,712 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -13630,7 +13657,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/iinfo.c      2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,264 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -13898,8 +13925,8 @@ diff -urN /usr/share/empty/fs/aufs/iinfo.c linux/fs/aufs/iinfo.c
 +}
 diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
 --- /usr/share/empty/fs/aufs/inode.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/inode.c      2012-07-22 19:57:03.164337936 +0200
-@@ -0,0 +1,471 @@
++++ linux/fs/aufs/inode.c      2012-08-26 08:39:00.760508065 +0200
+@@ -0,0 +1,478 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
 + *
@@ -14228,7 +14255,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
 +      struct super_block *sb;
 +      struct mutex *mtx;
 +      ino_t h_ino, ino;
-+      int err;
++      int err, lc_idx;
 +      aufs_bindex_t bstart;
 +
 +      sb = dentry->d_sb;
@@ -14269,6 +14296,13 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
 +
 +      AuDbg("%lx, new %d\n", inode->i_state, !!(inode->i_state & I_NEW));
 +      if (inode->i_state & I_NEW) {
++              lc_idx = AuLcNonDir_IIINFO;
++              if (S_ISLNK(h_inode->i_mode))
++                      lc_idx = AuLcSymlink_IIINFO;
++              else if (S_ISDIR(h_inode->i_mode))
++                      lc_idx = AuLcDir_IIINFO;
++              au_rw_class(&au_ii(inode)->ii_rwsem, au_lc_key + lc_idx);
++
 +              ii_write_lock_new_child(inode);
 +              err = set_inode(inode, dentry);
 +              if (!err) {
@@ -14358,7 +14392,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() == GLOBAL_ROOT_GID)
++      if (uid_eq(current_fsuid(), GLOBAL_ROOT_UID))
 +              return 0;
 +      return inode_permission(h_inode, mask);
 +}
@@ -14373,7 +14407,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/inode.h      2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,560 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -14937,7 +14971,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/ioctl.c      2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,196 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -15137,7 +15171,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/i_op_add.c   2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,712 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -15853,8 +15887,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-07-22 19:57:03.164337936 +0200
-@@ -0,0 +1,1014 @@
++++ linux/fs/aufs/i_op.c       2012-08-26 08:39:00.760508065 +0200
+@@ -0,0 +1,1009 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
 + *
@@ -16063,18 +16097,13 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +      ret = d_splice_alias(inode, dentry);
 +      if (unlikely(IS_ERR(ret) && inode)) {
 +              ii_write_unlock(inode);
-+              lc_idx = AuLcNonDir_IIINFO;
-+              if (S_ISLNK(inode->i_mode))
-+                      lc_idx = AuLcSymlink_IIINFO;
-+              else if (S_ISDIR(inode->i_mode))
-+                      lc_idx = AuLcDir_IIINFO;
-+              au_rw_class(&au_ii(inode)->ii_rwsem, au_lc_key + lc_idx);
 +              iput(inode);
++              inode = NULL;
 +      }
 +
 +out_unlock:
 +      di_write_unlock(dentry);
-+      if (unlikely(IS_ERR(ret) && inode)) {
++      if (inode) {
 +              lc_idx = AuLcNonDir_DIINFO;
 +              if (S_ISLNK(inode->i_mode))
 +                      lc_idx = AuLcSymlink_DIINFO;
@@ -16871,7 +16900,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +};
 diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
 --- /usr/share/empty/fs/aufs/i_op_del.c        1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op_del.c   2012-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/i_op_del.c   2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,478 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -17353,7 +17382,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/i_op_ren.c   2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,1026 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -18383,7 +18412,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-07-22 19:57:03.161004531 +0200
++++ linux/fs/aufs/Kconfig      2012-08-26 08:39:00.757174634 +0200
 @@ -0,0 +1,203 @@
 +config AUFS_FS
 +      tristate "Aufs (Advanced multi layered unification filesystem) support"
@@ -18590,7 +18619,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/loop.c       2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,133 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -18727,7 +18756,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/loop.h       2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,50 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -18781,7 +18810,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/magic.mk     2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,54 @@
 +
 +# defined in ${srctree}/fs/fuse/inode.c
@@ -18839,8 +18868,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-07-22 19:57:03.161004531 +0200
-@@ -0,0 +1,45 @@
++++ linux/fs/aufs/Makefile     2012-08-26 08:39:00.757174634 +0200
+@@ -0,0 +1,42 @@
 +
 +include ${src}/magic.mk
 +ifeq (${CONFIG_AUFS_FS},m)
@@ -18880,15 +18909,12 @@ 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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/module.c     2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,196 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -19088,7 +19114,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/module.h     2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,105 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -19197,7 +19223,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/opts.c       2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,1677 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -20878,7 +20904,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/opts.h       2012-08-26 08:39:00.760508065 +0200
 @@ -0,0 +1,209 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -21091,7 +21117,7 @@ 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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/plink.c      2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,511 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -21332,7 +21358,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() != GLOBAL_ROOT_GID) {
++      if (!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) {
 +              struct au_do_plink_lkup_args args = {
 +                      .errp           = &h_dentry,
 +                      .tgtname        = &tgtname,
@@ -21417,7 +21443,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() != GLOBAL_ROOT_GID) {
++      if (!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) {
 +              struct do_whplink_args args = {
 +                      .errp           = &err,
 +                      .tgt            = &tgtname,
@@ -21606,7 +21632,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/poll.c       2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,56 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -21666,7 +21692,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/procfs.c     2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,170 @@
 +/*
 + * Copyright (C) 2010-2012 Junjiro R. Okajima
@@ -21840,7 +21866,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/rdu.c        2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,384 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -22228,7 +22254,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/rwsem.h      2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,188 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -22420,7 +22446,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/sbinfo.c     2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,343 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -22765,105 +22791,9 @@ 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 <linux/mman.h>
-+#include <linux/security.h>
-+#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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/spl.h        2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,62 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -22929,7 +22859,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/super.c      2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,962 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -23895,7 +23825,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-07-22 19:57:03.164337936 +0200
++++ linux/fs/aufs/super.h      2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,546 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -24445,7 +24375,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-07-22 19:57:03.167671344 +0200
++++ linux/fs/aufs/sysaufs.c    2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,105 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -24554,7 +24484,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-07-22 19:57:03.167671344 +0200
++++ linux/fs/aufs/sysaufs.h    2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,104 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -24662,7 +24592,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-07-22 19:57:03.167671344 +0200
++++ linux/fs/aufs/sysfs.c      2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,257 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -24923,7 +24853,7 @@ diff -urN /usr/share/empty/fs/aufs/sysfs.c linux/fs/aufs/sysfs.c
 +}
 diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
 --- /usr/share/empty/fs/aufs/sysrq.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sysrq.c      2012-07-22 19:57:03.167671344 +0200
++++ linux/fs/aufs/sysrq.c      2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,148 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -25075,7 +25005,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-07-22 19:57:03.167671344 +0200
++++ linux/fs/aufs/vdir.c       2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,885 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -25964,7 +25894,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-07-22 19:57:03.167671344 +0200
++++ linux/fs/aufs/vfsub.c      2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,832 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -26800,7 +26730,7 @@ 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-07-22 19:57:03.167671344 +0200
++++ linux/fs/aufs/vfsub.h      2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,252 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -27056,7 +26986,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-07-22 19:57:03.167671344 +0200
++++ linux/fs/aufs/wbr_policy.c 2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,700 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -27760,7 +27690,7 @@ 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-07-22 19:57:03.167671344 +0200
++++ linux/fs/aufs/whout.c      2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,1041 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -28805,7 +28735,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +}
 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-07-22 19:57:03.167671344 +0200
++++ linux/fs/aufs/whout.h      2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,88 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -28897,7 +28827,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-07-22 19:57:03.167671344 +0200
++++ linux/fs/aufs/wkq.c        2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,214 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -28947,7 +28877,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() != GLOBAL_ROOT_GID);
++      AuDebugOn(!uid_eq(current_fsuid(), GLOBAL_ROOT_UID));
 +      AuDebugOn(rlimit(RLIMIT_FSIZE) != RLIM_INFINITY);
 +
 +      wkinfo->func(wkinfo->args);
@@ -29115,7 +29045,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-07-22 19:57:03.167671344 +0200
++++ linux/fs/aufs/wkq.h        2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,92 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -29211,7 +29141,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-07-22 19:57:03.167671344 +0200
++++ linux/fs/aufs/xino.c       2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,1264 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -30479,7 +30409,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-07-22 19:57:03.167671344 +0200
++++ linux/include/linux/aufs_type.h    2012-08-26 08:39:00.763841498 +0200
 @@ -0,0 +1,233 @@
 +/*
 + * Copyright (C) 2005-2012 Junjiro R. Okajima
@@ -30522,7 +30452,7 @@ diff -urN /usr/share/empty/include/linux/aufs_type.h linux/include/linux/aufs_ty
 +
 +#include <linux/limits.h>
 +
-+#define AUFS_VERSION  "3.x-rcN-20120618"
++#define AUFS_VERSION  "3.5-20120813"
 +
 +/* todo? move this to linux-2.6.19/include/magic.h */
 +#define AUFS_SUPER_MAGIC      ('a' << 24 | 'u' << 16 | 'f' << 8 | 's')
@@ -30714,3 +30644,4 @@ 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__ */
+
index 5f61c75c981d16496f10dd0a970c9727c106ec77..d30a20a8f0dd8539d7b0631c3e04ff36fed67b6c 100644 (file)
@@ -78,3 +78,615 @@ index 7a0c800..ec5ebbb 100644
                if (bindex < orig_bstart || bindex > orig_bend) {
                        dput(lower_dentry);
 
+From patchwork Sun Aug 12 11:57:49 2012
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: sp5100_tco: Add SB8x0 chipset support
+Date: Sun, 12 Aug 2012 11:57:49 -0000
+From: Takahisa Tanaka <mc74hc00@gmail.com>
+X-Patchwork-Id: 1309571
+Message-Id: <1344772669-2872-1-git-send-email-mc74hc00@gmail.com>
+To: linux-watchdog@vger.kernel.org
+Cc: wim@iguana.be, stable@kernel.org,
+ paulepanter@users.sourceforge.net, post+kernel@ralfj.de,
+ linux-kernel@vger.kernel.org, Takahisa Tanaka <mc74hc00@gmail.com>
+
+The current sp5100_tco driver only supports SP5100/SB7x0 chipset, doesn't
+support SB8x0 chipset, because current sp5100_tco driver doesn't know that the
+offset address for watchdog timer was changed from SB8x0 chipset.
+
+The offset address of SP5100 and SB7x0 chipsets are as follows, quote from the
+AMD SB700/710/750 Register Reference Guide(Page 164) and the AMD SP5100
+Register Reference Guide(Page 166).
+
+  WatchDogTimerControl 69h
+  WatchDogTimerBase0   6Ch
+  WatchDogTimerBase1   6Dh
+  WatchDogTimerBase2   6Eh
+  WatchDogTimerBase3   6Fh
+
+In contrast, the offset address of SB8x0 chipset is as follows, quote from
+AMD SB800-Series Southbridges Register Reference Guide(Page 147).
+
+  WatchDogTimerEn      48h
+  WatchDogTimerConfig  4Ch
+
+So, In the case of SB8x0 chipset, sp5100_tco reads meaningless MMIO
+address(for example, 0xbafe00) from wrong offset address, and the following
+message is logged.
+
+   SP5100 TCO timer: mmio address 0xbafe00 already in use
+
+With this patch, sp5100_tco driver supports SB8x0 chipset, and can avoid
+iomem resource conflict. The processing of this patch is as follows.
+
+ Step 1) Attempt to get the watchdog base address from indirect I/O(0xCD6
+         and 0xCD7).
+  - Go to the step 7 if obtained address hasn't conflicted with other
+    resource. But, currently, the address(0xfec000f0) conflicts with the
+    IOAPIC MMIO address, and the following message is logged.
+
+       SP5100 TCO timer: mmio address 0xfec000f0 already in use
+
+    0xfec000f0 is recommended by AMD BIOS Developer's Guide. So, go to the
+    next step.
+
+ Step 2) Attempt to get the SBResource_MMIO base address from AcpiMmioEN(for
+         SB8x0,  PM_Reg:24h) or SBResource_MMIO(SP5100/SB7x0, PCI_Reg:9Ch)
+         register.
+  - Go to the step 7 if these register has enabled by BIOS, and obtained
+    address hasn't conflicted with other resource.
+  - If above condition isn't true, go to the next step.
+
+ Step 3) Attempt to get the free MMIO address from allocate_resource().
+  - Go to the step 7 if these register has enabled by BIOS, and obtained
+    address hasn't conflicted with other resource.
+  - Driver initialization has failed if obtained address has conflicted
+    with other resource, and no 'force_addr' parameter is specified.
+
+ Step 4) Use the specified address If 'force_addr' parameter is specified.
+  - allocate_resource() function may fail, when the PCI bridge device occupies
+    iomem resource from 0xf0000000 to 0xffffffff. To handle such a case,
+    I added 'force_addr' parameter to sp5100_tco driver. With 'force_addr'
+    parameter, sp5100_tco driver directly can assign MMIO address for watchdog
+    timer from free iomem region. Note that It's dangerous to specify wrong
+    address in the 'force_addr' parameter.
+
+      Example of force_addr parameter use
+        # cat /proc/iomem
+        ...snip...
+        fec00000-fec003ff : IOAPIC 0
+                                      <--- free MMIO region
+        fec10000-fec1001f : pnp 00:0b
+        fec20000-fec203ff : IOAPIC 1
+        ...snip...
+        # cat /etc/modprobe.d/sp5100_tco.conf
+        options sp5100_tco force_addr=0xfec00800
+        # modprobe sp5100_tco
+        # cat /proc/iomem
+        ...snip...
+        fec00000-fec003ff : IOAPIC 0
+        fec00800-fec00807 : SP5100 TCO  <--- watchdog timer MMIO address
+        fec10000-fec1001f : pnp 00:0b
+        fec20000-fec203ff : IOAPIC 1
+        ...snip...
+        #
+
+  - Driver initialization has failed if specified address has conflicted
+    with other resource.
+
+ Step 5) Disable the watchdog timer
+  - To rewrite the watchdog timer register of the chipset, absolutely
+    guarantee that the watchdog timer is disabled.
+
+ Step 6) Re-program the watchdog timer MMIO address to chipset.
+  - Re-program the obtained MMIO address in Step 3 or Step 4 to chipset via
+    indirect I/O(0xCD6 and 0xCD7).
+
+ Step 7) Enable and setup the watchdog timer
+
+This patch has worked fine on my test environment(ASUS M4A89GTD-PRO/USB3 and
+DL165G7). therefore I believe that it's no problem to re-program the MMIO
+address for watchdog timer to chipset during disabled watchdog. However,
+I'm not sure about it, because I don't know much about chipset programming.
+
+So, any comments will be welcome.
+
+Tested-by: Paul Menzel <paulepanter@users.sourceforge.net>
+CC: stable@kernel.org
+Signed-off-by: Takahisa Tanaka <mc74hc00@gmail.com>
+
+---
+drivers/watchdog/sp5100_tco.c | 291 ++++++++++++++++++++++++++++++++++++------
+ drivers/watchdog/sp5100_tco.h |  46 +++++--
+ 2 files changed, 286 insertions(+), 51 deletions(-)
+
+diff --git a/drivers/watchdog/sp5100_tco.c b/drivers/watchdog/sp5100_tco.c
+index ae5e82c..36e917f 100644
+--- a/drivers/watchdog/sp5100_tco.c
++++ b/drivers/watchdog/sp5100_tco.c
+@@ -13,7 +13,9 @@
+  *    as published by the Free Software Foundation; either version
+  *    2 of the License, or (at your option) any later version.
+  *
+- *    See AMD Publication 43009 "AMD SB700/710/750 Register Reference Guide"
++ *    See AMD Publication 43009 "AMD SB700/710/750 Register Reference Guide",
++ *        AMD Publication 45482 "AMD SB800-Series Sourthbridges Register
++ *                                                          Reference Guide"
+  */
+ /*
+@@ -38,18 +40,23 @@
+ #include "sp5100_tco.h"
+ /* Module and version information */
+-#define TCO_VERSION "0.01"
++#define TCO_VERSION "0.03"
+ #define TCO_MODULE_NAME "SP5100 TCO timer"
+ #define TCO_DRIVER_NAME   TCO_MODULE_NAME ", v" TCO_VERSION
+ /* internal variables */
+ static u32 tcobase_phys;
++static u32 resbase_phys;
+ static void __iomem *tcobase;
+ static unsigned int pm_iobase;
+ static DEFINE_SPINLOCK(tco_lock);     /* Guards the hardware */
+ static unsigned long timer_alive;
+ static char tco_expect_close;
+ static struct pci_dev *sp5100_tco_pci;
++static struct resource wdt_res = {
++      .name = "Watchdog Timer",
++      .flags = IORESOURCE_MEM,
++};
+ /* the watchdog platform device */
+ static struct platform_device *sp5100_tco_platform_device;
+@@ -67,6 +74,12 @@ module_param(nowayout, bool, 0);
+ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started"
+               " (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
++static unsigned int force_addr;
++module_param(force_addr, uint, 0);
++MODULE_PARM_DESC(force_addr, "Force the use of specified MMIO address, "
++              "default is disabled. DON'T USE THIS PARAMETER ONLY "
++              "IF YOU REALLY KNOW WHAT YOU ARE DOING");
++
+ /*
+  * Some TCO specific functions
+  */
+@@ -122,6 +135,79 @@ static int tco_timer_set_heartbeat(int t)
+       return 0;
+ }
++static void tco_timer_enable(void)
++{
++      int val;
++
++      if (sp5100_tco_pci->revision >= 0x40) {
++              /* For SB800 or later */
++              /* Set the Watchdog timer resolution to 1 sec */
++              outb(SB800_PM_WATCHDOG_CONFIG, SB800_IO_PM_INDEX_REG);
++              val = inb(SB800_IO_PM_DATA_REG);
++              val |= SB800_PM_WATCHDOG_SECOND_RES;
++              outb(val, SB800_IO_PM_DATA_REG);
++
++              /* Enable watchdog decode bit and watchdog timer */
++              outb(SB800_PM_WATCHDOG_CONTROL, SB800_IO_PM_INDEX_REG);
++              val = inb(SB800_IO_PM_DATA_REG);
++              val |= SB800_PCI_WATCHDOG_DECODE_EN;
++              val &= ~SB800_PM_WATCHDOG_DISABLE;
++              outb(val, SB800_IO_PM_DATA_REG);
++      } else {
++              /* For SP5100 or SB7x0 */
++              /* Enable watchdog decode bit */
++              pci_read_config_dword(sp5100_tco_pci,
++                                    SP5100_PCI_WATCHDOG_MISC_REG,
++                                    &val);
++
++              val |= SP5100_PCI_WATCHDOG_DECODE_EN;
++
++              pci_write_config_dword(sp5100_tco_pci,
++                                     SP5100_PCI_WATCHDOG_MISC_REG,
++                                     val);
++
++              /* Enable Watchdog timer and set the resolution to 1 sec */
++              outb(SP5100_PM_WATCHDOG_CONTROL, SP5100_IO_PM_INDEX_REG);
++              val = inb(SP5100_IO_PM_DATA_REG);
++              val |= SP5100_PM_WATCHDOG_SECOND_RES;
++              val &= ~SP5100_PM_WATCHDOG_DISABLE;
++              outb(val, SP5100_IO_PM_DATA_REG);
++      }
++}
++
++static void tco_timer_disable(void)
++{
++      int val;
++
++      if (sp5100_tco_pci->revision >= 0x40) {
++              /* For SB800 or later */
++              /* Enable watchdog decode bit and Disable watchdog timer */
++              outb(SB800_PM_WATCHDOG_CONTROL, SB800_IO_PM_INDEX_REG);
++              val = inb(SB800_IO_PM_DATA_REG);
++              val |= SB800_PCI_WATCHDOG_DECODE_EN;
++              val |= SB800_PM_WATCHDOG_DISABLE;
++              outb(val, SB800_IO_PM_DATA_REG);
++      } else {
++              /* For SP5100 or SB7x0 */
++              /* Enable watchdog decode bit */
++              pci_read_config_dword(sp5100_tco_pci,
++                                    SP5100_PCI_WATCHDOG_MISC_REG,
++                                    &val);
++
++              val |= SP5100_PCI_WATCHDOG_DECODE_EN;
++
++              pci_write_config_dword(sp5100_tco_pci,
++                                     SP5100_PCI_WATCHDOG_MISC_REG,
++                                     val);
++
++              /* Disable Watchdog timer */
++              outb(SP5100_PM_WATCHDOG_CONTROL, SP5100_IO_PM_INDEX_REG);
++              val = inb(SP5100_IO_PM_DATA_REG);
++              val |= SP5100_PM_WATCHDOG_DISABLE;
++              outb(val, SP5100_IO_PM_DATA_REG);
++      }
++}
++
+ /*
+  *    /dev/watchdog handling
+  */
+@@ -270,11 +356,12 @@ MODULE_DEVICE_TABLE(pci, sp5100_tco_pci_tbl);
+ /*
+  * Init & exit routines
+  */
+-
+ static unsigned char __devinit sp5100_tco_setupdevice(void)
+ {
+       struct pci_dev *dev = NULL;
++      const char *dev_name = NULL;
+       u32 val;
++      u32 index_reg, data_reg, base_addr;
+       /* Match the PCI device */
+       for_each_pci_dev(dev) {
+@@ -287,29 +374,158 @@ static unsigned char __devinit sp5100_tco_setupdevice(void)
+       if (!sp5100_tco_pci)
+               return 0;
++      pr_info("PCI Revision ID: 0x%x\n", sp5100_tco_pci->revision);
++
++      /*
++       * Determine type of southbridge chipset.
++       */
++      if (sp5100_tco_pci->revision >= 0x40) {
++              dev_name = SB800_DEVNAME;
++              index_reg = SB800_IO_PM_INDEX_REG;
++              data_reg = SB800_IO_PM_DATA_REG;
++              base_addr = SB800_PM_WATCHDOG_BASE;
++      } else {
++              dev_name = SP5100_DEVNAME;
++              index_reg = SP5100_IO_PM_INDEX_REG;
++              data_reg = SP5100_IO_PM_DATA_REG;
++              base_addr = SP5100_PM_WATCHDOG_BASE;
++      }
++
+       /* Request the IO ports used by this driver */
+       pm_iobase = SP5100_IO_PM_INDEX_REG;
+-      if (!request_region(pm_iobase, SP5100_PM_IOPORTS_SIZE, "SP5100 TCO")) {
+-              pr_err("I/O address 0x%04x already in use\n", pm_iobase);
++      if (!request_region(pm_iobase, SP5100_PM_IOPORTS_SIZE, dev_name)) {
++              pr_err("I/O address 0x%08x already in use\n", pm_iobase);
+               goto exit;
+       }
+-      /* Find the watchdog base address. */
+-      outb(SP5100_PM_WATCHDOG_BASE3, SP5100_IO_PM_INDEX_REG);
+-      val = inb(SP5100_IO_PM_DATA_REG);
+-      outb(SP5100_PM_WATCHDOG_BASE2, SP5100_IO_PM_INDEX_REG);
+-      val = val << 8 | inb(SP5100_IO_PM_DATA_REG);
+-      outb(SP5100_PM_WATCHDOG_BASE1, SP5100_IO_PM_INDEX_REG);
+-      val = val << 8 | inb(SP5100_IO_PM_DATA_REG);
+-      outb(SP5100_PM_WATCHDOG_BASE0, SP5100_IO_PM_INDEX_REG);
+-      /* Low three bits of BASE0 are reserved. */
+-      val = val << 8 | (inb(SP5100_IO_PM_DATA_REG) & 0xf8);
++      /*
++       * First, Find the watchdog timer MMIO address from indirect I/O.
++       */
++      outb(base_addr+3, index_reg);
++      val = inb(data_reg);
++      outb(base_addr+2, index_reg);
++      val = val << 8 | inb(data_reg);
++      outb(base_addr+1, index_reg);
++      val = val << 8 | inb(data_reg);
++      outb(base_addr+0, index_reg);
++      /* Low three bits of BASE are reserved */
++      val = val << 8 | (inb(data_reg) & 0xf8);
++
++      pr_debug("Got 0x%08x from indirect I/O\n", val);
++
++      /* Check MMIO address conflict */
++      if (request_mem_region_exclusive(val, SP5100_WDT_MEM_MAP_SIZE,
++                                                              dev_name))
++              goto setup_wdt;
++      else
++              pr_debug("MMIO address 0x%08x already in use\n", val);
++
++      /*
++       * Second, Find the watchdog timer MMIO address
++       * from SBResource_MMIO register.
++       */
++      if (sp5100_tco_pci->revision >= 0x40) {
++              /* Read SBResource_MMIO from AcpiMmioEn(PM_Reg: 24h) */
++              outb(SB800_PM_ACPI_MMIO_EN+3, SB800_IO_PM_INDEX_REG);
++              val = inb(SB800_IO_PM_DATA_REG);
++              outb(SB800_PM_ACPI_MMIO_EN+2, SB800_IO_PM_INDEX_REG);
++              val = val << 8 | inb(SB800_IO_PM_DATA_REG);
++              outb(SB800_PM_ACPI_MMIO_EN+1, SB800_IO_PM_INDEX_REG);
++              val = val << 8 | inb(SB800_IO_PM_DATA_REG);
++              outb(SB800_PM_ACPI_MMIO_EN+0, SB800_IO_PM_INDEX_REG);
++              val = val << 8 | inb(SB800_IO_PM_DATA_REG);
++      } else {
++              /* Read SBResource_MMIO from PCI config(PCI_Reg: 9Ch) */
++              pci_read_config_dword(sp5100_tco_pci,
++                                    SP5100_SB_RESOURCE_MMIO_BASE, &val);
++      }
++
++      /* The SBResource_MMIO is enabled and mapped memory space? */
++      if ((val & (SB800_ACPI_MMIO_DECODE_EN | SB800_ACPI_MMIO_SEL)) ==
++                                                SB800_ACPI_MMIO_DECODE_EN) {
++              /* Clear unnecessary the low twelve bits */
++              val &= ~0xFFF;
++              /* Add the Watchdog Timer offset to base address. */
++              val += SB800_PM_WDT_MMIO_OFFSET;
++              /* Check mmio base address conflict */
++              if (request_mem_region_exclusive(val, SP5100_WDT_MEM_MAP_SIZE,
++                                                                 dev_name)) {
++                      pr_debug("Got 0x%08x from SBResource_MMIO register\n",
++                              val);
++                      goto setup_wdt;
++              } else
++                      pr_debug("MMIO address 0x%08x already in use\n", val);
++      } else
++              pr_debug("SBResource_MMIO is disabled(0x%08x)\n", val);
++
++      /*
++       * Lastly re-programming the watchdog MMIO address,
++       * This method is a last resort...
++       *
++       * Before re-programming, to ensure that the watchdog timer
++       * is disabled, disable the watchdog timer.
++       */
++      tco_timer_disable();
++
++      if (force_addr) {
++              /* Force the use of base address */
++              val = force_addr;
++              /* The alignment of the MMIO address to a 8byte boundary */
++              val &= ~0x7;
++
++              pr_info("Force the use of 0x%08x as MMIO address\n", val);
++      } else {
++              /*
++               * Get empty slot into the resource tree for watchdog timer.
++               */
++              if (allocate_resource(&iomem_resource,
++                                    &wdt_res,
++                                    SP5100_WDT_MEM_MAP_SIZE,
++                                    0xf0000000,
++                                    0xfffffff8,
++                                    0x8,
++                                    NULL,
++                                    NULL)) {
++                      pr_err("MMIO allocation failed\n");
++                      goto unreg_region;
++              }
++
++              val = resbase_phys = wdt_res.start;
++              pr_debug("Got 0x%08x from resource tree\n", val);
++      }
++
++      /* Restore to the low three bits, if chipset is SB8x0(or later) */
++      if (sp5100_tco_pci->revision >= 0x40) {
++              u8 reserved_bit;
++              reserved_bit = inb(base_addr) & 0x7;
++              val |= (u32)reserved_bit;
++      }
++
++      /* Re-programming the watchdog timer base address */
++      outb(base_addr+0, index_reg);
++      /* Low three bits of BASE are reserved */
++      outb((val >>  0) & 0xf8, data_reg);
++      outb(base_addr+1, index_reg);
++      outb((val >>  8) & 0xff, data_reg);
++      outb(base_addr+2, index_reg);
++      outb((val >> 16) & 0xff, data_reg);
++      outb(base_addr+3, index_reg);
++      outb((val >> 24) & 0xff, data_reg);
++
++      /*
++       * Clear unnecessary the low three bits,
++       * if chipset is SB8x0(or later)
++       */
++      if (sp5100_tco_pci->revision >= 0x40)
++              val &= ~0x7;
+       if (!request_mem_region_exclusive(val, SP5100_WDT_MEM_MAP_SIZE,
+-                                                              "SP5100 TCO")) {
+-              pr_err("mmio address 0x%04x already in use\n", val);
+-              goto unreg_region;
++                                                                 dev_name)) {
++              pr_err("MMIO address 0x%08x already in use\n", val);
++              goto unreg_resource;
+       }
++
++setup_wdt:
+       tcobase_phys = val;
+       tcobase = ioremap(val, SP5100_WDT_MEM_MAP_SIZE);
+@@ -318,25 +534,12 @@ static unsigned char __devinit sp5100_tco_setupdevice(void)
+               goto unreg_mem_region;
+       }
+-      /* Enable watchdog decode bit */
+-      pci_read_config_dword(sp5100_tco_pci,
+-                            SP5100_PCI_WATCHDOG_MISC_REG,
+-                            &val);
+-
+-      val |= SP5100_PCI_WATCHDOG_DECODE_EN;
+-
+-      pci_write_config_dword(sp5100_tco_pci,
+-                             SP5100_PCI_WATCHDOG_MISC_REG,
+-                             val);
++      pr_info("Using 0x%08x for watchdog MMIO address\n", val);
+-      /* Enable Watchdog timer and set the resolution to 1 sec. */
+-      outb(SP5100_PM_WATCHDOG_CONTROL, SP5100_IO_PM_INDEX_REG);
+-      val = inb(SP5100_IO_PM_DATA_REG);
+-      val |= SP5100_PM_WATCHDOG_SECOND_RES;
+-      val &= ~SP5100_PM_WATCHDOG_DISABLE;
+-      outb(val, SP5100_IO_PM_DATA_REG);
++      /* Setup the watchdog timer */
++      tco_timer_enable();
+-      /* Check that the watchdog action is set to reset the system. */
++      /* Check that the watchdog action is set to reset the system */
+       val = readl(SP5100_WDT_CONTROL(tcobase));
+       val &= ~SP5100_PM_WATCHDOG_ACTION_RESET;
+       writel(val, SP5100_WDT_CONTROL(tcobase));
+@@ -355,6 +558,9 @@ static unsigned char __devinit sp5100_tco_setupdevice(void)
+ unreg_mem_region:
+       release_mem_region(tcobase_phys, SP5100_WDT_MEM_MAP_SIZE);
++unreg_resource:
++      if (resbase_phys)
++              release_resource(&wdt_res);
+ unreg_region:
+       release_region(pm_iobase, SP5100_PM_IOPORTS_SIZE);
+ exit:
+@@ -400,14 +606,17 @@ static int __devinit sp5100_tco_init(struct platform_device *dev)
+       clear_bit(0, &timer_alive);
+-      pr_info("initialized (0x%p). heartbeat=%d sec (nowayout=%d)\n",
+-              tcobase, heartbeat, nowayout);
++      pr_info("initialized (0x%p). heartbeat=%d sec (nowayout=%d, "
++              "force_addr=0x%x)\n",
++              tcobase, heartbeat, nowayout, force_addr);
+       return 0;
+ exit:
+       iounmap(tcobase);
+       release_mem_region(tcobase_phys, SP5100_WDT_MEM_MAP_SIZE);
++      if (resbase_phys)
++              release_resource(&wdt_res);
+       release_region(pm_iobase, SP5100_PM_IOPORTS_SIZE);
+       return ret;
+ }
+@@ -422,6 +631,8 @@ static void __devexit sp5100_tco_cleanup(void)
+       misc_deregister(&sp5100_tco_miscdev);
+       iounmap(tcobase);
+       release_mem_region(tcobase_phys, SP5100_WDT_MEM_MAP_SIZE);
++      if (resbase_phys)
++              release_resource(&wdt_res);
+       release_region(pm_iobase, SP5100_PM_IOPORTS_SIZE);
+ }
+@@ -451,7 +662,7 @@ static int __init sp5100_tco_init_module(void)
+ {
+       int err;
+-      pr_info("SP5100 TCO WatchDog Timer Driver v%s\n", TCO_VERSION);
++      pr_info("SP5100/SB800 TCO WatchDog Timer Driver v%s\n", TCO_VERSION);
+       err = platform_driver_register(&sp5100_tco_driver);
+       if (err)
+@@ -475,13 +686,13 @@ static void __exit sp5100_tco_cleanup_module(void)
+ {
+       platform_device_unregister(sp5100_tco_platform_device);
+       platform_driver_unregister(&sp5100_tco_driver);
+-      pr_info("SP5100 TCO Watchdog Module Unloaded\n");
++      pr_info("SP5100/SB800 TCO Watchdog Module Unloaded\n");
+ }
+ module_init(sp5100_tco_init_module);
+ module_exit(sp5100_tco_cleanup_module);
+ MODULE_AUTHOR("Priyanka Gupta");
+-MODULE_DESCRIPTION("TCO timer driver for SP5100 chipset");
++MODULE_DESCRIPTION("TCO timer driver for SP5100/SB800 chipset");
+ MODULE_LICENSE("GPL");
+ MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
+diff --git a/drivers/watchdog/sp5100_tco.h b/drivers/watchdog/sp5100_tco.h
+index a5a16cc..71594a0 100644
+--- a/drivers/watchdog/sp5100_tco.h
++++ b/drivers/watchdog/sp5100_tco.h
+@@ -9,33 +9,57 @@
+ /*
+  * Some address definitions for the Watchdog
+  */
+-
+ #define SP5100_WDT_MEM_MAP_SIZE               0x08
+ #define SP5100_WDT_CONTROL(base)      ((base) + 0x00) /* Watchdog Control */
+ #define SP5100_WDT_COUNT(base)                ((base) + 0x04) /* Watchdog Count */
+-#define SP5100_WDT_START_STOP_BIT     1
++#define SP5100_WDT_START_STOP_BIT     (1 << 0)
+ #define SP5100_WDT_TRIGGER_BIT                (1 << 7)
+-#define SP5100_PCI_WATCHDOG_MISC_REG  0x41
+-#define SP5100_PCI_WATCHDOG_DECODE_EN (1 << 3)
+-
+ #define SP5100_PM_IOPORTS_SIZE                0x02
+-/* These two IO registers are hardcoded and there doesn't seem to be a way to
++/*
++ * These two IO registers are hardcoded and there doesn't seem to be a way to
+  * read them from a register.
+  */
++
++/*  For SP5100/SB7x0 chipset */
+ #define SP5100_IO_PM_INDEX_REG                0xCD6
+ #define SP5100_IO_PM_DATA_REG         0xCD7
++#define SP5100_SB_RESOURCE_MMIO_BASE  0x9C
++
+ #define SP5100_PM_WATCHDOG_CONTROL    0x69
+-#define SP5100_PM_WATCHDOG_BASE0      0x6C
+-#define SP5100_PM_WATCHDOG_BASE1      0x6D
+-#define SP5100_PM_WATCHDOG_BASE2      0x6E
+-#define SP5100_PM_WATCHDOG_BASE3      0x6F
++#define SP5100_PM_WATCHDOG_BASE               0x6C
+ #define SP5100_PM_WATCHDOG_FIRED      (1 << 1)
+ #define SP5100_PM_WATCHDOG_ACTION_RESET       (1 << 2)
+-#define SP5100_PM_WATCHDOG_DISABLE    1
++#define SP5100_PCI_WATCHDOG_MISC_REG  0x41
++#define SP5100_PCI_WATCHDOG_DECODE_EN (1 << 3)
++
++#define SP5100_PM_WATCHDOG_DISABLE    (1 << 0)
+ #define SP5100_PM_WATCHDOG_SECOND_RES (3 << 1)
++
++#define SP5100_DEVNAME                        "SP5100 TCO"
++
++
++/*  For SB8x0(or later) chipset */
++#define SB800_IO_PM_INDEX_REG         0xCD6
++#define SB800_IO_PM_DATA_REG          0xCD7
++
++#define SB800_PM_ACPI_MMIO_EN         0x24
++#define SB800_PM_WATCHDOG_CONTROL     0x48
++#define SB800_PM_WATCHDOG_BASE                0x48
++#define SB800_PM_WATCHDOG_CONFIG      0x4C
++
++#define SB800_PCI_WATCHDOG_DECODE_EN  (1 << 0)
++#define SB800_PM_WATCHDOG_DISABLE     (1 << 2)
++#define SB800_PM_WATCHDOG_SECOND_RES  (3 << 0)
++#define SB800_ACPI_MMIO_DECODE_EN     (1 << 0)
++#define SB800_ACPI_MMIO_SEL           (1 << 2)
++
++
++#define SB800_PM_WDT_MMIO_OFFSET      0xB00
++
++#define SB800_DEVNAME                 "SB800 TCO"
index 3a2dfb2a0bf2b245c39a0da7530505553edbb46f..07efdf710836104c607546378f81bb6422fc74f0 100644 (file)
@@ -91,7 +91,7 @@
 
 %define                rel             1
 %define                basever         3.5
-%define                postver         .2
+%define                postver         .3
 
 # __alt_kernel is list of features, empty string if none set
 # _alt kernel is defined as: %{nil}%{?alt_kernel:-%{?alt_kernel}} (defined in rpm.macros)
@@ -134,7 +134,7 @@ Source0:    http://www.kernel.org/pub/linux/kernel/v3.x/linux-%{basever}.tar.xz
 # Source0-md5: 24153eaaa81dedc9481ada8cd9c3b83d
 %if "%{postver}" != ".0"
 Patch0:                http://www.kernel.org/pub/linux/kernel/v3.x/patch-%{version}.bz2
-# Patch0-md5:  128f05bf03ba7e772286b2066eab439c
+# Patch0-md5:  94115bfe01743bd4326d71f321f2e5ac
 %endif
 
 Source3:       kernel-autoconf.h
@@ -223,7 +223,7 @@ Patch140:   kernel-unionfs.patch
 # Patch creation:
 # git clone git://aufs.git.sourceforge.net/gitroot/aufs/aufs3-standalone.git
 # cd aufs3-standalone
-# git checkout -b aufs3.4 origin/aufs3.4
+# git checkout -b aufs3.5 origin/aufs3.5
 # cat aufs3-kbuild.patch aufs3-base.patch aufs3-standalone.patch > ~/rpm/packages/kernel/kernel-aufs3.patch
 # mkdir linux
 # cp -a Documentation fs include linux
@@ -245,7 +245,7 @@ Patch2000:  kernel-small_fixes.patch
 Patch2001:     kernel-pwc-uncompress.patch
 Patch2003:     kernel-regressions.patch
 
-# http://git.kernel.org/?p=linux/kernel/git/jj/linux-apparmor.git;a=shortlog;h=refs/heads/v3.4-aa2.8
+# http://git.kernel.org/?p=linux/kernel/git/jj/linux-apparmor.git;a=shortlog;h=refs/heads/v3.5-aa2.8
 Patch5000:     kernel-apparmor.patch
 
 # for rescuecd
This page took 0.188054 seconds and 4 git commands to generate.