Namjae Jeon | 8b75885 | 2021-06-29 14:52:00 +0900 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
| 2 | /* |
| 3 | * Copyright (C) 2021 Samsung Electronics Co., Ltd. |
| 4 | */ |
| 5 | |
| 6 | #ifndef __XATTR_H__ |
| 7 | #define __XATTR_H__ |
| 8 | |
| 9 | /* |
| 10 | * These are on-disk structures to store additional metadata into xattr to |
| 11 | * reproduce windows filesystem semantics. And they are encoded with NDR to |
| 12 | * compatible with samba's xattr meta format. The compatibility with samba |
| 13 | * is important because it can lose the information(file attribute, |
| 14 | * creation time, acls) about the existing files when switching between |
| 15 | * ksmbd and samba. |
| 16 | */ |
| 17 | |
| 18 | /* |
| 19 | * Dos attribute flags used for what variable is valid. |
| 20 | */ |
| 21 | enum { |
| 22 | XATTR_DOSINFO_ATTRIB = 0x00000001, |
| 23 | XATTR_DOSINFO_EA_SIZE = 0x00000002, |
| 24 | XATTR_DOSINFO_SIZE = 0x00000004, |
| 25 | XATTR_DOSINFO_ALLOC_SIZE = 0x00000008, |
| 26 | XATTR_DOSINFO_CREATE_TIME = 0x00000010, |
| 27 | XATTR_DOSINFO_CHANGE_TIME = 0x00000020, |
| 28 | XATTR_DOSINFO_ITIME = 0x00000040 |
| 29 | }; |
| 30 | |
| 31 | /* |
| 32 | * Dos attribute structure which is compatible with samba's one. |
| 33 | * Storing it into the xattr named "DOSATTRIB" separately from inode |
| 34 | * allows ksmbd to faithfully reproduce windows filesystem semantics |
| 35 | * on top of a POSIX filesystem. |
| 36 | */ |
| 37 | struct xattr_dos_attrib { |
| 38 | __u16 version; /* version 3 or version 4 */ |
| 39 | __u32 flags; /* valid flags */ |
| 40 | __u32 attr; /* Dos attribute */ |
| 41 | __u32 ea_size; /* EA size */ |
| 42 | __u64 size; |
| 43 | __u64 alloc_size; |
| 44 | __u64 create_time; /* File creation time */ |
| 45 | __u64 change_time; /* File change time */ |
| 46 | __u64 itime; /* Invented/Initial time */ |
| 47 | }; |
| 48 | |
| 49 | /* |
| 50 | * Enumeration is used for computing posix acl hash. |
| 51 | */ |
| 52 | enum { |
| 53 | SMB_ACL_TAG_INVALID = 0, |
| 54 | SMB_ACL_USER, |
| 55 | SMB_ACL_USER_OBJ, |
| 56 | SMB_ACL_GROUP, |
| 57 | SMB_ACL_GROUP_OBJ, |
| 58 | SMB_ACL_OTHER, |
| 59 | SMB_ACL_MASK |
| 60 | }; |
| 61 | |
| 62 | #define SMB_ACL_READ 4 |
| 63 | #define SMB_ACL_WRITE 2 |
| 64 | #define SMB_ACL_EXECUTE 1 |
| 65 | |
| 66 | struct xattr_acl_entry { |
| 67 | int type; |
| 68 | uid_t uid; |
| 69 | gid_t gid; |
| 70 | mode_t perm; |
| 71 | }; |
| 72 | |
| 73 | /* |
| 74 | * xattr_smb_acl structure is used for computing posix acl hash. |
| 75 | */ |
| 76 | struct xattr_smb_acl { |
| 77 | int count; |
| 78 | int next; |
| 79 | struct xattr_acl_entry entries[0]; |
| 80 | }; |
| 81 | |
| 82 | /* 64bytes hash in xattr_ntacl is computed with sha256 */ |
| 83 | #define XATTR_SD_HASH_TYPE_SHA256 0x1 |
| 84 | #define XATTR_SD_HASH_SIZE 64 |
| 85 | |
| 86 | /* |
| 87 | * xattr_ntacl is used for storing ntacl and hashes. |
| 88 | * Hash is used for checking valid posix acl and ntacl in xattr. |
| 89 | */ |
| 90 | struct xattr_ntacl { |
| 91 | __u16 version; /* version 4*/ |
| 92 | void *sd_buf; |
| 93 | __u32 sd_size; |
| 94 | __u16 hash_type; /* hash type */ |
| 95 | __u8 desc[10]; /* posix_acl description */ |
| 96 | __u16 desc_len; |
| 97 | __u64 current_time; |
| 98 | __u8 hash[XATTR_SD_HASH_SIZE]; /* 64bytes hash for ntacl */ |
| 99 | __u8 posix_acl_hash[XATTR_SD_HASH_SIZE]; /* 64bytes hash for posix acl */ |
| 100 | }; |
| 101 | |
| 102 | /* DOS ATTRIBUITE XATTR PREFIX */ |
| 103 | #define DOS_ATTRIBUTE_PREFIX "DOSATTRIB" |
| 104 | #define DOS_ATTRIBUTE_PREFIX_LEN (sizeof(DOS_ATTRIBUTE_PREFIX) - 1) |
| 105 | #define XATTR_NAME_DOS_ATTRIBUTE (XATTR_USER_PREFIX DOS_ATTRIBUTE_PREFIX) |
| 106 | #define XATTR_NAME_DOS_ATTRIBUTE_LEN \ |
| 107 | (sizeof(XATTR_USER_PREFIX DOS_ATTRIBUTE_PREFIX) - 1) |
| 108 | |
| 109 | /* STREAM XATTR PREFIX */ |
| 110 | #define STREAM_PREFIX "DosStream." |
| 111 | #define STREAM_PREFIX_LEN (sizeof(STREAM_PREFIX) - 1) |
| 112 | #define XATTR_NAME_STREAM (XATTR_USER_PREFIX STREAM_PREFIX) |
| 113 | #define XATTR_NAME_STREAM_LEN (sizeof(XATTR_NAME_STREAM) - 1) |
| 114 | |
| 115 | /* SECURITY DESCRIPTOR(NTACL) XATTR PREFIX */ |
| 116 | #define SD_PREFIX "NTACL" |
| 117 | #define SD_PREFIX_LEN (sizeof(SD_PREFIX) - 1) |
| 118 | #define XATTR_NAME_SD (XATTR_SECURITY_PREFIX SD_PREFIX) |
| 119 | #define XATTR_NAME_SD_LEN \ |
| 120 | (sizeof(XATTR_SECURITY_PREFIX SD_PREFIX) - 1) |
| 121 | |
| 122 | #endif /* __XATTR_H__ */ |