162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2021 Samsung Electronics Co., Ltd. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef __XATTR_H__ 762306a36Sopenharmony_ci#define __XATTR_H__ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci/* 1062306a36Sopenharmony_ci * These are on-disk structures to store additional metadata into xattr to 1162306a36Sopenharmony_ci * reproduce windows filesystem semantics. And they are encoded with NDR to 1262306a36Sopenharmony_ci * compatible with samba's xattr meta format. The compatibility with samba 1362306a36Sopenharmony_ci * is important because it can lose the information(file attribute, 1462306a36Sopenharmony_ci * creation time, acls) about the existing files when switching between 1562306a36Sopenharmony_ci * ksmbd and samba. 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci/* 1962306a36Sopenharmony_ci * Dos attribute flags used for what variable is valid. 2062306a36Sopenharmony_ci */ 2162306a36Sopenharmony_cienum { 2262306a36Sopenharmony_ci XATTR_DOSINFO_ATTRIB = 0x00000001, 2362306a36Sopenharmony_ci XATTR_DOSINFO_EA_SIZE = 0x00000002, 2462306a36Sopenharmony_ci XATTR_DOSINFO_SIZE = 0x00000004, 2562306a36Sopenharmony_ci XATTR_DOSINFO_ALLOC_SIZE = 0x00000008, 2662306a36Sopenharmony_ci XATTR_DOSINFO_CREATE_TIME = 0x00000010, 2762306a36Sopenharmony_ci XATTR_DOSINFO_CHANGE_TIME = 0x00000020, 2862306a36Sopenharmony_ci XATTR_DOSINFO_ITIME = 0x00000040 2962306a36Sopenharmony_ci}; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci/* 3262306a36Sopenharmony_ci * Dos attribute structure which is compatible with samba's one. 3362306a36Sopenharmony_ci * Storing it into the xattr named "DOSATTRIB" separately from inode 3462306a36Sopenharmony_ci * allows ksmbd to faithfully reproduce windows filesystem semantics 3562306a36Sopenharmony_ci * on top of a POSIX filesystem. 3662306a36Sopenharmony_ci */ 3762306a36Sopenharmony_cistruct xattr_dos_attrib { 3862306a36Sopenharmony_ci __u16 version; /* version 3 or version 4 */ 3962306a36Sopenharmony_ci __u32 flags; /* valid flags */ 4062306a36Sopenharmony_ci __u32 attr; /* Dos attribute */ 4162306a36Sopenharmony_ci __u32 ea_size; /* EA size */ 4262306a36Sopenharmony_ci __u64 size; 4362306a36Sopenharmony_ci __u64 alloc_size; 4462306a36Sopenharmony_ci __u64 create_time; /* File creation time */ 4562306a36Sopenharmony_ci __u64 change_time; /* File change time */ 4662306a36Sopenharmony_ci __u64 itime; /* Invented/Initial time */ 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* 5062306a36Sopenharmony_ci * Enumeration is used for computing posix acl hash. 5162306a36Sopenharmony_ci */ 5262306a36Sopenharmony_cienum { 5362306a36Sopenharmony_ci SMB_ACL_TAG_INVALID = 0, 5462306a36Sopenharmony_ci SMB_ACL_USER, 5562306a36Sopenharmony_ci SMB_ACL_USER_OBJ, 5662306a36Sopenharmony_ci SMB_ACL_GROUP, 5762306a36Sopenharmony_ci SMB_ACL_GROUP_OBJ, 5862306a36Sopenharmony_ci SMB_ACL_OTHER, 5962306a36Sopenharmony_ci SMB_ACL_MASK 6062306a36Sopenharmony_ci}; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci#define SMB_ACL_READ 4 6362306a36Sopenharmony_ci#define SMB_ACL_WRITE 2 6462306a36Sopenharmony_ci#define SMB_ACL_EXECUTE 1 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistruct xattr_acl_entry { 6762306a36Sopenharmony_ci int type; 6862306a36Sopenharmony_ci uid_t uid; 6962306a36Sopenharmony_ci gid_t gid; 7062306a36Sopenharmony_ci mode_t perm; 7162306a36Sopenharmony_ci}; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci/* 7462306a36Sopenharmony_ci * xattr_smb_acl structure is used for computing posix acl hash. 7562306a36Sopenharmony_ci */ 7662306a36Sopenharmony_cistruct xattr_smb_acl { 7762306a36Sopenharmony_ci int count; 7862306a36Sopenharmony_ci int next; 7962306a36Sopenharmony_ci struct xattr_acl_entry entries[]; 8062306a36Sopenharmony_ci}; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci/* 64bytes hash in xattr_ntacl is computed with sha256 */ 8362306a36Sopenharmony_ci#define XATTR_SD_HASH_TYPE_SHA256 0x1 8462306a36Sopenharmony_ci#define XATTR_SD_HASH_SIZE 64 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci/* 8762306a36Sopenharmony_ci * xattr_ntacl is used for storing ntacl and hashes. 8862306a36Sopenharmony_ci * Hash is used for checking valid posix acl and ntacl in xattr. 8962306a36Sopenharmony_ci */ 9062306a36Sopenharmony_cistruct xattr_ntacl { 9162306a36Sopenharmony_ci __u16 version; /* version 4*/ 9262306a36Sopenharmony_ci void *sd_buf; 9362306a36Sopenharmony_ci __u32 sd_size; 9462306a36Sopenharmony_ci __u16 hash_type; /* hash type */ 9562306a36Sopenharmony_ci __u8 desc[10]; /* posix_acl description */ 9662306a36Sopenharmony_ci __u16 desc_len; 9762306a36Sopenharmony_ci __u64 current_time; 9862306a36Sopenharmony_ci __u8 hash[XATTR_SD_HASH_SIZE]; /* 64bytes hash for ntacl */ 9962306a36Sopenharmony_ci __u8 posix_acl_hash[XATTR_SD_HASH_SIZE]; /* 64bytes hash for posix acl */ 10062306a36Sopenharmony_ci}; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci/* DOS ATTRIBUITE XATTR PREFIX */ 10362306a36Sopenharmony_ci#define DOS_ATTRIBUTE_PREFIX "DOSATTRIB" 10462306a36Sopenharmony_ci#define DOS_ATTRIBUTE_PREFIX_LEN (sizeof(DOS_ATTRIBUTE_PREFIX) - 1) 10562306a36Sopenharmony_ci#define XATTR_NAME_DOS_ATTRIBUTE (XATTR_USER_PREFIX DOS_ATTRIBUTE_PREFIX) 10662306a36Sopenharmony_ci#define XATTR_NAME_DOS_ATTRIBUTE_LEN \ 10762306a36Sopenharmony_ci (sizeof(XATTR_USER_PREFIX DOS_ATTRIBUTE_PREFIX) - 1) 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci/* STREAM XATTR PREFIX */ 11062306a36Sopenharmony_ci#define STREAM_PREFIX "DosStream." 11162306a36Sopenharmony_ci#define STREAM_PREFIX_LEN (sizeof(STREAM_PREFIX) - 1) 11262306a36Sopenharmony_ci#define XATTR_NAME_STREAM (XATTR_USER_PREFIX STREAM_PREFIX) 11362306a36Sopenharmony_ci#define XATTR_NAME_STREAM_LEN (sizeof(XATTR_NAME_STREAM) - 1) 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci/* SECURITY DESCRIPTOR(NTACL) XATTR PREFIX */ 11662306a36Sopenharmony_ci#define SD_PREFIX "NTACL" 11762306a36Sopenharmony_ci#define SD_PREFIX_LEN (sizeof(SD_PREFIX) - 1) 11862306a36Sopenharmony_ci#define XATTR_NAME_SD (XATTR_SECURITY_PREFIX SD_PREFIX) 11962306a36Sopenharmony_ci#define XATTR_NAME_SD_LEN \ 12062306a36Sopenharmony_ci (sizeof(XATTR_SECURITY_PREFIX SD_PREFIX) - 1) 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci#endif /* __XATTR_H__ */ 123