1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (C) 2017-2018 HUAWEI, Inc. 4 * https://www.huawei.com/ 5 */ 6 #ifndef __EROFS_XATTR_H 7 #define __EROFS_XATTR_H 8 9 #include "internal.h" 10 #include <linux/posix_acl_xattr.h> 11 #include <linux/xattr.h> 12 13 /* Attribute not found */ 14 #define ENOATTR ENODATA 15 16 #ifdef CONFIG_EROFS_FS_XATTR 17 extern const struct xattr_handler erofs_xattr_user_handler; 18 extern const struct xattr_handler erofs_xattr_trusted_handler; 19 extern const struct xattr_handler erofs_xattr_security_handler; 20 21 static inline const char *erofs_xattr_prefix(unsigned int idx, 22 struct dentry *dentry) 23 { 24 const struct xattr_handler *handler = NULL; 25 26 static const struct xattr_handler *xattr_handler_map[] = { 27 [EROFS_XATTR_INDEX_USER] = &erofs_xattr_user_handler, 28 #ifdef CONFIG_EROFS_FS_POSIX_ACL 29 [EROFS_XATTR_INDEX_POSIX_ACL_ACCESS] = &nop_posix_acl_access, 30 [EROFS_XATTR_INDEX_POSIX_ACL_DEFAULT] = &nop_posix_acl_default, 31 #endif 32 [EROFS_XATTR_INDEX_TRUSTED] = &erofs_xattr_trusted_handler, 33 #ifdef CONFIG_EROFS_FS_SECURITY 34 [EROFS_XATTR_INDEX_SECURITY] = &erofs_xattr_security_handler, 35 #endif 36 }; 37 38 if (idx && idx < ARRAY_SIZE(xattr_handler_map)) 39 handler = xattr_handler_map[idx]; 40 41 if (!xattr_handler_can_list(handler, dentry)) 42 return NULL; 43 44 return xattr_prefix(handler); 45 } 46 47 extern const struct xattr_handler *erofs_xattr_handlers[]; 48 49 int erofs_xattr_prefixes_init(struct super_block *sb); 50 void erofs_xattr_prefixes_cleanup(struct super_block *sb); 51 int erofs_getxattr(struct inode *, int, const char *, void *, size_t); 52 ssize_t erofs_listxattr(struct dentry *, char *, size_t); 53 #else 54 static inline int erofs_xattr_prefixes_init(struct super_block *sb) { return 0; } 55 static inline void erofs_xattr_prefixes_cleanup(struct super_block *sb) {} 56 static inline int erofs_getxattr(struct inode *inode, int index, 57 const char *name, void *buffer, 58 size_t buffer_size) 59 { 60 return -EOPNOTSUPP; 61 } 62 63 #define erofs_listxattr (NULL) 64 #define erofs_xattr_handlers (NULL) 65 #endif /* !CONFIG_EROFS_FS_XATTR */ 66 67 #ifdef CONFIG_EROFS_FS_POSIX_ACL 68 struct posix_acl *erofs_get_acl(struct inode *inode, int type, bool rcu); 69 #else 70 #define erofs_get_acl (NULL) 71 #endif 72 73 #endif 74