blob: fe552b77c69e26f2597c5a98b24ba966b71b043f [file] [log] [blame]
#ifndef __NFS4ACL_H
#define __NFS4ACL_H
struct nfs4ace {
unsigned short e_type;
unsigned short e_flags;
unsigned int e_mask;
union {
unsigned int e_id;
const char *e_who;
} u;
};
struct nfs4acl {
atomic_t a_refcount;
unsigned int a_owner_mask;
unsigned int a_group_mask;
unsigned int a_other_mask;
unsigned short a_count;
unsigned short a_flags;
struct nfs4ace a_entries[0];
};
#define nfs4acl_for_each_entry(_ace, _acl) \
for (_ace = _acl->a_entries; \
_ace != _acl->a_entries + _acl->a_count; \
_ace++)
#define nfs4acl_for_each_entry_reverse(_ace, _acl) \
for (_ace = _acl->a_entries + _acl->a_count - 1; \
_ace != _acl->a_entries - 1; \
_ace--)
/* a_flags values */
#define ACL4_AUTO_INHERIT 0x01
#define ACL4_PROTECTED 0x02
#define ACL4_DEFAULTED 0x04
#define ACL4_WRITE_THROUGH 0x40
#define ACL4_VALID_FLAGS ( \
ACL4_AUTO_INHERIT | \
ACL4_PROTECTED | \
ACL4_DEFAULTED | \
ACL4_WRITE_THROUGH )
/* e_type values */
#define ACE4_ACCESS_ALLOWED_ACE_TYPE 0x0000
#define ACE4_ACCESS_DENIED_ACE_TYPE 0x0001
/*#define ACE4_SYSTEM_AUDIT_ACE_TYPE 0x0002*/
/*#define ACE4_SYSTEM_ALARM_ACE_TYPE 0x0003*/
/* e_flags bitflags */
#define ACE4_FILE_INHERIT_ACE 0x0001
#define ACE4_DIRECTORY_INHERIT_ACE 0x0002
#define ACE4_NO_PROPAGATE_INHERIT_ACE 0x0004
#define ACE4_INHERIT_ONLY_ACE 0x0008
/*#define ACE4_SUCCESSFUL_ACCESS_ACE_FLAG 0x0010*/
/*#define ACE4_FAILED_ACCESS_ACE_FLAG 0x0020*/
#define ACE4_IDENTIFIER_GROUP 0x0040
#define ACE4_INHERITED_ACE 0x0080
#define ACE4_SPECIAL_WHO 0x4000 /* in-memory representation only */
#define ACE4_VALID_FLAGS ( \
ACE4_FILE_INHERIT_ACE | \
ACE4_DIRECTORY_INHERIT_ACE | \
ACE4_NO_PROPAGATE_INHERIT_ACE | \
ACE4_INHERIT_ONLY_ACE | \
ACE4_IDENTIFIER_GROUP | \
ACE4_INHERITED_ACE )
/* e_mask bitflags */
#define ACE4_READ_DATA 0x00000001
#define ACE4_LIST_DIRECTORY 0x00000001
#define ACE4_WRITE_DATA 0x00000002
#define ACE4_ADD_FILE 0x00000002
#define ACE4_APPEND_DATA 0x00000004
#define ACE4_ADD_SUBDIRECTORY 0x00000004
#define ACE4_READ_NAMED_ATTRS 0x00000008
#define ACE4_WRITE_NAMED_ATTRS 0x00000010
#define ACE4_EXECUTE 0x00000020
#define ACE4_DELETE_CHILD 0x00000040
#define ACE4_READ_ATTRIBUTES 0x00000080
#define ACE4_WRITE_ATTRIBUTES 0x00000100
#define ACE4_DELETE 0x00010000
#define ACE4_READ_ACL 0x00020000
#define ACE4_WRITE_ACL 0x00040000
#define ACE4_WRITE_OWNER 0x00080000
#define ACE4_SYNCHRONIZE 0x00100000
#define ACE4_VALID_MASK ( \
ACE4_READ_DATA | ACE4_LIST_DIRECTORY | \
ACE4_WRITE_DATA | ACE4_ADD_FILE | \
ACE4_APPEND_DATA | ACE4_ADD_SUBDIRECTORY | \
ACE4_READ_NAMED_ATTRS | \
ACE4_WRITE_NAMED_ATTRS | \
ACE4_EXECUTE | \
ACE4_DELETE_CHILD | \
ACE4_READ_ATTRIBUTES | \
ACE4_WRITE_ATTRIBUTES | \
ACE4_DELETE | \
ACE4_READ_ACL | \
ACE4_WRITE_ACL | \
ACE4_WRITE_OWNER | \
ACE4_SYNCHRONIZE )
#define ACE4_POSIX_ALWAYS_ALLOWED ( \
ACE4_SYNCHRONIZE | \
ACE4_READ_ATTRIBUTES | \
ACE4_READ_ACL )
/*
* Duplicate an NFS4ACL handle.
*/
static inline struct nfs4acl *
nfs4acl_get(struct nfs4acl *acl)
{
if (acl)
atomic_inc(&acl->a_refcount);
return acl;
}
/*
* Free an NFS4ACL handle
*/
static inline void
nfs4acl_put(struct nfs4acl *acl)
{
if (acl && atomic_dec_and_test(&acl->a_refcount))
kfree(acl);
}
/* Special e_who identifiers: we use these pointer values in comparisons
instead of strcmp for efficiency. */
extern const char nfs4ace_owner_who[];
extern const char nfs4ace_group_who[];
extern const char nfs4ace_everyone_who[];
static inline int
nfs4acl_is_auto_inherit(const struct nfs4acl *acl)
{
return acl->a_flags & ACL4_AUTO_INHERIT;
}
static inline int
nfs4acl_is_protected(const struct nfs4acl *acl)
{
return acl->a_flags & ACL4_PROTECTED;
}
static inline int
nfs4ace_is_owner(const struct nfs4ace *ace)
{
return (ace->e_flags & ACE4_SPECIAL_WHO) &&
ace->u.e_who == nfs4ace_owner_who;
}
static inline int
nfs4ace_is_group(const struct nfs4ace *ace)
{
return (ace->e_flags & ACE4_SPECIAL_WHO) &&
ace->u.e_who == nfs4ace_group_who;
}
static inline int
nfs4ace_is_everyone(const struct nfs4ace *ace)
{
return (ace->e_flags & ACE4_SPECIAL_WHO) &&
ace->u.e_who == nfs4ace_everyone_who;
}
static inline int
nfs4ace_is_unix_id(const struct nfs4ace *ace)
{
return !(ace->e_flags & ACE4_SPECIAL_WHO);
}
static inline int
nfs4ace_is_inherit_only(const struct nfs4ace *ace)
{
return ace->e_flags & ACE4_INHERIT_ONLY_ACE;
}
static inline int
nfs4ace_is_inheritable(const struct nfs4ace *ace)
{
return ace->e_flags & (ACE4_FILE_INHERIT_ACE |
ACE4_DIRECTORY_INHERIT_ACE);
}
static inline void
nfs4ace_clear_inheritance_flags(struct nfs4ace *ace)
{
ace->e_flags &= ~(ACE4_FILE_INHERIT_ACE |
ACE4_DIRECTORY_INHERIT_ACE |
ACE4_NO_PROPAGATE_INHERIT_ACE |
ACE4_INHERIT_ONLY_ACE);
}
static inline int
nfs4ace_is_allow(const struct nfs4ace *ace)
{
return ace->e_type == ACE4_ACCESS_ALLOWED_ACE_TYPE;
}
static inline int
nfs4ace_is_deny(const struct nfs4ace *ace)
{
return ace->e_type == ACE4_ACCESS_DENIED_ACE_TYPE;
}
extern struct nfs4acl *nfs4acl_alloc(int count);
extern struct nfs4acl *nfs4acl_clone(const struct nfs4acl *acl);
extern unsigned int nfs4acl_want_to_mask(int want);
extern int nfs4acl_permission(struct inode *, const struct nfs4acl *, unsigned int);
extern int nfs4acl_generic_permission(struct inode *, unsigned int);
extern int nfs4ace_is_same_who(const struct nfs4ace *, const struct nfs4ace *);
extern int nfs4ace_set_who(struct nfs4ace *ace, const char *who);
extern struct nfs4acl *nfs4acl_inherit(const struct nfs4acl *, mode_t);
extern int nfs4acl_masks_to_mode(const struct nfs4acl *);
extern struct nfs4acl *nfs4acl_chmod(struct nfs4acl *, mode_t);
extern int nfs4acl_apply_masks(struct nfs4acl **acl);
extern int nfs4acl_write_through(struct nfs4acl **acl);
#endif /* __NFS4ACL_H */