mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 09:59:32 +00:00
Merge branch 'lookup-permissions-cleanup'
* lookup-permissions-cleanup: jffs2/jfs/xfs: switch over to 'check_acl' rather than 'permission()' ext[234]: move over to 'check_acl' permission model shmfs: use 'check_acl' instead of 'permission' Make 'check_acl()' a first-class filesystem op Simplify exec_permission_lite(), part 3 Simplify exec_permission_lite() further Simplify exec_permission_lite() logic Do not call 'ima_path_check()' for each path component
This commit is contained in:
commit
526b678093
27 changed files with 85 additions and 129 deletions
|
@ -230,7 +230,7 @@ ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl)
|
|||
return error;
|
||||
}
|
||||
|
||||
static int
|
||||
int
|
||||
ext2_check_acl(struct inode *inode, int mask)
|
||||
{
|
||||
struct posix_acl *acl = ext2_get_acl(inode, ACL_TYPE_ACCESS);
|
||||
|
@ -246,12 +246,6 @@ ext2_check_acl(struct inode *inode, int mask)
|
|||
return -EAGAIN;
|
||||
}
|
||||
|
||||
int
|
||||
ext2_permission(struct inode *inode, int mask)
|
||||
{
|
||||
return generic_permission(inode, mask, ext2_check_acl);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the ACLs of a new inode. Called from ext2_new_inode.
|
||||
*
|
||||
|
|
|
@ -54,13 +54,13 @@ static inline int ext2_acl_count(size_t size)
|
|||
#ifdef CONFIG_EXT2_FS_POSIX_ACL
|
||||
|
||||
/* acl.c */
|
||||
extern int ext2_permission (struct inode *, int);
|
||||
extern int ext2_check_acl (struct inode *, int);
|
||||
extern int ext2_acl_chmod (struct inode *);
|
||||
extern int ext2_init_acl (struct inode *, struct inode *);
|
||||
|
||||
#else
|
||||
#include <linux/sched.h>
|
||||
#define ext2_permission NULL
|
||||
#define ext2_check_acl NULL
|
||||
#define ext2_get_acl NULL
|
||||
#define ext2_set_acl NULL
|
||||
|
||||
|
|
|
@ -85,6 +85,6 @@ const struct inode_operations ext2_file_inode_operations = {
|
|||
.removexattr = generic_removexattr,
|
||||
#endif
|
||||
.setattr = ext2_setattr,
|
||||
.permission = ext2_permission,
|
||||
.check_acl = ext2_check_acl,
|
||||
.fiemap = ext2_fiemap,
|
||||
};
|
||||
|
|
|
@ -400,7 +400,7 @@ const struct inode_operations ext2_dir_inode_operations = {
|
|||
.removexattr = generic_removexattr,
|
||||
#endif
|
||||
.setattr = ext2_setattr,
|
||||
.permission = ext2_permission,
|
||||
.check_acl = ext2_check_acl,
|
||||
};
|
||||
|
||||
const struct inode_operations ext2_special_inode_operations = {
|
||||
|
@ -411,5 +411,5 @@ const struct inode_operations ext2_special_inode_operations = {
|
|||
.removexattr = generic_removexattr,
|
||||
#endif
|
||||
.setattr = ext2_setattr,
|
||||
.permission = ext2_permission,
|
||||
.check_acl = ext2_check_acl,
|
||||
};
|
||||
|
|
|
@ -238,7 +238,7 @@ ext3_set_acl(handle_t *handle, struct inode *inode, int type,
|
|||
return error;
|
||||
}
|
||||
|
||||
static int
|
||||
int
|
||||
ext3_check_acl(struct inode *inode, int mask)
|
||||
{
|
||||
struct posix_acl *acl = ext3_get_acl(inode, ACL_TYPE_ACCESS);
|
||||
|
@ -254,12 +254,6 @@ ext3_check_acl(struct inode *inode, int mask)
|
|||
return -EAGAIN;
|
||||
}
|
||||
|
||||
int
|
||||
ext3_permission(struct inode *inode, int mask)
|
||||
{
|
||||
return generic_permission(inode, mask, ext3_check_acl);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the ACLs of a new inode. Called from ext3_new_inode.
|
||||
*
|
||||
|
|
|
@ -54,13 +54,13 @@ static inline int ext3_acl_count(size_t size)
|
|||
#ifdef CONFIG_EXT3_FS_POSIX_ACL
|
||||
|
||||
/* acl.c */
|
||||
extern int ext3_permission (struct inode *, int);
|
||||
extern int ext3_check_acl (struct inode *, int);
|
||||
extern int ext3_acl_chmod (struct inode *);
|
||||
extern int ext3_init_acl (handle_t *, struct inode *, struct inode *);
|
||||
|
||||
#else /* CONFIG_EXT3_FS_POSIX_ACL */
|
||||
#include <linux/sched.h>
|
||||
#define ext3_permission NULL
|
||||
#define ext3_check_acl NULL
|
||||
|
||||
static inline int
|
||||
ext3_acl_chmod(struct inode *inode)
|
||||
|
|
|
@ -137,7 +137,7 @@ const struct inode_operations ext3_file_inode_operations = {
|
|||
.listxattr = ext3_listxattr,
|
||||
.removexattr = generic_removexattr,
|
||||
#endif
|
||||
.permission = ext3_permission,
|
||||
.check_acl = ext3_check_acl,
|
||||
.fiemap = ext3_fiemap,
|
||||
};
|
||||
|
||||
|
|
|
@ -2445,7 +2445,7 @@ const struct inode_operations ext3_dir_inode_operations = {
|
|||
.listxattr = ext3_listxattr,
|
||||
.removexattr = generic_removexattr,
|
||||
#endif
|
||||
.permission = ext3_permission,
|
||||
.check_acl = ext3_check_acl,
|
||||
};
|
||||
|
||||
const struct inode_operations ext3_special_inode_operations = {
|
||||
|
@ -2456,5 +2456,5 @@ const struct inode_operations ext3_special_inode_operations = {
|
|||
.listxattr = ext3_listxattr,
|
||||
.removexattr = generic_removexattr,
|
||||
#endif
|
||||
.permission = ext3_permission,
|
||||
.check_acl = ext3_check_acl,
|
||||
};
|
||||
|
|
|
@ -236,7 +236,7 @@ ext4_set_acl(handle_t *handle, struct inode *inode, int type,
|
|||
return error;
|
||||
}
|
||||
|
||||
static int
|
||||
int
|
||||
ext4_check_acl(struct inode *inode, int mask)
|
||||
{
|
||||
struct posix_acl *acl = ext4_get_acl(inode, ACL_TYPE_ACCESS);
|
||||
|
@ -252,12 +252,6 @@ ext4_check_acl(struct inode *inode, int mask)
|
|||
return -EAGAIN;
|
||||
}
|
||||
|
||||
int
|
||||
ext4_permission(struct inode *inode, int mask)
|
||||
{
|
||||
return generic_permission(inode, mask, ext4_check_acl);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the ACLs of a new inode. Called from ext4_new_inode.
|
||||
*
|
||||
|
|
|
@ -54,13 +54,13 @@ static inline int ext4_acl_count(size_t size)
|
|||
#ifdef CONFIG_EXT4_FS_POSIX_ACL
|
||||
|
||||
/* acl.c */
|
||||
extern int ext4_permission(struct inode *, int);
|
||||
extern int ext4_check_acl(struct inode *, int);
|
||||
extern int ext4_acl_chmod(struct inode *);
|
||||
extern int ext4_init_acl(handle_t *, struct inode *, struct inode *);
|
||||
|
||||
#else /* CONFIG_EXT4_FS_POSIX_ACL */
|
||||
#include <linux/sched.h>
|
||||
#define ext4_permission NULL
|
||||
#define ext4_check_acl NULL
|
||||
|
||||
static inline int
|
||||
ext4_acl_chmod(struct inode *inode)
|
||||
|
|
|
@ -207,7 +207,7 @@ const struct inode_operations ext4_file_inode_operations = {
|
|||
.listxattr = ext4_listxattr,
|
||||
.removexattr = generic_removexattr,
|
||||
#endif
|
||||
.permission = ext4_permission,
|
||||
.check_acl = ext4_check_acl,
|
||||
.fallocate = ext4_fallocate,
|
||||
.fiemap = ext4_fiemap,
|
||||
};
|
||||
|
|
|
@ -2536,7 +2536,7 @@ const struct inode_operations ext4_dir_inode_operations = {
|
|||
.listxattr = ext4_listxattr,
|
||||
.removexattr = generic_removexattr,
|
||||
#endif
|
||||
.permission = ext4_permission,
|
||||
.check_acl = ext4_check_acl,
|
||||
.fiemap = ext4_fiemap,
|
||||
};
|
||||
|
||||
|
@ -2548,5 +2548,5 @@ const struct inode_operations ext4_special_inode_operations = {
|
|||
.listxattr = ext4_listxattr,
|
||||
.removexattr = generic_removexattr,
|
||||
#endif
|
||||
.permission = ext4_permission,
|
||||
.check_acl = ext4_check_acl,
|
||||
};
|
||||
|
|
|
@ -258,7 +258,7 @@ static int jffs2_set_acl(struct inode *inode, int type, struct posix_acl *acl)
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int jffs2_check_acl(struct inode *inode, int mask)
|
||||
int jffs2_check_acl(struct inode *inode, int mask)
|
||||
{
|
||||
struct posix_acl *acl;
|
||||
int rc;
|
||||
|
@ -274,11 +274,6 @@ static int jffs2_check_acl(struct inode *inode, int mask)
|
|||
return -EAGAIN;
|
||||
}
|
||||
|
||||
int jffs2_permission(struct inode *inode, int mask)
|
||||
{
|
||||
return generic_permission(inode, mask, jffs2_check_acl);
|
||||
}
|
||||
|
||||
int jffs2_init_acl_pre(struct inode *dir_i, struct inode *inode, int *i_mode)
|
||||
{
|
||||
struct posix_acl *acl, *clone;
|
||||
|
|
|
@ -26,7 +26,7 @@ struct jffs2_acl_header {
|
|||
|
||||
#ifdef CONFIG_JFFS2_FS_POSIX_ACL
|
||||
|
||||
extern int jffs2_permission(struct inode *, int);
|
||||
extern int jffs2_check_acl(struct inode *, int);
|
||||
extern int jffs2_acl_chmod(struct inode *);
|
||||
extern int jffs2_init_acl_pre(struct inode *, struct inode *, int *);
|
||||
extern int jffs2_init_acl_post(struct inode *);
|
||||
|
@ -36,7 +36,7 @@ extern struct xattr_handler jffs2_acl_default_xattr_handler;
|
|||
|
||||
#else
|
||||
|
||||
#define jffs2_permission (NULL)
|
||||
#define jffs2_check_acl (NULL)
|
||||
#define jffs2_acl_chmod(inode) (0)
|
||||
#define jffs2_init_acl_pre(dir_i,inode,mode) (0)
|
||||
#define jffs2_init_acl_post(inode) (0)
|
||||
|
|
|
@ -55,7 +55,7 @@ const struct inode_operations jffs2_dir_inode_operations =
|
|||
.rmdir = jffs2_rmdir,
|
||||
.mknod = jffs2_mknod,
|
||||
.rename = jffs2_rename,
|
||||
.permission = jffs2_permission,
|
||||
.check_acl = jffs2_check_acl,
|
||||
.setattr = jffs2_setattr,
|
||||
.setxattr = jffs2_setxattr,
|
||||
.getxattr = jffs2_getxattr,
|
||||
|
|
|
@ -56,7 +56,7 @@ const struct file_operations jffs2_file_operations =
|
|||
|
||||
const struct inode_operations jffs2_file_inode_operations =
|
||||
{
|
||||
.permission = jffs2_permission,
|
||||
.check_acl = jffs2_check_acl,
|
||||
.setattr = jffs2_setattr,
|
||||
.setxattr = jffs2_setxattr,
|
||||
.getxattr = jffs2_getxattr,
|
||||
|
|
|
@ -21,7 +21,7 @@ const struct inode_operations jffs2_symlink_inode_operations =
|
|||
{
|
||||
.readlink = generic_readlink,
|
||||
.follow_link = jffs2_follow_link,
|
||||
.permission = jffs2_permission,
|
||||
.check_acl = jffs2_check_acl,
|
||||
.setattr = jffs2_setattr,
|
||||
.setxattr = jffs2_setxattr,
|
||||
.getxattr = jffs2_getxattr,
|
||||
|
|
|
@ -114,7 +114,7 @@ static int jfs_set_acl(tid_t tid, struct inode *inode, int type,
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int jfs_check_acl(struct inode *inode, int mask)
|
||||
int jfs_check_acl(struct inode *inode, int mask)
|
||||
{
|
||||
struct posix_acl *acl = jfs_get_acl(inode, ACL_TYPE_ACCESS);
|
||||
|
||||
|
@ -129,11 +129,6 @@ static int jfs_check_acl(struct inode *inode, int mask)
|
|||
return -EAGAIN;
|
||||
}
|
||||
|
||||
int jfs_permission(struct inode *inode, int mask)
|
||||
{
|
||||
return generic_permission(inode, mask, jfs_check_acl);
|
||||
}
|
||||
|
||||
int jfs_init_acl(tid_t tid, struct inode *inode, struct inode *dir)
|
||||
{
|
||||
struct posix_acl *acl = NULL;
|
||||
|
|
|
@ -96,7 +96,7 @@ const struct inode_operations jfs_file_inode_operations = {
|
|||
.removexattr = jfs_removexattr,
|
||||
#ifdef CONFIG_JFS_POSIX_ACL
|
||||
.setattr = jfs_setattr,
|
||||
.permission = jfs_permission,
|
||||
.check_acl = jfs_check_acl,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
|
||||
#ifdef CONFIG_JFS_POSIX_ACL
|
||||
|
||||
int jfs_permission(struct inode *, int);
|
||||
int jfs_check_acl(struct inode *, int);
|
||||
int jfs_init_acl(tid_t, struct inode *, struct inode *);
|
||||
int jfs_setattr(struct dentry *, struct iattr *);
|
||||
|
||||
|
|
|
@ -1543,7 +1543,7 @@ const struct inode_operations jfs_dir_inode_operations = {
|
|||
.removexattr = jfs_removexattr,
|
||||
#ifdef CONFIG_JFS_POSIX_ACL
|
||||
.setattr = jfs_setattr,
|
||||
.permission = jfs_permission,
|
||||
.check_acl = jfs_check_acl,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
94
fs/namei.c
94
fs/namei.c
|
@ -169,6 +169,36 @@ void putname(const char *name)
|
|||
EXPORT_SYMBOL(putname);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This does basic POSIX ACL permission checking
|
||||
*/
|
||||
static int acl_permission_check(struct inode *inode, int mask,
|
||||
int (*check_acl)(struct inode *inode, int mask))
|
||||
{
|
||||
umode_t mode = inode->i_mode;
|
||||
|
||||
mask &= MAY_READ | MAY_WRITE | MAY_EXEC;
|
||||
|
||||
if (current_fsuid() == inode->i_uid)
|
||||
mode >>= 6;
|
||||
else {
|
||||
if (IS_POSIXACL(inode) && (mode & S_IRWXG) && check_acl) {
|
||||
int error = check_acl(inode, mask);
|
||||
if (error != -EAGAIN)
|
||||
return error;
|
||||
}
|
||||
|
||||
if (in_group_p(inode->i_gid))
|
||||
mode >>= 3;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the DACs are ok we don't need any capability check.
|
||||
*/
|
||||
if ((mask & ~mode) == 0)
|
||||
return 0;
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
/**
|
||||
* generic_permission - check for access rights on a Posix-like filesystem
|
||||
|
@ -184,32 +214,15 @@ EXPORT_SYMBOL(putname);
|
|||
int generic_permission(struct inode *inode, int mask,
|
||||
int (*check_acl)(struct inode *inode, int mask))
|
||||
{
|
||||
umode_t mode = inode->i_mode;
|
||||
|
||||
mask &= MAY_READ | MAY_WRITE | MAY_EXEC;
|
||||
|
||||
if (current_fsuid() == inode->i_uid)
|
||||
mode >>= 6;
|
||||
else {
|
||||
if (IS_POSIXACL(inode) && (mode & S_IRWXG) && check_acl) {
|
||||
int error = check_acl(inode, mask);
|
||||
if (error == -EACCES)
|
||||
goto check_capabilities;
|
||||
else if (error != -EAGAIN)
|
||||
return error;
|
||||
}
|
||||
|
||||
if (in_group_p(inode->i_gid))
|
||||
mode >>= 3;
|
||||
}
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* If the DACs are ok we don't need any capability check.
|
||||
* Do the basic POSIX ACL permission checks.
|
||||
*/
|
||||
if ((mask & ~mode) == 0)
|
||||
return 0;
|
||||
ret = acl_permission_check(inode, mask, check_acl);
|
||||
if (ret != -EACCES)
|
||||
return ret;
|
||||
|
||||
check_capabilities:
|
||||
/*
|
||||
* Read/write DACs are always overridable.
|
||||
* Executable DACs are overridable if at least one exec bit is set.
|
||||
|
@ -262,7 +275,7 @@ int inode_permission(struct inode *inode, int mask)
|
|||
if (inode->i_op->permission)
|
||||
retval = inode->i_op->permission(inode, mask);
|
||||
else
|
||||
retval = generic_permission(inode, mask, NULL);
|
||||
retval = generic_permission(inode, mask, inode->i_op->check_acl);
|
||||
|
||||
if (retval)
|
||||
return retval;
|
||||
|
@ -432,29 +445,22 @@ static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name,
|
|||
*/
|
||||
static int exec_permission_lite(struct inode *inode)
|
||||
{
|
||||
umode_t mode = inode->i_mode;
|
||||
int ret;
|
||||
|
||||
if (inode->i_op->permission)
|
||||
return -EAGAIN;
|
||||
|
||||
if (current_fsuid() == inode->i_uid)
|
||||
mode >>= 6;
|
||||
else if (in_group_p(inode->i_gid))
|
||||
mode >>= 3;
|
||||
|
||||
if (mode & MAY_EXEC)
|
||||
if (inode->i_op->permission) {
|
||||
ret = inode->i_op->permission(inode, MAY_EXEC);
|
||||
if (!ret)
|
||||
goto ok;
|
||||
return ret;
|
||||
}
|
||||
ret = acl_permission_check(inode, MAY_EXEC, inode->i_op->check_acl);
|
||||
if (!ret)
|
||||
goto ok;
|
||||
|
||||
if ((inode->i_mode & S_IXUGO) && capable(CAP_DAC_OVERRIDE))
|
||||
if (capable(CAP_DAC_OVERRIDE) || capable(CAP_DAC_READ_SEARCH))
|
||||
goto ok;
|
||||
|
||||
if (S_ISDIR(inode->i_mode) && capable(CAP_DAC_OVERRIDE))
|
||||
goto ok;
|
||||
|
||||
if (S_ISDIR(inode->i_mode) && capable(CAP_DAC_READ_SEARCH))
|
||||
goto ok;
|
||||
|
||||
return -EACCES;
|
||||
return ret;
|
||||
ok:
|
||||
return security_inode_permission(inode, MAY_EXEC);
|
||||
}
|
||||
|
@ -853,12 +859,6 @@ static int __link_path_walk(const char *name, struct nameidata *nd)
|
|||
|
||||
nd->flags |= LOOKUP_CONTINUE;
|
||||
err = exec_permission_lite(inode);
|
||||
if (err == -EAGAIN)
|
||||
err = inode_permission(nd->path.dentry->d_inode,
|
||||
MAY_EXEC);
|
||||
if (!err)
|
||||
err = ima_path_check(&nd->path, MAY_EXEC,
|
||||
IMA_COUNT_UPDATE);
|
||||
if (err)
|
||||
break;
|
||||
|
||||
|
|
|
@ -484,14 +484,6 @@ xfs_vn_put_link(
|
|||
kfree(s);
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_vn_permission(
|
||||
struct inode *inode,
|
||||
int mask)
|
||||
{
|
||||
return generic_permission(inode, mask, xfs_check_acl);
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_vn_getattr(
|
||||
struct vfsmount *mnt,
|
||||
|
@ -696,7 +688,7 @@ xfs_vn_fiemap(
|
|||
}
|
||||
|
||||
static const struct inode_operations xfs_inode_operations = {
|
||||
.permission = xfs_vn_permission,
|
||||
.check_acl = xfs_check_acl,
|
||||
.truncate = xfs_vn_truncate,
|
||||
.getattr = xfs_vn_getattr,
|
||||
.setattr = xfs_vn_setattr,
|
||||
|
@ -724,7 +716,7 @@ static const struct inode_operations xfs_dir_inode_operations = {
|
|||
.rmdir = xfs_vn_unlink,
|
||||
.mknod = xfs_vn_mknod,
|
||||
.rename = xfs_vn_rename,
|
||||
.permission = xfs_vn_permission,
|
||||
.check_acl = xfs_check_acl,
|
||||
.getattr = xfs_vn_getattr,
|
||||
.setattr = xfs_vn_setattr,
|
||||
.setxattr = generic_setxattr,
|
||||
|
@ -749,7 +741,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = {
|
|||
.rmdir = xfs_vn_unlink,
|
||||
.mknod = xfs_vn_mknod,
|
||||
.rename = xfs_vn_rename,
|
||||
.permission = xfs_vn_permission,
|
||||
.check_acl = xfs_check_acl,
|
||||
.getattr = xfs_vn_getattr,
|
||||
.setattr = xfs_vn_setattr,
|
||||
.setxattr = generic_setxattr,
|
||||
|
@ -762,7 +754,7 @@ static const struct inode_operations xfs_symlink_inode_operations = {
|
|||
.readlink = generic_readlink,
|
||||
.follow_link = xfs_vn_follow_link,
|
||||
.put_link = xfs_vn_put_link,
|
||||
.permission = xfs_vn_permission,
|
||||
.check_acl = xfs_check_acl,
|
||||
.getattr = xfs_vn_getattr,
|
||||
.setattr = xfs_vn_setattr,
|
||||
.setxattr = generic_setxattr,
|
||||
|
|
|
@ -1528,6 +1528,7 @@ struct inode_operations {
|
|||
void (*put_link) (struct dentry *, struct nameidata *, void *);
|
||||
void (*truncate) (struct inode *);
|
||||
int (*permission) (struct inode *, int);
|
||||
int (*check_acl)(struct inode *, int);
|
||||
int (*setattr) (struct dentry *, struct iattr *);
|
||||
int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
|
||||
int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
|
||||
|
|
|
@ -39,7 +39,7 @@ static inline struct shmem_inode_info *SHMEM_I(struct inode *inode)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_TMPFS_POSIX_ACL
|
||||
int shmem_permission(struct inode *, int);
|
||||
int shmem_check_acl(struct inode *, int);
|
||||
int shmem_acl_init(struct inode *, struct inode *);
|
||||
|
||||
extern struct xattr_handler shmem_xattr_acl_access_handler;
|
||||
|
|
|
@ -2446,7 +2446,7 @@ static const struct inode_operations shmem_inode_operations = {
|
|||
.getxattr = generic_getxattr,
|
||||
.listxattr = generic_listxattr,
|
||||
.removexattr = generic_removexattr,
|
||||
.permission = shmem_permission,
|
||||
.check_acl = shmem_check_acl,
|
||||
#endif
|
||||
|
||||
};
|
||||
|
@ -2469,7 +2469,7 @@ static const struct inode_operations shmem_dir_inode_operations = {
|
|||
.getxattr = generic_getxattr,
|
||||
.listxattr = generic_listxattr,
|
||||
.removexattr = generic_removexattr,
|
||||
.permission = shmem_permission,
|
||||
.check_acl = shmem_check_acl,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -2480,7 +2480,7 @@ static const struct inode_operations shmem_special_inode_operations = {
|
|||
.getxattr = generic_getxattr,
|
||||
.listxattr = generic_listxattr,
|
||||
.removexattr = generic_removexattr,
|
||||
.permission = shmem_permission,
|
||||
.check_acl = shmem_check_acl,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
@ -157,7 +157,7 @@ shmem_acl_init(struct inode *inode, struct inode *dir)
|
|||
/**
|
||||
* shmem_check_acl - check_acl() callback for generic_permission()
|
||||
*/
|
||||
static int
|
||||
int
|
||||
shmem_check_acl(struct inode *inode, int mask)
|
||||
{
|
||||
struct posix_acl *acl = shmem_get_acl(inode, ACL_TYPE_ACCESS);
|
||||
|
@ -169,12 +169,3 @@ shmem_check_acl(struct inode *inode, int mask)
|
|||
}
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
/**
|
||||
* shmem_permission - permission() inode operation
|
||||
*/
|
||||
int
|
||||
shmem_permission(struct inode *inode, int mask)
|
||||
{
|
||||
return generic_permission(inode, mask, shmem_check_acl);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue