SOURCES (LINUX_2_6): kernel-apparmor.patch - adapted for vserver/grsec chan...
zbyniu
zbyniu at pld-linux.org
Thu May 29 16:22:16 CEST 2008
Author: zbyniu Date: Thu May 29 14:22:16 2008 GMT
Module: SOURCES Tag: LINUX_2_6
---- Log message:
- adapted for vserver/grsec changes in vfs api (partialy merged)
---- Files affected:
SOURCES:
kernel-apparmor.patch (1.1.2.1 -> 1.1.2.2)
---- Diffs:
================================================================
Index: SOURCES/kernel-apparmor.patch
diff -u SOURCES/kernel-apparmor.patch:1.1.2.1 SOURCES/kernel-apparmor.patch:1.1.2.2
--- SOURCES/kernel-apparmor.patch:1.1.2.1 Thu May 29 16:20:14 2008
+++ SOURCES/kernel-apparmor.patch Thu May 29 16:22:11 2008
@@ -377,10 +377,10 @@
dget(lower_new_dentry);
lower_dir_dentry = lock_parent(lower_new_dentry);
- rc = vfs_link(lower_old_dentry, lower_dir_dentry->d_inode,
-- lower_new_dentry);
+- lower_new_dentry, NULL);
+ rc = vfs_link(lower_old_dentry, lower_old_mnt,
+ lower_dir_dentry->d_inode, lower_new_dentry,
-+ lower_new_mnt);
++ lower_new_mnt, NULL);
if (rc || !lower_new_dentry->d_inode)
goto out_lock;
rc = ecryptfs_interpose(lower_new_dentry, new_dentry, dir->i_sb, 0);
@@ -392,8 +392,8 @@
struct inode *lower_dir_inode = ecryptfs_inode_to_lower(dir);
lock_parent(lower_dentry);
-- rc = vfs_unlink(lower_dir_inode, lower_dentry);
-+ rc = vfs_unlink(lower_dir_inode, lower_dentry, lower_mnt);
+- rc = vfs_unlink(lower_dir_inode, lower_dentry, NULL);
++ rc = vfs_unlink(lower_dir_inode, lower_dentry, NULL, lower_mnt);
if (rc) {
printk(KERN_ERR "Error in vfs_unlink; rc = [%d]\n", rc);
goto out_unlock;
@@ -419,7 +419,7 @@
}
- rc = vfs_symlink(lower_dir_dentry->d_inode, lower_dentry,
+ rc = vfs_symlink(lower_dir_dentry->d_inode, lower_dentry, lower_mnt,
- encoded_symname, mode);
+ encoded_symname, mode, NULL);
kfree(encoded_symname);
if (rc || !lower_dentry->d_inode)
@@ -487,11 +495,14 @@ static int ecryptfs_mkdir(struct inode *
@@ -432,9 +432,9 @@
lower_dentry = ecryptfs_dentry_to_lower(dentry);
+ lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry);
lower_dir_dentry = lock_parent(lower_dentry);
-- rc = vfs_mkdir(lower_dir_dentry->d_inode, lower_dentry, mode);
+- rc = vfs_mkdir(lower_dir_dentry->d_inode, lower_dentry, mode, NULL);
+ rc = vfs_mkdir(lower_dir_dentry->d_inode, lower_dentry, lower_mnt,
-+ mode);
++ mode, NULL);
if (rc || !lower_dentry->d_inode)
goto out;
rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb, 0);
@@ -451,8 +451,8 @@
dget(dentry);
lower_dir_dentry = lock_parent(lower_dentry);
dget(lower_dentry);
-- rc = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry);
-+ rc = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry, lower_mnt);
+- rc = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry, NULL);
++ rc = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry, NULL, lower_mnt);
dput(lower_dentry);
if (!rc)
d_delete(lower_dentry);
@@ -466,9 +466,9 @@
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, mode, dev, NULL);
+ rc = vfs_mknod(lower_dir_dentry->d_inode, lower_dentry, lower_mnt, mode,
-+ dev);
++ dev, NULL);
if (rc || !lower_dentry->d_inode)
goto out;
rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb, 0);
@@ -746,13 +746,14 @@
ATTR_MTIME|ATTR_CTIME|ATTR_OPEN,
NULL);
}
-@@ -1921,7 +1925,8 @@ fail:
+@@ -1921,8 +1925,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,
+- int mode, dev_t dev, struct nameidata *nd)
+int vfs_mknod(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
-+ int mode, dev_t dev)
++ int mode, dev_t dev, struct nameidata *nd)
{
int error = may_create(dir, dentry, NULL);
@@ -765,31 +766,33 @@
if (error)
return error;
-@@ -1973,11 +1978,12 @@ asmlinkage long sys_mknodat(int dfd, con
+@@ -1973,12 +1978,12 @@ asmlinkage long sys_mknodat(int dfd, con
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, mode,
+- new_decode_dev(dev), &nd);
+ error = vfs_mknod(nd.path.dentry->d_inode, dentry,
-+ nd.path.mnt, mode, new_decode_dev(dev));
++ nd.path.mnt, mode, new_decode_dev(dev), &nd);
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, mode,
+- 0, &nd);
+ error = vfs_mknod(nd.path.dentry->d_inode, dentry,
-+ nd.path.mnt, mode, 0);
++ nd.path.mnt, mode, 0, &nd);
break;
case S_IFDIR:
error = -EPERM;
-@@ -2000,7 +2006,8 @@ asmlinkage long sys_mknod(const char __u
+@@ -2000,8 +2006,8 @@ asmlinkage long sys_mknod(const char __u
return sys_mknodat(AT_FDCWD, filename, mode, dev);
}
--int vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
+-int vfs_mkdir(struct inode *dir, struct dentry *dentry,
+- int mode, struct nameidata *nd)
+int vfs_mkdir(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
-+ int mode)
++ int mode, struct nameidata *nd)
{
- int error = may_create(dir, dentry, NULL);
+ int error = may_create(dir, dentry, nd);
@@ -2011,7 +2018,7 @@ int vfs_mkdir(struct inode *dir, struct
return -EPERM;
@@ -804,17 +807,19 @@
if (!IS_POSIXACL(nd.path.dentry->d_inode))
mode &= ~current->fs->umask;
-- error = vfs_mkdir(nd.path.dentry->d_inode, dentry, mode);
-+ error = vfs_mkdir(nd.path.dentry->d_inode, dentry, nd.path.mnt, mode);
+- error = vfs_mkdir(nd.path.dentry->d_inode, dentry, mode, &nd);
++ error = vfs_mkdir(nd.path.dentry->d_inode, dentry, nd.path.mnt, mode, &nd);
dput(dentry);
out_unlock:
mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
-@@ -2087,7 +2094,7 @@ void dentry_unhash(struct dentry *dentry
+@@ -2087,8 +2094,8 @@ void dentry_unhash(struct dentry *dentry
spin_unlock(&dcache_lock);
}
--int vfs_rmdir(struct inode *dir, struct dentry *dentry)
-+int vfs_rmdir(struct inode *dir, struct dentry *dentry,struct vfsmount *mnt)
+-int vfs_rmdir(struct inode *dir, struct dentry *dentry,
+- struct nameidata *nd)
++int vfs_rmdir(struct inode *dir, struct dentry *dentry,
++ struct nameidata *nd, struct vfsmount *mnt)
{
int error = may_delete(dir, dentry, 1);
@@ -849,19 +854,21 @@
error = PTR_ERR(dentry);
if (IS_ERR(dentry))
goto exit2;
-- error = vfs_rmdir(nd.path.dentry->d_inode, dentry);
-+ error = vfs_rmdir(nd.path.dentry->d_inode, dentry, nd.path.mnt);
+- error = vfs_rmdir(nd.path.dentry->d_inode, dentry, &nd);
++ error = vfs_rmdir(nd.path.dentry->d_inode, dentry, &nd, nd.path.mnt);
dput(dentry);
exit2:
mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
-@@ -2167,7 +2175,7 @@ asmlinkage long sys_rmdir(const char __u
+@@ -2167,8 +2175,8 @@ asmlinkage long sys_rmdir(const char __u
return do_rmdir(AT_FDCWD, pathname);
}
--int vfs_unlink(struct inode *dir, struct dentry *dentry)
-+int vfs_unlink(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt)
+-int vfs_unlink(struct inode *dir, struct dentry *dentry,
+- struct nameidata *nd)
++int vfs_unlink(struct inode *dir, struct dentry *dentry,
++ struct nameidata *nd, struct vfsmount *mnt)
{
- int error = may_delete(dir, dentry, 0);
+ int error = may_delete(dir, dentry, 0, nd);
@@ -2183,7 +2191,7 @@ int vfs_unlink(struct inode *dir, struct
if (d_mountpoint(dentry))
@@ -876,21 +883,20 @@
inode = dentry->d_inode;
if (inode)
atomic_inc(&inode->i_count);
-- error = vfs_unlink(nd.path.dentry->d_inode, dentry);
-+ error = vfs_unlink(nd.path.dentry->d_inode, dentry, nd.path.mnt);
+- error = vfs_unlink(nd.path.dentry->d_inode, dentry, &nd);
++ error = vfs_unlink(nd.path.dentry->d_inode, dentry, &nd, nd.path.mnt);
exit2:
dput(dentry);
}
-@@ -2267,7 +2275,8 @@ asmlinkage long sys_unlink(const char __
+@@ -2267,7 +2275,7 @@ asmlinkage long sys_unlink(const char __
return do_unlinkat(AT_FDCWD, pathname);
}
--int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname, int mode)
+-int vfs_symlink(struct inode *dir, struct dentry *dentry,
+int vfs_symlink(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
-+ const char *oldname, int mode)
+ const char *oldname, int mode, struct nameidata *nd)
+ const char *oldname, int mode, struct nameidata *nd)
{
- int error = may_create(dir, dentry, NULL);
-
@@ -2277,7 +2286,7 @@ int vfs_symlink(struct inode *dir, struc
if (!dir->i_op || !dir->i_op->symlink)
return -EPERM;
@@ -900,22 +906,25 @@
if (error)
return error;
-@@ -2313,7 +2322,8 @@ asmlinkage long sys_symlinkat(const char
+@@ -2313,8 +2322,8 @@ asmlinkage long sys_symlinkat(const char
if (IS_ERR(dentry))
goto out_unlock;
-- error = vfs_symlink(nd.path.dentry->d_inode, dentry, from, S_IALLUGO);
+- error = vfs_symlink(nd.path.dentry->d_inode, dentry, from,
+- S_IALLUGO, &nd);
+ error = vfs_symlink(nd.path.dentry->d_inode, dentry, nd.path.mnt, from,
-+ S_IALLUGO);
++ S_IALLUGO, &nd);
dput(dentry);
out_unlock:
mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
-@@ -2330,7 +2340,7 @@ asmlinkage long sys_symlink(const char _
+@@ -2330,8 +2340,8 @@ asmlinkage long sys_symlink(const char _
return sys_symlinkat(oldname, AT_FDCWD, newname);
}
--int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
-+int vfs_link(struct dentry *old_dentry, struct vfsmount *old_mnt, struct inode *dir, struct dentry *new_dentry, struct vfsmount *new_mnt)
+-int vfs_link(struct dentry *old_dentry, struct inode *dir,
+- struct dentry *new_dentry, struct nameidata *nd)
++int vfs_link(struct dentry *old_dentry, struct vfsmount *old_mnt, struct inode *dir,
++ struct dentry *new_dentry, struct vfsmount *new_mnt, struct nameidata *nd)
{
struct inode *inode = old_dentry->d_inode;
int error;
@@ -929,16 +938,17 @@
if (error)
return error;
-@@ -2408,7 +2419,8 @@ asmlinkage long sys_linkat(int olddfd, c
- error = PTR_ERR(new_dentry);
- if (IS_ERR(new_dentry))
- goto out_unlock;
-- error = vfs_link(old_nd.path.dentry, nd.path.dentry->d_inode, new_dentry);
+@@ -2408,8 +2419,8 @@ asmlinkage long sys_linkat(int olddfd, c
+ goto out_unlock_dput;
+ }
+
+- error = vfs_link(old_nd.path.dentry, nd.path.dentry->d_inode,
+- new_dentry, &nd);
+ error = vfs_link(old_nd.path.dentry, old_nd.path.mnt, nd.path.dentry->d_inode,
-+ new_dentry, nd.path.mnt);
++ new_dentry, nd.path.mnt, &nd);
+ out_unlock_dput:
dput(new_dentry);
out_unlock:
- mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
@@ -2460,7 +2472,8 @@ asmlinkage long sys_link(const char __us
* locking].
*/
@@ -1052,9 +1062,9 @@
dprintk("NFSD: nfsd4_create_clid_dir: DIRECTORY EXISTS\n");
goto out_put;
}
-- status = vfs_mkdir(rec_dir.path.dentry->d_inode, dentry, S_IRWXU);
+- status = vfs_mkdir(rec_dir.path.dentry->d_inode, dentry, S_IRWXU, NULL);
+ status = vfs_mkdir(rec_dir.path.dentry->d_inode, dentry,
-+ rec_dir.path.mnt, S_IRWXU);
++ rec_dir.path.mnt, S_IRWXU, NULL);
out_put:
dput(dentry);
out_unlock:
@@ -1062,8 +1072,8 @@
return -EINVAL;
}
mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT);
-- status = vfs_unlink(dir->d_inode, dentry);
-+ status = vfs_unlink(dir->d_inode, dentry, rec_dir.path.mnt);
+- status = vfs_unlink(dir->d_inode, dentry, NULL);
++ status = vfs_unlink(dir->d_inode, dentry, NULL, rec_dir.path.mnt);
mutex_unlock(&dir->d_inode->i_mutex);
return status;
}
@@ -1071,8 +1081,8 @@
* a kernel from the future.... */
nfsd4_list_rec_dir(dentry, nfsd4_remove_clid_file);
mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT);
-- status = vfs_rmdir(dir->d_inode, dentry);
-+ status = vfs_rmdir(dir->d_inode, dentry, rec_dir.path.mnt);
+- status = vfs_rmdir(dir->d_inode, dentry, NULL);
++ status = vfs_rmdir(dir->d_inode, dentry, NULL, rec_dir.path.mnt);
mutex_unlock(&dir->d_inode->i_mutex);
return status;
}
@@ -1271,16 +1281,16 @@
host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL);
break;
case S_IFDIR:
-- host_err = vfs_mkdir(dirp, dchild, iap->ia_mode);
-+ host_err = vfs_mkdir(dirp, dchild, exp->ex_path.mnt, iap->ia_mode);
+- host_err = vfs_mkdir(dirp, dchild, iap->ia_mode, NULL);
++ host_err = vfs_mkdir(dirp, dchild, exp->ex_path.mnt, iap->ia_mode, NULL);
break;
case S_IFCHR:
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, iap->ia_mode, rdev, NULL);
+ host_err = vfs_mknod(dirp, dchild, exp->ex_path.mnt,
-+ iap->ia_mode, rdev);
++ iap->ia_mode, rdev, NULL);
break;
default:
printk("nfsd: bad file type %o in nfsd_create\n", type);
@@ -1309,19 +1319,19 @@
if (unlikely(path[plen] != 0)) {
char *path_alloced = kmalloc(plen+1, GFP_KERNEL);
if (path_alloced == NULL)
-@@ -1529,20 +1541,22 @@ nfsd_symlink(struct svc_rqst *rqstp, str
- else {
+@@ -1529,21 +1541,21 @@ nfsd_symlink(struct svc_rqst *rqstp, str
strncpy(path_alloced, path, plen);
path_alloced[plen] = 0;
-- host_err = vfs_symlink(dentry->d_inode, dnew, path_alloced, mode);
-+ host_err = vfs_symlink(dentry->d_inode, dnew,
-+ exp->ex_path.mnt, path_alloced, mode);
+ host_err = vfs_symlink(dentry->d_inode, dnew,
+- path_alloced, mode, NULL);
++ exp->ex_path.mnt, path_alloced, mode, NULL);
kfree(path_alloced);
}
} else
-- host_err = vfs_symlink(dentry->d_inode, dnew, path, mode);
+- host_err = vfs_symlink(dentry->d_inode, dnew,
+- path, mode, NULL);
+ host_err = vfs_symlink(dentry->d_inode, dnew, exp->ex_path.mnt,
-+ path, mode);
++ path, mode, NULL);
if (!host_err) {
- if (EX_ISSYNC(fhp->fh_export))
@@ -1340,9 +1350,9 @@
dold = tfhp->fh_dentry;
dest = dold->d_inode;
-- host_err = vfs_link(dold, dirp, dnew);
+- host_err = vfs_link(dold, dirp, dnew, NULL);
+ host_err = vfs_link(dold, tfhp->fh_export->ex_path.mnt, dirp,
-+ dnew, ffhp->fh_export->ex_path.mnt);
++ dnew, ffhp->fh_export->ex_path.mnt, NULL);
if (!host_err) {
if (EX_ISSYNC(ffhp->fh_export)) {
err = nfserrno(nfsd_sync_dir(ddir));
@@ -1382,11 +1392,11 @@
host_err = -EPERM;
} else
#endif
-- host_err = vfs_unlink(dirp, rdentry);
-+ host_err = vfs_unlink(dirp, rdentry, exp->ex_path.mnt);
+- host_err = vfs_unlink(dirp, rdentry, NULL);
++ host_err = vfs_unlink(dirp, rdentry, NULL, exp->ex_path.mnt);
} else { /* It's RMDIR */
-- host_err = vfs_rmdir(dirp, rdentry);
-+ host_err = vfs_rmdir(dirp, rdentry, exp->ex_path.mnt);
+- host_err = vfs_rmdir(dirp, rdentry, NULL);
++ host_err = vfs_rmdir(dirp, rdentry, NULL, exp->ex_path.mnt);
}
dput(rdentry);
@@ -1545,17 +1555,16 @@
mutex_unlock(&inode->i_mutex);
dput_and_out:
-@@ -627,7 +626,8 @@ asmlinkage long sys_chmod(const char __u
- return sys_fchmodat(AT_FDCWD, filename, mode);
+@@ -627,7 +626,7 @@ asmlinkage long sys_chmod(const char __u
}
--static int chown_common(struct dentry * dentry, uid_t user, gid_t group)
-+static int chown_common(struct dentry * dentry, struct vfsmount *mnt,
+ static int chown_common(struct dentry *dentry, struct vfsmount *mnt,
+- uid_t user, gid_t group)
+ uid_t user, gid_t group, struct file *file)
{
struct inode * inode;
int error;
-@@ -656,8 +656,11 @@ static int chown_common(struct dentry *
+@@ -666,8 +666,11 @@ static int chown_common(struct dentry *
if (!S_ISDIR(inode->i_mode))
newattrs.ia_valid |=
ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV;
@@ -1568,30 +1577,30 @@
mutex_unlock(&inode->i_mutex);
out:
return error;
-@@ -671,7 +674,7 @@ asmlinkage long sys_chown(const char __u
- error = user_path_walk(filename, &nd);
- if (error)
- goto out;
-- error = chown_common(nd.path.dentry, user, group);
-+ error = chown_common(nd.path.dentry, nd.path.mnt, user, group, NULL);
+@@ -671,7 +686,7 @@ asmlinkage long sys_chown(const char __u
+ error = cow_check_and_break(&nd);
+ if (!error)
+ #endif
+- error = chown_common(nd.path.dentry, nd.path.mnt, user, group);
++ error = chown_common(nd.path.dentry, nd.path.mnt, user, group, NULL);
path_put(&nd.path);
out:
return error;
-@@ -691,7 +694,7 @@ asmlinkage long sys_fchownat(int dfd, co
+@@ -691,7 +710,7 @@ asmlinkage long sys_fchownat(int dfd, co
error = __user_walk_fd(dfd, filename, follow, &nd);
- if (error)
- goto out;
-- error = chown_common(nd.path.dentry, user, group);
-+ error = chown_common(nd.path.dentry, nd.path.mnt, user, group, NULL);
+ if (!error)
+ #endif
+- error = chown_common(nd.path.dentry, nd.path.mnt, user, group);
++ error = chown_common(nd.path.dentry, nd.path.mnt, user, group, NULL);
path_put(&nd.path);
out:
return error;
@@ -705,7 +708,7 @@ asmlinkage long sys_lchown(const char __
- error = user_path_walk_link(filename, &nd);
- if (error)
- goto out;
-- error = chown_common(nd.path.dentry, user, group);
-+ error = chown_common(nd.path.dentry, nd.path.mnt, user, group, NULL);
+ error = cow_check_and_break(&nd);
+ if (!error)
+ #endif
+- error = chown_common(nd.path.dentry, nd.path.mnt, user, group);
++ error = chown_common(nd.path.dentry, nd.path.mnt, user, group, NULL);
path_put(&nd.path);
out:
return error;
@@ -1599,7 +1608,7 @@
dentry = file->f_path.dentry;
audit_inode(NULL, dentry);
-- error = chown_common(dentry, user, group);
+- error = chown_common(dentry, file->f_vfsmnt, user, group);
+ error = chown_common(dentry, file->f_path.mnt, user, group, file);
fput(file);
out:
@@ -1620,8 +1629,8 @@
if (dir->d_inode->i_nlink <= 2) {
root = get_xa_root(inode->i_sb, XATTR_REPLACE);
reiserfs_write_lock_xattrs(inode->i_sb);
-- err = vfs_rmdir(root->d_inode, dir);
-+ err = vfs_rmdir(root->d_inode, dir, NULL);
+- err = vfs_rmdir(root->d_inode, dir, NULL);
++ err = vfs_rmdir(root->d_inode, dir, NULL, NULL);
reiserfs_write_unlock_xattrs(inode->i_sb);
dput(root);
} else {
@@ -1700,7 +1709,7 @@
struct inode *inode;
struct iattr newattrs;
struct file *f = NULL;
-@@ -83,16 +83,16 @@ long do_utimes(int dfd, char __user *fil
+@@ -83,19 +83,19 @@ long do_utimes(int dfd, char __user *fil
f = fget(dfd);
if (!f)
goto out;
@@ -1711,6 +1720,9 @@
if (error)
goto out;
+ error = cow_check_and_break(&nd);
+ if (error)
+ goto dput_and_out;
- dentry = nd.path.dentry;
+ path = nd.path;
}
@@ -1826,14 +1838,12 @@
if (error)
return error;
-@@ -219,8 +223,8 @@ EXPORT_SYMBOL_GPL(vfs_removexattr);
- * Extended attribute SET operations
+@@ -219,7 +223,7 @@ EXPORT_SYMBOL_GPL(vfs_removexattr);
*/
static long
--setxattr(struct dentry *d, char __user *name, void __user *value,
-- size_t size, int flags)
-+setxattr(struct dentry *dentry, struct vfsmount *mnt, char __user *name,
-+ void __user *value, size_t size, int flags, struct file *file)
+ setxattr(struct dentry *d, char __user *name, void __user *value,
+- size_t size, int flags, struct vfsmount *mnt)
++ size_t size, int flags, struct vfsmount *mnt, struct file *file)
{
int error;
void *kvalue = NULL;
@@ -1842,7 +1852,7 @@
}
- error = vfs_setxattr(d, kname, kvalue, size, flags);
-+ error = vfs_setxattr(dentry, mnt, kname, kvalue, size, flags, file);
++ error = vfs_setxattr(d, mnt, kname, kvalue, size, flags, file);
kfree(kvalue);
return error;
}
@@ -1850,8 +1860,8 @@
error = user_path_walk(path, &nd);
if (error)
return error;
-- error = setxattr(nd.path.dentry, name, value, size, flags);
-+ error = setxattr(nd.path.dentry, nd.path.mnt, name, value, size, flags, NULL);
+- error = setxattr(nd.path.dentry, name, value, size, flags, nd.path.mnt);
++ error = setxattr(nd.path.dentry, name, value, size, flags, nd.path.mnt, NULL);
path_put(&nd.path);
return error;
}
@@ -1859,8 +1869,8 @@
error = user_path_walk_link(path, &nd);
if (error)
return error;
-- error = setxattr(nd.path.dentry, name, value, size, flags);
-+ error = setxattr(nd.path.dentry, nd.path.mnt, name, value, size, flags, NULL);
+- error = setxattr(nd.path.dentry, name, value, size, flags, nd.path.mnt);
++ error = setxattr(nd.path.dentry, name, value, size, flags, nd.path.mnt, NULL);
path_put(&nd.path);
return error;
}
@@ -1868,8 +1878,8 @@
return error;
dentry = f->f_path.dentry;
audit_inode(NULL, dentry);
-- error = setxattr(dentry, name, value, size, flags);
-+ error = setxattr(dentry, f->f_vfsmnt, name, value, size, flags, f);
+- error = setxattr(dentry, name, value, size, flags, f->f_vfsmnt);
++ error = setxattr(dentry, name, value, size, flags, f->f_vfsmnt, f);
fput(f);
return error;
}
@@ -1969,8 +1979,8 @@
* Extended attribute REMOVE operations
*/
static long
--removexattr(struct dentry *d, char __user *name)
-+removexattr(struct dentry *dentry, struct vfsmount *mnt, char __user *name,
+-removexattr(struct dentry *d, char __user *name, struct vfsmount *mnt)
++removexattr(struct dentry *dentry, char __user *name, struct vfsmount *mnt,
+ struct file *file)
{
int error;
@@ -1988,8 +1998,8 @@
error = user_path_walk(path, &nd);
if (error)
return error;
-- error = removexattr(nd.path.dentry, name);
-+ error = removexattr(nd.path.dentry, nd.path.mnt, name, NULL);
+- error = removexattr(nd.path.dentry, name, nd.path.mnt);
++ error = removexattr(nd.path.dentry, name, nd.path.mnt, NULL);
path_put(&nd.path);
return error;
}
@@ -1997,8 +2007,8 @@
error = user_path_walk_link(path, &nd);
if (error)
return error;
-- error = removexattr(nd.path.dentry, name);
-+ error = removexattr(nd.path.dentry, nd.path.mnt, name, NULL);
+- error = removexattr(nd.path.dentry, name, nd.path.mnt);
++ error = removexattr(nd.path.dentry, name, nd.path.mnt, NULL);
path_put(&nd.path);
return error;
}
@@ -2006,8 +2016,8 @@
return error;
dentry = f->f_path.dentry;
audit_inode(NULL, dentry);
-- error = removexattr(dentry, name);
-+ error = removexattr(dentry, f->f_path.mnt, name, f);
+- error = removexattr(dentry, name, f->f_vfsmnt);
++ error = removexattr(dentry, name, f->f_path.mnt, f);
fput(f);
return error;
}
@@ -2093,19 +2103,19 @@
<<Diff was trimmed, longer than 597 lines>>
---- CVS-web:
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/SOURCES/kernel-apparmor.patch?r1=1.1.2.1&r2=1.1.2.2&f=u
More information about the pld-cvs-commit
mailing list