1f5166768STheodore 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 */ 580cad6246SMiklos Szeredi struct posix_acl *ext4_get_acl(struct inode *inode, int type, bool rcu); 59*13e83a49SChristian Brauner int ext4_set_acl(struct mnt_idmap *idmap, struct dentry *dentry, 60549c7297SChristian Brauner struct posix_acl *acl, int type); 61617ba13bSMingming Cao extern int ext4_init_acl(handle_t *, struct inode *, struct inode *); 62ac27a0ecSDave Kleikamp 6303010a33STheodore Ts'o #else /* CONFIG_EXT4_FS_POSIX_ACL */ 64ac27a0ecSDave Kleikamp #include <linux/sched.h> 654e34e719SChristoph Hellwig #define ext4_get_acl NULL 6664e178a7SChristoph Hellwig #define ext4_set_acl NULL 67ac27a0ecSDave Kleikamp 68ac27a0ecSDave Kleikamp static inline int 69617ba13bSMingming Cao ext4_init_acl(handle_t *handle, struct inode *inode, struct inode *dir) 70ac27a0ecSDave Kleikamp { 71ac27a0ecSDave Kleikamp return 0; 72ac27a0ecSDave Kleikamp } 7303010a33STheodore Ts'o #endif /* CONFIG_EXT4_FS_POSIX_ACL */ 74ac27a0ecSDave Kleikamp 75