xfs: improve xfs_forget_acl
Move the function to xfs_acl.c and provide a proper stub for the !CONFIG_XFS_POSIX_ACL case. Lift the flags check to the caller as it nicely fits in there. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Chandan Rajendra <chandanrlinux@gmail.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
53ac39fdb3
commit
5a3930e27e
|
@ -270,3 +270,19 @@ xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
|
|||
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Invalidate any cached ACLs if the user has bypassed the ACL interface.
|
||||
* We don't validate the content whatsoever so it is caller responsibility to
|
||||
* provide data in valid format and ensure i_mode is consistent.
|
||||
*/
|
||||
void
|
||||
xfs_forget_acl(
|
||||
struct inode *inode,
|
||||
const char *name)
|
||||
{
|
||||
if (!strcmp(name, SGI_ACL_FILE))
|
||||
forget_cached_acl(inode, ACL_TYPE_ACCESS);
|
||||
else if (!strcmp(name, SGI_ACL_DEFAULT))
|
||||
forget_cached_acl(inode, ACL_TYPE_DEFAULT);
|
||||
}
|
||||
|
|
|
@ -13,14 +13,16 @@ struct posix_acl;
|
|||
extern struct posix_acl *xfs_get_acl(struct inode *inode, int type);
|
||||
extern int xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type);
|
||||
extern int __xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type);
|
||||
void xfs_forget_acl(struct inode *inode, const char *name);
|
||||
#else
|
||||
static inline struct posix_acl *xfs_get_acl(struct inode *inode, int type)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
# define xfs_set_acl NULL
|
||||
static inline void xfs_forget_acl(struct inode *inode, const char *name)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_XFS_POSIX_ACL */
|
||||
|
||||
extern void xfs_forget_acl(struct inode *inode, const char *name, int xflags);
|
||||
|
||||
#endif /* __XFS_ACL_H__ */
|
||||
|
|
|
@ -510,8 +510,8 @@ xfs_attrmulti_attr_set(
|
|||
}
|
||||
|
||||
error = xfs_attr_set(&args);
|
||||
if (!error)
|
||||
xfs_forget_acl(inode, name, flags);
|
||||
if (!error && (flags & ATTR_ROOT))
|
||||
xfs_forget_acl(inode, name);
|
||||
kfree(args.value);
|
||||
return error;
|
||||
}
|
||||
|
|
|
@ -39,28 +39,6 @@ xfs_xattr_get(const struct xattr_handler *handler, struct dentry *unused,
|
|||
return args.valuelen;
|
||||
}
|
||||
|
||||
void
|
||||
xfs_forget_acl(
|
||||
struct inode *inode,
|
||||
const char *name,
|
||||
int xflags)
|
||||
{
|
||||
/*
|
||||
* Invalidate any cached ACLs if the user has bypassed the ACL
|
||||
* interface. We don't validate the content whatsoever so it is caller
|
||||
* responsibility to provide data in valid format and ensure i_mode is
|
||||
* consistent.
|
||||
*/
|
||||
if (xflags & ATTR_ROOT) {
|
||||
#ifdef CONFIG_XFS_POSIX_ACL
|
||||
if (!strcmp(name, SGI_ACL_FILE))
|
||||
forget_cached_acl(inode, ACL_TYPE_ACCESS);
|
||||
else if (!strcmp(name, SGI_ACL_DEFAULT))
|
||||
forget_cached_acl(inode, ACL_TYPE_DEFAULT);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
xfs_xattr_set(const struct xattr_handler *handler, struct dentry *unused,
|
||||
struct inode *inode, const char *name, const void *value,
|
||||
|
@ -83,8 +61,8 @@ xfs_xattr_set(const struct xattr_handler *handler, struct dentry *unused,
|
|||
args.flags |= ATTR_REPLACE;
|
||||
|
||||
error = xfs_attr_set(&args);
|
||||
if (!error)
|
||||
xfs_forget_acl(inode, name, args.flags);
|
||||
if (!error && (handler->flags & ATTR_ROOT))
|
||||
xfs_forget_acl(inode, name);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue