diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-07 11:56:33 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-07 11:56:33 -0500 |
commit | b4a45f5fe8078bfc10837dbd5b98735058bc4698 (patch) | |
tree | df6f13a27610a3ec7eb4a661448cd779a8f84c79 /fs/gfs2/ops_inode.c | |
parent | 01539ba2a706ab7d35fc0667dff919ade7f87d63 (diff) | |
parent | b3e19d924b6eaf2ca7d22cba99a517c5171007b6 (diff) |
Merge branch 'vfs-scale-working' of git://git.kernel.org/pub/scm/linux/kernel/git/npiggin/linux-npiggin
* 'vfs-scale-working' of git://git.kernel.org/pub/scm/linux/kernel/git/npiggin/linux-npiggin: (57 commits)
fs: scale mntget/mntput
fs: rename vfsmount counter helpers
fs: implement faster dentry memcmp
fs: prefetch inode data in dcache lookup
fs: improve scalability of pseudo filesystems
fs: dcache per-inode inode alias locking
fs: dcache per-bucket dcache hash locking
bit_spinlock: add required includes
kernel: add bl_list
xfs: provide simple rcu-walk ACL implementation
btrfs: provide simple rcu-walk ACL implementation
ext2,3,4: provide simple rcu-walk ACL implementation
fs: provide simple rcu-walk generic_check_acl implementation
fs: provide rcu-walk aware permission i_ops
fs: rcu-walk aware d_revalidate method
fs: cache optimise dentry and inode for rcu-walk
fs: dcache reduce branches in lookup path
fs: dcache remove d_mounted
fs: fs_struct use seqlock
fs: rcu-walk for path lookup
...
Diffstat (limited to 'fs/gfs2/ops_inode.c')
-rw-r--r-- | fs/gfs2/ops_inode.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c index 1db6b7343229..1501db4f0e6d 100644 --- a/fs/gfs2/ops_inode.c +++ b/fs/gfs2/ops_inode.c | |||
@@ -106,7 +106,7 @@ static struct dentry *gfs2_lookup(struct inode *dir, struct dentry *dentry, | |||
106 | { | 106 | { |
107 | struct inode *inode = NULL; | 107 | struct inode *inode = NULL; |
108 | 108 | ||
109 | dentry->d_op = &gfs2_dops; | 109 | d_set_d_op(dentry, &gfs2_dops); |
110 | 110 | ||
111 | inode = gfs2_lookupi(dir, &dentry->d_name, 0); | 111 | inode = gfs2_lookupi(dir, &dentry->d_name, 0); |
112 | if (inode && IS_ERR(inode)) | 112 | if (inode && IS_ERR(inode)) |
@@ -166,7 +166,7 @@ static int gfs2_link(struct dentry *old_dentry, struct inode *dir, | |||
166 | if (error) | 166 | if (error) |
167 | goto out_child; | 167 | goto out_child; |
168 | 168 | ||
169 | error = gfs2_permission(dir, MAY_WRITE | MAY_EXEC); | 169 | error = gfs2_permission(dir, MAY_WRITE | MAY_EXEC, 0); |
170 | if (error) | 170 | if (error) |
171 | goto out_gunlock; | 171 | goto out_gunlock; |
172 | 172 | ||
@@ -289,7 +289,7 @@ static int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name, | |||
289 | if (IS_APPEND(&dip->i_inode)) | 289 | if (IS_APPEND(&dip->i_inode)) |
290 | return -EPERM; | 290 | return -EPERM; |
291 | 291 | ||
292 | error = gfs2_permission(&dip->i_inode, MAY_WRITE | MAY_EXEC); | 292 | error = gfs2_permission(&dip->i_inode, MAY_WRITE | MAY_EXEC, 0); |
293 | if (error) | 293 | if (error) |
294 | return error; | 294 | return error; |
295 | 295 | ||
@@ -822,7 +822,7 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry, | |||
822 | } | 822 | } |
823 | } | 823 | } |
824 | } else { | 824 | } else { |
825 | error = gfs2_permission(ndir, MAY_WRITE | MAY_EXEC); | 825 | error = gfs2_permission(ndir, MAY_WRITE | MAY_EXEC, 0); |
826 | if (error) | 826 | if (error) |
827 | goto out_gunlock; | 827 | goto out_gunlock; |
828 | 828 | ||
@@ -857,7 +857,7 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry, | |||
857 | /* Check out the dir to be renamed */ | 857 | /* Check out the dir to be renamed */ |
858 | 858 | ||
859 | if (dir_rename) { | 859 | if (dir_rename) { |
860 | error = gfs2_permission(odentry->d_inode, MAY_WRITE); | 860 | error = gfs2_permission(odentry->d_inode, MAY_WRITE, 0); |
861 | if (error) | 861 | if (error) |
862 | goto out_gunlock; | 862 | goto out_gunlock; |
863 | } | 863 | } |
@@ -1041,13 +1041,17 @@ static void gfs2_put_link(struct dentry *dentry, struct nameidata *nd, void *p) | |||
1041 | * Returns: errno | 1041 | * Returns: errno |
1042 | */ | 1042 | */ |
1043 | 1043 | ||
1044 | int gfs2_permission(struct inode *inode, int mask) | 1044 | int gfs2_permission(struct inode *inode, int mask, unsigned int flags) |
1045 | { | 1045 | { |
1046 | struct gfs2_inode *ip = GFS2_I(inode); | 1046 | struct gfs2_inode *ip; |
1047 | struct gfs2_holder i_gh; | 1047 | struct gfs2_holder i_gh; |
1048 | int error; | 1048 | int error; |
1049 | int unlock = 0; | 1049 | int unlock = 0; |
1050 | 1050 | ||
1051 | if (flags & IPERM_FLAG_RCU) | ||
1052 | return -ECHILD; | ||
1053 | |||
1054 | ip = GFS2_I(inode); | ||
1051 | if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) { | 1055 | if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) { |
1052 | error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh); | 1056 | error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh); |
1053 | if (error) | 1057 | if (error) |
@@ -1058,7 +1062,7 @@ int gfs2_permission(struct inode *inode, int mask) | |||
1058 | if ((mask & MAY_WRITE) && IS_IMMUTABLE(inode)) | 1062 | if ((mask & MAY_WRITE) && IS_IMMUTABLE(inode)) |
1059 | error = -EACCES; | 1063 | error = -EACCES; |
1060 | else | 1064 | else |
1061 | error = generic_permission(inode, mask, gfs2_check_acl); | 1065 | error = generic_permission(inode, mask, flags, gfs2_check_acl); |
1062 | if (unlock) | 1066 | if (unlock) |
1063 | gfs2_glock_dq_uninit(&i_gh); | 1067 | gfs2_glock_dq_uninit(&i_gh); |
1064 | 1068 | ||