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 Workerstatic 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 Workerstatic 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