fs: take the ACL checks to common code
Replace the ->check_acl method with a ->get_acl method that simply reads an ACL from disk after having a cache miss. This means we can replace the ACL checking boilerplate code with a single implementation in namei.c. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
edde854e8b
commit
4e34e719e4
|
@ -52,7 +52,7 @@ ata *);
|
||||||
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, unsigned int);
|
int (*permission) (struct inode *, int, unsigned int);
|
||||||
int (*check_acl)(struct inode *, int);
|
int (*get_acl)(struct inode *, int);
|
||||||
int (*setattr) (struct dentry *, struct iattr *);
|
int (*setattr) (struct dentry *, struct iattr *);
|
||||||
int (*getattr) (struct vfsmount *, struct dentry *, struct kstat *);
|
int (*getattr) (struct vfsmount *, 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);
|
||||||
|
@ -80,7 +80,7 @@ put_link: no
|
||||||
truncate: yes (see below)
|
truncate: yes (see below)
|
||||||
setattr: yes
|
setattr: yes
|
||||||
permission: no (may not block if called in rcu-walk mode)
|
permission: no (may not block if called in rcu-walk mode)
|
||||||
check_acl: no
|
get_acl: no
|
||||||
getattr: no
|
getattr: no
|
||||||
setxattr: yes
|
setxattr: yes
|
||||||
getxattr: no
|
getxattr: no
|
||||||
|
|
|
@ -407,10 +407,11 @@ to some pointer to returning that pointer. On errors return ERR_PTR(...).
|
||||||
|
|
||||||
--
|
--
|
||||||
[mandatory]
|
[mandatory]
|
||||||
->permission(), generic_permission() and ->check_acl() have lost flags
|
->permission() and generic_permission()have lost flags
|
||||||
argument; instead of passing IPERM_FLAG_RCU we add MAY_NOT_BLOCK into mask.
|
argument; instead of passing IPERM_FLAG_RCU we add MAY_NOT_BLOCK into mask.
|
||||||
generic_permission() has also lost the check_acl argument; if you want
|
generic_permission() has also lost the check_acl argument; ACL checking
|
||||||
non-NULL to be used for that inode, put it into ->i_op->check_acl.
|
has been taken to VFS and filesystems need to provide a non-NULL ->i_op->get_acl
|
||||||
|
to read an ACL from disk.
|
||||||
|
|
||||||
--
|
--
|
||||||
[mandatory]
|
[mandatory]
|
||||||
|
|
|
@ -356,7 +356,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 (*get_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);
|
||||||
|
|
14
fs/9p/acl.c
14
fs/9p/acl.c
|
@ -96,7 +96,7 @@ static struct posix_acl *v9fs_get_cached_acl(struct inode *inode, int type)
|
||||||
return acl;
|
return acl;
|
||||||
}
|
}
|
||||||
|
|
||||||
int v9fs_check_acl(struct inode *inode, int mask)
|
struct posix_acl *v9fs_iop_get_acl(struct inode *inode, int type)
|
||||||
{
|
{
|
||||||
struct posix_acl *acl;
|
struct posix_acl *acl;
|
||||||
struct v9fs_session_info *v9ses;
|
struct v9fs_session_info *v9ses;
|
||||||
|
@ -108,18 +108,10 @@ int v9fs_check_acl(struct inode *inode, int mask)
|
||||||
* On access = client and acl = on mode get the acl
|
* On access = client and acl = on mode get the acl
|
||||||
* values from the server
|
* values from the server
|
||||||
*/
|
*/
|
||||||
return -EAGAIN;
|
return NULL;
|
||||||
}
|
}
|
||||||
acl = v9fs_get_cached_acl(inode, ACL_TYPE_ACCESS);
|
return v9fs_get_cached_acl(inode, type);
|
||||||
|
|
||||||
if (IS_ERR(acl))
|
|
||||||
return PTR_ERR(acl);
|
|
||||||
if (acl) {
|
|
||||||
int error = posix_acl_permission(inode, acl, mask);
|
|
||||||
posix_acl_release(acl);
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
return -EAGAIN;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int v9fs_set_acl(struct dentry *dentry, int type, struct posix_acl *acl)
|
static int v9fs_set_acl(struct dentry *dentry, int type, struct posix_acl *acl)
|
||||||
|
|
|
@ -16,14 +16,14 @@
|
||||||
|
|
||||||
#ifdef CONFIG_9P_FS_POSIX_ACL
|
#ifdef CONFIG_9P_FS_POSIX_ACL
|
||||||
extern int v9fs_get_acl(struct inode *, struct p9_fid *);
|
extern int v9fs_get_acl(struct inode *, struct p9_fid *);
|
||||||
extern int v9fs_check_acl(struct inode *inode, int mask);
|
extern struct posix_acl *v9fs_iop_get_acl(struct inode *inode, int type);
|
||||||
extern int v9fs_acl_chmod(struct dentry *);
|
extern int v9fs_acl_chmod(struct dentry *);
|
||||||
extern int v9fs_set_create_acl(struct dentry *,
|
extern int v9fs_set_create_acl(struct dentry *,
|
||||||
struct posix_acl **, struct posix_acl **);
|
struct posix_acl **, struct posix_acl **);
|
||||||
extern int v9fs_acl_mode(struct inode *dir, mode_t *modep,
|
extern int v9fs_acl_mode(struct inode *dir, mode_t *modep,
|
||||||
struct posix_acl **dpacl, struct posix_acl **pacl);
|
struct posix_acl **dpacl, struct posix_acl **pacl);
|
||||||
#else
|
#else
|
||||||
#define v9fs_check_acl NULL
|
#define v9fs_iop_get_acl NULL
|
||||||
static inline int v9fs_get_acl(struct inode *inode, struct p9_fid *fid)
|
static inline int v9fs_get_acl(struct inode *inode, struct p9_fid *fid)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -872,7 +872,7 @@ const struct inode_operations v9fs_dir_inode_operations_dotl = {
|
||||||
.getxattr = generic_getxattr,
|
.getxattr = generic_getxattr,
|
||||||
.removexattr = generic_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
.listxattr = v9fs_listxattr,
|
.listxattr = v9fs_listxattr,
|
||||||
.check_acl = v9fs_check_acl,
|
.get_acl = v9fs_iop_get_acl,
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct inode_operations v9fs_file_inode_operations_dotl = {
|
const struct inode_operations v9fs_file_inode_operations_dotl = {
|
||||||
|
@ -882,7 +882,7 @@ const struct inode_operations v9fs_file_inode_operations_dotl = {
|
||||||
.getxattr = generic_getxattr,
|
.getxattr = generic_getxattr,
|
||||||
.removexattr = generic_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
.listxattr = v9fs_listxattr,
|
.listxattr = v9fs_listxattr,
|
||||||
.check_acl = v9fs_check_acl,
|
.get_acl = v9fs_iop_get_acl,
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct inode_operations v9fs_symlink_inode_operations_dotl = {
|
const struct inode_operations v9fs_symlink_inode_operations_dotl = {
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
#ifdef CONFIG_BTRFS_FS_POSIX_ACL
|
#ifdef CONFIG_BTRFS_FS_POSIX_ACL
|
||||||
|
|
||||||
static struct posix_acl *btrfs_get_acl(struct inode *inode, int type)
|
struct posix_acl *btrfs_get_acl(struct inode *inode, int type)
|
||||||
{
|
{
|
||||||
int size;
|
int size;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
@ -195,22 +195,6 @@ out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int btrfs_check_acl(struct inode *inode, int mask)
|
|
||||||
{
|
|
||||||
int error = -EAGAIN;
|
|
||||||
struct posix_acl *acl;
|
|
||||||
|
|
||||||
acl = btrfs_get_acl(inode, ACL_TYPE_ACCESS);
|
|
||||||
if (IS_ERR(acl))
|
|
||||||
return PTR_ERR(acl);
|
|
||||||
if (acl) {
|
|
||||||
error = posix_acl_permission(inode, acl, mask);
|
|
||||||
posix_acl_release(acl);
|
|
||||||
}
|
|
||||||
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* btrfs_init_acl is already generally called under fs_mutex, so the locking
|
* btrfs_init_acl is already generally called under fs_mutex, so the locking
|
||||||
* stuff has been fixed to work with that. If the locking stuff changes, we
|
* stuff has been fixed to work with that. If the locking stuff changes, we
|
||||||
|
|
|
@ -2645,9 +2645,9 @@ do { \
|
||||||
|
|
||||||
/* acl.c */
|
/* acl.c */
|
||||||
#ifdef CONFIG_BTRFS_FS_POSIX_ACL
|
#ifdef CONFIG_BTRFS_FS_POSIX_ACL
|
||||||
int btrfs_check_acl(struct inode *inode, int mask);
|
struct posix_acl *btrfs_get_acl(struct inode *inode, int type);
|
||||||
#else
|
#else
|
||||||
#define btrfs_check_acl NULL
|
#define btrfs_get_acl NULL
|
||||||
#endif
|
#endif
|
||||||
int btrfs_init_acl(struct btrfs_trans_handle *trans,
|
int btrfs_init_acl(struct btrfs_trans_handle *trans,
|
||||||
struct inode *inode, struct inode *dir);
|
struct inode *inode, struct inode *dir);
|
||||||
|
|
|
@ -7351,12 +7351,12 @@ static const struct inode_operations btrfs_dir_inode_operations = {
|
||||||
.listxattr = btrfs_listxattr,
|
.listxattr = btrfs_listxattr,
|
||||||
.removexattr = btrfs_removexattr,
|
.removexattr = btrfs_removexattr,
|
||||||
.permission = btrfs_permission,
|
.permission = btrfs_permission,
|
||||||
.check_acl = btrfs_check_acl,
|
.get_acl = btrfs_get_acl,
|
||||||
};
|
};
|
||||||
static const struct inode_operations btrfs_dir_ro_inode_operations = {
|
static const struct inode_operations btrfs_dir_ro_inode_operations = {
|
||||||
.lookup = btrfs_lookup,
|
.lookup = btrfs_lookup,
|
||||||
.permission = btrfs_permission,
|
.permission = btrfs_permission,
|
||||||
.check_acl = btrfs_check_acl,
|
.get_acl = btrfs_get_acl,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct file_operations btrfs_dir_file_operations = {
|
static const struct file_operations btrfs_dir_file_operations = {
|
||||||
|
@ -7425,7 +7425,7 @@ static const struct inode_operations btrfs_file_inode_operations = {
|
||||||
.removexattr = btrfs_removexattr,
|
.removexattr = btrfs_removexattr,
|
||||||
.permission = btrfs_permission,
|
.permission = btrfs_permission,
|
||||||
.fiemap = btrfs_fiemap,
|
.fiemap = btrfs_fiemap,
|
||||||
.check_acl = btrfs_check_acl,
|
.get_acl = btrfs_get_acl,
|
||||||
};
|
};
|
||||||
static const struct inode_operations btrfs_special_inode_operations = {
|
static const struct inode_operations btrfs_special_inode_operations = {
|
||||||
.getattr = btrfs_getattr,
|
.getattr = btrfs_getattr,
|
||||||
|
@ -7435,7 +7435,7 @@ static const struct inode_operations btrfs_special_inode_operations = {
|
||||||
.getxattr = btrfs_getxattr,
|
.getxattr = btrfs_getxattr,
|
||||||
.listxattr = btrfs_listxattr,
|
.listxattr = btrfs_listxattr,
|
||||||
.removexattr = btrfs_removexattr,
|
.removexattr = btrfs_removexattr,
|
||||||
.check_acl = btrfs_check_acl,
|
.get_acl = btrfs_get_acl,
|
||||||
};
|
};
|
||||||
static const struct inode_operations btrfs_symlink_inode_operations = {
|
static const struct inode_operations btrfs_symlink_inode_operations = {
|
||||||
.readlink = generic_readlink,
|
.readlink = generic_readlink,
|
||||||
|
@ -7447,7 +7447,7 @@ static const struct inode_operations btrfs_symlink_inode_operations = {
|
||||||
.getxattr = btrfs_getxattr,
|
.getxattr = btrfs_getxattr,
|
||||||
.listxattr = btrfs_listxattr,
|
.listxattr = btrfs_listxattr,
|
||||||
.removexattr = btrfs_removexattr,
|
.removexattr = btrfs_removexattr,
|
||||||
.check_acl = btrfs_check_acl,
|
.get_acl = btrfs_get_acl,
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct dentry_operations btrfs_dentry_operations = {
|
const struct dentry_operations btrfs_dentry_operations = {
|
||||||
|
|
|
@ -128,7 +128,7 @@ fail:
|
||||||
/*
|
/*
|
||||||
* inode->i_mutex: don't care
|
* inode->i_mutex: don't care
|
||||||
*/
|
*/
|
||||||
static struct posix_acl *
|
struct posix_acl *
|
||||||
ext2_get_acl(struct inode *inode, int type)
|
ext2_get_acl(struct inode *inode, int type)
|
||||||
{
|
{
|
||||||
int name_index;
|
int name_index;
|
||||||
|
@ -231,23 +231,6 @@ ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl)
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
ext2_check_acl(struct inode *inode, int mask)
|
|
||||||
{
|
|
||||||
struct posix_acl *acl;
|
|
||||||
|
|
||||||
acl = ext2_get_acl(inode, ACL_TYPE_ACCESS);
|
|
||||||
if (IS_ERR(acl))
|
|
||||||
return PTR_ERR(acl);
|
|
||||||
if (acl) {
|
|
||||||
int error = posix_acl_permission(inode, acl, mask);
|
|
||||||
posix_acl_release(acl);
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -EAGAIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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)
|
||||||
#ifdef CONFIG_EXT2_FS_POSIX_ACL
|
#ifdef CONFIG_EXT2_FS_POSIX_ACL
|
||||||
|
|
||||||
/* acl.c */
|
/* acl.c */
|
||||||
extern int ext2_check_acl (struct inode *, int);
|
extern struct posix_acl *ext2_get_acl(struct inode *inode, int type);
|
||||||
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_check_acl NULL
|
#define ext2_get_acl NULL
|
||||||
#define ext2_get_acl NULL
|
#define ext2_get_acl NULL
|
||||||
#define ext2_set_acl NULL
|
#define ext2_set_acl NULL
|
||||||
|
|
||||||
|
|
|
@ -102,6 +102,6 @@ const struct inode_operations ext2_file_inode_operations = {
|
||||||
.removexattr = generic_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
#endif
|
#endif
|
||||||
.setattr = ext2_setattr,
|
.setattr = ext2_setattr,
|
||||||
.check_acl = ext2_check_acl,
|
.get_acl = ext2_get_acl,
|
||||||
.fiemap = ext2_fiemap,
|
.fiemap = ext2_fiemap,
|
||||||
};
|
};
|
||||||
|
|
|
@ -408,7 +408,7 @@ const struct inode_operations ext2_dir_inode_operations = {
|
||||||
.removexattr = generic_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
#endif
|
#endif
|
||||||
.setattr = ext2_setattr,
|
.setattr = ext2_setattr,
|
||||||
.check_acl = ext2_check_acl,
|
.get_acl = ext2_get_acl,
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct inode_operations ext2_special_inode_operations = {
|
const struct inode_operations ext2_special_inode_operations = {
|
||||||
|
@ -419,5 +419,5 @@ const struct inode_operations ext2_special_inode_operations = {
|
||||||
.removexattr = generic_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
#endif
|
#endif
|
||||||
.setattr = ext2_setattr,
|
.setattr = ext2_setattr,
|
||||||
.check_acl = ext2_check_acl,
|
.get_acl = ext2_get_acl,
|
||||||
};
|
};
|
||||||
|
|
|
@ -131,7 +131,7 @@ fail:
|
||||||
*
|
*
|
||||||
* inode->i_mutex: don't care
|
* inode->i_mutex: don't care
|
||||||
*/
|
*/
|
||||||
static struct posix_acl *
|
struct posix_acl *
|
||||||
ext3_get_acl(struct inode *inode, int type)
|
ext3_get_acl(struct inode *inode, int type)
|
||||||
{
|
{
|
||||||
int name_index;
|
int name_index;
|
||||||
|
@ -239,23 +239,6 @@ ext3_set_acl(handle_t *handle, struct inode *inode, int type,
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
ext3_check_acl(struct inode *inode, int mask)
|
|
||||||
{
|
|
||||||
struct posix_acl *acl;
|
|
||||||
|
|
||||||
acl = ext3_get_acl(inode, ACL_TYPE_ACCESS);
|
|
||||||
if (IS_ERR(acl))
|
|
||||||
return PTR_ERR(acl);
|
|
||||||
if (acl) {
|
|
||||||
int error = posix_acl_permission(inode, acl, mask);
|
|
||||||
posix_acl_release(acl);
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -EAGAIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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)
|
||||||
#ifdef CONFIG_EXT3_FS_POSIX_ACL
|
#ifdef CONFIG_EXT3_FS_POSIX_ACL
|
||||||
|
|
||||||
/* acl.c */
|
/* acl.c */
|
||||||
extern int ext3_check_acl (struct inode *, int);
|
extern struct posix_acl *ext3_get_acl(struct inode *inode, int type);
|
||||||
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_check_acl NULL
|
#define ext3_get_acl NULL
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
ext3_acl_chmod(struct inode *inode)
|
ext3_acl_chmod(struct inode *inode)
|
||||||
|
|
|
@ -79,7 +79,7 @@ const struct inode_operations ext3_file_inode_operations = {
|
||||||
.listxattr = ext3_listxattr,
|
.listxattr = ext3_listxattr,
|
||||||
.removexattr = generic_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
#endif
|
#endif
|
||||||
.check_acl = ext3_check_acl,
|
.get_acl = ext3_get_acl,
|
||||||
.fiemap = ext3_fiemap,
|
.fiemap = ext3_fiemap,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2529,7 +2529,7 @@ const struct inode_operations ext3_dir_inode_operations = {
|
||||||
.listxattr = ext3_listxattr,
|
.listxattr = ext3_listxattr,
|
||||||
.removexattr = generic_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
#endif
|
#endif
|
||||||
.check_acl = ext3_check_acl,
|
.get_acl = ext3_get_acl,
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct inode_operations ext3_special_inode_operations = {
|
const struct inode_operations ext3_special_inode_operations = {
|
||||||
|
@ -2540,5 +2540,5 @@ const struct inode_operations ext3_special_inode_operations = {
|
||||||
.listxattr = ext3_listxattr,
|
.listxattr = ext3_listxattr,
|
||||||
.removexattr = generic_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
#endif
|
#endif
|
||||||
.check_acl = ext3_check_acl,
|
.get_acl = ext3_get_acl,
|
||||||
};
|
};
|
||||||
|
|
|
@ -131,7 +131,7 @@ fail:
|
||||||
*
|
*
|
||||||
* inode->i_mutex: don't care
|
* inode->i_mutex: don't care
|
||||||
*/
|
*/
|
||||||
static struct posix_acl *
|
struct posix_acl *
|
||||||
ext4_get_acl(struct inode *inode, int type)
|
ext4_get_acl(struct inode *inode, int type)
|
||||||
{
|
{
|
||||||
int name_index;
|
int name_index;
|
||||||
|
@ -237,23 +237,6 @@ ext4_set_acl(handle_t *handle, struct inode *inode, int type,
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
ext4_check_acl(struct inode *inode, int mask)
|
|
||||||
{
|
|
||||||
struct posix_acl *acl;
|
|
||||||
|
|
||||||
acl = ext4_get_acl(inode, ACL_TYPE_ACCESS);
|
|
||||||
if (IS_ERR(acl))
|
|
||||||
return PTR_ERR(acl);
|
|
||||||
if (acl) {
|
|
||||||
int error = posix_acl_permission(inode, acl, mask);
|
|
||||||
posix_acl_release(acl);
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -EAGAIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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)
|
||||||
#ifdef CONFIG_EXT4_FS_POSIX_ACL
|
#ifdef CONFIG_EXT4_FS_POSIX_ACL
|
||||||
|
|
||||||
/* acl.c */
|
/* acl.c */
|
||||||
extern int ext4_check_acl(struct inode *, int);
|
struct posix_acl *ext4_get_acl(struct inode *inode, int type);
|
||||||
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_check_acl NULL
|
#define ext4_get_acl NULL
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
ext4_acl_chmod(struct inode *inode)
|
ext4_acl_chmod(struct inode *inode)
|
||||||
|
|
|
@ -301,7 +301,7 @@ const struct inode_operations ext4_file_inode_operations = {
|
||||||
.listxattr = ext4_listxattr,
|
.listxattr = ext4_listxattr,
|
||||||
.removexattr = generic_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
#endif
|
#endif
|
||||||
.check_acl = ext4_check_acl,
|
.get_acl = ext4_get_acl,
|
||||||
.fiemap = ext4_fiemap,
|
.fiemap = ext4_fiemap,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2590,7 +2590,7 @@ const struct inode_operations ext4_dir_inode_operations = {
|
||||||
.listxattr = ext4_listxattr,
|
.listxattr = ext4_listxattr,
|
||||||
.removexattr = generic_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
#endif
|
#endif
|
||||||
.check_acl = ext4_check_acl,
|
.get_acl = ext4_get_acl,
|
||||||
.fiemap = ext4_fiemap,
|
.fiemap = ext4_fiemap,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2602,5 +2602,5 @@ const struct inode_operations ext4_special_inode_operations = {
|
||||||
.listxattr = ext4_listxattr,
|
.listxattr = ext4_listxattr,
|
||||||
.removexattr = generic_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
#endif
|
#endif
|
||||||
.check_acl = ext4_check_acl,
|
.get_acl = ext4_get_acl,
|
||||||
};
|
};
|
||||||
|
|
|
@ -172,20 +172,6 @@ generic_acl_chmod(struct inode *inode)
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
generic_check_acl(struct inode *inode, int mask)
|
|
||||||
{
|
|
||||||
struct posix_acl *acl;
|
|
||||||
|
|
||||||
acl = get_cached_acl(inode, ACL_TYPE_ACCESS);
|
|
||||||
if (acl) {
|
|
||||||
int error = posix_acl_permission(inode, acl, mask);
|
|
||||||
posix_acl_release(acl);
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
return -EAGAIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct xattr_handler generic_acl_access_handler = {
|
const struct xattr_handler generic_acl_access_handler = {
|
||||||
.prefix = POSIX_ACL_XATTR_ACCESS,
|
.prefix = POSIX_ACL_XATTR_ACCESS,
|
||||||
.flags = ACL_TYPE_ACCESS,
|
.flags = ACL_TYPE_ACCESS,
|
||||||
|
|
|
@ -67,30 +67,9 @@ static struct posix_acl *gfs2_acl_get(struct gfs2_inode *ip, int type)
|
||||||
return acl;
|
return acl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
struct posix_acl *gfs2_get_acl(struct inode *inode, int type)
|
||||||
* gfs2_check_acl - Check an ACL to see if we're allowed to do something
|
|
||||||
* @inode: the file we want to do something to
|
|
||||||
* @mask: what we want to do
|
|
||||||
*
|
|
||||||
* Returns: errno
|
|
||||||
*/
|
|
||||||
|
|
||||||
int gfs2_check_acl(struct inode *inode, int mask)
|
|
||||||
{
|
{
|
||||||
struct posix_acl *acl;
|
return gfs2_acl_get(GFS2_I(inode), type);
|
||||||
int error;
|
|
||||||
|
|
||||||
acl = gfs2_acl_get(GFS2_I(inode), ACL_TYPE_ACCESS);
|
|
||||||
if (IS_ERR(acl))
|
|
||||||
return PTR_ERR(acl);
|
|
||||||
|
|
||||||
if (acl) {
|
|
||||||
error = posix_acl_permission(inode, acl, mask);
|
|
||||||
posix_acl_release(acl);
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -EAGAIN;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gfs2_set_mode(struct inode *inode, mode_t mode)
|
static int gfs2_set_mode(struct inode *inode, mode_t mode)
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#define GFS2_POSIX_ACL_DEFAULT "posix_acl_default"
|
#define GFS2_POSIX_ACL_DEFAULT "posix_acl_default"
|
||||||
#define GFS2_ACL_MAX_ENTRIES 25
|
#define GFS2_ACL_MAX_ENTRIES 25
|
||||||
|
|
||||||
extern int gfs2_check_acl(struct inode *inode, int mask);
|
extern struct posix_acl *gfs2_get_acl(struct inode *inode, int type);
|
||||||
extern int gfs2_acl_create(struct gfs2_inode *dip, struct inode *inode);
|
extern int gfs2_acl_create(struct gfs2_inode *dip, struct inode *inode);
|
||||||
extern int gfs2_acl_chmod(struct gfs2_inode *ip, struct iattr *attr);
|
extern int gfs2_acl_chmod(struct gfs2_inode *ip, struct iattr *attr);
|
||||||
extern const struct xattr_handler gfs2_xattr_system_handler;
|
extern const struct xattr_handler gfs2_xattr_system_handler;
|
||||||
|
|
|
@ -1846,7 +1846,7 @@ const struct inode_operations gfs2_file_iops = {
|
||||||
.listxattr = gfs2_listxattr,
|
.listxattr = gfs2_listxattr,
|
||||||
.removexattr = gfs2_removexattr,
|
.removexattr = gfs2_removexattr,
|
||||||
.fiemap = gfs2_fiemap,
|
.fiemap = gfs2_fiemap,
|
||||||
.check_acl = gfs2_check_acl,
|
.get_acl = gfs2_get_acl,
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct inode_operations gfs2_dir_iops = {
|
const struct inode_operations gfs2_dir_iops = {
|
||||||
|
@ -1867,7 +1867,7 @@ const struct inode_operations gfs2_dir_iops = {
|
||||||
.listxattr = gfs2_listxattr,
|
.listxattr = gfs2_listxattr,
|
||||||
.removexattr = gfs2_removexattr,
|
.removexattr = gfs2_removexattr,
|
||||||
.fiemap = gfs2_fiemap,
|
.fiemap = gfs2_fiemap,
|
||||||
.check_acl = gfs2_check_acl,
|
.get_acl = gfs2_get_acl,
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct inode_operations gfs2_symlink_iops = {
|
const struct inode_operations gfs2_symlink_iops = {
|
||||||
|
@ -1882,6 +1882,6 @@ const struct inode_operations gfs2_symlink_iops = {
|
||||||
.listxattr = gfs2_listxattr,
|
.listxattr = gfs2_listxattr,
|
||||||
.removexattr = gfs2_removexattr,
|
.removexattr = gfs2_removexattr,
|
||||||
.fiemap = gfs2_fiemap,
|
.fiemap = gfs2_fiemap,
|
||||||
.check_acl = gfs2_check_acl,
|
.get_acl = gfs2_get_acl,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -156,7 +156,7 @@ static void *jffs2_acl_to_medium(const struct posix_acl *acl, size_t *size)
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct posix_acl *jffs2_get_acl(struct inode *inode, int type)
|
struct posix_acl *jffs2_get_acl(struct inode *inode, int type)
|
||||||
{
|
{
|
||||||
struct posix_acl *acl;
|
struct posix_acl *acl;
|
||||||
char *value = NULL;
|
char *value = NULL;
|
||||||
|
@ -259,22 +259,6 @@ static int jffs2_set_acl(struct inode *inode, int type, struct posix_acl *acl)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int jffs2_check_acl(struct inode *inode, int mask)
|
|
||||||
{
|
|
||||||
struct posix_acl *acl;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
acl = jffs2_get_acl(inode, ACL_TYPE_ACCESS);
|
|
||||||
if (IS_ERR(acl))
|
|
||||||
return PTR_ERR(acl);
|
|
||||||
if (acl) {
|
|
||||||
rc = posix_acl_permission(inode, acl, mask);
|
|
||||||
posix_acl_release(acl);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
return -EAGAIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
int jffs2_init_acl_pre(struct inode *dir_i, struct inode *inode, mode_t *i_mode)
|
int jffs2_init_acl_pre(struct inode *dir_i, struct inode *inode, mode_t *i_mode)
|
||||||
{
|
{
|
||||||
struct posix_acl *acl;
|
struct posix_acl *acl;
|
||||||
|
|
|
@ -26,7 +26,7 @@ struct jffs2_acl_header {
|
||||||
|
|
||||||
#ifdef CONFIG_JFFS2_FS_POSIX_ACL
|
#ifdef CONFIG_JFFS2_FS_POSIX_ACL
|
||||||
|
|
||||||
extern int jffs2_check_acl(struct inode *, int);
|
struct posix_acl *jffs2_get_acl(struct inode *inode, int type);
|
||||||
extern int jffs2_acl_chmod(struct inode *);
|
extern int jffs2_acl_chmod(struct inode *);
|
||||||
extern int jffs2_init_acl_pre(struct inode *, struct inode *, mode_t *);
|
extern int jffs2_init_acl_pre(struct inode *, struct inode *, mode_t *);
|
||||||
extern int jffs2_init_acl_post(struct inode *);
|
extern int jffs2_init_acl_post(struct inode *);
|
||||||
|
@ -36,7 +36,7 @@ extern const struct xattr_handler jffs2_acl_default_xattr_handler;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define jffs2_check_acl (NULL)
|
#define jffs2_get_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)
|
||||||
|
|
|
@ -56,7 +56,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,
|
||||||
.check_acl = jffs2_check_acl,
|
.get_acl = jffs2_get_acl,
|
||||||
.setattr = jffs2_setattr,
|
.setattr = jffs2_setattr,
|
||||||
.setxattr = jffs2_setxattr,
|
.setxattr = jffs2_setxattr,
|
||||||
.getxattr = jffs2_getxattr,
|
.getxattr = jffs2_getxattr,
|
||||||
|
|
|
@ -63,7 +63,7 @@ const struct file_operations jffs2_file_operations =
|
||||||
|
|
||||||
const struct inode_operations jffs2_file_inode_operations =
|
const struct inode_operations jffs2_file_inode_operations =
|
||||||
{
|
{
|
||||||
.check_acl = jffs2_check_acl,
|
.get_acl = jffs2_get_acl,
|
||||||
.setattr = jffs2_setattr,
|
.setattr = jffs2_setattr,
|
||||||
.setxattr = jffs2_setxattr,
|
.setxattr = jffs2_setxattr,
|
||||||
.getxattr = jffs2_getxattr,
|
.getxattr = jffs2_getxattr,
|
||||||
|
|
|
@ -20,7 +20,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,
|
||||||
.check_acl = jffs2_check_acl,
|
.get_acl = jffs2_get_acl,
|
||||||
.setattr = jffs2_setattr,
|
.setattr = jffs2_setattr,
|
||||||
.setxattr = jffs2_setxattr,
|
.setxattr = jffs2_setxattr,
|
||||||
.getxattr = jffs2_getxattr,
|
.getxattr = jffs2_getxattr,
|
||||||
|
|
18
fs/jfs/acl.c
18
fs/jfs/acl.c
|
@ -27,7 +27,7 @@
|
||||||
#include "jfs_xattr.h"
|
#include "jfs_xattr.h"
|
||||||
#include "jfs_acl.h"
|
#include "jfs_acl.h"
|
||||||
|
|
||||||
static struct posix_acl *jfs_get_acl(struct inode *inode, int type)
|
struct posix_acl *jfs_get_acl(struct inode *inode, int type)
|
||||||
{
|
{
|
||||||
struct posix_acl *acl;
|
struct posix_acl *acl;
|
||||||
char *ea_name;
|
char *ea_name;
|
||||||
|
@ -114,22 +114,6 @@ out:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int jfs_check_acl(struct inode *inode, int mask)
|
|
||||||
{
|
|
||||||
struct posix_acl *acl;
|
|
||||||
|
|
||||||
acl = jfs_get_acl(inode, ACL_TYPE_ACCESS);
|
|
||||||
if (IS_ERR(acl))
|
|
||||||
return PTR_ERR(acl);
|
|
||||||
if (acl) {
|
|
||||||
int error = posix_acl_permission(inode, acl, mask);
|
|
||||||
posix_acl_release(acl);
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -EAGAIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
||||||
|
|
|
@ -140,7 +140,7 @@ const struct inode_operations jfs_file_inode_operations = {
|
||||||
.removexattr = jfs_removexattr,
|
.removexattr = jfs_removexattr,
|
||||||
.setattr = jfs_setattr,
|
.setattr = jfs_setattr,
|
||||||
#ifdef CONFIG_JFS_POSIX_ACL
|
#ifdef CONFIG_JFS_POSIX_ACL
|
||||||
.check_acl = jfs_check_acl,
|
.get_acl = jfs_get_acl,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
#ifdef CONFIG_JFS_POSIX_ACL
|
#ifdef CONFIG_JFS_POSIX_ACL
|
||||||
|
|
||||||
int jfs_check_acl(struct inode *, int);
|
struct posix_acl *jfs_get_acl(struct inode *inode, int type);
|
||||||
int jfs_init_acl(tid_t, struct inode *, struct inode *);
|
int jfs_init_acl(tid_t, struct inode *, struct inode *);
|
||||||
int jfs_acl_chmod(struct inode *inode);
|
int jfs_acl_chmod(struct inode *inode);
|
||||||
|
|
||||||
|
|
|
@ -1537,7 +1537,7 @@ const struct inode_operations jfs_dir_inode_operations = {
|
||||||
.removexattr = jfs_removexattr,
|
.removexattr = jfs_removexattr,
|
||||||
.setattr = jfs_setattr,
|
.setattr = jfs_setattr,
|
||||||
#ifdef CONFIG_JFS_POSIX_ACL
|
#ifdef CONFIG_JFS_POSIX_ACL
|
||||||
.check_acl = jfs_check_acl,
|
.get_acl = jfs_get_acl,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
20
fs/namei.c
20
fs/namei.c
|
@ -196,21 +196,23 @@ static int check_acl(struct inode *inode, int mask)
|
||||||
acl = get_cached_acl(inode, ACL_TYPE_ACCESS);
|
acl = get_cached_acl(inode, ACL_TYPE_ACCESS);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A filesystem can force a ACL callback by just never
|
* A filesystem can force a ACL callback by just never filling the
|
||||||
* filling the ACL cache. But normally you'd fill the
|
* ACL cache. But normally you'd fill the cache either at inode
|
||||||
* cache either at inode instantiation time, or on the
|
* instantiation time, or on the first ->get_acl call.
|
||||||
* first ->check_acl call.
|
|
||||||
*
|
*
|
||||||
* If the filesystem doesn't have a check_acl() function
|
* If the filesystem doesn't have a get_acl() function at all, we'll
|
||||||
* at all, we'll just create the negative cache entry.
|
* just create the negative cache entry.
|
||||||
*/
|
*/
|
||||||
if (acl == ACL_NOT_CACHED) {
|
if (acl == ACL_NOT_CACHED) {
|
||||||
if (inode->i_op->check_acl)
|
if (inode->i_op->get_acl) {
|
||||||
return inode->i_op->check_acl(inode, mask);
|
acl = inode->i_op->get_acl(inode, ACL_TYPE_ACCESS);
|
||||||
|
if (IS_ERR(acl))
|
||||||
|
return PTR_ERR(acl);
|
||||||
|
} else {
|
||||||
set_cached_acl(inode, ACL_TYPE_ACCESS, NULL);
|
set_cached_acl(inode, ACL_TYPE_ACCESS, NULL);
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (acl) {
|
if (acl) {
|
||||||
int error = posix_acl_permission(inode, acl, mask);
|
int error = posix_acl_permission(inode, acl, mask);
|
||||||
|
|
|
@ -290,7 +290,7 @@ static int ocfs2_set_acl(handle_t *handle,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ocfs2_check_acl(struct inode *inode, int mask)
|
struct posix_acl *ocfs2_iop_get_acl(struct inode *inode, int type)
|
||||||
{
|
{
|
||||||
struct ocfs2_super *osb;
|
struct ocfs2_super *osb;
|
||||||
struct buffer_head *di_bh = NULL;
|
struct buffer_head *di_bh = NULL;
|
||||||
|
@ -299,29 +299,17 @@ int ocfs2_check_acl(struct inode *inode, int mask)
|
||||||
|
|
||||||
osb = OCFS2_SB(inode->i_sb);
|
osb = OCFS2_SB(inode->i_sb);
|
||||||
if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL))
|
if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL))
|
||||||
return ret;
|
return NULL;
|
||||||
|
|
||||||
ret = ocfs2_read_inode_block(inode, &di_bh);
|
ret = ocfs2_read_inode_block(inode, &di_bh);
|
||||||
if (ret < 0) {
|
if (ret < 0)
|
||||||
mlog_errno(ret);
|
return ERR_PTR(ret);
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
acl = ocfs2_get_acl_nolock(inode, ACL_TYPE_ACCESS, di_bh);
|
acl = ocfs2_get_acl_nolock(inode, type, di_bh);
|
||||||
|
|
||||||
brelse(di_bh);
|
brelse(di_bh);
|
||||||
|
|
||||||
if (IS_ERR(acl)) {
|
return acl;
|
||||||
mlog_errno(PTR_ERR(acl));
|
|
||||||
return PTR_ERR(acl);
|
|
||||||
}
|
|
||||||
if (acl) {
|
|
||||||
ret = posix_acl_permission(inode, acl, mask);
|
|
||||||
posix_acl_release(acl);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -EAGAIN;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int ocfs2_acl_chmod(struct inode *inode)
|
int ocfs2_acl_chmod(struct inode *inode)
|
||||||
|
|
|
@ -26,7 +26,7 @@ struct ocfs2_acl_entry {
|
||||||
__le32 e_id;
|
__le32 e_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int ocfs2_check_acl(struct inode *, int);
|
struct posix_acl *ocfs2_iop_get_acl(struct inode *inode, int type);
|
||||||
extern int ocfs2_acl_chmod(struct inode *);
|
extern int ocfs2_acl_chmod(struct inode *);
|
||||||
extern int ocfs2_init_acl(handle_t *, struct inode *, struct inode *,
|
extern int ocfs2_init_acl(handle_t *, struct inode *, struct inode *,
|
||||||
struct buffer_head *, struct buffer_head *,
|
struct buffer_head *, struct buffer_head *,
|
||||||
|
|
|
@ -2600,14 +2600,14 @@ const struct inode_operations ocfs2_file_iops = {
|
||||||
.listxattr = ocfs2_listxattr,
|
.listxattr = ocfs2_listxattr,
|
||||||
.removexattr = generic_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
.fiemap = ocfs2_fiemap,
|
.fiemap = ocfs2_fiemap,
|
||||||
.check_acl = ocfs2_check_acl,
|
.get_acl = ocfs2_iop_get_acl,
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct inode_operations ocfs2_special_file_iops = {
|
const struct inode_operations ocfs2_special_file_iops = {
|
||||||
.setattr = ocfs2_setattr,
|
.setattr = ocfs2_setattr,
|
||||||
.getattr = ocfs2_getattr,
|
.getattr = ocfs2_getattr,
|
||||||
.permission = ocfs2_permission,
|
.permission = ocfs2_permission,
|
||||||
.check_acl = ocfs2_check_acl,
|
.get_acl = ocfs2_iop_get_acl,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -2498,5 +2498,5 @@ const struct inode_operations ocfs2_dir_iops = {
|
||||||
.listxattr = ocfs2_listxattr,
|
.listxattr = ocfs2_listxattr,
|
||||||
.removexattr = generic_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
.fiemap = ocfs2_fiemap,
|
.fiemap = ocfs2_fiemap,
|
||||||
.check_acl = ocfs2_check_acl,
|
.get_acl = ocfs2_iop_get_acl,
|
||||||
};
|
};
|
||||||
|
|
|
@ -27,7 +27,6 @@ EXPORT_SYMBOL(posix_acl_alloc);
|
||||||
EXPORT_SYMBOL(posix_acl_valid);
|
EXPORT_SYMBOL(posix_acl_valid);
|
||||||
EXPORT_SYMBOL(posix_acl_equiv_mode);
|
EXPORT_SYMBOL(posix_acl_equiv_mode);
|
||||||
EXPORT_SYMBOL(posix_acl_from_mode);
|
EXPORT_SYMBOL(posix_acl_from_mode);
|
||||||
EXPORT_SYMBOL(posix_acl_permission);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Init a fresh posix_acl
|
* Init a fresh posix_acl
|
||||||
|
|
|
@ -319,5 +319,5 @@ const struct inode_operations reiserfs_file_inode_operations = {
|
||||||
.listxattr = reiserfs_listxattr,
|
.listxattr = reiserfs_listxattr,
|
||||||
.removexattr = reiserfs_removexattr,
|
.removexattr = reiserfs_removexattr,
|
||||||
.permission = reiserfs_permission,
|
.permission = reiserfs_permission,
|
||||||
.check_acl = reiserfs_check_acl,
|
.get_acl = reiserfs_get_acl,
|
||||||
};
|
};
|
||||||
|
|
|
@ -1529,7 +1529,7 @@ const struct inode_operations reiserfs_dir_inode_operations = {
|
||||||
.listxattr = reiserfs_listxattr,
|
.listxattr = reiserfs_listxattr,
|
||||||
.removexattr = reiserfs_removexattr,
|
.removexattr = reiserfs_removexattr,
|
||||||
.permission = reiserfs_permission,
|
.permission = reiserfs_permission,
|
||||||
.check_acl = reiserfs_check_acl,
|
.get_acl = reiserfs_get_acl,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1546,7 +1546,7 @@ const struct inode_operations reiserfs_symlink_inode_operations = {
|
||||||
.listxattr = reiserfs_listxattr,
|
.listxattr = reiserfs_listxattr,
|
||||||
.removexattr = reiserfs_removexattr,
|
.removexattr = reiserfs_removexattr,
|
||||||
.permission = reiserfs_permission,
|
.permission = reiserfs_permission,
|
||||||
.check_acl = reiserfs_check_acl,
|
.get_acl = reiserfs_get_acl,
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1560,5 +1560,5 @@ const struct inode_operations reiserfs_special_inode_operations = {
|
||||||
.listxattr = reiserfs_listxattr,
|
.listxattr = reiserfs_listxattr,
|
||||||
.removexattr = reiserfs_removexattr,
|
.removexattr = reiserfs_removexattr,
|
||||||
.permission = reiserfs_permission,
|
.permission = reiserfs_permission,
|
||||||
.check_acl = reiserfs_check_acl,
|
.get_acl = reiserfs_get_acl,
|
||||||
};
|
};
|
||||||
|
|
|
@ -867,24 +867,6 @@ out:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int reiserfs_check_acl(struct inode *inode, int mask)
|
|
||||||
{
|
|
||||||
struct posix_acl *acl;
|
|
||||||
int error = -EAGAIN; /* do regular unix permission checks by default */
|
|
||||||
|
|
||||||
acl = reiserfs_get_acl(inode, ACL_TYPE_ACCESS);
|
|
||||||
|
|
||||||
if (acl) {
|
|
||||||
if (!IS_ERR(acl)) {
|
|
||||||
error = posix_acl_permission(inode, acl, mask);
|
|
||||||
posix_acl_release(acl);
|
|
||||||
} else if (PTR_ERR(acl) != -ENODATA)
|
|
||||||
error = PTR_ERR(acl);
|
|
||||||
}
|
|
||||||
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int create_privroot(struct dentry *dentry)
|
static int create_privroot(struct dentry *dentry)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
|
@ -114,6 +114,8 @@ xfs_get_acl(struct inode *inode, int type)
|
||||||
if (acl != ACL_NOT_CACHED)
|
if (acl != ACL_NOT_CACHED)
|
||||||
return acl;
|
return acl;
|
||||||
|
|
||||||
|
trace_xfs_get_acl(ip);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ACL_TYPE_ACCESS:
|
case ACL_TYPE_ACCESS:
|
||||||
ea_name = SGI_ACL_FILE;
|
ea_name = SGI_ACL_FILE;
|
||||||
|
@ -218,25 +220,6 @@ xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl)
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
xfs_check_acl(struct inode *inode, int mask)
|
|
||||||
{
|
|
||||||
struct posix_acl *acl;
|
|
||||||
int error = -EAGAIN;
|
|
||||||
|
|
||||||
trace_xfs_check_acl(XFS_I(inode));
|
|
||||||
|
|
||||||
acl = xfs_get_acl(inode, ACL_TYPE_ACCESS);
|
|
||||||
if (IS_ERR(acl))
|
|
||||||
return PTR_ERR(acl);
|
|
||||||
if (acl) {
|
|
||||||
error = posix_acl_permission(inode, acl, mask);
|
|
||||||
posix_acl_release(acl);
|
|
||||||
}
|
|
||||||
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
xfs_set_mode(struct inode *inode, mode_t mode)
|
xfs_set_mode(struct inode *inode, mode_t mode)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1022,7 +1022,7 @@ xfs_vn_fiemap(
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct inode_operations xfs_inode_operations = {
|
static const struct inode_operations xfs_inode_operations = {
|
||||||
.check_acl = xfs_check_acl,
|
.get_acl = xfs_get_acl,
|
||||||
.getattr = xfs_vn_getattr,
|
.getattr = xfs_vn_getattr,
|
||||||
.setattr = xfs_vn_setattr,
|
.setattr = xfs_vn_setattr,
|
||||||
.setxattr = generic_setxattr,
|
.setxattr = generic_setxattr,
|
||||||
|
@ -1048,7 +1048,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,
|
||||||
.check_acl = xfs_check_acl,
|
.get_acl = xfs_get_acl,
|
||||||
.getattr = xfs_vn_getattr,
|
.getattr = xfs_vn_getattr,
|
||||||
.setattr = xfs_vn_setattr,
|
.setattr = xfs_vn_setattr,
|
||||||
.setxattr = generic_setxattr,
|
.setxattr = generic_setxattr,
|
||||||
|
@ -1073,7 +1073,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,
|
||||||
.check_acl = xfs_check_acl,
|
.get_acl = xfs_get_acl,
|
||||||
.getattr = xfs_vn_getattr,
|
.getattr = xfs_vn_getattr,
|
||||||
.setattr = xfs_vn_setattr,
|
.setattr = xfs_vn_setattr,
|
||||||
.setxattr = generic_setxattr,
|
.setxattr = generic_setxattr,
|
||||||
|
@ -1086,7 +1086,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,
|
||||||
.check_acl = xfs_check_acl,
|
.get_acl = xfs_get_acl,
|
||||||
.getattr = xfs_vn_getattr,
|
.getattr = xfs_vn_getattr,
|
||||||
.setattr = xfs_vn_setattr,
|
.setattr = xfs_vn_setattr,
|
||||||
.setxattr = generic_setxattr,
|
.setxattr = generic_setxattr,
|
||||||
|
|
|
@ -571,7 +571,7 @@ DEFINE_INODE_EVENT(xfs_alloc_file_space);
|
||||||
DEFINE_INODE_EVENT(xfs_free_file_space);
|
DEFINE_INODE_EVENT(xfs_free_file_space);
|
||||||
DEFINE_INODE_EVENT(xfs_readdir);
|
DEFINE_INODE_EVENT(xfs_readdir);
|
||||||
#ifdef CONFIG_XFS_POSIX_ACL
|
#ifdef CONFIG_XFS_POSIX_ACL
|
||||||
DEFINE_INODE_EVENT(xfs_check_acl);
|
DEFINE_INODE_EVENT(xfs_get_acl);
|
||||||
#endif
|
#endif
|
||||||
DEFINE_INODE_EVENT(xfs_vm_bmap);
|
DEFINE_INODE_EVENT(xfs_vm_bmap);
|
||||||
DEFINE_INODE_EVENT(xfs_file_ioctl);
|
DEFINE_INODE_EVENT(xfs_file_ioctl);
|
||||||
|
|
|
@ -42,7 +42,6 @@ struct xfs_acl {
|
||||||
#define SGI_ACL_DEFAULT_SIZE (sizeof(SGI_ACL_DEFAULT)-1)
|
#define SGI_ACL_DEFAULT_SIZE (sizeof(SGI_ACL_DEFAULT)-1)
|
||||||
|
|
||||||
#ifdef CONFIG_XFS_POSIX_ACL
|
#ifdef CONFIG_XFS_POSIX_ACL
|
||||||
extern int xfs_check_acl(struct inode *inode, int mask);
|
|
||||||
extern struct posix_acl *xfs_get_acl(struct inode *inode, int type);
|
extern struct posix_acl *xfs_get_acl(struct inode *inode, int type);
|
||||||
extern int xfs_inherit_acl(struct inode *inode, struct posix_acl *default_acl);
|
extern int xfs_inherit_acl(struct inode *inode, struct posix_acl *default_acl);
|
||||||
extern int xfs_acl_chmod(struct inode *inode);
|
extern int xfs_acl_chmod(struct inode *inode);
|
||||||
|
@ -52,7 +51,6 @@ extern int posix_acl_default_exists(struct inode *inode);
|
||||||
extern const struct xattr_handler xfs_xattr_acl_access_handler;
|
extern const struct xattr_handler xfs_xattr_acl_access_handler;
|
||||||
extern const struct xattr_handler xfs_xattr_acl_default_handler;
|
extern const struct xattr_handler xfs_xattr_acl_default_handler;
|
||||||
#else
|
#else
|
||||||
# define xfs_check_acl NULL
|
|
||||||
# define xfs_get_acl(inode, type) NULL
|
# define xfs_get_acl(inode, type) NULL
|
||||||
# define xfs_inherit_acl(inode, default_acl) 0
|
# define xfs_inherit_acl(inode, default_acl) 0
|
||||||
# define xfs_acl_chmod(inode) 0
|
# define xfs_acl_chmod(inode) 0
|
||||||
|
|
|
@ -1586,7 +1586,7 @@ struct inode_operations {
|
||||||
struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *);
|
struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *);
|
||||||
void * (*follow_link) (struct dentry *, struct nameidata *);
|
void * (*follow_link) (struct dentry *, struct nameidata *);
|
||||||
int (*permission) (struct inode *, int);
|
int (*permission) (struct inode *, int);
|
||||||
int (*check_acl)(struct inode *, int);
|
struct posix_acl * (*get_acl)(struct inode *, int);
|
||||||
|
|
||||||
int (*readlink) (struct dentry *, char __user *,int);
|
int (*readlink) (struct dentry *, char __user *,int);
|
||||||
void (*put_link) (struct dentry *, struct nameidata *, void *);
|
void (*put_link) (struct dentry *, struct nameidata *, void *);
|
||||||
|
|
|
@ -10,6 +10,5 @@ extern const struct xattr_handler generic_acl_default_handler;
|
||||||
|
|
||||||
int generic_acl_init(struct inode *, struct inode *);
|
int generic_acl_init(struct inode *, struct inode *);
|
||||||
int generic_acl_chmod(struct inode *);
|
int generic_acl_chmod(struct inode *);
|
||||||
int generic_check_acl(struct inode *inode, int mask);
|
|
||||||
|
|
||||||
#endif /* LINUX_GENERIC_ACL_H */
|
#endif /* LINUX_GENERIC_ACL_H */
|
||||||
|
|
|
@ -59,11 +59,7 @@ extern const struct xattr_handler reiserfs_posix_acl_access_handler;
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define reiserfs_cache_default_acl(inode) 0
|
#define reiserfs_cache_default_acl(inode) 0
|
||||||
|
#define reiserfs_get_acl NULL
|
||||||
static inline struct posix_acl *reiserfs_get_acl(struct inode *inode, int type)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int reiserfs_acl_chmod(struct inode *inode)
|
static inline int reiserfs_acl_chmod(struct inode *inode)
|
||||||
{
|
{
|
||||||
|
|
|
@ -45,7 +45,6 @@ int reiserfs_permission(struct inode *inode, int mask);
|
||||||
|
|
||||||
#ifdef CONFIG_REISERFS_FS_XATTR
|
#ifdef CONFIG_REISERFS_FS_XATTR
|
||||||
#define has_xattr_dir(inode) (REISERFS_I(inode)->i_flags & i_has_xattr_dir)
|
#define has_xattr_dir(inode) (REISERFS_I(inode)->i_flags & i_has_xattr_dir)
|
||||||
int reiserfs_check_acl(struct inode *inode, int mask);
|
|
||||||
ssize_t reiserfs_getxattr(struct dentry *dentry, const char *name,
|
ssize_t reiserfs_getxattr(struct dentry *dentry, const char *name,
|
||||||
void *buffer, size_t size);
|
void *buffer, size_t size);
|
||||||
int reiserfs_setxattr(struct dentry *dentry, const char *name,
|
int reiserfs_setxattr(struct dentry *dentry, const char *name,
|
||||||
|
@ -123,7 +122,6 @@ static inline void reiserfs_init_xattr_rwsem(struct inode *inode)
|
||||||
#define reiserfs_setxattr NULL
|
#define reiserfs_setxattr NULL
|
||||||
#define reiserfs_listxattr NULL
|
#define reiserfs_listxattr NULL
|
||||||
#define reiserfs_removexattr NULL
|
#define reiserfs_removexattr NULL
|
||||||
#define reiserfs_check_acl NULL
|
|
||||||
|
|
||||||
static inline void reiserfs_init_xattr_rwsem(struct inode *inode)
|
static inline void reiserfs_init_xattr_rwsem(struct inode *inode)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2715,10 +2715,6 @@ static const struct inode_operations shmem_inode_operations = {
|
||||||
.listxattr = shmem_listxattr,
|
.listxattr = shmem_listxattr,
|
||||||
.removexattr = shmem_removexattr,
|
.removexattr = shmem_removexattr,
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_TMPFS_POSIX_ACL
|
|
||||||
.check_acl = generic_check_acl,
|
|
||||||
#endif
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct inode_operations shmem_dir_inode_operations = {
|
static const struct inode_operations shmem_dir_inode_operations = {
|
||||||
|
@ -2741,7 +2737,6 @@ static const struct inode_operations shmem_dir_inode_operations = {
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_TMPFS_POSIX_ACL
|
#ifdef CONFIG_TMPFS_POSIX_ACL
|
||||||
.setattr = shmem_setattr,
|
.setattr = shmem_setattr,
|
||||||
.check_acl = generic_check_acl,
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2754,7 +2749,6 @@ static const struct inode_operations shmem_special_inode_operations = {
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_TMPFS_POSIX_ACL
|
#ifdef CONFIG_TMPFS_POSIX_ACL
|
||||||
.setattr = shmem_setattr,
|
.setattr = shmem_setattr,
|
||||||
.check_acl = generic_check_acl,
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue