Commit 526b6780 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 752015d1 18f4c644
...@@ -230,7 +230,7 @@ ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl) ...@@ -230,7 +230,7 @@ ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl)
return error; return error;
} }
static int int
ext2_check_acl(struct inode *inode, int mask) ext2_check_acl(struct inode *inode, int mask)
{ {
struct posix_acl *acl = ext2_get_acl(inode, ACL_TYPE_ACCESS); struct posix_acl *acl = ext2_get_acl(inode, ACL_TYPE_ACCESS);
...@@ -246,12 +246,6 @@ ext2_check_acl(struct inode *inode, int mask) ...@@ -246,12 +246,6 @@ ext2_check_acl(struct inode *inode, int mask)
return -EAGAIN; 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. * 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) ...@@ -54,13 +54,13 @@ static inline int ext2_acl_count(size_t size)
#ifdef CONFIG_EXT2_FS_POSIX_ACL #ifdef CONFIG_EXT2_FS_POSIX_ACL
/* acl.c */ /* 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_acl_chmod (struct inode *);
extern int ext2_init_acl (struct inode *, struct inode *); extern int ext2_init_acl (struct inode *, struct inode *);
#else #else
#include <linux/sched.h> #include <linux/sched.h>
#define ext2_permission NULL #define ext2_check_acl NULL
#define ext2_get_acl NULL #define ext2_get_acl NULL
#define ext2_set_acl NULL #define ext2_set_acl NULL
......
...@@ -85,6 +85,6 @@ const struct inode_operations ext2_file_inode_operations = { ...@@ -85,6 +85,6 @@ const struct inode_operations ext2_file_inode_operations = {
.removexattr = generic_removexattr, .removexattr = generic_removexattr,
#endif #endif
.setattr = ext2_setattr, .setattr = ext2_setattr,
.permission = ext2_permission, .check_acl = ext2_check_acl,
.fiemap = ext2_fiemap, .fiemap = ext2_fiemap,
}; };
...@@ -400,7 +400,7 @@ const struct inode_operations ext2_dir_inode_operations = { ...@@ -400,7 +400,7 @@ const struct inode_operations ext2_dir_inode_operations = {
.removexattr = generic_removexattr, .removexattr = generic_removexattr,
#endif #endif
.setattr = ext2_setattr, .setattr = ext2_setattr,
.permission = ext2_permission, .check_acl = ext2_check_acl,
}; };
const struct inode_operations ext2_special_inode_operations = { const struct inode_operations ext2_special_inode_operations = {
...@@ -411,5 +411,5 @@ const struct inode_operations ext2_special_inode_operations = { ...@@ -411,5 +411,5 @@ const struct inode_operations ext2_special_inode_operations = {
.removexattr = generic_removexattr, .removexattr = generic_removexattr,
#endif #endif
.setattr = ext2_setattr, .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, ...@@ -238,7 +238,7 @@ ext3_set_acl(handle_t *handle, struct inode *inode, int type,
return error; return error;
} }
static int int
ext3_check_acl(struct inode *inode, int mask) ext3_check_acl(struct inode *inode, int mask)
{ {
struct posix_acl *acl = ext3_get_acl(inode, ACL_TYPE_ACCESS); struct posix_acl *acl = ext3_get_acl(inode, ACL_TYPE_ACCESS);
...@@ -254,12 +254,6 @@ ext3_check_acl(struct inode *inode, int mask) ...@@ -254,12 +254,6 @@ ext3_check_acl(struct inode *inode, int mask)
return -EAGAIN; 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. * 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) ...@@ -54,13 +54,13 @@ static inline int ext3_acl_count(size_t size)
#ifdef CONFIG_EXT3_FS_POSIX_ACL #ifdef CONFIG_EXT3_FS_POSIX_ACL
/* acl.c */ /* 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_acl_chmod (struct inode *);
extern int ext3_init_acl (handle_t *, struct inode *, struct inode *); extern int ext3_init_acl (handle_t *, struct inode *, struct inode *);
#else /* CONFIG_EXT3_FS_POSIX_ACL */ #else /* CONFIG_EXT3_FS_POSIX_ACL */
#include <linux/sched.h> #include <linux/sched.h>
#define ext3_permission NULL #define ext3_check_acl NULL
static inline int static inline int
ext3_acl_chmod(struct inode *inode) ext3_acl_chmod(struct inode *inode)
......
...@@ -137,7 +137,7 @@ const struct inode_operations ext3_file_inode_operations = { ...@@ -137,7 +137,7 @@ const struct inode_operations ext3_file_inode_operations = {
.listxattr = ext3_listxattr, .listxattr = ext3_listxattr,
.removexattr = generic_removexattr, .removexattr = generic_removexattr,
#endif #endif
.permission = ext3_permission, .check_acl = ext3_check_acl,
.fiemap = ext3_fiemap, .fiemap = ext3_fiemap,
}; };
...@@ -2445,7 +2445,7 @@ const struct inode_operations ext3_dir_inode_operations = { ...@@ -2445,7 +2445,7 @@ const struct inode_operations ext3_dir_inode_operations = {
.listxattr = ext3_listxattr, .listxattr = ext3_listxattr,
.removexattr = generic_removexattr, .removexattr = generic_removexattr,
#endif #endif
.permission = ext3_permission, .check_acl = ext3_check_acl,
}; };
const struct inode_operations ext3_special_inode_operations = { const struct inode_operations ext3_special_inode_operations = {
...@@ -2456,5 +2456,5 @@ const struct inode_operations ext3_special_inode_operations = { ...@@ -2456,5 +2456,5 @@ const struct inode_operations ext3_special_inode_operations = {
.listxattr = ext3_listxattr, .listxattr = ext3_listxattr,
.removexattr = generic_removexattr, .removexattr = generic_removexattr,
#endif #endif
.permission = ext3_permission, .check_acl = ext3_check_acl,
}; };
...@@ -236,7 +236,7 @@ ext4_set_acl(handle_t *handle, struct inode *inode, int type, ...@@ -236,7 +236,7 @@ ext4_set_acl(handle_t *handle, struct inode *inode, int type,
return error; return error;
} }
static int int
ext4_check_acl(struct inode *inode, int mask) ext4_check_acl(struct inode *inode, int mask)
{ {
struct posix_acl *acl = ext4_get_acl(inode, ACL_TYPE_ACCESS); struct posix_acl *acl = ext4_get_acl(inode, ACL_TYPE_ACCESS);
...@@ -252,12 +252,6 @@ ext4_check_acl(struct inode *inode, int mask) ...@@ -252,12 +252,6 @@ ext4_check_acl(struct inode *inode, int mask)
return -EAGAIN; 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. * 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) ...@@ -54,13 +54,13 @@ static inline int ext4_acl_count(size_t size)
#ifdef CONFIG_EXT4_FS_POSIX_ACL #ifdef CONFIG_EXT4_FS_POSIX_ACL
/* acl.c */ /* 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_acl_chmod(struct inode *);
extern int ext4_init_acl(handle_t *, struct inode *, struct inode *); extern int ext4_init_acl(handle_t *, struct inode *, struct inode *);
#else /* CONFIG_EXT4_FS_POSIX_ACL */ #else /* CONFIG_EXT4_FS_POSIX_ACL */
#include <linux/sched.h> #include <linux/sched.h>
#define ext4_permission NULL #define ext4_check_acl NULL
static inline int static inline int
ext4_acl_chmod(struct inode *inode) ext4_acl_chmod(struct inode *inode)
......
...@@ -207,7 +207,7 @@ const struct inode_operations ext4_file_inode_operations = { ...@@ -207,7 +207,7 @@ const struct inode_operations ext4_file_inode_operations = {
.listxattr = ext4_listxattr, .listxattr = ext4_listxattr,
.removexattr = generic_removexattr, .removexattr = generic_removexattr,
#endif #endif
.permission = ext4_permission, .check_acl = ext4_check_acl,
.fallocate = ext4_fallocate, .fallocate = ext4_fallocate,
.fiemap = ext4_fiemap, .fiemap = ext4_fiemap,
}; };
......
...@@ -2536,7 +2536,7 @@ const struct inode_operations ext4_dir_inode_operations = { ...@@ -2536,7 +2536,7 @@ const struct inode_operations ext4_dir_inode_operations = {
.listxattr = ext4_listxattr, .listxattr = ext4_listxattr,
.removexattr = generic_removexattr, .removexattr = generic_removexattr,
#endif #endif
.permission = ext4_permission, .check_acl = ext4_check_acl,
.fiemap = ext4_fiemap, .fiemap = ext4_fiemap,
}; };
...@@ -2548,5 +2548,5 @@ const struct inode_operations ext4_special_inode_operations = { ...@@ -2548,5 +2548,5 @@ const struct inode_operations ext4_special_inode_operations = {
.listxattr = ext4_listxattr, .listxattr = ext4_listxattr,
.removexattr = generic_removexattr, .removexattr = generic_removexattr,
#endif #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) ...@@ -258,7 +258,7 @@ static int jffs2_set_acl(struct inode *inode, int type, struct posix_acl *acl)
return rc; 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; struct posix_acl *acl;
int rc; int rc;
...@@ -274,11 +274,6 @@ static int jffs2_check_acl(struct inode *inode, int mask) ...@@ -274,11 +274,6 @@ static int jffs2_check_acl(struct inode *inode, int mask)
return -EAGAIN; 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) int jffs2_init_acl_pre(struct inode *dir_i, struct inode *inode, int *i_mode)
{ {
struct posix_acl *acl, *clone; struct posix_acl *acl, *clone;
......
...@@ -26,7 +26,7 @@ struct jffs2_acl_header { ...@@ -26,7 +26,7 @@ struct jffs2_acl_header {
#ifdef CONFIG_JFFS2_FS_POSIX_ACL #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_acl_chmod(struct inode *);
extern int jffs2_init_acl_pre(struct inode *, struct inode *, int *); extern int jffs2_init_acl_pre(struct inode *, struct inode *, int *);
extern int jffs2_init_acl_post(struct inode *); extern int jffs2_init_acl_post(struct inode *);
...@@ -36,7 +36,7 @@ extern struct xattr_handler jffs2_acl_default_xattr_handler; ...@@ -36,7 +36,7 @@ extern struct xattr_handler jffs2_acl_default_xattr_handler;
#else #else
#define jffs2_permission (NULL) #define jffs2_check_acl (NULL)
#define jffs2_acl_chmod(inode) (0) #define jffs2_acl_chmod(inode) (0)
#define jffs2_init_acl_pre(dir_i,inode,mode) (0) #define jffs2_init_acl_pre(dir_i,inode,mode) (0)
#define jffs2_init_acl_post(inode) (0) #define jffs2_init_acl_post(inode) (0)
......
...@@ -55,7 +55,7 @@ const struct inode_operations jffs2_dir_inode_operations = ...@@ -55,7 +55,7 @@ const struct inode_operations jffs2_dir_inode_operations =
.rmdir = jffs2_rmdir, .rmdir = jffs2_rmdir,
.mknod = jffs2_mknod, .mknod = jffs2_mknod,
.rename = jffs2_rename, .rename = jffs2_rename,
.permission = jffs2_permission, .check_acl = jffs2_check_acl,
.setattr = jffs2_setattr, .setattr = jffs2_setattr,
.setxattr = jffs2_setxattr, .setxattr = jffs2_setxattr,
.getxattr = jffs2_getxattr, .getxattr = jffs2_getxattr,
......
...@@ -56,7 +56,7 @@ const struct file_operations jffs2_file_operations = ...@@ -56,7 +56,7 @@ const struct file_operations jffs2_file_operations =
const struct inode_operations jffs2_file_inode_operations = const struct inode_operations jffs2_file_inode_operations =
{ {
.permission = jffs2_permission, .check_acl = jffs2_check_acl,
.setattr = jffs2_setattr, .setattr = jffs2_setattr,
.setxattr = jffs2_setxattr, .setxattr = jffs2_setxattr,
.getxattr = jffs2_getxattr, .getxattr = jffs2_getxattr,
......
...@@ -21,7 +21,7 @@ const struct inode_operations jffs2_symlink_inode_operations = ...@@ -21,7 +21,7 @@ const struct inode_operations jffs2_symlink_inode_operations =
{ {
.readlink = generic_readlink, .readlink = generic_readlink,
.follow_link = jffs2_follow_link, .follow_link = jffs2_follow_link,
.permission = jffs2_permission, .check_acl = jffs2_check_acl,
.setattr = jffs2_setattr, .setattr = jffs2_setattr,
.setxattr = jffs2_setxattr, .setxattr = jffs2_setxattr,
.getxattr = jffs2_getxattr, .getxattr = jffs2_getxattr,
......
...@@ -114,7 +114,7 @@ static int jfs_set_acl(tid_t tid, struct inode *inode, int type, ...@@ -114,7 +114,7 @@ static int jfs_set_acl(tid_t tid, struct inode *inode, int type,
return rc; 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); 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) ...@@ -129,11 +129,6 @@ static int jfs_check_acl(struct inode *inode, int mask)
return -EAGAIN; 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) int jfs_init_acl(tid_t tid, struct inode *inode, struct inode *dir)
{ {
struct posix_acl *acl = NULL; struct posix_acl *acl = NULL;
......
...@@ -96,7 +96,7 @@ const struct inode_operations jfs_file_inode_operations = { ...@@ -96,7 +96,7 @@ const struct inode_operations jfs_file_inode_operations = {
.removexattr = jfs_removexattr, .removexattr = jfs_removexattr,
#ifdef CONFIG_JFS_POSIX_ACL #ifdef CONFIG_JFS_POSIX_ACL
.setattr = jfs_setattr, .setattr = jfs_setattr,
.permission = jfs_permission, .check_acl = jfs_check_acl,
#endif #endif
}; };
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#ifdef CONFIG_JFS_POSIX_ACL #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_init_acl(tid_t, struct inode *, struct inode *);
int jfs_setattr(struct dentry *, struct iattr *); int jfs_setattr(struct dentry *, struct iattr *);
......
...@@ -1543,7 +1543,7 @@ const struct inode_operations jfs_dir_inode_operations = { ...@@ -1543,7 +1543,7 @@ const struct inode_operations jfs_dir_inode_operations = {
.removexattr = jfs_removexattr, .removexattr = jfs_removexattr,
#ifdef CONFIG_JFS_POSIX_ACL #ifdef CONFIG_JFS_POSIX_ACL
.setattr = jfs_setattr, .setattr = jfs_setattr,
.permission = jfs_permission, .check_acl = jfs_check_acl,
#endif #endif
}; };
......
...@@ -169,19 +169,10 @@ void putname(const char *name) ...@@ -169,19 +169,10 @@ void putname(const char *name)
EXPORT_SYMBOL(putname); EXPORT_SYMBOL(putname);
#endif #endif
/*
/** * This does basic POSIX ACL permission checking
* 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
*
* Used to check for read/write/execute permissions on a file.
* We use "fsuid" for this, letting us set arbitrary permissions
* for filesystem access without changing the "normal" uids which
* are used for other things..
*/ */
int generic_permission(struct inode *inode, int mask, static int acl_permission_check(struct inode *inode, int mask,
int (*check_acl)(struct inode *inode, int mask)) int (*check_acl)(struct inode *inode, int mask))
{ {
umode_t mode = inode->i_mode; umode_t mode = inode->i_mode;
...@@ -193,9 +184,7 @@ int generic_permission(struct inode *inode, int mask, ...@@ -193,9 +184,7 @@ int generic_permission(struct inode *inode, int mask,
else { else {
if (IS_POSIXACL(inode) && (mode & S_IRWXG) && check_acl) { if (IS_POSIXACL(inode) && (mode & S_IRWXG) && check_acl) {
int error = check_acl(inode, mask); int error = check_acl(inode, mask);
if (error == -EACCES) if (error != -EAGAIN)
goto check_capabilities;
else if (error != -EAGAIN)
return error; return error;
} }
...@@ -208,8 +197,32 @@ int generic_permission(struct inode *inode, int mask, ...@@ -208,8 +197,32 @@ int generic_permission(struct inode *inode, int mask,
*/ */
if ((mask & ~mode) == 0) if ((mask & ~mode) == 0)
return 0; return 0;
return -EACCES;
}
/**
* 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
*
* Used to check for read/write/execute permissions on a file.
* We use "fsuid" for this, letting us set arbitrary permissions
* for filesystem access without changing the "normal" uids which
* are used for other things..
*/
int generic_permission(struct inode *inode, int mask,
int (*check_acl)(struct inode *inode, int mask))
{
int ret;
/*
* Do the basic POSIX ACL permission checks.
*/
ret = acl_permission_check(inode, mask, check_acl);
if (ret != -EACCES)
return ret;
check_capabilities:
/* /*
* Read/write DACs are always overridable. * Read/write DACs are always overridable.
* Executable DACs are overridable if at least one exec bit is set. * Executable DACs are overridable if at least one exec bit is set.
...@@ -262,7 +275,7 @@ int inode_permission(struct inode *inode, int mask) ...@@ -262,7 +275,7 @@ int inode_permission(struct inode *inode, int mask)
if (inode->i_op->permission) if (inode->i_op->permission)
retval = inode->i_op->permission(inode, mask); retval = inode->i_op->permission(inode, mask);
else else
retval = generic_permission(inode, mask, NULL); retval = generic_permission(inode, mask, inode->i_op->check_acl);
if (retval) if (retval)
return retval; return retval;
...@@ -432,29 +445,22 @@ static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, ...@@ -432,29 +445,22 @@ static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name,
*/ */
static int exec_permission_lite(struct inode *inode) 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)
goto ok;
if ((inode->i_mode & S_IXUGO) && capable(CAP_DAC_OVERRIDE)) if (inode->i_op->permission) {
goto ok; ret = inode->i_op->permission(inode, MAY_EXEC);
if (!ret)
if (S_ISDIR(inode->i_mode) && capable(CAP_DAC_OVERRIDE)) goto ok;
return ret;
}
ret = acl_permission_check(inode, MAY_EXEC, inode->i_op->check_acl);
if (!ret)
goto ok; goto ok;
if (S_ISDIR(inode->i_mode) && capable(CAP_DAC_READ_SEARCH)) if (capable(CAP_DAC_OVERRIDE) || capable(CAP_DAC_READ_SEARCH))
goto ok; goto ok;
return -EACCES; return ret;
ok: ok:
return security_inode_permission(inode, MAY_EXEC); return security_inode_permission(inode, MAY_EXEC);
} }
...@@ -853,12 +859,6 @@ static int __link_path_walk(const char *name, struct nameidata *nd) ...@@ -853,12 +859,6 @@ static int __link_path_walk(const char *name, struct nameidata *nd)
nd->flags |= LOOKUP_CONTINUE; nd->flags |= LOOKUP_CONTINUE;
err = exec_permission_lite(inode); 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) if (err)
break; break;
......
...@@ -484,14 +484,6 @@ xfs_vn_put_link( ...@@ -484,14 +484,6 @@ xfs_vn_put_link(
kfree(s); kfree(s);
} }
STATIC int
xfs_vn_permission(
struct inode *inode,
int mask)
{
return generic_permission(inode, mask, xfs_check_acl);
}
STATIC int STATIC int
xfs_vn_getattr( xfs_vn_getattr(
struct vfsmount *mnt, struct vfsmount *mnt,
...@@ -696,7 +688,7 @@ xfs_vn_fiemap( ...@@ -696,7 +688,7 @@ xfs_vn_fiemap(
} }
static const struct inode_operations xfs_inode_operations = { static const struct inode_operations xfs_inode_operations = {
.permission = xfs_vn_permission, .check_acl = xfs_check_acl,
.truncate = xfs_vn_truncate, .truncate = xfs_vn_truncate,
.getattr = xfs_vn_getattr, .getattr = xfs_vn_getattr,
.setattr = xfs_vn_setattr, .setattr = xfs_vn_setattr,
...@@ -724,7 +716,7 @@ static const struct inode_operations xfs_dir_inode_operations = { ...@@ -724,7 +716,7 @@ static const struct inode_operations xfs_dir_inode_operations = {
.rmdir = xfs_vn_unlink, .rmdir = xfs_vn_unlink,
.mknod = xfs_vn_mknod, .mknod = xfs_vn_mknod,
.rename = xfs_vn_rename, .rename = xfs_vn_rename,
.permission = xfs_vn_permission, .check_acl = xfs_check_acl,
.getattr = xfs_vn_getattr, .getattr = xfs_vn_getattr,
.setattr = xfs_vn_setattr, .setattr = xfs_vn_setattr,
.setxattr = generic_setxattr, .setxattr = generic_setxattr,
...@@ -749,7 +741,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = { ...@@ -749,7 +741,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = {
.rmdir = xfs_vn_unlink, .rmdir = xfs_vn_unlink,
.mknod = xfs_vn_mknod, .mknod = xfs_vn_mknod,
.rename = xfs_vn_rename, .rename = xfs_vn_rename,
.permission = xfs_vn_permission, .check_acl = xfs_check_acl,
.getattr = xfs_vn_getattr, .getattr = xfs_vn_getattr,
.setattr = xfs_vn_setattr, .setattr = xfs_vn_setattr,
.setxattr = generic_setxattr, .setxattr = generic_setxattr,
...@@ -762,7 +754,7 @@ static const struct inode_operations xfs_symlink_inode_operations = { ...@@ -762,7 +754,7 @@ static const struct inode_operations xfs_symlink_inode_operations = {
.readlink = generic_readlink, .readlink = generic_readlink,
.follow_link = xfs_vn_follow_link, .follow_link = xfs_vn_follow_link,
.put_link = xfs_vn_put_link, .put_link = xfs_vn_put_link,
.permission = xfs_vn_permission, .check_acl = xfs_check_acl,
.getattr = xfs_vn_getattr, .getattr = xfs_vn_getattr,
.setattr = xfs_vn_setattr, .setattr = xfs_vn_setattr,
.setxattr = generic_setxattr, .setxattr = generic_setxattr,
......
...@@ -1528,6 +1528,7 @@ struct inode_operations { ...@@ -1528,6 +1528,7 @@ struct inode_operations {
void (*put_link) (struct dentry *, struct nameidata *, void *); void (*put_link) (struct dentry *, struct nameidata *, void *);
void (*truncate) (struct inode *); void (*truncate) (struct inode *);
int (*permission) (struct inode *, int); int (*permission) (struct inode *, int);
int (*check_acl)(struct inode *, int);
int (*setattr) (struct dentry *, struct iattr *); int (*setattr) (struct dentry *, struct iattr *);
int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); 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) ...@@ -39,7 +39,7 @@ static inline struct shmem_inode_info *SHMEM_I(struct inode *inode)
} }
#ifdef CONFIG_TMPFS_POSIX_ACL #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 *); int shmem_acl_init(struct inode *, struct inode *);
extern struct xattr_handler shmem_xattr_acl_access_handler; extern struct xattr_handler shmem_xattr_acl_access_handler;
......
...@@ -2446,7 +2446,7 @@ static const struct inode_operations shmem_inode_operations = { ...@@ -2446,7 +2446,7 @@ static const struct inode_operations shmem_inode_operations = {
.getxattr = generic_getxattr, .getxattr = generic_getxattr,
.listxattr = generic_listxattr, .listxattr = generic_listxattr,
.removexattr = generic_removexattr, .removexattr = generic_removexattr,
.permission = shmem_permission, .check_acl = shmem_check_acl,
#endif #endif
}; };
...@@ -2469,7 +2469,7 @@ static const struct inode_operations shmem_dir_inode_operations = { ...@@ -2469,7 +2469,7 @@ static const struct inode_operations shmem_dir_inode_operations = {
.getxattr = generic_getxattr, .getxattr = generic_getxattr,
.listxattr = generic_listxattr, .listxattr = generic_listxattr,
.removexattr = generic_removexattr, .removexattr = generic_removexattr,
.permission = shmem_permission, .check_acl = shmem_check_acl,
#endif #endif
}; };
...@@ -2480,7 +2480,7 @@ static const struct inode_operations shmem_special_inode_operations = { ...@@ -2480,7 +2480,7 @@ static const struct inode_operations shmem_special_inode_operations = {
.getxattr = generic_getxattr, .getxattr = generic_getxattr,
.listxattr = generic_listxattr, .listxattr = generic_listxattr,
.removexattr = generic_removexattr, .removexattr = generic_removexattr,
.permission = shmem_permission, .check_acl = shmem_check_acl,
#endif #endif
}; };
......
...@@ -157,7 +157,7 @@ shmem_acl_init(struct inode *inode, struct inode *dir) ...@@ -157,7 +157,7 @@ shmem_acl_init(struct inode *inode, struct inode *dir)
/** /**
* shmem_check_acl - check_acl() callback for generic_permission() * shmem_check_acl - check_acl() callback for generic_permission()
*/ */
static int int
shmem_check_acl(struct inode *inode, int mask) shmem_check_acl(struct inode *inode, int mask)
{ {
struct posix_acl *acl = shmem_get_acl(inode, ACL_TYPE_ACCESS); struct posix_acl *acl = shmem_get_acl(inode, ACL_TYPE_ACCESS);
...@@ -169,12 +169,3 @@ shmem_check_acl(struct inode *inode, int mask) ...@@ -169,12 +169,3 @@ shmem_check_acl(struct inode *inode, int mask)
} }
return -EAGAIN; return -EAGAIN;
} }
/**
* shmem_permission - permission() inode operation
*/
int
shmem_permission(struct inode *inode, int mask)
{
return generic_permission(inode, mask, shmem_check_acl);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment