2019-07-31 23:57:31 +08:00
/* SPDX-License-Identifier: GPL-2.0-only */
/*
2018-07-26 20:21:52 +08:00
* Copyright ( C ) 2017 - 2018 HUAWEI , Inc .
2020-07-13 15:09:44 +02:00
* https : //www.huawei.com/
2018-07-26 20:21:52 +08:00
*/
# ifndef __EROFS_XATTR_H
# define __EROFS_XATTR_H
# include "internal.h"
# include <linux/posix_acl_xattr.h>
# include <linux/xattr.h>
/* Attribute not found */
# define ENOATTR ENODATA
2019-07-31 23:57:33 +08:00
# ifdef CONFIG_EROFS_FS_XATTR
2018-07-26 20:21:52 +08:00
extern const struct xattr_handler erofs_xattr_user_handler ;
extern const struct xattr_handler erofs_xattr_trusted_handler ;
extern const struct xattr_handler erofs_xattr_security_handler ;
2023-02-01 14:14:56 +01:00
static inline const char * erofs_xattr_prefix ( unsigned int idx ,
struct dentry * dentry )
2018-07-26 20:21:52 +08:00
{
2023-02-01 14:14:56 +01:00
const struct xattr_handler * handler = NULL ;
2023-09-30 02:00:12 -03:00
static const struct xattr_handler * const xattr_handler_map [ ] = {
2020-01-02 14:02:32 +02:00
[ EROFS_XATTR_INDEX_USER ] = & erofs_xattr_user_handler ,
2018-07-26 20:21:52 +08:00
# ifdef CONFIG_EROFS_FS_POSIX_ACL
2023-02-01 14:14:58 +01:00
[ EROFS_XATTR_INDEX_POSIX_ACL_ACCESS ] = & nop_posix_acl_access ,
[ EROFS_XATTR_INDEX_POSIX_ACL_DEFAULT ] = & nop_posix_acl_default ,
2018-07-26 20:21:52 +08:00
# endif
2020-01-02 14:02:32 +02:00
[ EROFS_XATTR_INDEX_TRUSTED ] = & erofs_xattr_trusted_handler ,
2018-07-26 20:21:52 +08:00
# ifdef CONFIG_EROFS_FS_SECURITY
2020-01-02 14:02:32 +02:00
[ EROFS_XATTR_INDEX_SECURITY ] = & erofs_xattr_security_handler ,
2018-07-26 20:21:52 +08:00
# endif
2020-01-02 14:02:32 +02:00
} ;
2019-07-15 17:51:27 +05:30
2023-02-01 14:14:56 +01:00
if ( idx & & idx < ARRAY_SIZE ( xattr_handler_map ) )
handler = xattr_handler_map [ idx ] ;
if ( ! xattr_handler_can_list ( handler , dentry ) )
return NULL ;
return xattr_prefix ( handler ) ;
2018-07-26 20:21:52 +08:00
}
2023-09-30 02:00:12 -03:00
extern const struct xattr_handler * const erofs_xattr_handlers [ ] ;
2019-01-14 19:40:25 +08:00
2023-04-07 22:17:08 +08:00
int erofs_xattr_prefixes_init ( struct super_block * sb ) ;
void erofs_xattr_prefixes_cleanup ( struct super_block * sb ) ;
2018-07-26 20:21:52 +08:00
int erofs_getxattr ( struct inode * , int , const char * , void * , size_t ) ;
ssize_t erofs_listxattr ( struct dentry * , char * , size_t ) ;
# else
2023-04-07 22:17:08 +08:00
static inline int erofs_xattr_prefixes_init ( struct super_block * sb ) { return 0 ; }
static inline void erofs_xattr_prefixes_cleanup ( struct super_block * sb ) { }
2019-07-31 23:57:33 +08:00
static inline int erofs_getxattr ( struct inode * inode , int index ,
const char * name , void * buffer ,
size_t buffer_size )
2018-07-26 20:21:52 +08:00
{
2019-08-14 18:37:05 +08:00
return - EOPNOTSUPP ;
2018-07-26 20:21:52 +08:00
}
2020-05-26 17:03:43 +08:00
# define erofs_listxattr (NULL)
# define erofs_xattr_handlers (NULL)
2019-07-31 23:57:33 +08:00
# endif /* !CONFIG_EROFS_FS_XATTR */
2018-07-26 20:21:52 +08:00
2019-01-29 16:35:20 +08:00
# ifdef CONFIG_EROFS_FS_POSIX_ACL
2021-08-18 22:08:24 +02:00
struct posix_acl * erofs_get_acl ( struct inode * inode , int type , bool rcu ) ;
2019-01-29 16:35:20 +08:00
# else
# define erofs_get_acl (NULL)
# endif
2018-07-26 20:21:52 +08:00
# endif