]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Include/IndustryStandard/VirtioFs.h
OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_FORGET
[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
fa97e372
LE
84//\r
85// FUSE operation codes.\r
86//\r
87typedef enum {\r
92a4d30e 88 VirtioFsFuseOpForget = 2,\r
72d4f133 89 VirtioFsFuseOpRelease = 18,\r
fa97e372 90 VirtioFsFuseOpInit = 26,\r
b62a0c56 91 VirtioFsFuseOpOpenDir = 27,\r
72d4f133 92 VirtioFsFuseOpReleaseDir = 29,\r
fa97e372
LE
93} VIRTIO_FS_FUSE_OPCODE;\r
94\r
6a2dc768
LE
95#pragma pack (1)\r
96//\r
97// Request-response headers common to all request types.\r
98//\r
99typedef struct {\r
100 UINT32 Len;\r
101 UINT32 Opcode;\r
102 UINT64 Unique;\r
103 UINT64 NodeId;\r
104 UINT32 Uid;\r
105 UINT32 Gid;\r
106 UINT32 Pid;\r
107 UINT32 Padding;\r
108} VIRTIO_FS_FUSE_REQUEST;\r
109\r
110typedef struct {\r
111 UINT32 Len;\r
112 INT32 Error;\r
113 UINT64 Unique;\r
114} VIRTIO_FS_FUSE_RESPONSE;\r
fa97e372 115\r
92a4d30e
LE
116//\r
117// Header for VirtioFsFuseOpForget.\r
118//\r
119typedef struct {\r
120 UINT64 NumberOfLookups;\r
121} VIRTIO_FS_FUSE_FORGET_REQUEST;\r
122\r
72d4f133
LE
123//\r
124// Header for VirtioFsFuseOpRelease and VirtioFsFuseOpReleaseDir.\r
125//\r
126typedef struct {\r
127 UINT64 FileHandle;\r
128 UINT32 Flags;\r
129 UINT32 ReleaseFlags;\r
130 UINT64 LockOwner;\r
131} VIRTIO_FS_FUSE_RELEASE_REQUEST;\r
132\r
fa97e372
LE
133//\r
134// Headers for VirtioFsFuseOpInit.\r
135//\r
136typedef struct {\r
137 UINT32 Major;\r
138 UINT32 Minor;\r
139 UINT32 MaxReadahead;\r
140 UINT32 Flags;\r
141} VIRTIO_FS_FUSE_INIT_REQUEST;\r
142\r
143typedef struct {\r
144 UINT32 Major;\r
145 UINT32 Minor;\r
146 UINT32 MaxReadahead;\r
147 UINT32 Flags;\r
148 UINT16 MaxBackground;\r
149 UINT16 CongestionThreshold;\r
150 UINT32 MaxWrite;\r
151 UINT32 TimeGran;\r
152 UINT16 MaxPages;\r
153 UINT16 MapAlignment;\r
154 UINT32 Unused[8];\r
155} VIRTIO_FS_FUSE_INIT_RESPONSE;\r
b62a0c56
LE
156\r
157//\r
158// Headers for VirtioFsFuseOpOpenDir.\r
159//\r
160typedef struct {\r
161 UINT32 Flags;\r
162 UINT32 Unused;\r
163} VIRTIO_FS_FUSE_OPEN_REQUEST;\r
164\r
165typedef struct {\r
166 UINT64 FileHandle;\r
167 UINT32 OpenFlags;\r
168 UINT32 Padding;\r
169} VIRTIO_FS_FUSE_OPEN_RESPONSE;\r
6a2dc768
LE
170#pragma pack ()\r
171\r
eaa7115d 172#endif // VIRTIO_FS_H_\r