162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci  File: linux/ext2_xattr.h
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci  On-disk format of extended attributes for the ext2 filesystem.
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci  (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org>
862306a36Sopenharmony_ci*/
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/init.h>
1162306a36Sopenharmony_ci#include <linux/xattr.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/* Magic value in attribute blocks */
1462306a36Sopenharmony_ci#define EXT2_XATTR_MAGIC		0xEA020000
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/* Maximum number of references to one attribute block */
1762306a36Sopenharmony_ci#define EXT2_XATTR_REFCOUNT_MAX		1024
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/* Name indexes */
2062306a36Sopenharmony_ci#define EXT2_XATTR_INDEX_USER			1
2162306a36Sopenharmony_ci#define EXT2_XATTR_INDEX_POSIX_ACL_ACCESS	2
2262306a36Sopenharmony_ci#define EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT	3
2362306a36Sopenharmony_ci#define EXT2_XATTR_INDEX_TRUSTED		4
2462306a36Sopenharmony_ci#define	EXT2_XATTR_INDEX_LUSTRE			5
2562306a36Sopenharmony_ci#define EXT2_XATTR_INDEX_SECURITY	        6
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistruct ext2_xattr_header {
2862306a36Sopenharmony_ci	__le32	h_magic;	/* magic number for identification */
2962306a36Sopenharmony_ci	__le32	h_refcount;	/* reference count */
3062306a36Sopenharmony_ci	__le32	h_blocks;	/* number of disk blocks used */
3162306a36Sopenharmony_ci	__le32	h_hash;		/* hash value of all attributes */
3262306a36Sopenharmony_ci	__u32	h_reserved[4];	/* zero right now */
3362306a36Sopenharmony_ci};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistruct ext2_xattr_entry {
3662306a36Sopenharmony_ci	__u8	e_name_len;	/* length of name */
3762306a36Sopenharmony_ci	__u8	e_name_index;	/* attribute name index */
3862306a36Sopenharmony_ci	__le16	e_value_offs;	/* offset in disk block of value */
3962306a36Sopenharmony_ci	__le32	e_value_block;	/* disk block attribute is stored on (n/i) */
4062306a36Sopenharmony_ci	__le32	e_value_size;	/* size of attribute value */
4162306a36Sopenharmony_ci	__le32	e_hash;		/* hash value of name and value */
4262306a36Sopenharmony_ci	char	e_name[];	/* attribute name */
4362306a36Sopenharmony_ci};
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci#define EXT2_XATTR_PAD_BITS		2
4662306a36Sopenharmony_ci#define EXT2_XATTR_PAD		(1<<EXT2_XATTR_PAD_BITS)
4762306a36Sopenharmony_ci#define EXT2_XATTR_ROUND		(EXT2_XATTR_PAD-1)
4862306a36Sopenharmony_ci#define EXT2_XATTR_LEN(name_len) \
4962306a36Sopenharmony_ci	(((name_len) + EXT2_XATTR_ROUND + \
5062306a36Sopenharmony_ci	sizeof(struct ext2_xattr_entry)) & ~EXT2_XATTR_ROUND)
5162306a36Sopenharmony_ci#define EXT2_XATTR_NEXT(entry) \
5262306a36Sopenharmony_ci	( (struct ext2_xattr_entry *)( \
5362306a36Sopenharmony_ci	  (char *)(entry) + EXT2_XATTR_LEN((entry)->e_name_len)) )
5462306a36Sopenharmony_ci#define EXT2_XATTR_SIZE(size) \
5562306a36Sopenharmony_ci	(((size) + EXT2_XATTR_ROUND) & ~EXT2_XATTR_ROUND)
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistruct mb_cache;
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci# ifdef CONFIG_EXT2_FS_XATTR
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ciextern const struct xattr_handler ext2_xattr_user_handler;
6262306a36Sopenharmony_ciextern const struct xattr_handler ext2_xattr_trusted_handler;
6362306a36Sopenharmony_ciextern const struct xattr_handler ext2_xattr_security_handler;
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ciextern ssize_t ext2_listxattr(struct dentry *, char *, size_t);
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ciextern int ext2_xattr_get(struct inode *, int, const char *, void *, size_t);
6862306a36Sopenharmony_ciextern int ext2_xattr_set(struct inode *, int, const char *, const void *, size_t, int);
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ciextern void ext2_xattr_delete_inode(struct inode *);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ciextern struct mb_cache *ext2_xattr_create_cache(void);
7362306a36Sopenharmony_ciextern void ext2_xattr_destroy_cache(struct mb_cache *cache);
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ciextern const struct xattr_handler *ext2_xattr_handlers[];
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci# else  /* CONFIG_EXT2_FS_XATTR */
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cistatic inline int
8062306a36Sopenharmony_ciext2_xattr_get(struct inode *inode, int name_index,
8162306a36Sopenharmony_ci	       const char *name, void *buffer, size_t size)
8262306a36Sopenharmony_ci{
8362306a36Sopenharmony_ci	return -EOPNOTSUPP;
8462306a36Sopenharmony_ci}
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistatic inline int
8762306a36Sopenharmony_ciext2_xattr_set(struct inode *inode, int name_index, const char *name,
8862306a36Sopenharmony_ci	       const void *value, size_t size, int flags)
8962306a36Sopenharmony_ci{
9062306a36Sopenharmony_ci	return -EOPNOTSUPP;
9162306a36Sopenharmony_ci}
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_cistatic inline void
9462306a36Sopenharmony_ciext2_xattr_delete_inode(struct inode *inode)
9562306a36Sopenharmony_ci{
9662306a36Sopenharmony_ci}
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_cistatic inline void ext2_xattr_destroy_cache(struct mb_cache *cache)
9962306a36Sopenharmony_ci{
10062306a36Sopenharmony_ci}
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci#define ext2_xattr_handlers NULL
10362306a36Sopenharmony_ci#define ext2_listxattr NULL
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci# endif  /* CONFIG_EXT2_FS_XATTR */
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci#ifdef CONFIG_EXT2_FS_SECURITY
10862306a36Sopenharmony_ciextern int ext2_init_security(struct inode *inode, struct inode *dir,
10962306a36Sopenharmony_ci			      const struct qstr *qstr);
11062306a36Sopenharmony_ci#else
11162306a36Sopenharmony_cistatic inline int ext2_init_security(struct inode *inode, struct inode *dir,
11262306a36Sopenharmony_ci				     const struct qstr *qstr)
11362306a36Sopenharmony_ci{
11462306a36Sopenharmony_ci	return 0;
11562306a36Sopenharmony_ci}
11662306a36Sopenharmony_ci#endif
117