|  | /* SPDX-License-Identifier: GPL-2.0-or-later */ | 
|  | /* | 
|  | *   Copyright (C) 2021 Samsung Electronics Co., Ltd. | 
|  | */ | 
|  |  | 
|  | #ifndef __XATTR_H__ | 
|  | #define __XATTR_H__ | 
|  |  | 
|  | /* | 
|  | * These are on-disk structures to store additional metadata into xattr to | 
|  | * reproduce windows filesystem semantics. And they are encoded with NDR to | 
|  | * compatible with samba's xattr meta format. The compatibility with samba | 
|  | * is important because it can lose the information(file attribute, | 
|  | * creation time, acls) about the existing files when switching between | 
|  | * ksmbd and samba. | 
|  | */ | 
|  |  | 
|  | /* | 
|  | * Dos attribute flags used for what variable is valid. | 
|  | */ | 
|  | enum { | 
|  | XATTR_DOSINFO_ATTRIB		= 0x00000001, | 
|  | XATTR_DOSINFO_EA_SIZE		= 0x00000002, | 
|  | XATTR_DOSINFO_SIZE		= 0x00000004, | 
|  | XATTR_DOSINFO_ALLOC_SIZE	= 0x00000008, | 
|  | XATTR_DOSINFO_CREATE_TIME	= 0x00000010, | 
|  | XATTR_DOSINFO_CHANGE_TIME	= 0x00000020, | 
|  | XATTR_DOSINFO_ITIME		= 0x00000040 | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * Dos attribute structure which is compatible with samba's one. | 
|  | * Storing it into the xattr named "DOSATTRIB" separately from inode | 
|  | * allows ksmbd to faithfully reproduce windows filesystem semantics | 
|  | * on top of a POSIX filesystem. | 
|  | */ | 
|  | struct xattr_dos_attrib { | 
|  | __u16	version;	/* version 3 or version 4 */ | 
|  | __u32	flags;		/* valid flags */ | 
|  | __u32	attr;		/* Dos attribute */ | 
|  | __u32	ea_size;	/* EA size */ | 
|  | __u64	size; | 
|  | __u64	alloc_size; | 
|  | __u64	create_time;	/* File creation time */ | 
|  | __u64	change_time;	/* File change time */ | 
|  | __u64	itime;		/* Invented/Initial time */ | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * Enumeration is used for computing posix acl hash. | 
|  | */ | 
|  | enum { | 
|  | SMB_ACL_TAG_INVALID = 0, | 
|  | SMB_ACL_USER, | 
|  | SMB_ACL_USER_OBJ, | 
|  | SMB_ACL_GROUP, | 
|  | SMB_ACL_GROUP_OBJ, | 
|  | SMB_ACL_OTHER, | 
|  | SMB_ACL_MASK | 
|  | }; | 
|  |  | 
|  | #define SMB_ACL_READ			4 | 
|  | #define SMB_ACL_WRITE			2 | 
|  | #define SMB_ACL_EXECUTE			1 | 
|  |  | 
|  | struct xattr_acl_entry { | 
|  | int type; | 
|  | uid_t uid; | 
|  | gid_t gid; | 
|  | mode_t perm; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * xattr_smb_acl structure is used for computing posix acl hash. | 
|  | */ | 
|  | struct xattr_smb_acl { | 
|  | int count; | 
|  | int next; | 
|  | struct xattr_acl_entry entries[]; | 
|  | }; | 
|  |  | 
|  | /* 64bytes hash in xattr_ntacl is computed with sha256 */ | 
|  | #define XATTR_SD_HASH_TYPE_SHA256	0x1 | 
|  | #define XATTR_SD_HASH_SIZE		64 | 
|  |  | 
|  | /* | 
|  | * xattr_ntacl is used for storing ntacl and hashes. | 
|  | * Hash is used for checking valid posix acl and ntacl in xattr. | 
|  | */ | 
|  | struct xattr_ntacl { | 
|  | __u16	version; /* version 4*/ | 
|  | void	*sd_buf; | 
|  | __u32	sd_size; | 
|  | __u16	hash_type; /* hash type */ | 
|  | __u8	desc[10]; /* posix_acl description */ | 
|  | __u16	desc_len; | 
|  | __u64	current_time; | 
|  | __u8	hash[XATTR_SD_HASH_SIZE]; /* 64bytes hash for ntacl */ | 
|  | __u8	posix_acl_hash[XATTR_SD_HASH_SIZE]; /* 64bytes hash for posix acl */ | 
|  | }; | 
|  |  | 
|  | /* DOS ATTRIBUITE XATTR PREFIX */ | 
|  | #define DOS_ATTRIBUTE_PREFIX		"DOSATTRIB" | 
|  | #define DOS_ATTRIBUTE_PREFIX_LEN	(sizeof(DOS_ATTRIBUTE_PREFIX) - 1) | 
|  | #define XATTR_NAME_DOS_ATTRIBUTE	(XATTR_USER_PREFIX DOS_ATTRIBUTE_PREFIX) | 
|  | #define XATTR_NAME_DOS_ATTRIBUTE_LEN	\ | 
|  | (sizeof(XATTR_USER_PREFIX DOS_ATTRIBUTE_PREFIX) - 1) | 
|  |  | 
|  | /* STREAM XATTR PREFIX */ | 
|  | #define STREAM_PREFIX			"DosStream." | 
|  | #define STREAM_PREFIX_LEN		(sizeof(STREAM_PREFIX) - 1) | 
|  | #define XATTR_NAME_STREAM		(XATTR_USER_PREFIX STREAM_PREFIX) | 
|  | #define XATTR_NAME_STREAM_LEN		(sizeof(XATTR_NAME_STREAM) - 1) | 
|  |  | 
|  | /* SECURITY DESCRIPTOR(NTACL) XATTR PREFIX */ | 
|  | #define SD_PREFIX			"NTACL" | 
|  | #define SD_PREFIX_LEN	(sizeof(SD_PREFIX) - 1) | 
|  | #define XATTR_NAME_SD	(XATTR_SECURITY_PREFIX SD_PREFIX) | 
|  | #define XATTR_NAME_SD_LEN	\ | 
|  | (sizeof(XATTR_SECURITY_PREFIX SD_PREFIX) - 1) | 
|  |  | 
|  | #endif /* __XATTR_H__ */ |