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