2019-07-31 18:57:31 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
/*
2018-07-26 15:21:52 +03:00
* Copyright ( C ) 2017 - 2018 HUAWEI , Inc .
2020-07-13 16:09:44 +03:00
* https : //www.huawei.com/
2018-07-26 15:21:52 +03:00
* Created by Gao Xiang < gaoxiang25 @ huawei . com >
*/
# 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-15 15:21:27 +03:00
static inline unsigned int inlinexattr_header_size ( struct inode * inode )
2018-07-26 15:21:52 +03:00
{
2019-09-04 05:08:56 +03:00
return sizeof ( struct erofs_xattr_ibody_header ) +
sizeof ( u32 ) * EROFS_I ( inode ) - > xattr_shared_count ;
2018-07-26 15:21:52 +03:00
}
2019-07-15 15:21:27 +03:00
static inline erofs_blk_t xattrblock_addr ( struct erofs_sb_info * sbi ,
unsigned int xattr_id )
2018-07-26 15:21:52 +03:00
{
# ifdef CONFIG_EROFS_FS_XATTR
return sbi - > xattr_blkaddr +
xattr_id * sizeof ( __u32 ) / EROFS_BLKSIZ ;
# else
return 0 ;
# endif
}
2019-07-15 15:21:27 +03:00
static inline unsigned int xattrblock_offset ( struct erofs_sb_info * sbi ,
unsigned int xattr_id )
2018-07-26 15:21:52 +03:00
{
return ( xattr_id * sizeof ( __u32 ) ) % EROFS_BLKSIZ ;
}
2019-07-31 18:57:33 +03:00
# ifdef CONFIG_EROFS_FS_XATTR
2018-07-26 15:21:52 +03:00
extern const struct xattr_handler erofs_xattr_user_handler ;
extern const struct xattr_handler erofs_xattr_trusted_handler ;
# ifdef CONFIG_EROFS_FS_SECURITY
extern const struct xattr_handler erofs_xattr_security_handler ;
# endif
2019-07-15 15:21:27 +03:00
static inline const struct xattr_handler * erofs_xattr_handler ( unsigned int idx )
2018-07-26 15:21:52 +03:00
{
2020-01-02 15:02:32 +03:00
static const struct xattr_handler * xattr_handler_map [ ] = {
[ EROFS_XATTR_INDEX_USER ] = & erofs_xattr_user_handler ,
2018-07-26 15:21:52 +03:00
# ifdef CONFIG_EROFS_FS_POSIX_ACL
2020-01-02 15:02:32 +03:00
[ EROFS_XATTR_INDEX_POSIX_ACL_ACCESS ] =
& posix_acl_access_xattr_handler ,
[ EROFS_XATTR_INDEX_POSIX_ACL_DEFAULT ] =
& posix_acl_default_xattr_handler ,
2018-07-26 15:21:52 +03:00
# endif
2020-01-02 15:02:32 +03:00
[ EROFS_XATTR_INDEX_TRUSTED ] = & erofs_xattr_trusted_handler ,
2018-07-26 15:21:52 +03:00
# ifdef CONFIG_EROFS_FS_SECURITY
2020-01-02 15:02:32 +03:00
[ EROFS_XATTR_INDEX_SECURITY ] = & erofs_xattr_security_handler ,
2018-07-26 15:21:52 +03:00
# endif
2020-01-02 15:02:32 +03:00
} ;
2019-07-15 15:21:27 +03:00
return idx & & idx < ARRAY_SIZE ( xattr_handler_map ) ?
xattr_handler_map [ idx ] : NULL ;
2018-07-26 15:21:52 +03:00
}
2019-01-14 14:40:25 +03:00
extern const struct xattr_handler * erofs_xattr_handlers [ ] ;
2018-07-26 15:21:52 +03:00
int erofs_getxattr ( struct inode * , int , const char * , void * , size_t ) ;
ssize_t erofs_listxattr ( struct dentry * , char * , size_t ) ;
# else
2019-07-31 18:57:33 +03:00
static inline int erofs_getxattr ( struct inode * inode , int index ,
const char * name , void * buffer ,
size_t buffer_size )
2018-07-26 15:21:52 +03:00
{
2019-08-14 13:37:05 +03:00
return - EOPNOTSUPP ;
2018-07-26 15:21:52 +03:00
}
2020-05-26 12:03:43 +03:00
# define erofs_listxattr (NULL)
# define erofs_xattr_handlers (NULL)
2019-07-31 18:57:33 +03:00
# endif /* !CONFIG_EROFS_FS_XATTR */
2018-07-26 15:21:52 +03:00
2019-01-29 11:35:20 +03:00
# ifdef CONFIG_EROFS_FS_POSIX_ACL
struct posix_acl * erofs_get_acl ( struct inode * inode , int type ) ;
# else
# define erofs_get_acl (NULL)
# endif
2018-07-26 15:21:52 +03:00
# endif