Home | History | Annotate | Download | only in fsck
      1 /**
      2  * xattr.h
      3  *
      4  * Many parts of codes are copied from Linux kernel/fs/f2fs.
      5  *
      6  * Copyright (C) 2015 Huawei Ltd.
      7  * Witten by:
      8  *   Hou Pengyang <houpengyang (at) huawei.com>
      9  *   Liu Shuoran <liushuoran (at) huawei.com>
     10  *   Jaegeuk Kim <jaegeuk (at) kernel.org>
     11  *
     12  * This program is free software; you can redistribute it and/or modify
     13  * it under the terms of the GNU General Public License version 2 as
     14  * published by the Free Software Foundation.
     15  */
     16 #ifndef _XATTR_H_
     17 #define _XATTR_H_
     18 
     19 #include "f2fs.h"
     20 #ifdef HAVE_SYS_XATTR_H
     21 #include <sys/xattr.h>
     22 #endif
     23 
     24 struct f2fs_xattr_header {
     25 	__le32 h_magic;		/* magic number for identification */
     26 	__le32 h_refcount;	/* reference count */
     27 	__u32 h_sloadd[4];	/* zero right now */
     28 };
     29 
     30 struct f2fs_xattr_entry {
     31 	__u8 e_name_index;
     32 	__u8 e_name_len;
     33 	__le16 e_value_size;	/* size of attribute value */
     34 	char e_name[0];		/* attribute name */
     35 };
     36 
     37 #define FS_KEY_DESCRIPTOR_SIZE 8
     38 #define FS_KEY_DERIVATION_NONCE_SIZE 16
     39 
     40 struct fscrypt_context {
     41 	u8 format;
     42 	u8 contents_encryption_mode;
     43 	u8 filenames_encryption_mode;
     44 	u8 flags;
     45 	u8 master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE];
     46 	u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
     47 } __attribute__((packed));
     48 
     49 #define F2FS_ACL_VERSION	0x0001
     50 
     51 struct f2fs_acl_entry {
     52 	__le16 e_tag;
     53 	__le16 e_perm;
     54 	__le32 e_id;
     55 };
     56 
     57 struct f2fs_acl_entry_short {
     58 	__le16 e_tag;
     59 	__le16 e_perm;
     60 };
     61 
     62 struct f2fs_acl_header {
     63 	__le32 a_version;
     64 };
     65 
     66 static inline int f2fs_acl_count(int size)
     67 {
     68 	ssize_t s;
     69 	size -= sizeof(struct f2fs_acl_header);
     70 	s = size - 4 * sizeof(struct f2fs_acl_entry_short);
     71 	if (s < 0) {
     72 		if (size % sizeof(struct f2fs_acl_entry_short))
     73 			return -1;
     74 		return size / sizeof(struct f2fs_acl_entry_short);
     75 	} else {
     76 		if (s % sizeof(struct f2fs_acl_entry))
     77 			return -1;
     78 		return s / sizeof(struct f2fs_acl_entry) + 4;
     79 	}
     80 }
     81 
     82 #ifndef XATTR_USER_PREFIX
     83 #define XATTR_USER_PREFIX	"user."
     84 #endif
     85 #ifndef XATTR_SECURITY_PREFIX
     86 #define XATTR_SECURITY_PREFIX	"security."
     87 #endif
     88 #ifndef XATTR_TRUSTED_PREFIX
     89 #define XATTR_TRUSTED_PREFIX	"trusted."
     90 #endif
     91 
     92 #ifndef XATTR_CREATE
     93 #define XATTR_CREATE 0x1
     94 #endif
     95 #ifndef XATTR_REPLACE
     96 #define XATTR_REPLACE 0x2
     97 #endif
     98 
     99 #define XATTR_ROUND	(3)
    100 
    101 #define XATTR_SELINUX_SUFFIX "selinux"
    102 #define F2FS_XATTR_INDEX_USER			1
    103 #define F2FS_XATTR_INDEX_POSIX_ACL_ACCESS	2
    104 #define F2FS_XATTR_INDEX_POSIX_ACL_DEFAULT	3
    105 #define F2FS_XATTR_INDEX_TRUSTED		4
    106 #define F2FS_XATTR_INDEX_LUSTRE			5
    107 #define F2FS_XATTR_INDEX_SECURITY		6
    108 #define F2FS_XATTR_INDEX_ENCRYPTION		9
    109 
    110 #define IS_XATTR_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0)
    111 
    112 #define XATTR_HDR(ptr)		((struct f2fs_xattr_header *)(ptr))
    113 #define XATTR_ENTRY(ptr) 	((struct f2fs_xattr_entry *)(ptr))
    114 #define F2FS_XATTR_MAGIC	0xF2F52011
    115 
    116 #define XATTR_NEXT_ENTRY(entry) ((struct f2fs_xattr_entry *) ((char *)(entry) +\
    117 					ENTRY_SIZE(entry)))
    118 #define XATTR_FIRST_ENTRY(ptr)	(XATTR_ENTRY(XATTR_HDR(ptr) + 1))
    119 
    120 #define XATTR_ALIGN(size)	((size + XATTR_ROUND) & ~XATTR_ROUND)
    121 
    122 #define ENTRY_SIZE(entry) (XATTR_ALIGN(sizeof(struct f2fs_xattr_entry) + \
    123 			entry->e_name_len + le16_to_cpu(entry->e_value_size)))
    124 
    125 #define list_for_each_xattr(entry, addr) \
    126 	for (entry = XATTR_FIRST_ENTRY(addr); \
    127 			!IS_XATTR_LAST_ENTRY(entry); \
    128 			entry = XATTR_NEXT_ENTRY(entry))
    129 
    130 #define MIN_OFFSET	XATTR_ALIGN(PAGE_SIZE -			\
    131 		sizeof(struct node_footer) - sizeof(__u32))
    132 
    133 #define MAX_VALUE_LEN	(MIN_OFFSET -				\
    134 		sizeof(struct f2fs_xattr_header) -		\
    135 		sizeof(struct f2fs_xattr_entry))
    136 
    137 #endif
    138