1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #include <linux/init.h> 3 #include <linux/posix_acl.h> 4 5 #define REISERFS_ACL_VERSION 0x0001 6 7 typedef struct { 8 __le16 e_tag; 9 __le16 e_perm; 10 __le32 e_id; 11 } reiserfs_acl_entry; 12 13 typedef struct { 14 __le16 e_tag; 15 __le16 e_perm; 16 } reiserfs_acl_entry_short; 17 18 typedef struct { 19 __le32 a_version; 20 } reiserfs_acl_header; 21 22 static inline size_t reiserfs_acl_size(int count) 23 { 24 if (count <= 4) { 25 return sizeof(reiserfs_acl_header) + 26 count * sizeof(reiserfs_acl_entry_short); 27 } else { 28 return sizeof(reiserfs_acl_header) + 29 4 * sizeof(reiserfs_acl_entry_short) + 30 (count - 4) * sizeof(reiserfs_acl_entry); 31 } 32 } 33 34 static inline int reiserfs_acl_count(size_t size) 35 { 36 ssize_t s; 37 size -= sizeof(reiserfs_acl_header); 38 s = size - 4 * sizeof(reiserfs_acl_entry_short); 39 if (s < 0) { 40 if (size % sizeof(reiserfs_acl_entry_short)) 41 return -1; 42 return size / sizeof(reiserfs_acl_entry_short); 43 } else { 44 if (s % sizeof(reiserfs_acl_entry)) 45 return -1; 46 return s / sizeof(reiserfs_acl_entry) + 4; 47 } 48 } 49 50 #ifdef CONFIG_REISERFS_FS_POSIX_ACL 51 struct posix_acl *reiserfs_get_acl(struct inode *inode, int type); 52 int reiserfs_set_acl(struct inode *inode, struct posix_acl *acl, int type); 53 int reiserfs_acl_chmod(struct inode *inode); 54 int reiserfs_inherit_default_acl(struct reiserfs_transaction_handle *th, 55 struct inode *dir, struct dentry *dentry, 56 struct inode *inode); 57 int reiserfs_cache_default_acl(struct inode *dir); 58 59 #else 60 61 #define reiserfs_cache_default_acl(inode) 0 62 #define reiserfs_get_acl NULL 63 #define reiserfs_set_acl NULL 64 65 static inline int reiserfs_acl_chmod(struct inode *inode) 66 { 67 return 0; 68 } 69 70 static inline int 71 reiserfs_inherit_default_acl(struct reiserfs_transaction_handle *th, 72 const struct inode *dir, struct dentry *dentry, 73 struct inode *inode) 74 { 75 return 0; 76 } 77 #endif 78