]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Include/IndustryStandard/VirtioFs.h
OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_MKDIR
[mirror_edk2.git] / OvmfPkg / Include / IndustryStandard / VirtioFs.h
CommitLineData
eaa7115d
LE
1/** @file\r
2 Type and macro definitions specific to the Virtio Filesystem device.\r
3\r
4 At the time of this writing, the latest released Virtio specification (v1.1)\r
5 does not include the virtio-fs device. The development version of the\r
6 specification defines it however; see the latest version at\r
7 <https://github.com/oasis-tcs/virtio-spec/blob/87fa6b5d8155/virtio-fs.tex>.\r
8\r
9 This header file is minimal, and only defines the types and macros that are\r
10 necessary for the OvmfPkg implementation.\r
11\r
12 Copyright (C) 2020, Red Hat, Inc.\r
13\r
14 SPDX-License-Identifier: BSD-2-Clause-Patent\r
15**/\r
16\r
17#ifndef VIRTIO_FS_H_\r
18#define VIRTIO_FS_H_\r
19\r
20#include <IndustryStandard/Virtio.h>\r
21\r
22//\r
23// Lowest numbered queue for sending normal priority requests.\r
24//\r
25#define VIRTIO_FS_REQUEST_QUEUE 1\r
26\r
27//\r
28// Number of bytes in the "VIRTIO_FS_CONFIG.Tag" field.\r
29//\r
30#define VIRTIO_FS_TAG_BYTES 36\r
31\r
32//\r
33// Device configuration layout.\r
34//\r
35#pragma pack (1)\r
36typedef struct {\r
37 //\r
38 // The Tag field can be considered the filesystem label, or a mount point\r
39 // hint. It is UTF-8 encoded, and padded to full size with NUL bytes. If the\r
40 // encoded bytes take up the entire Tag field, then there is no NUL\r
41 // terminator.\r
42 //\r
43 UINT8 Tag[VIRTIO_FS_TAG_BYTES];\r
44 //\r
45 // The total number of request virtqueues exposed by the device (i.e.,\r
46 // excluding the "hiprio" queue).\r
47 //\r
48 UINT32 NumReqQueues;\r
49} VIRTIO_FS_CONFIG;\r
50#pragma pack ()\r
51\r
6a2dc768
LE
52//\r
53// FUSE-related definitions follow.\r
54//\r
55// From virtio-v1.1-cs01-87fa6b5d8155, 5.11 File System Device: "[...] The\r
56// driver acts as the FUSE client mounting the file system. The virtio file\r
57// system device provides the mechanism for transporting FUSE requests [...]"\r
58//\r
59// Unfortunately, the documentation of the FUSE wire protocol is lacking. The\r
60// Virtio spec (as of this writing) simply defers to\r
61// "include/uapi/linux/fuse.h" in the Linux kernel source -- see the reference\r
62// in virtio spec file "introduction.tex", at commit 87fa6b5d8155.\r
63//\r
64// Of course, "include/uapi/linux/fuse.h" is a moving target (the virtio spec\r
65// does not specify a particular FUSE interface version). The OvmfPkg code\r
66// targets version 7.31, because that's the lowest version that the QEMU\r
67// virtio-fs daemon supports at this time -- see QEMU commit 72c42e2d6551\r
68// ("virtiofsd: Trim out compatibility code", 2020-01-23).\r
69//\r
70// Correspondingly, Linux's "include/uapi/linux/fuse.h" is consulted as checked\r
71// out at commit (c6ff213fe5b8^) = d78092e4937d ("fuse: fix page dereference\r
72// after free", 2020-09-18); that is, right before commit c6ff213fe5b8 ("fuse:\r
73// add submount support to <uapi/linux/fuse.h>", 2020-09-18) introduces FUSE\r
74// interface version 7.32.\r
75//\r
76#define VIRTIO_FS_FUSE_MAJOR 7\r
77#define VIRTIO_FS_FUSE_MINOR 31\r
78\r
334c13e1
LE
79//\r
80// The inode number of the root directory.\r
81//\r
82#define VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID 1\r
83\r
f058cb69
LE
84//\r
85// File mode bitmasks.\r
86//\r
87#define VIRTIO_FS_FUSE_MODE_PERM_RWXU 0000700u\r
88#define VIRTIO_FS_FUSE_MODE_PERM_RWXG 0000070u\r
89#define VIRTIO_FS_FUSE_MODE_PERM_RWXO 0000007u\r
90\r
da82d2e3
LE
91//\r
92// Flags for VirtioFsFuseOpOpen.\r
93//\r
94#define VIRTIO_FS_FUSE_OPEN_REQ_F_RDONLY 0\r
95#define VIRTIO_FS_FUSE_OPEN_REQ_F_RDWR 2\r
96\r
fa97e372
LE
97//\r
98// FUSE operation codes.\r
99//\r
100typedef enum {\r
92a4d30e 101 VirtioFsFuseOpForget = 2,\r
f058cb69 102 VirtioFsFuseOpMkDir = 9,\r
da82d2e3 103 VirtioFsFuseOpOpen = 14,\r
72d4f133 104 VirtioFsFuseOpRelease = 18,\r
2e151d26 105 VirtioFsFuseOpFsync = 20,\r
d0474399 106 VirtioFsFuseOpFlush = 25,\r
fa97e372 107 VirtioFsFuseOpInit = 26,\r
b62a0c56 108 VirtioFsFuseOpOpenDir = 27,\r
72d4f133 109 VirtioFsFuseOpReleaseDir = 29,\r
2e151d26 110 VirtioFsFuseOpFsyncDir = 30,\r
fa97e372
LE
111} VIRTIO_FS_FUSE_OPCODE;\r
112\r
6a2dc768
LE
113#pragma pack (1)\r
114//\r
115// Request-response headers common to all request types.\r
116//\r
117typedef struct {\r
118 UINT32 Len;\r
119 UINT32 Opcode;\r
120 UINT64 Unique;\r
121 UINT64 NodeId;\r
122 UINT32 Uid;\r
123 UINT32 Gid;\r
124 UINT32 Pid;\r
125 UINT32 Padding;\r
126} VIRTIO_FS_FUSE_REQUEST;\r
127\r
128typedef struct {\r
129 UINT32 Len;\r
130 INT32 Error;\r
131 UINT64 Unique;\r
132} VIRTIO_FS_FUSE_RESPONSE;\r
fa97e372 133\r
f058cb69
LE
134//\r
135// Structure with which the Virtio Filesystem device reports a NodeId to the\r
136// FUSE client (i.e., to the Virtio Filesystem driver). This structure is a\r
137// part of the response headers for operations that inform the FUSE client of\r
138// an inode.\r
139//\r
140typedef struct {\r
141 UINT64 NodeId;\r
142 UINT64 Generation;\r
143 UINT64 EntryValid;\r
144 UINT64 AttrValid;\r
145 UINT32 EntryValidNsec;\r
146 UINT32 AttrValidNsec;\r
147} VIRTIO_FS_FUSE_NODE_RESPONSE;\r
148\r
149//\r
150// Structure describing the host-side attributes of an inode. This structure is\r
151// a part of the response headers for operations that inform the FUSE client of\r
152// an inode.\r
153//\r
154typedef struct {\r
155 UINT64 Ino;\r
156 UINT64 Size;\r
157 UINT64 Blocks;\r
158 UINT64 Atime;\r
159 UINT64 Mtime;\r
160 UINT64 Ctime;\r
161 UINT32 AtimeNsec;\r
162 UINT32 MtimeNsec;\r
163 UINT32 CtimeNsec;\r
164 UINT32 Mode;\r
165 UINT32 Nlink;\r
166 UINT32 Uid;\r
167 UINT32 Gid;\r
168 UINT32 Rdev;\r
169 UINT32 Blksize;\r
170 UINT32 Padding;\r
171} VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE;\r
172\r
92a4d30e
LE
173//\r
174// Header for VirtioFsFuseOpForget.\r
175//\r
176typedef struct {\r
177 UINT64 NumberOfLookups;\r
178} VIRTIO_FS_FUSE_FORGET_REQUEST;\r
179\r
f058cb69
LE
180//\r
181// Header for VirtioFsFuseOpMkDir.\r
182//\r
183typedef struct {\r
184 UINT32 Mode;\r
185 UINT32 Umask;\r
186} VIRTIO_FS_FUSE_MKDIR_REQUEST;\r
187\r
da82d2e3
LE
188//\r
189// Headers for VirtioFsFuseOpOpen and VirtioFsFuseOpOpenDir.\r
190//\r
191typedef struct {\r
192 UINT32 Flags;\r
193 UINT32 Unused;\r
194} VIRTIO_FS_FUSE_OPEN_REQUEST;\r
195\r
196typedef struct {\r
197 UINT64 FileHandle;\r
198 UINT32 OpenFlags;\r
199 UINT32 Padding;\r
200} VIRTIO_FS_FUSE_OPEN_RESPONSE;\r
201\r
72d4f133
LE
202//\r
203// Header for VirtioFsFuseOpRelease and VirtioFsFuseOpReleaseDir.\r
204//\r
205typedef struct {\r
206 UINT64 FileHandle;\r
207 UINT32 Flags;\r
208 UINT32 ReleaseFlags;\r
209 UINT64 LockOwner;\r
210} VIRTIO_FS_FUSE_RELEASE_REQUEST;\r
211\r
2e151d26
LE
212//\r
213// Header for VirtioFsFuseOpFsync and VirtioFsFuseOpFsyncDir.\r
214//\r
215typedef struct {\r
216 UINT64 FileHandle;\r
217 UINT32 FsyncFlags;\r
218 UINT32 Padding;\r
219} VIRTIO_FS_FUSE_FSYNC_REQUEST;\r
220\r
d0474399
LE
221//\r
222// Header for VirtioFsFuseOpFlush.\r
223//\r
224typedef struct {\r
225 UINT64 FileHandle;\r
226 UINT32 Unused;\r
227 UINT32 Padding;\r
228 UINT64 LockOwner;\r
229} VIRTIO_FS_FUSE_FLUSH_REQUEST;\r
230\r
fa97e372
LE
231//\r
232// Headers for VirtioFsFuseOpInit.\r
233//\r
234typedef struct {\r
235 UINT32 Major;\r
236 UINT32 Minor;\r
237 UINT32 MaxReadahead;\r
238 UINT32 Flags;\r
239} VIRTIO_FS_FUSE_INIT_REQUEST;\r
240\r
241typedef struct {\r
242 UINT32 Major;\r
243 UINT32 Minor;\r
244 UINT32 MaxReadahead;\r
245 UINT32 Flags;\r
246 UINT16 MaxBackground;\r
247 UINT16 CongestionThreshold;\r
248 UINT32 MaxWrite;\r
249 UINT32 TimeGran;\r
250 UINT16 MaxPages;\r
251 UINT16 MapAlignment;\r
252 UINT32 Unused[8];\r
253} VIRTIO_FS_FUSE_INIT_RESPONSE;\r
6a2dc768
LE
254#pragma pack ()\r
255\r
eaa7115d 256#endif // VIRTIO_FS_H_\r