]> git.proxmox.com Git - mirror_edk2.git/blob - OvmfPkg/Include/IndustryStandard/VirtioFs.h
OvmfPkg/VirtioFsDxe: add a shared wrapper for FUSE_FSYNC / FUSE_FSYNCDIR
[mirror_edk2.git] / OvmfPkg / Include / IndustryStandard / VirtioFs.h
1 /** @file
2 Type and macro definitions specific to the Virtio Filesystem device.
3
4 At the time of this writing, the latest released Virtio specification (v1.1)
5 does not include the virtio-fs device. The development version of the
6 specification defines it however; see the latest version at
7 <https://github.com/oasis-tcs/virtio-spec/blob/87fa6b5d8155/virtio-fs.tex>.
8
9 This header file is minimal, and only defines the types and macros that are
10 necessary for the OvmfPkg implementation.
11
12 Copyright (C) 2020, Red Hat, Inc.
13
14 SPDX-License-Identifier: BSD-2-Clause-Patent
15 **/
16
17 #ifndef VIRTIO_FS_H_
18 #define VIRTIO_FS_H_
19
20 #include <IndustryStandard/Virtio.h>
21
22 //
23 // Lowest numbered queue for sending normal priority requests.
24 //
25 #define VIRTIO_FS_REQUEST_QUEUE 1
26
27 //
28 // Number of bytes in the "VIRTIO_FS_CONFIG.Tag" field.
29 //
30 #define VIRTIO_FS_TAG_BYTES 36
31
32 //
33 // Device configuration layout.
34 //
35 #pragma pack (1)
36 typedef struct {
37 //
38 // The Tag field can be considered the filesystem label, or a mount point
39 // hint. It is UTF-8 encoded, and padded to full size with NUL bytes. If the
40 // encoded bytes take up the entire Tag field, then there is no NUL
41 // terminator.
42 //
43 UINT8 Tag[VIRTIO_FS_TAG_BYTES];
44 //
45 // The total number of request virtqueues exposed by the device (i.e.,
46 // excluding the "hiprio" queue).
47 //
48 UINT32 NumReqQueues;
49 } VIRTIO_FS_CONFIG;
50 #pragma pack ()
51
52 //
53 // FUSE-related definitions follow.
54 //
55 // From virtio-v1.1-cs01-87fa6b5d8155, 5.11 File System Device: "[...] The
56 // driver acts as the FUSE client mounting the file system. The virtio file
57 // system device provides the mechanism for transporting FUSE requests [...]"
58 //
59 // Unfortunately, the documentation of the FUSE wire protocol is lacking. The
60 // Virtio spec (as of this writing) simply defers to
61 // "include/uapi/linux/fuse.h" in the Linux kernel source -- see the reference
62 // in virtio spec file "introduction.tex", at commit 87fa6b5d8155.
63 //
64 // Of course, "include/uapi/linux/fuse.h" is a moving target (the virtio spec
65 // does not specify a particular FUSE interface version). The OvmfPkg code
66 // targets version 7.31, because that's the lowest version that the QEMU
67 // virtio-fs daemon supports at this time -- see QEMU commit 72c42e2d6551
68 // ("virtiofsd: Trim out compatibility code", 2020-01-23).
69 //
70 // Correspondingly, Linux's "include/uapi/linux/fuse.h" is consulted as checked
71 // out at commit (c6ff213fe5b8^) = d78092e4937d ("fuse: fix page dereference
72 // after free", 2020-09-18); that is, right before commit c6ff213fe5b8 ("fuse:
73 // add submount support to <uapi/linux/fuse.h>", 2020-09-18) introduces FUSE
74 // interface version 7.32.
75 //
76 #define VIRTIO_FS_FUSE_MAJOR 7
77 #define VIRTIO_FS_FUSE_MINOR 31
78
79 //
80 // The inode number of the root directory.
81 //
82 #define VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID 1
83
84 //
85 // FUSE operation codes.
86 //
87 typedef enum {
88 VirtioFsFuseOpForget = 2,
89 VirtioFsFuseOpRelease = 18,
90 VirtioFsFuseOpFsync = 20,
91 VirtioFsFuseOpInit = 26,
92 VirtioFsFuseOpOpenDir = 27,
93 VirtioFsFuseOpReleaseDir = 29,
94 VirtioFsFuseOpFsyncDir = 30,
95 } VIRTIO_FS_FUSE_OPCODE;
96
97 #pragma pack (1)
98 //
99 // Request-response headers common to all request types.
100 //
101 typedef struct {
102 UINT32 Len;
103 UINT32 Opcode;
104 UINT64 Unique;
105 UINT64 NodeId;
106 UINT32 Uid;
107 UINT32 Gid;
108 UINT32 Pid;
109 UINT32 Padding;
110 } VIRTIO_FS_FUSE_REQUEST;
111
112 typedef struct {
113 UINT32 Len;
114 INT32 Error;
115 UINT64 Unique;
116 } VIRTIO_FS_FUSE_RESPONSE;
117
118 //
119 // Header for VirtioFsFuseOpForget.
120 //
121 typedef struct {
122 UINT64 NumberOfLookups;
123 } VIRTIO_FS_FUSE_FORGET_REQUEST;
124
125 //
126 // Header for VirtioFsFuseOpRelease and VirtioFsFuseOpReleaseDir.
127 //
128 typedef struct {
129 UINT64 FileHandle;
130 UINT32 Flags;
131 UINT32 ReleaseFlags;
132 UINT64 LockOwner;
133 } VIRTIO_FS_FUSE_RELEASE_REQUEST;
134
135 //
136 // Header for VirtioFsFuseOpFsync and VirtioFsFuseOpFsyncDir.
137 //
138 typedef struct {
139 UINT64 FileHandle;
140 UINT32 FsyncFlags;
141 UINT32 Padding;
142 } VIRTIO_FS_FUSE_FSYNC_REQUEST;
143
144 //
145 // Headers for VirtioFsFuseOpInit.
146 //
147 typedef struct {
148 UINT32 Major;
149 UINT32 Minor;
150 UINT32 MaxReadahead;
151 UINT32 Flags;
152 } VIRTIO_FS_FUSE_INIT_REQUEST;
153
154 typedef struct {
155 UINT32 Major;
156 UINT32 Minor;
157 UINT32 MaxReadahead;
158 UINT32 Flags;
159 UINT16 MaxBackground;
160 UINT16 CongestionThreshold;
161 UINT32 MaxWrite;
162 UINT32 TimeGran;
163 UINT16 MaxPages;
164 UINT16 MapAlignment;
165 UINT32 Unused[8];
166 } VIRTIO_FS_FUSE_INIT_RESPONSE;
167
168 //
169 // Headers for VirtioFsFuseOpOpenDir.
170 //
171 typedef struct {
172 UINT32 Flags;
173 UINT32 Unused;
174 } VIRTIO_FS_FUSE_OPEN_REQUEST;
175
176 typedef struct {
177 UINT64 FileHandle;
178 UINT32 OpenFlags;
179 UINT32 Padding;
180 } VIRTIO_FS_FUSE_OPEN_RESPONSE;
181 #pragma pack ()
182
183 #endif // VIRTIO_FS_H_