mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
fs: provide rcu-walk aware permission i_ops
Signed-off-by: Nick Piggin <[email protected]>
This commit is contained in:
parent
34286d6662
commit
b74c79e993
60 changed files with 287 additions and 146 deletions
|
|
@ -75,11 +75,14 @@ static struct posix_acl *gfs2_acl_get(struct gfs2_inode *ip, int type)
|
|||
* Returns: errno
|
||||
*/
|
||||
|
||||
int gfs2_check_acl(struct inode *inode, int mask)
|
||||
int gfs2_check_acl(struct inode *inode, int mask, unsigned int flags)
|
||||
{
|
||||
struct posix_acl *acl;
|
||||
int error;
|
||||
|
||||
if (flags & IPERM_FLAG_RCU)
|
||||
return -ECHILD;
|
||||
|
||||
acl = gfs2_acl_get(GFS2_I(inode), ACL_TYPE_ACCESS);
|
||||
if (IS_ERR(acl))
|
||||
return PTR_ERR(acl);
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
#define GFS2_POSIX_ACL_DEFAULT "posix_acl_default"
|
||||
#define GFS2_ACL_MAX_ENTRIES 25
|
||||
|
||||
extern int gfs2_check_acl(struct inode *inode, int mask);
|
||||
extern int gfs2_check_acl(struct inode *inode, int mask, unsigned int);
|
||||
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 const struct xattr_handler gfs2_xattr_system_handler;
|
||||
|
|
|
|||
|
|
@ -241,7 +241,7 @@ static int do_gfs2_set_flags(struct file *filp, u32 reqflags, u32 mask)
|
|||
!capable(CAP_LINUX_IMMUTABLE))
|
||||
goto out;
|
||||
if (!IS_IMMUTABLE(inode)) {
|
||||
error = gfs2_permission(inode, MAY_WRITE);
|
||||
error = gfs2_permission(inode, MAY_WRITE, 0);
|
||||
if (error)
|
||||
goto out;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -509,7 +509,7 @@ struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name,
|
|||
}
|
||||
|
||||
if (!is_root) {
|
||||
error = gfs2_permission(dir, MAY_EXEC);
|
||||
error = gfs2_permission(dir, MAY_EXEC, 0);
|
||||
if (error)
|
||||
goto out;
|
||||
}
|
||||
|
|
@ -539,7 +539,7 @@ static int create_ok(struct gfs2_inode *dip, const struct qstr *name,
|
|||
{
|
||||
int error;
|
||||
|
||||
error = gfs2_permission(&dip->i_inode, MAY_WRITE | MAY_EXEC);
|
||||
error = gfs2_permission(&dip->i_inode, MAY_WRITE | MAY_EXEC, 0);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ extern struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name,
|
|||
extern struct inode *gfs2_createi(struct gfs2_holder *ghs,
|
||||
const struct qstr *name,
|
||||
unsigned int mode, dev_t dev);
|
||||
extern int gfs2_permission(struct inode *inode, int mask);
|
||||
extern int gfs2_permission(struct inode *inode, int mask, unsigned int flags);
|
||||
extern int gfs2_setattr_simple(struct gfs2_inode *ip, struct iattr *attr);
|
||||
extern struct inode *gfs2_lookup_simple(struct inode *dip, const char *name);
|
||||
extern void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf);
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@ static int gfs2_link(struct dentry *old_dentry, struct inode *dir,
|
|||
if (error)
|
||||
goto out_child;
|
||||
|
||||
error = gfs2_permission(dir, MAY_WRITE | MAY_EXEC);
|
||||
error = gfs2_permission(dir, MAY_WRITE | MAY_EXEC, 0);
|
||||
if (error)
|
||||
goto out_gunlock;
|
||||
|
||||
|
|
@ -289,7 +289,7 @@ static int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name,
|
|||
if (IS_APPEND(&dip->i_inode))
|
||||
return -EPERM;
|
||||
|
||||
error = gfs2_permission(&dip->i_inode, MAY_WRITE | MAY_EXEC);
|
||||
error = gfs2_permission(&dip->i_inode, MAY_WRITE | MAY_EXEC, 0);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
|
@ -822,7 +822,7 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry,
|
|||
}
|
||||
}
|
||||
} else {
|
||||
error = gfs2_permission(ndir, MAY_WRITE | MAY_EXEC);
|
||||
error = gfs2_permission(ndir, MAY_WRITE | MAY_EXEC, 0);
|
||||
if (error)
|
||||
goto out_gunlock;
|
||||
|
||||
|
|
@ -857,7 +857,7 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry,
|
|||
/* Check out the dir to be renamed */
|
||||
|
||||
if (dir_rename) {
|
||||
error = gfs2_permission(odentry->d_inode, MAY_WRITE);
|
||||
error = gfs2_permission(odentry->d_inode, MAY_WRITE, 0);
|
||||
if (error)
|
||||
goto out_gunlock;
|
||||
}
|
||||
|
|
@ -1041,13 +1041,17 @@ static void gfs2_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
|
|||
* Returns: errno
|
||||
*/
|
||||
|
||||
int gfs2_permission(struct inode *inode, int mask)
|
||||
int gfs2_permission(struct inode *inode, int mask, unsigned int flags)
|
||||
{
|
||||
struct gfs2_inode *ip = GFS2_I(inode);
|
||||
struct gfs2_inode *ip;
|
||||
struct gfs2_holder i_gh;
|
||||
int error;
|
||||
int unlock = 0;
|
||||
|
||||
if (flags & IPERM_FLAG_RCU)
|
||||
return -ECHILD;
|
||||
|
||||
ip = GFS2_I(inode);
|
||||
if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) {
|
||||
error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh);
|
||||
if (error)
|
||||
|
|
@ -1058,7 +1062,7 @@ int gfs2_permission(struct inode *inode, int mask)
|
|||
if ((mask & MAY_WRITE) && IS_IMMUTABLE(inode))
|
||||
error = -EACCES;
|
||||
else
|
||||
error = generic_permission(inode, mask, gfs2_check_acl);
|
||||
error = generic_permission(inode, mask, flags, gfs2_check_acl);
|
||||
if (unlock)
|
||||
gfs2_glock_dq_uninit(&i_gh);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue