ksmbd: reorder and document on-disk and netlink structures in headers
[linux-2.6-microblaze.git] / fs / ksmbd / xattr.h
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__ */