]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.apparmor/vfs-mknod.diff
Added missing Xen Kernel Patches which were not commited because
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.apparmor / vfs-mknod.diff
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/vfs-mknod.diff b/src/patches/suse-2.6.27.31/patches.apparmor/vfs-mknod.diff
new file mode 100644 (file)
index 0000000..cc12392
--- /dev/null
@@ -0,0 +1,99 @@
+From: Tony Jones <tonyj@suse.de>
+Subject: Add a struct vfsmount parameter to vfs_mknod()
+
+The vfsmount will be passed down to the LSM hook so that LSMs can compute
+pathnames.
+
+Signed-off-by: Tony Jones <tonyj@suse.de>
+Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
+Signed-off-by: John Johansen <jjohansen@suse.de>
+
+---
+ fs/ecryptfs/inode.c |    5 ++++-
+ fs/namei.c          |   10 ++++++----
+ fs/nfsd/vfs.c       |    3 ++-
+ include/linux/fs.h  |    2 +-
+ net/unix/af_unix.c  |    3 ++-
+ 5 files changed, 15 insertions(+), 8 deletions(-)
+
+--- a/fs/ecryptfs/inode.c
++++ b/fs/ecryptfs/inode.c
+@@ -552,11 +552,14 @@ ecryptfs_mknod(struct inode *dir, struct
+ {
+       int rc;
+       struct dentry *lower_dentry;
++      struct vfsmount *lower_mnt;
+       struct dentry *lower_dir_dentry;
+       lower_dentry = ecryptfs_dentry_to_lower(dentry);
++      lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry);
+       lower_dir_dentry = lock_parent(lower_dentry);
+-      rc = vfs_mknod(lower_dir_dentry->d_inode, lower_dentry, mode, dev);
++      rc = vfs_mknod(lower_dir_dentry->d_inode, lower_dentry, lower_mnt, mode,
++                     dev);
+       if (rc || !lower_dentry->d_inode)
+               goto out;
+       rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb, 0);
+--- a/fs/namei.c
++++ b/fs/namei.c
+@@ -1976,7 +1976,8 @@ fail:
+ }
+ EXPORT_SYMBOL_GPL(lookup_create);
+-int vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
++int vfs_mknod(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
++            int mode, dev_t dev)
+ {
+       int error = may_create(dir, dentry, 0);
+@@ -2054,11 +2055,12 @@ SYSCALL_DEFINE4(mknodat, int, dfd, const
+                       error = vfs_create(nd.path.dentry->d_inode,dentry,mode,&nd);
+                       break;
+               case S_IFCHR: case S_IFBLK:
+-                      error = vfs_mknod(nd.path.dentry->d_inode,dentry,mode,
+-                                      new_decode_dev(dev));
++                      error = vfs_mknod(nd.path.dentry->d_inode, dentry,
++                                        nd.path, mode, new_decode_dev(dev));
+                       break;
+               case S_IFIFO: case S_IFSOCK:
+-                      error = vfs_mknod(nd.path.dentry->d_inode,dentry,mode,0);
++                      error = vfs_mknod(nd.path.dentry->d_inode, dentry,
++                                        nd.path, mode, 0);
+                       break;
+       }
+       mnt_drop_write(nd.path.mnt);
+--- a/fs/nfsd/vfs.c
++++ b/fs/nfsd/vfs.c
+@@ -1306,7 +1306,8 @@ nfsd_create(struct svc_rqst *rqstp, stru
+       case S_IFBLK:
+       case S_IFIFO:
+       case S_IFSOCK:
+-              host_err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev);
++              host_err = vfs_mknod(dirp, dchild, exp->ex_path.mnt,
++                                   iap->ia_mode, rdev);
+               break;
+       }
+       if (host_err < 0) {
+--- a/include/linux/fs.h
++++ b/include/linux/fs.h
+@@ -1179,7 +1179,7 @@ extern void unlock_super(struct super_bl
+ extern int vfs_permission(struct nameidata *, int);
+ extern int vfs_create(struct inode *, struct dentry *, int, struct nameidata *);
+ extern int vfs_mkdir(struct inode *, struct dentry *, struct vfsmount *, int);
+-extern int vfs_mknod(struct inode *, struct dentry *, int, dev_t);
++extern int vfs_mknod(struct inode *, struct dentry *, struct vfsmount *, int, dev_t);
+ extern int vfs_symlink(struct inode *, struct dentry *, const char *);
+ extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
+ extern int vfs_rmdir(struct inode *, struct dentry *);
+--- a/net/unix/af_unix.c
++++ b/net/unix/af_unix.c
+@@ -827,7 +827,8 @@ static int unix_bind(struct socket *sock
+               err = mnt_want_write(nd.path.mnt);
+               if (err)
+                       goto out_mknod_dput;
+-              err = vfs_mknod(nd.path.dentry->d_inode, dentry, mode, 0);
++              err = vfs_mknod(nd.path.dentry->d_inode, dentry, nd.path.mnt,
++                              mode, 0);
+               mnt_drop_write(nd.path.mnt);
+               if (err)
+                       goto out_mknod_dput;