74 lines · c
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_H7#define __EROFS_XATTR_H8 9#include "internal.h"10#include <linux/posix_acl_xattr.h>11#include <linux/xattr.h>12 13/* Attribute not found */14#define ENOATTR ENODATA15 16#ifdef CONFIG_EROFS_FS_XATTR17extern const struct xattr_handler erofs_xattr_user_handler;18extern const struct xattr_handler erofs_xattr_trusted_handler;19extern const struct xattr_handler erofs_xattr_security_handler;20 21static 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 * const xattr_handler_map[] = {27 [EROFS_XATTR_INDEX_USER] = &erofs_xattr_user_handler,28#ifdef CONFIG_EROFS_FS_POSIX_ACL29 [EROFS_XATTR_INDEX_POSIX_ACL_ACCESS] = &nop_posix_acl_access,30 [EROFS_XATTR_INDEX_POSIX_ACL_DEFAULT] = &nop_posix_acl_default,31#endif32 [EROFS_XATTR_INDEX_TRUSTED] = &erofs_xattr_trusted_handler,33#ifdef CONFIG_EROFS_FS_SECURITY34 [EROFS_XATTR_INDEX_SECURITY] = &erofs_xattr_security_handler,35#endif36 };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 47extern const struct xattr_handler * const erofs_xattr_handlers[];48 49int erofs_xattr_prefixes_init(struct super_block *sb);50void erofs_xattr_prefixes_cleanup(struct super_block *sb);51int erofs_getxattr(struct inode *, int, const char *, void *, size_t);52ssize_t erofs_listxattr(struct dentry *, char *, size_t);53#else54static inline int erofs_xattr_prefixes_init(struct super_block *sb) { return 0; }55static inline void erofs_xattr_prefixes_cleanup(struct super_block *sb) {}56static 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_ACL68struct posix_acl *erofs_get_acl(struct inode *inode, int type, bool rcu);69#else70#define erofs_get_acl (NULL)71#endif72 73#endif74