diff options
Diffstat (limited to 'fs/gfs2/ops_inode.c')
-rw-r--r-- | fs/gfs2/ops_inode.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c index f28f89796f4d..5c63a06fcd7c 100644 --- a/fs/gfs2/ops_inode.c +++ b/fs/gfs2/ops_inode.c | |||
@@ -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 | ||