1*f5166768STheodore Ts'o // SPDX-License-Identifier: GPL-2.0 2ac27a0ecSDave Kleikamp /* 3617ba13bSMingming Cao File: fs/ext4/acl.h 4ac27a0ecSDave Kleikamp 5ac27a0ecSDave Kleikamp (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> 6ac27a0ecSDave Kleikamp */ 7ac27a0ecSDave Kleikamp 8ac27a0ecSDave Kleikamp #include <linux/posix_acl_xattr.h> 9ac27a0ecSDave Kleikamp 10617ba13bSMingming Cao #define EXT4_ACL_VERSION 0x0001 11ac27a0ecSDave Kleikamp 12ac27a0ecSDave Kleikamp typedef struct { 13ac27a0ecSDave Kleikamp __le16 e_tag; 14ac27a0ecSDave Kleikamp __le16 e_perm; 15ac27a0ecSDave Kleikamp __le32 e_id; 16617ba13bSMingming Cao } ext4_acl_entry; 17ac27a0ecSDave Kleikamp 18ac27a0ecSDave Kleikamp typedef struct { 19ac27a0ecSDave Kleikamp __le16 e_tag; 20ac27a0ecSDave Kleikamp __le16 e_perm; 21617ba13bSMingming Cao } ext4_acl_entry_short; 22ac27a0ecSDave Kleikamp 23ac27a0ecSDave Kleikamp typedef struct { 24ac27a0ecSDave Kleikamp __le32 a_version; 25617ba13bSMingming Cao } ext4_acl_header; 26ac27a0ecSDave Kleikamp 27617ba13bSMingming Cao static inline size_t ext4_acl_size(int count) 28ac27a0ecSDave Kleikamp { 29ac27a0ecSDave Kleikamp if (count <= 4) { 30617ba13bSMingming Cao return sizeof(ext4_acl_header) + 31617ba13bSMingming Cao count * sizeof(ext4_acl_entry_short); 32ac27a0ecSDave Kleikamp } else { 33617ba13bSMingming Cao return sizeof(ext4_acl_header) + 34617ba13bSMingming Cao 4 * sizeof(ext4_acl_entry_short) + 35617ba13bSMingming Cao (count - 4) * sizeof(ext4_acl_entry); 36ac27a0ecSDave Kleikamp } 37ac27a0ecSDave Kleikamp } 38ac27a0ecSDave Kleikamp 39617ba13bSMingming Cao static inline int ext4_acl_count(size_t size) 40ac27a0ecSDave Kleikamp { 41ac27a0ecSDave Kleikamp ssize_t s; 42617ba13bSMingming Cao size -= sizeof(ext4_acl_header); 43617ba13bSMingming Cao s = size - 4 * sizeof(ext4_acl_entry_short); 44ac27a0ecSDave Kleikamp if (s < 0) { 45617ba13bSMingming Cao if (size % sizeof(ext4_acl_entry_short)) 46ac27a0ecSDave Kleikamp return -1; 47617ba13bSMingming Cao return size / sizeof(ext4_acl_entry_short); 48ac27a0ecSDave Kleikamp } else { 49617ba13bSMingming Cao if (s % sizeof(ext4_acl_entry)) 50ac27a0ecSDave Kleikamp return -1; 51617ba13bSMingming Cao return s / sizeof(ext4_acl_entry) + 4; 52ac27a0ecSDave Kleikamp } 53ac27a0ecSDave Kleikamp } 54ac27a0ecSDave Kleikamp 5503010a33STheodore Ts'o #ifdef CONFIG_EXT4_FS_POSIX_ACL 56ac27a0ecSDave Kleikamp 57ac27a0ecSDave Kleikamp /* acl.c */ 584e34e719SChristoph Hellwig struct posix_acl *ext4_get_acl(struct inode *inode, int type); 5964e178a7SChristoph Hellwig int ext4_set_acl(struct inode *inode, struct posix_acl *acl, int type); 60617ba13bSMingming Cao extern int ext4_init_acl(handle_t *, struct inode *, struct inode *); 61ac27a0ecSDave Kleikamp 6203010a33STheodore Ts'o #else /* CONFIG_EXT4_FS_POSIX_ACL */ 63ac27a0ecSDave Kleikamp #include <linux/sched.h> 644e34e719SChristoph Hellwig #define ext4_get_acl NULL 6564e178a7SChristoph Hellwig #define ext4_set_acl NULL 66ac27a0ecSDave Kleikamp 67ac27a0ecSDave Kleikamp static inline int 68617ba13bSMingming Cao ext4_init_acl(handle_t *handle, struct inode *inode, struct inode *dir) 69ac27a0ecSDave Kleikamp { 70ac27a0ecSDave Kleikamp return 0; 71ac27a0ecSDave Kleikamp } 7203010a33STheodore Ts'o #endif /* CONFIG_EXT4_FS_POSIX_ACL */ 73ac27a0ecSDave Kleikamp 74