xref: /aosp_15_r20/external/f2fs-tools/fsck/xattr.h (revision 59bfda1f02d633cd6b8b69f31eee485d40f6eef6)
1*59bfda1fSAndroid Build Coastguard Worker /**
2*59bfda1fSAndroid Build Coastguard Worker  * xattr.h
3*59bfda1fSAndroid Build Coastguard Worker  *
4*59bfda1fSAndroid Build Coastguard Worker  * Many parts of codes are copied from Linux kernel/fs/f2fs.
5*59bfda1fSAndroid Build Coastguard Worker  *
6*59bfda1fSAndroid Build Coastguard Worker  * Copyright (C) 2015 Huawei Ltd.
7*59bfda1fSAndroid Build Coastguard Worker  * Witten by:
8*59bfda1fSAndroid Build Coastguard Worker  *   Hou Pengyang <[email protected]>
9*59bfda1fSAndroid Build Coastguard Worker  *   Liu Shuoran <[email protected]>
10*59bfda1fSAndroid Build Coastguard Worker  *   Jaegeuk Kim <[email protected]>
11*59bfda1fSAndroid Build Coastguard Worker  *
12*59bfda1fSAndroid Build Coastguard Worker  * This program is free software; you can redistribute it and/or modify
13*59bfda1fSAndroid Build Coastguard Worker  * it under the terms of the GNU General Public License version 2 as
14*59bfda1fSAndroid Build Coastguard Worker  * published by the Free Software Foundation.
15*59bfda1fSAndroid Build Coastguard Worker  */
16*59bfda1fSAndroid Build Coastguard Worker #ifndef _XATTR_H_
17*59bfda1fSAndroid Build Coastguard Worker #define _XATTR_H_
18*59bfda1fSAndroid Build Coastguard Worker 
19*59bfda1fSAndroid Build Coastguard Worker #include "f2fs.h"
20*59bfda1fSAndroid Build Coastguard Worker #ifdef HAVE_SYS_XATTR_H
21*59bfda1fSAndroid Build Coastguard Worker #include <sys/xattr.h>
22*59bfda1fSAndroid Build Coastguard Worker #endif
23*59bfda1fSAndroid Build Coastguard Worker 
24*59bfda1fSAndroid Build Coastguard Worker struct f2fs_xattr_header {
25*59bfda1fSAndroid Build Coastguard Worker 	__le32 h_magic;		/* magic number for identification */
26*59bfda1fSAndroid Build Coastguard Worker 	__le32 h_refcount;	/* reference count */
27*59bfda1fSAndroid Build Coastguard Worker 	__u32 h_sloadd[4];	/* zero right now */
28*59bfda1fSAndroid Build Coastguard Worker };
29*59bfda1fSAndroid Build Coastguard Worker 
30*59bfda1fSAndroid Build Coastguard Worker struct f2fs_xattr_entry {
31*59bfda1fSAndroid Build Coastguard Worker 	__u8 e_name_index;
32*59bfda1fSAndroid Build Coastguard Worker 	__u8 e_name_len;
33*59bfda1fSAndroid Build Coastguard Worker 	__le16 e_value_size;	/* size of attribute value */
34*59bfda1fSAndroid Build Coastguard Worker 	char e_name[0];		/* attribute name */
35*59bfda1fSAndroid Build Coastguard Worker };
36*59bfda1fSAndroid Build Coastguard Worker 
37*59bfda1fSAndroid Build Coastguard Worker #define FSCRYPT_CONTEXT_V1 1
38*59bfda1fSAndroid Build Coastguard Worker #define FSCRYPT_CONTEXT_V2 2
39*59bfda1fSAndroid Build Coastguard Worker #ifndef FSCRYPT_KEY_DESCRIPTOR_SIZE
40*59bfda1fSAndroid Build Coastguard Worker #define FSCRYPT_KEY_DESCRIPTOR_SIZE 8
41*59bfda1fSAndroid Build Coastguard Worker #endif
42*59bfda1fSAndroid Build Coastguard Worker #ifndef FSCRYPT_KEY_IDENTIFIER_SIZE
43*59bfda1fSAndroid Build Coastguard Worker #define FSCRYPT_KEY_IDENTIFIER_SIZE	16
44*59bfda1fSAndroid Build Coastguard Worker #endif
45*59bfda1fSAndroid Build Coastguard Worker #define FSCRYPT_FILE_NONCE_SIZE 16
46*59bfda1fSAndroid Build Coastguard Worker #define F2FS_XATTR_NAME_ENCRYPTION_CONTEXT    "c"
47*59bfda1fSAndroid Build Coastguard Worker 
48*59bfda1fSAndroid Build Coastguard Worker struct fscrypt_context_v1 {
49*59bfda1fSAndroid Build Coastguard Worker 	u8 version; /* FSCRYPT_CONTEXT_V1 */
50*59bfda1fSAndroid Build Coastguard Worker 	u8 contents_encryption_mode;
51*59bfda1fSAndroid Build Coastguard Worker 	u8 filenames_encryption_mode;
52*59bfda1fSAndroid Build Coastguard Worker 	u8 flags;
53*59bfda1fSAndroid Build Coastguard Worker 	u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
54*59bfda1fSAndroid Build Coastguard Worker 	u8 nonce[FSCRYPT_FILE_NONCE_SIZE];
55*59bfda1fSAndroid Build Coastguard Worker };
56*59bfda1fSAndroid Build Coastguard Worker 
57*59bfda1fSAndroid Build Coastguard Worker struct fscrypt_context_v2 {
58*59bfda1fSAndroid Build Coastguard Worker 	u8 version; /* FSCRYPT_CONTEXT_V2 */
59*59bfda1fSAndroid Build Coastguard Worker 	u8 contents_encryption_mode;
60*59bfda1fSAndroid Build Coastguard Worker 	u8 filenames_encryption_mode;
61*59bfda1fSAndroid Build Coastguard Worker 	u8 flags;
62*59bfda1fSAndroid Build Coastguard Worker 	u8 __reserved[4];
63*59bfda1fSAndroid Build Coastguard Worker 	u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
64*59bfda1fSAndroid Build Coastguard Worker 	u8 nonce[FSCRYPT_FILE_NONCE_SIZE];
65*59bfda1fSAndroid Build Coastguard Worker };
66*59bfda1fSAndroid Build Coastguard Worker 
67*59bfda1fSAndroid Build Coastguard Worker union fscrypt_context {
68*59bfda1fSAndroid Build Coastguard Worker 	u8 version;
69*59bfda1fSAndroid Build Coastguard Worker 	struct fscrypt_context_v1 v1;
70*59bfda1fSAndroid Build Coastguard Worker 	struct fscrypt_context_v2 v2;
71*59bfda1fSAndroid Build Coastguard Worker };
72*59bfda1fSAndroid Build Coastguard Worker 
73*59bfda1fSAndroid Build Coastguard Worker static_assert(sizeof(struct fscrypt_context_v1) == 28, "");
74*59bfda1fSAndroid Build Coastguard Worker static_assert(sizeof(struct fscrypt_context_v2) == 40, "");
75*59bfda1fSAndroid Build Coastguard Worker 
76*59bfda1fSAndroid Build Coastguard Worker /*
77*59bfda1fSAndroid Build Coastguard Worker * Return the size expected for the given fscrypt_context based on its version
78*59bfda1fSAndroid Build Coastguard Worker * number, or 0 if the context version is unrecognized.
79*59bfda1fSAndroid Build Coastguard Worker */
fscrypt_context_size(const union fscrypt_context * ctx)80*59bfda1fSAndroid Build Coastguard Worker static inline int fscrypt_context_size(const union fscrypt_context *ctx)
81*59bfda1fSAndroid Build Coastguard Worker {
82*59bfda1fSAndroid Build Coastguard Worker 	switch (ctx->version) {
83*59bfda1fSAndroid Build Coastguard Worker 	case FSCRYPT_CONTEXT_V1:
84*59bfda1fSAndroid Build Coastguard Worker 		return sizeof(ctx->v1);
85*59bfda1fSAndroid Build Coastguard Worker 	case FSCRYPT_CONTEXT_V2:
86*59bfda1fSAndroid Build Coastguard Worker 		return sizeof(ctx->v2);
87*59bfda1fSAndroid Build Coastguard Worker 	default:
88*59bfda1fSAndroid Build Coastguard Worker 		MSG(0, "Unsupported fscrypt_context format!\n");
89*59bfda1fSAndroid Build Coastguard Worker 	}
90*59bfda1fSAndroid Build Coastguard Worker 	return 0;
91*59bfda1fSAndroid Build Coastguard Worker }
92*59bfda1fSAndroid Build Coastguard Worker 
93*59bfda1fSAndroid Build Coastguard Worker struct fsverity_descriptor_location {
94*59bfda1fSAndroid Build Coastguard Worker 	__le32 version;
95*59bfda1fSAndroid Build Coastguard Worker 	__le32 size;
96*59bfda1fSAndroid Build Coastguard Worker 	__le64 pos;
97*59bfda1fSAndroid Build Coastguard Worker };
98*59bfda1fSAndroid Build Coastguard Worker 
99*59bfda1fSAndroid Build Coastguard Worker static_assert(sizeof(struct fsverity_descriptor_location) == 16, "");
100*59bfda1fSAndroid Build Coastguard Worker 
101*59bfda1fSAndroid Build Coastguard Worker #define F2FS_ACL_VERSION	0x0001
102*59bfda1fSAndroid Build Coastguard Worker 
103*59bfda1fSAndroid Build Coastguard Worker struct f2fs_acl_entry {
104*59bfda1fSAndroid Build Coastguard Worker 	__le16 e_tag;
105*59bfda1fSAndroid Build Coastguard Worker 	__le16 e_perm;
106*59bfda1fSAndroid Build Coastguard Worker 	__le32 e_id;
107*59bfda1fSAndroid Build Coastguard Worker };
108*59bfda1fSAndroid Build Coastguard Worker 
109*59bfda1fSAndroid Build Coastguard Worker struct f2fs_acl_entry_short {
110*59bfda1fSAndroid Build Coastguard Worker 	__le16 e_tag;
111*59bfda1fSAndroid Build Coastguard Worker 	__le16 e_perm;
112*59bfda1fSAndroid Build Coastguard Worker };
113*59bfda1fSAndroid Build Coastguard Worker 
114*59bfda1fSAndroid Build Coastguard Worker struct f2fs_acl_header {
115*59bfda1fSAndroid Build Coastguard Worker 	__le32 a_version;
116*59bfda1fSAndroid Build Coastguard Worker };
117*59bfda1fSAndroid Build Coastguard Worker 
f2fs_acl_count(int size)118*59bfda1fSAndroid Build Coastguard Worker static inline int f2fs_acl_count(int size)
119*59bfda1fSAndroid Build Coastguard Worker {
120*59bfda1fSAndroid Build Coastguard Worker 	ssize_t s;
121*59bfda1fSAndroid Build Coastguard Worker 	size -= sizeof(struct f2fs_acl_header);
122*59bfda1fSAndroid Build Coastguard Worker 	s = size - 4 * sizeof(struct f2fs_acl_entry_short);
123*59bfda1fSAndroid Build Coastguard Worker 	if (s < 0) {
124*59bfda1fSAndroid Build Coastguard Worker 		if (size % sizeof(struct f2fs_acl_entry_short))
125*59bfda1fSAndroid Build Coastguard Worker 			return -1;
126*59bfda1fSAndroid Build Coastguard Worker 		return size / sizeof(struct f2fs_acl_entry_short);
127*59bfda1fSAndroid Build Coastguard Worker 	} else {
128*59bfda1fSAndroid Build Coastguard Worker 		if (s % sizeof(struct f2fs_acl_entry))
129*59bfda1fSAndroid Build Coastguard Worker 			return -1;
130*59bfda1fSAndroid Build Coastguard Worker 		return s / sizeof(struct f2fs_acl_entry) + 4;
131*59bfda1fSAndroid Build Coastguard Worker 	}
132*59bfda1fSAndroid Build Coastguard Worker }
133*59bfda1fSAndroid Build Coastguard Worker 
134*59bfda1fSAndroid Build Coastguard Worker #ifndef XATTR_USER_PREFIX
135*59bfda1fSAndroid Build Coastguard Worker #define XATTR_USER_PREFIX	"user."
136*59bfda1fSAndroid Build Coastguard Worker #endif
137*59bfda1fSAndroid Build Coastguard Worker #ifndef XATTR_SECURITY_PREFIX
138*59bfda1fSAndroid Build Coastguard Worker #define XATTR_SECURITY_PREFIX	"security."
139*59bfda1fSAndroid Build Coastguard Worker #endif
140*59bfda1fSAndroid Build Coastguard Worker #ifndef XATTR_TRUSTED_PREFIX
141*59bfda1fSAndroid Build Coastguard Worker #define XATTR_TRUSTED_PREFIX	"trusted."
142*59bfda1fSAndroid Build Coastguard Worker #endif
143*59bfda1fSAndroid Build Coastguard Worker 
144*59bfda1fSAndroid Build Coastguard Worker #ifndef XATTR_CREATE
145*59bfda1fSAndroid Build Coastguard Worker #define XATTR_CREATE 0x1
146*59bfda1fSAndroid Build Coastguard Worker #endif
147*59bfda1fSAndroid Build Coastguard Worker #ifndef XATTR_REPLACE
148*59bfda1fSAndroid Build Coastguard Worker #define XATTR_REPLACE 0x2
149*59bfda1fSAndroid Build Coastguard Worker #endif
150*59bfda1fSAndroid Build Coastguard Worker 
151*59bfda1fSAndroid Build Coastguard Worker #define XATTR_ROUND	(3)
152*59bfda1fSAndroid Build Coastguard Worker 
153*59bfda1fSAndroid Build Coastguard Worker #define XATTR_SELINUX_SUFFIX "selinux"
154*59bfda1fSAndroid Build Coastguard Worker #define F2FS_XATTR_INDEX_USER			1
155*59bfda1fSAndroid Build Coastguard Worker #define F2FS_XATTR_INDEX_POSIX_ACL_ACCESS	2
156*59bfda1fSAndroid Build Coastguard Worker #define F2FS_XATTR_INDEX_POSIX_ACL_DEFAULT	3
157*59bfda1fSAndroid Build Coastguard Worker #define F2FS_XATTR_INDEX_TRUSTED		4
158*59bfda1fSAndroid Build Coastguard Worker #define F2FS_XATTR_INDEX_LUSTRE			5
159*59bfda1fSAndroid Build Coastguard Worker #define F2FS_XATTR_INDEX_SECURITY		6
160*59bfda1fSAndroid Build Coastguard Worker #define F2FS_XATTR_INDEX_ENCRYPTION		9
161*59bfda1fSAndroid Build Coastguard Worker #define F2FS_XATTR_INDEX_VERITY			11
162*59bfda1fSAndroid Build Coastguard Worker 
163*59bfda1fSAndroid Build Coastguard Worker #define F2FS_XATTR_NAME_VERITY			"v"
164*59bfda1fSAndroid Build Coastguard Worker 
165*59bfda1fSAndroid Build Coastguard Worker #define IS_XATTR_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0)
166*59bfda1fSAndroid Build Coastguard Worker 
167*59bfda1fSAndroid Build Coastguard Worker #define XATTR_HDR(ptr)		((struct f2fs_xattr_header *)(ptr))
168*59bfda1fSAndroid Build Coastguard Worker #define XATTR_ENTRY(ptr) 	((struct f2fs_xattr_entry *)(ptr))
169*59bfda1fSAndroid Build Coastguard Worker #define F2FS_XATTR_MAGIC	0xF2F52011
170*59bfda1fSAndroid Build Coastguard Worker 
171*59bfda1fSAndroid Build Coastguard Worker #define XATTR_NEXT_ENTRY(entry) ((struct f2fs_xattr_entry *) ((char *)(entry) +\
172*59bfda1fSAndroid Build Coastguard Worker 					ENTRY_SIZE(entry)))
173*59bfda1fSAndroid Build Coastguard Worker #define XATTR_FIRST_ENTRY(ptr)	(XATTR_ENTRY(XATTR_HDR(ptr) + 1))
174*59bfda1fSAndroid Build Coastguard Worker 
175*59bfda1fSAndroid Build Coastguard Worker #define XATTR_ALIGN(size)	((size + XATTR_ROUND) & ~XATTR_ROUND)
176*59bfda1fSAndroid Build Coastguard Worker 
177*59bfda1fSAndroid Build Coastguard Worker #define ENTRY_SIZE(entry) (XATTR_ALIGN(sizeof(struct f2fs_xattr_entry) + \
178*59bfda1fSAndroid Build Coastguard Worker 			entry->e_name_len + le16_to_cpu(entry->e_value_size)))
179*59bfda1fSAndroid Build Coastguard Worker 
180*59bfda1fSAndroid Build Coastguard Worker #define list_for_each_xattr(entry, addr) \
181*59bfda1fSAndroid Build Coastguard Worker 	for (entry = XATTR_FIRST_ENTRY(addr); \
182*59bfda1fSAndroid Build Coastguard Worker 			!IS_XATTR_LAST_ENTRY(entry); \
183*59bfda1fSAndroid Build Coastguard Worker 			entry = XATTR_NEXT_ENTRY(entry))
184*59bfda1fSAndroid Build Coastguard Worker 
185*59bfda1fSAndroid Build Coastguard Worker #define VALID_XATTR_BLOCK_SIZE	(F2FS_BLKSIZE - sizeof(struct node_footer))
186*59bfda1fSAndroid Build Coastguard Worker 
187*59bfda1fSAndroid Build Coastguard Worker #define XATTR_SIZE(i)		((le32_to_cpu((i)->i_xattr_nid) ?	\
188*59bfda1fSAndroid Build Coastguard Worker 					VALID_XATTR_BLOCK_SIZE : 0) +	\
189*59bfda1fSAndroid Build Coastguard Worker 						(inline_xattr_size(i)))
190*59bfda1fSAndroid Build Coastguard Worker 
191*59bfda1fSAndroid Build Coastguard Worker #define MIN_OFFSET	XATTR_ALIGN(F2FS_BLKSIZE -		\
192*59bfda1fSAndroid Build Coastguard Worker 		sizeof(struct node_footer) - sizeof(__u32))
193*59bfda1fSAndroid Build Coastguard Worker 
194*59bfda1fSAndroid Build Coastguard Worker #define MAX_VALUE_LEN	(MIN_OFFSET -				\
195*59bfda1fSAndroid Build Coastguard Worker 		sizeof(struct f2fs_xattr_header) -		\
196*59bfda1fSAndroid Build Coastguard Worker 		sizeof(struct f2fs_xattr_entry))
197*59bfda1fSAndroid Build Coastguard Worker 
198*59bfda1fSAndroid Build Coastguard Worker #define MAX_INLINE_XATTR_SIZE						\
199*59bfda1fSAndroid Build Coastguard Worker 			(DEF_ADDRS_PER_INODE -				\
200*59bfda1fSAndroid Build Coastguard Worker 			F2FS_TOTAL_EXTRA_ATTR_SIZE / sizeof(__le32) -	\
201*59bfda1fSAndroid Build Coastguard Worker 			DEF_INLINE_RESERVED_SIZE -			\
202*59bfda1fSAndroid Build Coastguard Worker 			MIN_INLINE_DENTRY_SIZE / sizeof(__le32))
203*59bfda1fSAndroid Build Coastguard Worker #endif
204