mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-07 23:11:27 +00:00
helpers for acl caching + switch to those
helpers: get_cached_acl(inode, type), set_cached_acl(inode, type, acl), forget_cached_acl(inode, type). ubifs/xattr.c needed includes reordered, the rest is a plain switchover. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
06b16e9f68
commit
073aaa1b14
10 changed files with 153 additions and 331 deletions
|
@ -83,4 +83,68 @@ extern int posix_acl_chmod_masq(struct posix_acl *, mode_t);
|
|||
extern struct posix_acl *get_posix_acl(struct inode *, int);
|
||||
extern int set_posix_acl(struct inode *, int, struct posix_acl *);
|
||||
|
||||
static inline struct posix_acl *get_cached_acl(struct inode *inode, int type)
|
||||
{
|
||||
struct posix_acl **p, *acl;
|
||||
switch (type) {
|
||||
case ACL_TYPE_ACCESS:
|
||||
p = &inode->i_acl;
|
||||
break;
|
||||
case ACL_TYPE_DEFAULT:
|
||||
p = &inode->i_default_acl;
|
||||
break;
|
||||
default:
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
acl = ACCESS_ONCE(*p);
|
||||
if (acl) {
|
||||
spin_lock(&inode->i_lock);
|
||||
acl = *p;
|
||||
if (acl != ACL_NOT_CACHED)
|
||||
acl = posix_acl_dup(acl);
|
||||
spin_unlock(&inode->i_lock);
|
||||
}
|
||||
return acl;
|
||||
}
|
||||
|
||||
static inline void set_cached_acl(struct inode *inode,
|
||||
int type,
|
||||
struct posix_acl *acl)
|
||||
{
|
||||
struct posix_acl *old = NULL;
|
||||
spin_lock(&inode->i_lock);
|
||||
switch (type) {
|
||||
case ACL_TYPE_ACCESS:
|
||||
old = inode->i_acl;
|
||||
inode->i_acl = posix_acl_dup(acl);
|
||||
break;
|
||||
case ACL_TYPE_DEFAULT:
|
||||
old = inode->i_default_acl;
|
||||
inode->i_default_acl = posix_acl_dup(acl);
|
||||
break;
|
||||
}
|
||||
spin_unlock(&inode->i_lock);
|
||||
if (old != ACL_NOT_CACHED)
|
||||
posix_acl_release(old);
|
||||
}
|
||||
|
||||
static inline void forget_cached_acl(struct inode *inode, int type)
|
||||
{
|
||||
struct posix_acl *old = NULL;
|
||||
spin_lock(&inode->i_lock);
|
||||
switch (type) {
|
||||
case ACL_TYPE_ACCESS:
|
||||
old = inode->i_acl;
|
||||
inode->i_acl = ACL_NOT_CACHED;
|
||||
break;
|
||||
case ACL_TYPE_DEFAULT:
|
||||
old = inode->i_default_acl;
|
||||
inode->i_default_acl = ACL_NOT_CACHED;
|
||||
break;
|
||||
}
|
||||
spin_unlock(&inode->i_lock);
|
||||
if (old != ACL_NOT_CACHED)
|
||||
posix_acl_release(old);
|
||||
}
|
||||
|
||||
#endif /* __LINUX_POSIX_ACL_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue