kill check_acl callback of generic_permission()
its value depends only on inode and does not change; we might as well store it in ->i_op->check_acl and be done with that. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Родитель
07b8ce1ee8
Коммит
178ea73521
|
@ -350,7 +350,7 @@ int afs_permission(struct inode *inode, int mask, unsigned int flags)
|
|||
}
|
||||
|
||||
key_put(key);
|
||||
ret = generic_permission(inode, mask, flags, NULL);
|
||||
ret = generic_permission(inode, mask, flags);
|
||||
_leave(" = %d", ret);
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -7339,7 +7339,7 @@ static int btrfs_permission(struct inode *inode, int mask, unsigned int flags)
|
|||
return -EROFS;
|
||||
if ((BTRFS_I(inode)->flags & BTRFS_INODE_READONLY) && (mask & MAY_WRITE))
|
||||
return -EACCES;
|
||||
return generic_permission(inode, mask, flags, btrfs_check_acl);
|
||||
return generic_permission(inode, mask, flags);
|
||||
}
|
||||
|
||||
static const struct inode_operations btrfs_dir_inode_operations = {
|
||||
|
@ -7359,10 +7359,12 @@ static const struct inode_operations btrfs_dir_inode_operations = {
|
|||
.listxattr = btrfs_listxattr,
|
||||
.removexattr = btrfs_removexattr,
|
||||
.permission = btrfs_permission,
|
||||
.check_acl = btrfs_check_acl,
|
||||
};
|
||||
static const struct inode_operations btrfs_dir_ro_inode_operations = {
|
||||
.lookup = btrfs_lookup,
|
||||
.permission = btrfs_permission,
|
||||
.check_acl = btrfs_check_acl,
|
||||
};
|
||||
|
||||
static const struct file_operations btrfs_dir_file_operations = {
|
||||
|
@ -7431,6 +7433,7 @@ static const struct inode_operations btrfs_file_inode_operations = {
|
|||
.removexattr = btrfs_removexattr,
|
||||
.permission = btrfs_permission,
|
||||
.fiemap = btrfs_fiemap,
|
||||
.check_acl = btrfs_check_acl,
|
||||
};
|
||||
static const struct inode_operations btrfs_special_inode_operations = {
|
||||
.getattr = btrfs_getattr,
|
||||
|
@ -7440,6 +7443,7 @@ static const struct inode_operations btrfs_special_inode_operations = {
|
|||
.getxattr = btrfs_getxattr,
|
||||
.listxattr = btrfs_listxattr,
|
||||
.removexattr = btrfs_removexattr,
|
||||
.check_acl = btrfs_check_acl,
|
||||
};
|
||||
static const struct inode_operations btrfs_symlink_inode_operations = {
|
||||
.readlink = generic_readlink,
|
||||
|
@ -7451,6 +7455,7 @@ static const struct inode_operations btrfs_symlink_inode_operations = {
|
|||
.getxattr = btrfs_getxattr,
|
||||
.listxattr = btrfs_listxattr,
|
||||
.removexattr = btrfs_removexattr,
|
||||
.check_acl = btrfs_check_acl,
|
||||
};
|
||||
|
||||
const struct dentry_operations btrfs_dentry_operations = {
|
||||
|
|
|
@ -1805,7 +1805,7 @@ int ceph_permission(struct inode *inode, int mask, unsigned int flags)
|
|||
err = ceph_do_getattr(inode, CEPH_CAP_AUTH_SHARED);
|
||||
|
||||
if (!err)
|
||||
err = generic_permission(inode, mask, flags, NULL);
|
||||
err = generic_permission(inode, mask, flags);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -239,7 +239,7 @@ static int cifs_permission(struct inode *inode, int mask, unsigned int flags)
|
|||
on the client (above and beyond ACL on servers) for
|
||||
servers which do not support setting and viewing mode bits,
|
||||
so allowing client to check permissions is useful */
|
||||
return generic_permission(inode, mask, flags, NULL);
|
||||
return generic_permission(inode, mask, flags);
|
||||
}
|
||||
|
||||
static struct kmem_cache *cifs_inode_cachep;
|
||||
|
|
|
@ -1018,7 +1018,7 @@ static int fuse_permission(struct inode *inode, int mask, unsigned int flags)
|
|||
}
|
||||
|
||||
if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
|
||||
err = generic_permission(inode, mask, flags, NULL);
|
||||
err = generic_permission(inode, mask, flags);
|
||||
|
||||
/* If permission is denied, try to refresh file
|
||||
attributes. This is also needed, because the root
|
||||
|
@ -1027,7 +1027,7 @@ static int fuse_permission(struct inode *inode, int mask, unsigned int flags)
|
|||
err = fuse_perm_getattr(inode, flags);
|
||||
if (!err)
|
||||
err = generic_permission(inode, mask,
|
||||
flags, NULL);
|
||||
flags);
|
||||
}
|
||||
|
||||
/* Note: the opposite of the above test does not
|
||||
|
|
|
@ -1564,7 +1564,7 @@ int gfs2_permission(struct inode *inode, int mask, unsigned int flags)
|
|||
if ((mask & MAY_WRITE) && IS_IMMUTABLE(inode))
|
||||
error = -EACCES;
|
||||
else
|
||||
error = generic_permission(inode, mask, flags, gfs2_check_acl);
|
||||
error = generic_permission(inode, mask, flags);
|
||||
if (unlock)
|
||||
gfs2_glock_dq_uninit(&i_gh);
|
||||
|
||||
|
@ -1854,6 +1854,7 @@ const struct inode_operations gfs2_file_iops = {
|
|||
.listxattr = gfs2_listxattr,
|
||||
.removexattr = gfs2_removexattr,
|
||||
.fiemap = gfs2_fiemap,
|
||||
.check_acl = gfs2_check_acl,
|
||||
};
|
||||
|
||||
const struct inode_operations gfs2_dir_iops = {
|
||||
|
@ -1874,6 +1875,7 @@ const struct inode_operations gfs2_dir_iops = {
|
|||
.listxattr = gfs2_listxattr,
|
||||
.removexattr = gfs2_removexattr,
|
||||
.fiemap = gfs2_fiemap,
|
||||
.check_acl = gfs2_check_acl,
|
||||
};
|
||||
|
||||
const struct inode_operations gfs2_symlink_iops = {
|
||||
|
@ -1888,5 +1890,6 @@ const struct inode_operations gfs2_symlink_iops = {
|
|||
.listxattr = gfs2_listxattr,
|
||||
.removexattr = gfs2_removexattr,
|
||||
.fiemap = gfs2_fiemap,
|
||||
.check_acl = gfs2_check_acl,
|
||||
};
|
||||
|
||||
|
|
|
@ -770,7 +770,7 @@ int hostfs_permission(struct inode *ino, int desired, unsigned int flags)
|
|||
err = access_file(name, r, w, x);
|
||||
__putname(name);
|
||||
if (!err)
|
||||
err = generic_permission(ino, desired, flags, NULL);
|
||||
err = generic_permission(ino, desired, flags);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -398,7 +398,7 @@ again:
|
|||
hpfs_unlock(dir->i_sb);
|
||||
return -ENOSPC;
|
||||
}
|
||||
if (generic_permission(inode, MAY_WRITE, 0, NULL) ||
|
||||
if (generic_permission(inode, MAY_WRITE, 0) ||
|
||||
!S_ISREG(inode->i_mode) ||
|
||||
get_write_access(inode)) {
|
||||
d_rehash(dentry);
|
||||
|
|
17
fs/namei.c
17
fs/namei.c
|
@ -176,9 +176,9 @@ EXPORT_SYMBOL(putname);
|
|||
/*
|
||||
* This does basic POSIX ACL permission checking
|
||||
*/
|
||||
static int acl_permission_check(struct inode *inode, int mask, unsigned int flags,
|
||||
int (*check_acl)(struct inode *inode, int mask, unsigned int flags))
|
||||
static int acl_permission_check(struct inode *inode, int mask, unsigned int flags)
|
||||
{
|
||||
int (*check_acl)(struct inode *inode, int mask, unsigned int flags);
|
||||
unsigned int mode = inode->i_mode;
|
||||
|
||||
mask &= MAY_READ | MAY_WRITE | MAY_EXEC;
|
||||
|
@ -189,6 +189,7 @@ static int acl_permission_check(struct inode *inode, int mask, unsigned int flag
|
|||
if (current_fsuid() == inode->i_uid)
|
||||
mode >>= 6;
|
||||
else {
|
||||
check_acl = inode->i_op->check_acl;
|
||||
if (IS_POSIXACL(inode) && (mode & S_IRWXG) && check_acl) {
|
||||
int error = check_acl(inode, mask, flags);
|
||||
if (error != -EAGAIN)
|
||||
|
@ -212,7 +213,6 @@ other_perms:
|
|||
* generic_permission - check for access rights on a Posix-like filesystem
|
||||
* @inode: inode to check access rights for
|
||||
* @mask: right to check for (%MAY_READ, %MAY_WRITE, %MAY_EXEC)
|
||||
* @check_acl: optional callback to check for Posix ACLs
|
||||
* @flags: IPERM_FLAG_ flags.
|
||||
*
|
||||
* Used to check for read/write/execute permissions on a file.
|
||||
|
@ -224,15 +224,14 @@ other_perms:
|
|||
* request cannot be satisfied (eg. requires blocking or too much complexity).
|
||||
* It would then be called again in ref-walk mode.
|
||||
*/
|
||||
int generic_permission(struct inode *inode, int mask, unsigned int flags,
|
||||
int (*check_acl)(struct inode *inode, int mask, unsigned int flags))
|
||||
int generic_permission(struct inode *inode, int mask, unsigned int flags)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Do the basic POSIX ACL permission checks.
|
||||
*/
|
||||
ret = acl_permission_check(inode, mask, flags, check_acl);
|
||||
ret = acl_permission_check(inode, mask, flags);
|
||||
if (ret != -EACCES)
|
||||
return ret;
|
||||
|
||||
|
@ -290,8 +289,7 @@ int inode_permission(struct inode *inode, int mask)
|
|||
if (inode->i_op->permission)
|
||||
retval = inode->i_op->permission(inode, mask, 0);
|
||||
else
|
||||
retval = generic_permission(inode, mask, 0,
|
||||
inode->i_op->check_acl);
|
||||
retval = generic_permission(inode, mask, 0);
|
||||
|
||||
if (retval)
|
||||
return retval;
|
||||
|
@ -326,8 +324,7 @@ static inline int exec_permission(struct inode *inode, unsigned int flags)
|
|||
if (likely(!ret))
|
||||
goto ok;
|
||||
} else {
|
||||
ret = acl_permission_check(inode, MAY_EXEC, flags,
|
||||
inode->i_op->check_acl);
|
||||
ret = acl_permission_check(inode, MAY_EXEC, flags);
|
||||
if (likely(!ret))
|
||||
goto ok;
|
||||
if (ret != -EACCES)
|
||||
|
|
|
@ -2328,7 +2328,7 @@ out:
|
|||
out_notsup:
|
||||
res = nfs_revalidate_inode(NFS_SERVER(inode), inode);
|
||||
if (res == 0)
|
||||
res = generic_permission(inode, mask, flags, NULL);
|
||||
res = generic_permission(inode, mask, flags);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
|
@ -806,7 +806,7 @@ int nilfs_permission(struct inode *inode, int mask, unsigned int flags)
|
|||
root->cno != NILFS_CPTREE_CURRENT_CNO)
|
||||
return -EROFS; /* snapshot is not writable */
|
||||
|
||||
return generic_permission(inode, mask, flags, NULL);
|
||||
return generic_permission(inode, mask, flags);
|
||||
}
|
||||
|
||||
int nilfs_load_inode_block(struct inode *inode, struct buffer_head **pbh)
|
||||
|
|
|
@ -1293,7 +1293,7 @@ int ocfs2_permission(struct inode *inode, int mask, unsigned int flags)
|
|||
goto out;
|
||||
}
|
||||
|
||||
ret = generic_permission(inode, mask, flags, ocfs2_check_acl);
|
||||
ret = generic_permission(inode, mask, flags);
|
||||
|
||||
ocfs2_inode_unlock(inode, 0);
|
||||
out:
|
||||
|
@ -2593,12 +2593,14 @@ const struct inode_operations ocfs2_file_iops = {
|
|||
.listxattr = ocfs2_listxattr,
|
||||
.removexattr = generic_removexattr,
|
||||
.fiemap = ocfs2_fiemap,
|
||||
.check_acl = ocfs2_check_acl,
|
||||
};
|
||||
|
||||
const struct inode_operations ocfs2_special_file_iops = {
|
||||
.setattr = ocfs2_setattr,
|
||||
.getattr = ocfs2_getattr,
|
||||
.permission = ocfs2_permission,
|
||||
.check_acl = ocfs2_check_acl,
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -2498,4 +2498,5 @@ const struct inode_operations ocfs2_dir_iops = {
|
|||
.listxattr = ocfs2_listxattr,
|
||||
.removexattr = generic_removexattr,
|
||||
.fiemap = ocfs2_fiemap,
|
||||
.check_acl = ocfs2_check_acl,
|
||||
};
|
||||
|
|
|
@ -2169,7 +2169,7 @@ static const struct file_operations proc_fd_operations = {
|
|||
*/
|
||||
static int proc_fd_permission(struct inode *inode, int mask, unsigned int flags)
|
||||
{
|
||||
int rv = generic_permission(inode, mask, flags, NULL);
|
||||
int rv = generic_permission(inode, mask, flags);
|
||||
if (rv == 0)
|
||||
return 0;
|
||||
if (task_pid(current) == proc_pid(inode))
|
||||
|
|
|
@ -312,4 +312,5 @@ const struct inode_operations reiserfs_file_inode_operations = {
|
|||
.listxattr = reiserfs_listxattr,
|
||||
.removexattr = reiserfs_removexattr,
|
||||
.permission = reiserfs_permission,
|
||||
.check_acl = reiserfs_check_acl,
|
||||
};
|
||||
|
|
|
@ -1529,6 +1529,7 @@ const struct inode_operations reiserfs_dir_inode_operations = {
|
|||
.listxattr = reiserfs_listxattr,
|
||||
.removexattr = reiserfs_removexattr,
|
||||
.permission = reiserfs_permission,
|
||||
.check_acl = reiserfs_check_acl,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -1545,6 +1546,7 @@ const struct inode_operations reiserfs_symlink_inode_operations = {
|
|||
.listxattr = reiserfs_listxattr,
|
||||
.removexattr = reiserfs_removexattr,
|
||||
.permission = reiserfs_permission,
|
||||
.check_acl = reiserfs_check_acl,
|
||||
|
||||
};
|
||||
|
||||
|
@ -1558,5 +1560,5 @@ const struct inode_operations reiserfs_special_inode_operations = {
|
|||
.listxattr = reiserfs_listxattr,
|
||||
.removexattr = reiserfs_removexattr,
|
||||
.permission = reiserfs_permission,
|
||||
|
||||
.check_acl = reiserfs_check_acl,
|
||||
};
|
||||
|
|
|
@ -868,11 +868,17 @@ out:
|
|||
return err;
|
||||
}
|
||||
|
||||
static int reiserfs_check_acl(struct inode *inode, int mask, unsigned int flags)
|
||||
int reiserfs_check_acl(struct inode *inode, int mask, unsigned int flags)
|
||||
{
|
||||
struct posix_acl *acl;
|
||||
int error = -EAGAIN; /* do regular unix permission checks by default */
|
||||
|
||||
/*
|
||||
* Stat data v1 doesn't support ACLs.
|
||||
*/
|
||||
if (get_inode_sd_version(inode) == STAT_DATA_V1)
|
||||
return -EAGAIN;
|
||||
|
||||
if (flags & IPERM_FLAG_RCU)
|
||||
return -ECHILD;
|
||||
|
||||
|
@ -961,15 +967,7 @@ int reiserfs_permission(struct inode *inode, int mask, unsigned int flags)
|
|||
if (IS_PRIVATE(inode))
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_REISERFS_FS_XATTR
|
||||
/*
|
||||
* Stat data v1 doesn't support ACLs.
|
||||
*/
|
||||
if (get_inode_sd_version(inode) != STAT_DATA_V1)
|
||||
return generic_permission(inode, mask, flags,
|
||||
reiserfs_check_acl);
|
||||
#endif
|
||||
return generic_permission(inode, mask, flags, NULL);
|
||||
return generic_permission(inode, mask, flags);
|
||||
}
|
||||
|
||||
static int xattr_hide_revalidate(struct dentry *dentry, struct nameidata *nd)
|
||||
|
|
|
@ -362,5 +362,5 @@ int sysfs_permission(struct inode *inode, int mask, unsigned int flags)
|
|||
sysfs_refresh_inode(sd, inode);
|
||||
mutex_unlock(&sysfs_mutex);
|
||||
|
||||
return generic_permission(inode, mask, flags, NULL);
|
||||
return generic_permission(inode, mask, flags);
|
||||
}
|
||||
|
|
|
@ -2187,8 +2187,7 @@ extern sector_t bmap(struct inode *, sector_t);
|
|||
#endif
|
||||
extern int notify_change(struct dentry *, struct iattr *);
|
||||
extern int inode_permission(struct inode *, int);
|
||||
extern int generic_permission(struct inode *, int, unsigned int,
|
||||
int (*check_acl)(struct inode *, int, unsigned int));
|
||||
extern int generic_permission(struct inode *, int, unsigned int);
|
||||
|
||||
static inline bool execute_ok(struct inode *inode)
|
||||
{
|
||||
|
|
|
@ -45,6 +45,7 @@ int reiserfs_permission(struct inode *inode, int mask, unsigned int flags);
|
|||
|
||||
#ifdef CONFIG_REISERFS_FS_XATTR
|
||||
#define has_xattr_dir(inode) (REISERFS_I(inode)->i_flags & i_has_xattr_dir)
|
||||
int reiserfs_check_acl(struct inode *inode, int mask, unsigned int flags);
|
||||
ssize_t reiserfs_getxattr(struct dentry *dentry, const char *name,
|
||||
void *buffer, size_t size);
|
||||
int reiserfs_setxattr(struct dentry *dentry, const char *name,
|
||||
|
@ -122,6 +123,7 @@ static inline void reiserfs_init_xattr_rwsem(struct inode *inode)
|
|||
#define reiserfs_setxattr NULL
|
||||
#define reiserfs_listxattr NULL
|
||||
#define reiserfs_removexattr NULL
|
||||
#define reiserfs_check_acl NULL
|
||||
|
||||
static inline void reiserfs_init_xattr_rwsem(struct inode *inode)
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче