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, bool rcu); 52 int reiserfs_set_acl(struct user_namespace *mnt_userns, struct inode *inode, 53 struct posix_acl *acl, int type); 54 int reiserfs_acl_chmod(struct inode *inode); 55 int reiserfs_inherit_default_acl(struct reiserfs_transaction_handle *th, 56 struct inode *dir, struct dentry *dentry, 57 struct inode *inode); 58 int reiserfs_cache_default_acl(struct inode *dir); 59 60 #else 61 62 #define reiserfs_cache_default_acl(inode) 0 63 #define reiserfs_get_acl NULL 64 #define reiserfs_set_acl NULL 65 66 static inline int reiserfs_acl_chmod(struct inode *inode) 67 { 68 return 0; 69 } 70 71 static inline int 72 reiserfs_inherit_default_acl(struct reiserfs_transaction_handle *th, 73 const struct inode *dir, struct dentry *dentry, 74 struct inode *inode) 75 { 76 return 0; 77 } 78 #endif 79