xref: /openbmc/linux/fs/ext4/acl.h (revision ac27a0ec)
1ac27a0ecSDave Kleikamp /*
2ac27a0ecSDave Kleikamp   File: fs/ext3/acl.h
3ac27a0ecSDave Kleikamp 
4ac27a0ecSDave Kleikamp   (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org>
5ac27a0ecSDave Kleikamp */
6ac27a0ecSDave Kleikamp 
7ac27a0ecSDave Kleikamp #include <linux/posix_acl_xattr.h>
8ac27a0ecSDave Kleikamp 
9ac27a0ecSDave Kleikamp #define EXT3_ACL_VERSION	0x0001
10ac27a0ecSDave Kleikamp 
11ac27a0ecSDave Kleikamp typedef struct {
12ac27a0ecSDave Kleikamp 	__le16		e_tag;
13ac27a0ecSDave Kleikamp 	__le16		e_perm;
14ac27a0ecSDave Kleikamp 	__le32		e_id;
15ac27a0ecSDave Kleikamp } ext3_acl_entry;
16ac27a0ecSDave Kleikamp 
17ac27a0ecSDave Kleikamp typedef struct {
18ac27a0ecSDave Kleikamp 	__le16		e_tag;
19ac27a0ecSDave Kleikamp 	__le16		e_perm;
20ac27a0ecSDave Kleikamp } ext3_acl_entry_short;
21ac27a0ecSDave Kleikamp 
22ac27a0ecSDave Kleikamp typedef struct {
23ac27a0ecSDave Kleikamp 	__le32		a_version;
24ac27a0ecSDave Kleikamp } ext3_acl_header;
25ac27a0ecSDave Kleikamp 
26ac27a0ecSDave Kleikamp static inline size_t ext3_acl_size(int count)
27ac27a0ecSDave Kleikamp {
28ac27a0ecSDave Kleikamp 	if (count <= 4) {
29ac27a0ecSDave Kleikamp 		return sizeof(ext3_acl_header) +
30ac27a0ecSDave Kleikamp 		       count * sizeof(ext3_acl_entry_short);
31ac27a0ecSDave Kleikamp 	} else {
32ac27a0ecSDave Kleikamp 		return sizeof(ext3_acl_header) +
33ac27a0ecSDave Kleikamp 		       4 * sizeof(ext3_acl_entry_short) +
34ac27a0ecSDave Kleikamp 		       (count - 4) * sizeof(ext3_acl_entry);
35ac27a0ecSDave Kleikamp 	}
36ac27a0ecSDave Kleikamp }
37ac27a0ecSDave Kleikamp 
38ac27a0ecSDave Kleikamp static inline int ext3_acl_count(size_t size)
39ac27a0ecSDave Kleikamp {
40ac27a0ecSDave Kleikamp 	ssize_t s;
41ac27a0ecSDave Kleikamp 	size -= sizeof(ext3_acl_header);
42ac27a0ecSDave Kleikamp 	s = size - 4 * sizeof(ext3_acl_entry_short);
43ac27a0ecSDave Kleikamp 	if (s < 0) {
44ac27a0ecSDave Kleikamp 		if (size % sizeof(ext3_acl_entry_short))
45ac27a0ecSDave Kleikamp 			return -1;
46ac27a0ecSDave Kleikamp 		return size / sizeof(ext3_acl_entry_short);
47ac27a0ecSDave Kleikamp 	} else {
48ac27a0ecSDave Kleikamp 		if (s % sizeof(ext3_acl_entry))
49ac27a0ecSDave Kleikamp 			return -1;
50ac27a0ecSDave Kleikamp 		return s / sizeof(ext3_acl_entry) + 4;
51ac27a0ecSDave Kleikamp 	}
52ac27a0ecSDave Kleikamp }
53ac27a0ecSDave Kleikamp 
54ac27a0ecSDave Kleikamp #ifdef CONFIG_EXT3_FS_POSIX_ACL
55ac27a0ecSDave Kleikamp 
56ac27a0ecSDave Kleikamp /* Value for inode->u.ext3_i.i_acl and inode->u.ext3_i.i_default_acl
57ac27a0ecSDave Kleikamp    if the ACL has not been cached */
58ac27a0ecSDave Kleikamp #define EXT3_ACL_NOT_CACHED ((void *)-1)
59ac27a0ecSDave Kleikamp 
60ac27a0ecSDave Kleikamp /* acl.c */
61ac27a0ecSDave Kleikamp extern int ext3_permission (struct inode *, int, struct nameidata *);
62ac27a0ecSDave Kleikamp extern int ext3_acl_chmod (struct inode *);
63ac27a0ecSDave Kleikamp extern int ext3_init_acl (handle_t *, struct inode *, struct inode *);
64ac27a0ecSDave Kleikamp 
65ac27a0ecSDave Kleikamp #else  /* CONFIG_EXT3_FS_POSIX_ACL */
66ac27a0ecSDave Kleikamp #include <linux/sched.h>
67ac27a0ecSDave Kleikamp #define ext3_permission NULL
68ac27a0ecSDave Kleikamp 
69ac27a0ecSDave Kleikamp static inline int
70ac27a0ecSDave Kleikamp ext3_acl_chmod(struct inode *inode)
71ac27a0ecSDave Kleikamp {
72ac27a0ecSDave Kleikamp 	return 0;
73ac27a0ecSDave Kleikamp }
74ac27a0ecSDave Kleikamp 
75ac27a0ecSDave Kleikamp static inline int
76ac27a0ecSDave Kleikamp ext3_init_acl(handle_t *handle, struct inode *inode, struct inode *dir)
77ac27a0ecSDave Kleikamp {
78ac27a0ecSDave Kleikamp 	return 0;
79ac27a0ecSDave Kleikamp }
80ac27a0ecSDave Kleikamp #endif  /* CONFIG_EXT3_FS_POSIX_ACL */
81ac27a0ecSDave Kleikamp 
82