1 | /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-2-Clause) */ |
2 | /* |
3 | This file defines the kernel interface of FUSE |
4 | Copyright (C) 2001-2008 Miklos Szeredi <miklos@szeredi.hu> |
5 | |
6 | This program can be distributed under the terms of the GNU GPL. |
7 | See the file COPYING. |
8 | |
9 | This -- and only this -- header file may also be distributed under |
10 | the terms of the BSD Licence as follows: |
11 | |
12 | Copyright (C) 2001-2007 Miklos Szeredi. All rights reserved. |
13 | |
14 | Redistribution and use in source and binary forms, with or without |
15 | modification, are permitted provided that the following conditions |
16 | are met: |
17 | 1. Redistributions of source code must retain the above copyright |
18 | notice, this list of conditions and the following disclaimer. |
19 | 2. Redistributions in binary form must reproduce the above copyright |
20 | notice, this list of conditions and the following disclaimer in the |
21 | documentation and/or other materials provided with the distribution. |
22 | |
23 | THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
24 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
25 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
26 | ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE |
27 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
28 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
29 | OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
30 | HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
31 | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
32 | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
33 | SUCH DAMAGE. |
34 | */ |
35 | |
36 | /* |
37 | * This file defines the kernel interface of FUSE |
38 | * |
39 | * Protocol changelog: |
40 | * |
41 | * 7.1: |
42 | * - add the following messages: |
43 | * FUSE_SETATTR, FUSE_SYMLINK, FUSE_MKNOD, FUSE_MKDIR, FUSE_UNLINK, |
44 | * FUSE_RMDIR, FUSE_RENAME, FUSE_LINK, FUSE_OPEN, FUSE_READ, FUSE_WRITE, |
45 | * FUSE_RELEASE, FUSE_FSYNC, FUSE_FLUSH, FUSE_SETXATTR, FUSE_GETXATTR, |
46 | * FUSE_LISTXATTR, FUSE_REMOVEXATTR, FUSE_OPENDIR, FUSE_READDIR, |
47 | * FUSE_RELEASEDIR |
48 | * - add padding to messages to accommodate 32-bit servers on 64-bit kernels |
49 | * |
50 | * 7.2: |
51 | * - add FOPEN_DIRECT_IO and FOPEN_KEEP_CACHE flags |
52 | * - add FUSE_FSYNCDIR message |
53 | * |
54 | * 7.3: |
55 | * - add FUSE_ACCESS message |
56 | * - add FUSE_CREATE message |
57 | * - add filehandle to fuse_setattr_in |
58 | * |
59 | * 7.4: |
60 | * - add frsize to fuse_kstatfs |
61 | * - clean up request size limit checking |
62 | * |
63 | * 7.5: |
64 | * - add flags and max_write to fuse_init_out |
65 | * |
66 | * 7.6: |
67 | * - add max_readahead to fuse_init_in and fuse_init_out |
68 | * |
69 | * 7.7: |
70 | * - add FUSE_INTERRUPT message |
71 | * - add POSIX file lock support |
72 | * |
73 | * 7.8: |
74 | * - add lock_owner and flags fields to fuse_release_in |
75 | * - add FUSE_BMAP message |
76 | * - add FUSE_DESTROY message |
77 | * |
78 | * 7.9: |
79 | * - new fuse_getattr_in input argument of GETATTR |
80 | * - add lk_flags in fuse_lk_in |
81 | * - add lock_owner field to fuse_setattr_in, fuse_read_in and fuse_write_in |
82 | * - add blksize field to fuse_attr |
83 | * - add file flags field to fuse_read_in and fuse_write_in |
84 | * - Add ATIME_NOW and MTIME_NOW flags to fuse_setattr_in |
85 | * |
86 | * 7.10 |
87 | * - add nonseekable open flag |
88 | * |
89 | * 7.11 |
90 | * - add IOCTL message |
91 | * - add unsolicited notification support |
92 | * - add POLL message and NOTIFY_POLL notification |
93 | * |
94 | * 7.12 |
95 | * - add umask flag to input argument of create, mknod and mkdir |
96 | * - add notification messages for invalidation of inodes and |
97 | * directory entries |
98 | * |
99 | * 7.13 |
100 | * - make max number of background requests and congestion threshold |
101 | * tunables |
102 | * |
103 | * 7.14 |
104 | * - add splice support to fuse device |
105 | * |
106 | * 7.15 |
107 | * - add store notify |
108 | * - add retrieve notify |
109 | * |
110 | * 7.16 |
111 | * - add BATCH_FORGET request |
112 | * - FUSE_IOCTL_UNRESTRICTED shall now return with array of 'struct |
113 | * fuse_ioctl_iovec' instead of ambiguous 'struct iovec' |
114 | * - add FUSE_IOCTL_32BIT flag |
115 | * |
116 | * 7.17 |
117 | * - add FUSE_FLOCK_LOCKS and FUSE_RELEASE_FLOCK_UNLOCK |
118 | * |
119 | * 7.18 |
120 | * - add FUSE_IOCTL_DIR flag |
121 | * - add FUSE_NOTIFY_DELETE |
122 | * |
123 | * 7.19 |
124 | * - add FUSE_FALLOCATE |
125 | * |
126 | * 7.20 |
127 | * - add FUSE_AUTO_INVAL_DATA |
128 | * |
129 | * 7.21 |
130 | * - add FUSE_READDIRPLUS |
131 | * - send the requested events in POLL request |
132 | * |
133 | * 7.22 |
134 | * - add FUSE_ASYNC_DIO |
135 | * |
136 | * 7.23 |
137 | * - add FUSE_WRITEBACK_CACHE |
138 | * - add time_gran to fuse_init_out |
139 | * - add reserved space to fuse_init_out |
140 | * - add FATTR_CTIME |
141 | * - add ctime and ctimensec to fuse_setattr_in |
142 | * - add FUSE_RENAME2 request |
143 | * - add FUSE_NO_OPEN_SUPPORT flag |
144 | * |
145 | * 7.24 |
146 | * - add FUSE_LSEEK for SEEK_HOLE and SEEK_DATA support |
147 | * |
148 | * 7.25 |
149 | * - add FUSE_PARALLEL_DIROPS |
150 | * |
151 | * 7.26 |
152 | * - add FUSE_HANDLE_KILLPRIV |
153 | * - add FUSE_POSIX_ACL |
154 | * |
155 | * 7.27 |
156 | * - add FUSE_ABORT_ERROR |
157 | * |
158 | * 7.28 |
159 | * - add FUSE_COPY_FILE_RANGE |
160 | * - add FOPEN_CACHE_DIR |
161 | * - add FUSE_MAX_PAGES, add max_pages to init_out |
162 | * - add FUSE_CACHE_SYMLINKS |
163 | * |
164 | * 7.29 |
165 | * - add FUSE_NO_OPENDIR_SUPPORT flag |
166 | * |
167 | * 7.30 |
168 | * - add FUSE_EXPLICIT_INVAL_DATA |
169 | * - add FUSE_IOCTL_COMPAT_X32 |
170 | * |
171 | * 7.31 |
172 | * - add FUSE_WRITE_KILL_PRIV flag |
173 | * - add FUSE_SETUPMAPPING and FUSE_REMOVEMAPPING |
174 | * - add map_alignment to fuse_init_out, add FUSE_MAP_ALIGNMENT flag |
175 | * |
176 | * 7.32 |
177 | * - add flags to fuse_attr, add FUSE_ATTR_SUBMOUNT, add FUSE_SUBMOUNTS |
178 | * |
179 | * 7.33 |
180 | * - add FUSE_HANDLE_KILLPRIV_V2, FUSE_WRITE_KILL_SUIDGID, FATTR_KILL_SUIDGID |
181 | * - add FUSE_OPEN_KILL_SUIDGID |
182 | * - extend fuse_setxattr_in, add FUSE_SETXATTR_EXT |
183 | * - add FUSE_SETXATTR_ACL_KILL_SGID |
184 | * |
185 | * 7.34 |
186 | * - add FUSE_SYNCFS |
187 | * |
188 | * 7.35 |
189 | * - add FOPEN_NOFLUSH |
190 | * |
191 | * 7.36 |
192 | * - extend fuse_init_in with reserved fields, add FUSE_INIT_EXT init flag |
193 | * - add flags2 to fuse_init_in and fuse_init_out |
194 | * - add FUSE_SECURITY_CTX init flag |
195 | * - add security context to create, mkdir, symlink, and mknod requests |
196 | * - add FUSE_HAS_INODE_DAX, FUSE_ATTR_DAX |
197 | * |
198 | * 7.37 |
199 | * - add FUSE_TMPFILE |
200 | * |
201 | * 7.38 |
202 | * - add FUSE_EXPIRE_ONLY flag to fuse_notify_inval_entry |
203 | * - add FOPEN_PARALLEL_DIRECT_WRITES |
204 | * - add total_extlen to fuse_in_header |
205 | * - add FUSE_MAX_NR_SECCTX |
206 | * - add extension header |
207 | * - add FUSE_EXT_GROUPS |
208 | * - add FUSE_CREATE_SUPP_GROUP |
209 | * - add FUSE_HAS_EXPIRE_ONLY |
210 | * |
211 | * 7.39 |
212 | * - add FUSE_DIRECT_IO_ALLOW_MMAP |
213 | * - add FUSE_STATX and related structures |
214 | * |
215 | * 7.40 |
216 | * - add max_stack_depth to fuse_init_out, add FUSE_PASSTHROUGH init flag |
217 | * - add backing_id to fuse_open_out, add FOPEN_PASSTHROUGH open flag |
218 | * - add FUSE_NO_EXPORT_SUPPORT init flag |
219 | * - add FUSE_NOTIFY_RESEND, add FUSE_HAS_RESEND init flag |
220 | */ |
221 | |
222 | #ifndef _LINUX_FUSE_H |
223 | #define _LINUX_FUSE_H |
224 | |
225 | #ifdef __KERNEL__ |
226 | #include <linux/types.h> |
227 | #else |
228 | #include <stdint.h> |
229 | #endif |
230 | |
231 | /* |
232 | * Version negotiation: |
233 | * |
234 | * Both the kernel and userspace send the version they support in the |
235 | * INIT request and reply respectively. |
236 | * |
237 | * If the major versions match then both shall use the smallest |
238 | * of the two minor versions for communication. |
239 | * |
240 | * If the kernel supports a larger major version, then userspace shall |
241 | * reply with the major version it supports, ignore the rest of the |
242 | * INIT message and expect a new INIT message from the kernel with a |
243 | * matching major version. |
244 | * |
245 | * If the library supports a larger major version, then it shall fall |
246 | * back to the major protocol version sent by the kernel for |
247 | * communication and reply with that major version (and an arbitrary |
248 | * supported minor version). |
249 | */ |
250 | |
251 | /** Version number of this interface */ |
252 | #define FUSE_KERNEL_VERSION 7 |
253 | |
254 | /** Minor version number of this interface */ |
255 | #define FUSE_KERNEL_MINOR_VERSION 40 |
256 | |
257 | /** The node ID of the root inode */ |
258 | #define FUSE_ROOT_ID 1 |
259 | |
260 | /* Make sure all structures are padded to 64bit boundary, so 32bit |
261 | userspace works under 64bit kernels */ |
262 | |
263 | struct fuse_attr { |
264 | uint64_t ino; |
265 | uint64_t size; |
266 | uint64_t blocks; |
267 | uint64_t atime; |
268 | uint64_t mtime; |
269 | uint64_t ctime; |
270 | uint32_t atimensec; |
271 | uint32_t mtimensec; |
272 | uint32_t ctimensec; |
273 | uint32_t mode; |
274 | uint32_t nlink; |
275 | uint32_t uid; |
276 | uint32_t gid; |
277 | uint32_t rdev; |
278 | uint32_t blksize; |
279 | uint32_t flags; |
280 | }; |
281 | |
282 | /* |
283 | * The following structures are bit-for-bit compatible with the statx(2) ABI in |
284 | * Linux. |
285 | */ |
286 | struct fuse_sx_time { |
287 | int64_t tv_sec; |
288 | uint32_t tv_nsec; |
289 | int32_t __reserved; |
290 | }; |
291 | |
292 | struct fuse_statx { |
293 | uint32_t mask; |
294 | uint32_t blksize; |
295 | uint64_t attributes; |
296 | uint32_t nlink; |
297 | uint32_t uid; |
298 | uint32_t gid; |
299 | uint16_t mode; |
300 | uint16_t __spare0[1]; |
301 | uint64_t ino; |
302 | uint64_t size; |
303 | uint64_t blocks; |
304 | uint64_t attributes_mask; |
305 | struct fuse_sx_time atime; |
306 | struct fuse_sx_time btime; |
307 | struct fuse_sx_time ctime; |
308 | struct fuse_sx_time mtime; |
309 | uint32_t rdev_major; |
310 | uint32_t rdev_minor; |
311 | uint32_t dev_major; |
312 | uint32_t dev_minor; |
313 | uint64_t __spare2[14]; |
314 | }; |
315 | |
316 | struct fuse_kstatfs { |
317 | uint64_t blocks; |
318 | uint64_t bfree; |
319 | uint64_t bavail; |
320 | uint64_t files; |
321 | uint64_t ffree; |
322 | uint32_t bsize; |
323 | uint32_t namelen; |
324 | uint32_t frsize; |
325 | uint32_t padding; |
326 | uint32_t spare[6]; |
327 | }; |
328 | |
329 | struct fuse_file_lock { |
330 | uint64_t start; |
331 | uint64_t end; |
332 | uint32_t type; |
333 | uint32_t pid; /* tgid */ |
334 | }; |
335 | |
336 | /** |
337 | * Bitmasks for fuse_setattr_in.valid |
338 | */ |
339 | #define FATTR_MODE (1 << 0) |
340 | #define FATTR_UID (1 << 1) |
341 | #define FATTR_GID (1 << 2) |
342 | #define FATTR_SIZE (1 << 3) |
343 | #define FATTR_ATIME (1 << 4) |
344 | #define FATTR_MTIME (1 << 5) |
345 | #define FATTR_FH (1 << 6) |
346 | #define FATTR_ATIME_NOW (1 << 7) |
347 | #define FATTR_MTIME_NOW (1 << 8) |
348 | #define FATTR_LOCKOWNER (1 << 9) |
349 | #define FATTR_CTIME (1 << 10) |
350 | #define FATTR_KILL_SUIDGID (1 << 11) |
351 | |
352 | /** |
353 | * Flags returned by the OPEN request |
354 | * |
355 | * FOPEN_DIRECT_IO: bypass page cache for this open file |
356 | * FOPEN_KEEP_CACHE: don't invalidate the data cache on open |
357 | * FOPEN_NONSEEKABLE: the file is not seekable |
358 | * FOPEN_CACHE_DIR: allow caching this directory |
359 | * FOPEN_STREAM: the file is stream-like (no file position at all) |
360 | * FOPEN_NOFLUSH: don't flush data cache on close (unless FUSE_WRITEBACK_CACHE) |
361 | * FOPEN_PARALLEL_DIRECT_WRITES: Allow concurrent direct writes on the same inode |
362 | * FOPEN_PASSTHROUGH: passthrough read/write io for this open file |
363 | */ |
364 | #define FOPEN_DIRECT_IO (1 << 0) |
365 | #define FOPEN_KEEP_CACHE (1 << 1) |
366 | #define FOPEN_NONSEEKABLE (1 << 2) |
367 | #define FOPEN_CACHE_DIR (1 << 3) |
368 | #define FOPEN_STREAM (1 << 4) |
369 | #define FOPEN_NOFLUSH (1 << 5) |
370 | #define FOPEN_PARALLEL_DIRECT_WRITES (1 << 6) |
371 | #define FOPEN_PASSTHROUGH (1 << 7) |
372 | |
373 | /** |
374 | * INIT request/reply flags |
375 | * |
376 | * FUSE_ASYNC_READ: asynchronous read requests |
377 | * FUSE_POSIX_LOCKS: remote locking for POSIX file locks |
378 | * FUSE_FILE_OPS: kernel sends file handle for fstat, etc... (not yet supported) |
379 | * FUSE_ATOMIC_O_TRUNC: handles the O_TRUNC open flag in the filesystem |
380 | * FUSE_EXPORT_SUPPORT: filesystem handles lookups of "." and ".." |
381 | * FUSE_BIG_WRITES: filesystem can handle write size larger than 4kB |
382 | * FUSE_DONT_MASK: don't apply umask to file mode on create operations |
383 | * FUSE_SPLICE_WRITE: kernel supports splice write on the device |
384 | * FUSE_SPLICE_MOVE: kernel supports splice move on the device |
385 | * FUSE_SPLICE_READ: kernel supports splice read on the device |
386 | * FUSE_FLOCK_LOCKS: remote locking for BSD style file locks |
387 | * FUSE_HAS_IOCTL_DIR: kernel supports ioctl on directories |
388 | * FUSE_AUTO_INVAL_DATA: automatically invalidate cached pages |
389 | * FUSE_DO_READDIRPLUS: do READDIRPLUS (READDIR+LOOKUP in one) |
390 | * FUSE_READDIRPLUS_AUTO: adaptive readdirplus |
391 | * FUSE_ASYNC_DIO: asynchronous direct I/O submission |
392 | * FUSE_WRITEBACK_CACHE: use writeback cache for buffered writes |
393 | * FUSE_NO_OPEN_SUPPORT: kernel supports zero-message opens |
394 | * FUSE_PARALLEL_DIROPS: allow parallel lookups and readdir |
395 | * FUSE_HANDLE_KILLPRIV: fs handles killing suid/sgid/cap on write/chown/trunc |
396 | * FUSE_POSIX_ACL: filesystem supports posix acls |
397 | * FUSE_ABORT_ERROR: reading the device after abort returns ECONNABORTED |
398 | * FUSE_MAX_PAGES: init_out.max_pages contains the max number of req pages |
399 | * FUSE_CACHE_SYMLINKS: cache READLINK responses |
400 | * FUSE_NO_OPENDIR_SUPPORT: kernel supports zero-message opendir |
401 | * FUSE_EXPLICIT_INVAL_DATA: only invalidate cached pages on explicit request |
402 | * FUSE_MAP_ALIGNMENT: init_out.map_alignment contains log2(byte alignment) for |
403 | * foffset and moffset fields in struct |
404 | * fuse_setupmapping_out and fuse_removemapping_one. |
405 | * FUSE_SUBMOUNTS: kernel supports auto-mounting directory submounts |
406 | * FUSE_HANDLE_KILLPRIV_V2: fs kills suid/sgid/cap on write/chown/trunc. |
407 | * Upon write/truncate suid/sgid is only killed if caller |
408 | * does not have CAP_FSETID. Additionally upon |
409 | * write/truncate sgid is killed only if file has group |
410 | * execute permission. (Same as Linux VFS behavior). |
411 | * FUSE_SETXATTR_EXT: Server supports extended struct fuse_setxattr_in |
412 | * FUSE_INIT_EXT: extended fuse_init_in request |
413 | * FUSE_INIT_RESERVED: reserved, do not use |
414 | * FUSE_SECURITY_CTX: add security context to create, mkdir, symlink, and |
415 | * mknod |
416 | * FUSE_HAS_INODE_DAX: use per inode DAX |
417 | * FUSE_CREATE_SUPP_GROUP: add supplementary group info to create, mkdir, |
418 | * symlink and mknod (single group that matches parent) |
419 | * FUSE_HAS_EXPIRE_ONLY: kernel supports expiry-only entry invalidation |
420 | * FUSE_DIRECT_IO_ALLOW_MMAP: allow shared mmap in FOPEN_DIRECT_IO mode. |
421 | * FUSE_NO_EXPORT_SUPPORT: explicitly disable export support |
422 | * FUSE_HAS_RESEND: kernel supports resending pending requests, and the high bit |
423 | * of the request ID indicates resend requests |
424 | */ |
425 | #define FUSE_ASYNC_READ (1 << 0) |
426 | #define FUSE_POSIX_LOCKS (1 << 1) |
427 | #define FUSE_FILE_OPS (1 << 2) |
428 | #define FUSE_ATOMIC_O_TRUNC (1 << 3) |
429 | #define FUSE_EXPORT_SUPPORT (1 << 4) |
430 | #define FUSE_BIG_WRITES (1 << 5) |
431 | #define FUSE_DONT_MASK (1 << 6) |
432 | #define FUSE_SPLICE_WRITE (1 << 7) |
433 | #define FUSE_SPLICE_MOVE (1 << 8) |
434 | #define FUSE_SPLICE_READ (1 << 9) |
435 | #define FUSE_FLOCK_LOCKS (1 << 10) |
436 | #define FUSE_HAS_IOCTL_DIR (1 << 11) |
437 | #define FUSE_AUTO_INVAL_DATA (1 << 12) |
438 | #define FUSE_DO_READDIRPLUS (1 << 13) |
439 | #define FUSE_READDIRPLUS_AUTO (1 << 14) |
440 | #define FUSE_ASYNC_DIO (1 << 15) |
441 | #define FUSE_WRITEBACK_CACHE (1 << 16) |
442 | #define FUSE_NO_OPEN_SUPPORT (1 << 17) |
443 | #define FUSE_PARALLEL_DIROPS (1 << 18) |
444 | #define FUSE_HANDLE_KILLPRIV (1 << 19) |
445 | #define FUSE_POSIX_ACL (1 << 20) |
446 | #define FUSE_ABORT_ERROR (1 << 21) |
447 | #define FUSE_MAX_PAGES (1 << 22) |
448 | #define FUSE_CACHE_SYMLINKS (1 << 23) |
449 | #define FUSE_NO_OPENDIR_SUPPORT (1 << 24) |
450 | #define FUSE_EXPLICIT_INVAL_DATA (1 << 25) |
451 | #define FUSE_MAP_ALIGNMENT (1 << 26) |
452 | #define FUSE_SUBMOUNTS (1 << 27) |
453 | #define FUSE_HANDLE_KILLPRIV_V2 (1 << 28) |
454 | #define FUSE_SETXATTR_EXT (1 << 29) |
455 | #define FUSE_INIT_EXT (1 << 30) |
456 | #define FUSE_INIT_RESERVED (1 << 31) |
457 | /* bits 32..63 get shifted down 32 bits into the flags2 field */ |
458 | #define FUSE_SECURITY_CTX (1ULL << 32) |
459 | #define FUSE_HAS_INODE_DAX (1ULL << 33) |
460 | #define FUSE_CREATE_SUPP_GROUP (1ULL << 34) |
461 | #define FUSE_HAS_EXPIRE_ONLY (1ULL << 35) |
462 | #define FUSE_DIRECT_IO_ALLOW_MMAP (1ULL << 36) |
463 | #define FUSE_PASSTHROUGH (1ULL << 37) |
464 | #define FUSE_NO_EXPORT_SUPPORT (1ULL << 38) |
465 | #define FUSE_HAS_RESEND (1ULL << 39) |
466 | |
467 | /* Obsolete alias for FUSE_DIRECT_IO_ALLOW_MMAP */ |
468 | #define FUSE_DIRECT_IO_RELAX FUSE_DIRECT_IO_ALLOW_MMAP |
469 | |
470 | /** |
471 | * CUSE INIT request/reply flags |
472 | * |
473 | * CUSE_UNRESTRICTED_IOCTL: use unrestricted ioctl |
474 | */ |
475 | #define CUSE_UNRESTRICTED_IOCTL (1 << 0) |
476 | |
477 | /** |
478 | * Release flags |
479 | */ |
480 | #define FUSE_RELEASE_FLUSH (1 << 0) |
481 | #define FUSE_RELEASE_FLOCK_UNLOCK (1 << 1) |
482 | |
483 | /** |
484 | * Getattr flags |
485 | */ |
486 | #define FUSE_GETATTR_FH (1 << 0) |
487 | |
488 | /** |
489 | * Lock flags |
490 | */ |
491 | #define FUSE_LK_FLOCK (1 << 0) |
492 | |
493 | /** |
494 | * WRITE flags |
495 | * |
496 | * FUSE_WRITE_CACHE: delayed write from page cache, file handle is guessed |
497 | * FUSE_WRITE_LOCKOWNER: lock_owner field is valid |
498 | * FUSE_WRITE_KILL_SUIDGID: kill suid and sgid bits |
499 | */ |
500 | #define FUSE_WRITE_CACHE (1 << 0) |
501 | #define FUSE_WRITE_LOCKOWNER (1 << 1) |
502 | #define FUSE_WRITE_KILL_SUIDGID (1 << 2) |
503 | |
504 | /* Obsolete alias; this flag implies killing suid/sgid only. */ |
505 | #define FUSE_WRITE_KILL_PRIV FUSE_WRITE_KILL_SUIDGID |
506 | |
507 | /** |
508 | * Read flags |
509 | */ |
510 | #define FUSE_READ_LOCKOWNER (1 << 1) |
511 | |
512 | /** |
513 | * Ioctl flags |
514 | * |
515 | * FUSE_IOCTL_COMPAT: 32bit compat ioctl on 64bit machine |
516 | * FUSE_IOCTL_UNRESTRICTED: not restricted to well-formed ioctls, retry allowed |
517 | * FUSE_IOCTL_RETRY: retry with new iovecs |
518 | * FUSE_IOCTL_32BIT: 32bit ioctl |
519 | * FUSE_IOCTL_DIR: is a directory |
520 | * FUSE_IOCTL_COMPAT_X32: x32 compat ioctl on 64bit machine (64bit time_t) |
521 | * |
522 | * FUSE_IOCTL_MAX_IOV: maximum of in_iovecs + out_iovecs |
523 | */ |
524 | #define FUSE_IOCTL_COMPAT (1 << 0) |
525 | #define FUSE_IOCTL_UNRESTRICTED (1 << 1) |
526 | #define FUSE_IOCTL_RETRY (1 << 2) |
527 | #define FUSE_IOCTL_32BIT (1 << 3) |
528 | #define FUSE_IOCTL_DIR (1 << 4) |
529 | #define FUSE_IOCTL_COMPAT_X32 (1 << 5) |
530 | |
531 | #define FUSE_IOCTL_MAX_IOV 256 |
532 | |
533 | /** |
534 | * Poll flags |
535 | * |
536 | * FUSE_POLL_SCHEDULE_NOTIFY: request poll notify |
537 | */ |
538 | #define FUSE_POLL_SCHEDULE_NOTIFY (1 << 0) |
539 | |
540 | /** |
541 | * Fsync flags |
542 | * |
543 | * FUSE_FSYNC_FDATASYNC: Sync data only, not metadata |
544 | */ |
545 | #define FUSE_FSYNC_FDATASYNC (1 << 0) |
546 | |
547 | /** |
548 | * fuse_attr flags |
549 | * |
550 | * FUSE_ATTR_SUBMOUNT: Object is a submount root |
551 | * FUSE_ATTR_DAX: Enable DAX for this file in per inode DAX mode |
552 | */ |
553 | #define FUSE_ATTR_SUBMOUNT (1 << 0) |
554 | #define FUSE_ATTR_DAX (1 << 1) |
555 | |
556 | /** |
557 | * Open flags |
558 | * FUSE_OPEN_KILL_SUIDGID: Kill suid and sgid if executable |
559 | */ |
560 | #define FUSE_OPEN_KILL_SUIDGID (1 << 0) |
561 | |
562 | /** |
563 | * setxattr flags |
564 | * FUSE_SETXATTR_ACL_KILL_SGID: Clear SGID when system.posix_acl_access is set |
565 | */ |
566 | #define FUSE_SETXATTR_ACL_KILL_SGID (1 << 0) |
567 | |
568 | /** |
569 | * notify_inval_entry flags |
570 | * FUSE_EXPIRE_ONLY |
571 | */ |
572 | #define FUSE_EXPIRE_ONLY (1 << 0) |
573 | |
574 | /** |
575 | * extension type |
576 | * FUSE_MAX_NR_SECCTX: maximum value of &fuse_secctx_header.nr_secctx |
577 | * FUSE_EXT_GROUPS: &fuse_supp_groups extension |
578 | */ |
579 | enum fuse_ext_type { |
580 | /* Types 0..31 are reserved for fuse_secctx_header */ |
581 | FUSE_MAX_NR_SECCTX = 31, |
582 | FUSE_EXT_GROUPS = 32, |
583 | }; |
584 | |
585 | enum fuse_opcode { |
586 | FUSE_LOOKUP = 1, |
587 | FUSE_FORGET = 2, /* no reply */ |
588 | FUSE_GETATTR = 3, |
589 | FUSE_SETATTR = 4, |
590 | FUSE_READLINK = 5, |
591 | FUSE_SYMLINK = 6, |
592 | FUSE_MKNOD = 8, |
593 | FUSE_MKDIR = 9, |
594 | FUSE_UNLINK = 10, |
595 | FUSE_RMDIR = 11, |
596 | FUSE_RENAME = 12, |
597 | FUSE_LINK = 13, |
598 | FUSE_OPEN = 14, |
599 | FUSE_READ = 15, |
600 | FUSE_WRITE = 16, |
601 | FUSE_STATFS = 17, |
602 | FUSE_RELEASE = 18, |
603 | FUSE_FSYNC = 20, |
604 | FUSE_SETXATTR = 21, |
605 | FUSE_GETXATTR = 22, |
606 | FUSE_LISTXATTR = 23, |
607 | FUSE_REMOVEXATTR = 24, |
608 | FUSE_FLUSH = 25, |
609 | FUSE_INIT = 26, |
610 | FUSE_OPENDIR = 27, |
611 | FUSE_READDIR = 28, |
612 | FUSE_RELEASEDIR = 29, |
613 | FUSE_FSYNCDIR = 30, |
614 | FUSE_GETLK = 31, |
615 | FUSE_SETLK = 32, |
616 | FUSE_SETLKW = 33, |
617 | FUSE_ACCESS = 34, |
618 | FUSE_CREATE = 35, |
619 | FUSE_INTERRUPT = 36, |
620 | FUSE_BMAP = 37, |
621 | FUSE_DESTROY = 38, |
622 | FUSE_IOCTL = 39, |
623 | FUSE_POLL = 40, |
624 | FUSE_NOTIFY_REPLY = 41, |
625 | FUSE_BATCH_FORGET = 42, |
626 | FUSE_FALLOCATE = 43, |
627 | FUSE_READDIRPLUS = 44, |
628 | FUSE_RENAME2 = 45, |
629 | FUSE_LSEEK = 46, |
630 | FUSE_COPY_FILE_RANGE = 47, |
631 | FUSE_SETUPMAPPING = 48, |
632 | FUSE_REMOVEMAPPING = 49, |
633 | FUSE_SYNCFS = 50, |
634 | FUSE_TMPFILE = 51, |
635 | FUSE_STATX = 52, |
636 | |
637 | /* CUSE specific operations */ |
638 | CUSE_INIT = 4096, |
639 | |
640 | /* Reserved opcodes: helpful to detect structure endian-ness */ |
641 | CUSE_INIT_BSWAP_RESERVED = 1048576, /* CUSE_INIT << 8 */ |
642 | FUSE_INIT_BSWAP_RESERVED = 436207616, /* FUSE_INIT << 24 */ |
643 | }; |
644 | |
645 | enum fuse_notify_code { |
646 | FUSE_NOTIFY_POLL = 1, |
647 | FUSE_NOTIFY_INVAL_INODE = 2, |
648 | FUSE_NOTIFY_INVAL_ENTRY = 3, |
649 | FUSE_NOTIFY_STORE = 4, |
650 | FUSE_NOTIFY_RETRIEVE = 5, |
651 | FUSE_NOTIFY_DELETE = 6, |
652 | FUSE_NOTIFY_RESEND = 7, |
653 | FUSE_NOTIFY_CODE_MAX, |
654 | }; |
655 | |
656 | /* The read buffer is required to be at least 8k, but may be much larger */ |
657 | #define FUSE_MIN_READ_BUFFER 8192 |
658 | |
659 | #define FUSE_COMPAT_ENTRY_OUT_SIZE 120 |
660 | |
661 | struct fuse_entry_out { |
662 | uint64_t nodeid; /* Inode ID */ |
663 | uint64_t generation; /* Inode generation: nodeid:gen must |
664 | be unique for the fs's lifetime */ |
665 | uint64_t entry_valid; /* Cache timeout for the name */ |
666 | uint64_t attr_valid; /* Cache timeout for the attributes */ |
667 | uint32_t entry_valid_nsec; |
668 | uint32_t attr_valid_nsec; |
669 | struct fuse_attr attr; |
670 | }; |
671 | |
672 | struct fuse_forget_in { |
673 | uint64_t nlookup; |
674 | }; |
675 | |
676 | struct fuse_forget_one { |
677 | uint64_t nodeid; |
678 | uint64_t nlookup; |
679 | }; |
680 | |
681 | struct fuse_batch_forget_in { |
682 | uint32_t count; |
683 | uint32_t dummy; |
684 | }; |
685 | |
686 | struct fuse_getattr_in { |
687 | uint32_t getattr_flags; |
688 | uint32_t dummy; |
689 | uint64_t fh; |
690 | }; |
691 | |
692 | #define FUSE_COMPAT_ATTR_OUT_SIZE 96 |
693 | |
694 | struct fuse_attr_out { |
695 | uint64_t attr_valid; /* Cache timeout for the attributes */ |
696 | uint32_t attr_valid_nsec; |
697 | uint32_t dummy; |
698 | struct fuse_attr attr; |
699 | }; |
700 | |
701 | struct fuse_statx_in { |
702 | uint32_t getattr_flags; |
703 | uint32_t reserved; |
704 | uint64_t fh; |
705 | uint32_t sx_flags; |
706 | uint32_t sx_mask; |
707 | }; |
708 | |
709 | struct fuse_statx_out { |
710 | uint64_t attr_valid; /* Cache timeout for the attributes */ |
711 | uint32_t attr_valid_nsec; |
712 | uint32_t flags; |
713 | uint64_t spare[2]; |
714 | struct fuse_statx stat; |
715 | }; |
716 | |
717 | #define FUSE_COMPAT_MKNOD_IN_SIZE 8 |
718 | |
719 | struct fuse_mknod_in { |
720 | uint32_t mode; |
721 | uint32_t rdev; |
722 | uint32_t umask; |
723 | uint32_t padding; |
724 | }; |
725 | |
726 | struct fuse_mkdir_in { |
727 | uint32_t mode; |
728 | uint32_t umask; |
729 | }; |
730 | |
731 | struct fuse_rename_in { |
732 | uint64_t newdir; |
733 | }; |
734 | |
735 | struct fuse_rename2_in { |
736 | uint64_t newdir; |
737 | uint32_t flags; |
738 | uint32_t padding; |
739 | }; |
740 | |
741 | struct fuse_link_in { |
742 | uint64_t oldnodeid; |
743 | }; |
744 | |
745 | struct fuse_setattr_in { |
746 | uint32_t valid; |
747 | uint32_t padding; |
748 | uint64_t fh; |
749 | uint64_t size; |
750 | uint64_t lock_owner; |
751 | uint64_t atime; |
752 | uint64_t mtime; |
753 | uint64_t ctime; |
754 | uint32_t atimensec; |
755 | uint32_t mtimensec; |
756 | uint32_t ctimensec; |
757 | uint32_t mode; |
758 | uint32_t unused4; |
759 | uint32_t uid; |
760 | uint32_t gid; |
761 | uint32_t unused5; |
762 | }; |
763 | |
764 | struct fuse_open_in { |
765 | uint32_t flags; |
766 | uint32_t open_flags; /* FUSE_OPEN_... */ |
767 | }; |
768 | |
769 | struct fuse_create_in { |
770 | uint32_t flags; |
771 | uint32_t mode; |
772 | uint32_t umask; |
773 | uint32_t open_flags; /* FUSE_OPEN_... */ |
774 | }; |
775 | |
776 | struct fuse_open_out { |
777 | uint64_t fh; |
778 | uint32_t open_flags; |
779 | int32_t backing_id; |
780 | }; |
781 | |
782 | struct fuse_release_in { |
783 | uint64_t fh; |
784 | uint32_t flags; |
785 | uint32_t release_flags; |
786 | uint64_t lock_owner; |
787 | }; |
788 | |
789 | struct fuse_flush_in { |
790 | uint64_t fh; |
791 | uint32_t unused; |
792 | uint32_t padding; |
793 | uint64_t lock_owner; |
794 | }; |
795 | |
796 | struct fuse_read_in { |
797 | uint64_t fh; |
798 | uint64_t offset; |
799 | uint32_t size; |
800 | uint32_t read_flags; |
801 | uint64_t lock_owner; |
802 | uint32_t flags; |
803 | uint32_t padding; |
804 | }; |
805 | |
806 | #define FUSE_COMPAT_WRITE_IN_SIZE 24 |
807 | |
808 | struct fuse_write_in { |
809 | uint64_t fh; |
810 | uint64_t offset; |
811 | uint32_t size; |
812 | uint32_t write_flags; |
813 | uint64_t lock_owner; |
814 | uint32_t flags; |
815 | uint32_t padding; |
816 | }; |
817 | |
818 | struct fuse_write_out { |
819 | uint32_t size; |
820 | uint32_t padding; |
821 | }; |
822 | |
823 | #define FUSE_COMPAT_STATFS_SIZE 48 |
824 | |
825 | struct fuse_statfs_out { |
826 | struct fuse_kstatfs st; |
827 | }; |
828 | |
829 | struct fuse_fsync_in { |
830 | uint64_t fh; |
831 | uint32_t fsync_flags; |
832 | uint32_t padding; |
833 | }; |
834 | |
835 | #define FUSE_COMPAT_SETXATTR_IN_SIZE 8 |
836 | |
837 | struct fuse_setxattr_in { |
838 | uint32_t size; |
839 | uint32_t flags; |
840 | uint32_t setxattr_flags; |
841 | uint32_t padding; |
842 | }; |
843 | |
844 | struct fuse_getxattr_in { |
845 | uint32_t size; |
846 | uint32_t padding; |
847 | }; |
848 | |
849 | struct fuse_getxattr_out { |
850 | uint32_t size; |
851 | uint32_t padding; |
852 | }; |
853 | |
854 | struct fuse_lk_in { |
855 | uint64_t fh; |
856 | uint64_t owner; |
857 | struct fuse_file_lock lk; |
858 | uint32_t lk_flags; |
859 | uint32_t padding; |
860 | }; |
861 | |
862 | struct fuse_lk_out { |
863 | struct fuse_file_lock lk; |
864 | }; |
865 | |
866 | struct fuse_access_in { |
867 | uint32_t mask; |
868 | uint32_t padding; |
869 | }; |
870 | |
871 | struct fuse_init_in { |
872 | uint32_t major; |
873 | uint32_t minor; |
874 | uint32_t max_readahead; |
875 | uint32_t flags; |
876 | uint32_t flags2; |
877 | uint32_t unused[11]; |
878 | }; |
879 | |
880 | #define FUSE_COMPAT_INIT_OUT_SIZE 8 |
881 | #define FUSE_COMPAT_22_INIT_OUT_SIZE 24 |
882 | |
883 | struct fuse_init_out { |
884 | uint32_t major; |
885 | uint32_t minor; |
886 | uint32_t max_readahead; |
887 | uint32_t flags; |
888 | uint16_t max_background; |
889 | uint16_t congestion_threshold; |
890 | uint32_t max_write; |
891 | uint32_t time_gran; |
892 | uint16_t max_pages; |
893 | uint16_t map_alignment; |
894 | uint32_t flags2; |
895 | uint32_t max_stack_depth; |
896 | uint32_t unused[6]; |
897 | }; |
898 | |
899 | #define CUSE_INIT_INFO_MAX 4096 |
900 | |
901 | struct cuse_init_in { |
902 | uint32_t major; |
903 | uint32_t minor; |
904 | uint32_t unused; |
905 | uint32_t flags; |
906 | }; |
907 | |
908 | struct cuse_init_out { |
909 | uint32_t major; |
910 | uint32_t minor; |
911 | uint32_t unused; |
912 | uint32_t flags; |
913 | uint32_t max_read; |
914 | uint32_t max_write; |
915 | uint32_t dev_major; /* chardev major */ |
916 | uint32_t dev_minor; /* chardev minor */ |
917 | uint32_t spare[10]; |
918 | }; |
919 | |
920 | struct fuse_interrupt_in { |
921 | uint64_t unique; |
922 | }; |
923 | |
924 | struct fuse_bmap_in { |
925 | uint64_t block; |
926 | uint32_t blocksize; |
927 | uint32_t padding; |
928 | }; |
929 | |
930 | struct fuse_bmap_out { |
931 | uint64_t block; |
932 | }; |
933 | |
934 | struct fuse_ioctl_in { |
935 | uint64_t fh; |
936 | uint32_t flags; |
937 | uint32_t cmd; |
938 | uint64_t arg; |
939 | uint32_t in_size; |
940 | uint32_t out_size; |
941 | }; |
942 | |
943 | struct fuse_ioctl_iovec { |
944 | uint64_t base; |
945 | uint64_t len; |
946 | }; |
947 | |
948 | struct fuse_ioctl_out { |
949 | int32_t result; |
950 | uint32_t flags; |
951 | uint32_t in_iovs; |
952 | uint32_t out_iovs; |
953 | }; |
954 | |
955 | struct fuse_poll_in { |
956 | uint64_t fh; |
957 | uint64_t kh; |
958 | uint32_t flags; |
959 | uint32_t events; |
960 | }; |
961 | |
962 | struct fuse_poll_out { |
963 | uint32_t revents; |
964 | uint32_t padding; |
965 | }; |
966 | |
967 | struct fuse_notify_poll_wakeup_out { |
968 | uint64_t kh; |
969 | }; |
970 | |
971 | struct fuse_fallocate_in { |
972 | uint64_t fh; |
973 | uint64_t offset; |
974 | uint64_t length; |
975 | uint32_t mode; |
976 | uint32_t padding; |
977 | }; |
978 | |
979 | /** |
980 | * FUSE request unique ID flag |
981 | * |
982 | * Indicates whether this is a resend request. The receiver should handle this |
983 | * request accordingly. |
984 | */ |
985 | #define FUSE_UNIQUE_RESEND (1ULL << 63) |
986 | |
987 | struct { |
988 | uint32_t ; |
989 | uint32_t ; |
990 | uint64_t ; |
991 | uint64_t ; |
992 | uint32_t ; |
993 | uint32_t ; |
994 | uint32_t ; |
995 | uint16_t ; /* length of extensions in 8byte units */ |
996 | uint16_t ; |
997 | }; |
998 | |
999 | struct { |
1000 | uint32_t ; |
1001 | int32_t ; |
1002 | uint64_t ; |
1003 | }; |
1004 | |
1005 | struct fuse_dirent { |
1006 | uint64_t ino; |
1007 | uint64_t off; |
1008 | uint32_t namelen; |
1009 | uint32_t type; |
1010 | char name[]; |
1011 | }; |
1012 | |
1013 | /* Align variable length records to 64bit boundary */ |
1014 | #define FUSE_REC_ALIGN(x) \ |
1015 | (((x) + sizeof(uint64_t) - 1) & ~(sizeof(uint64_t) - 1)) |
1016 | |
1017 | #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name) |
1018 | #define FUSE_DIRENT_ALIGN(x) FUSE_REC_ALIGN(x) |
1019 | #define FUSE_DIRENT_SIZE(d) \ |
1020 | FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen) |
1021 | |
1022 | struct fuse_direntplus { |
1023 | struct fuse_entry_out entry_out; |
1024 | struct fuse_dirent dirent; |
1025 | }; |
1026 | |
1027 | #define FUSE_NAME_OFFSET_DIRENTPLUS \ |
1028 | offsetof(struct fuse_direntplus, dirent.name) |
1029 | #define FUSE_DIRENTPLUS_SIZE(d) \ |
1030 | FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET_DIRENTPLUS + (d)->dirent.namelen) |
1031 | |
1032 | struct fuse_notify_inval_inode_out { |
1033 | uint64_t ino; |
1034 | int64_t off; |
1035 | int64_t len; |
1036 | }; |
1037 | |
1038 | struct fuse_notify_inval_entry_out { |
1039 | uint64_t parent; |
1040 | uint32_t namelen; |
1041 | uint32_t flags; |
1042 | }; |
1043 | |
1044 | struct fuse_notify_delete_out { |
1045 | uint64_t parent; |
1046 | uint64_t child; |
1047 | uint32_t namelen; |
1048 | uint32_t padding; |
1049 | }; |
1050 | |
1051 | struct fuse_notify_store_out { |
1052 | uint64_t nodeid; |
1053 | uint64_t offset; |
1054 | uint32_t size; |
1055 | uint32_t padding; |
1056 | }; |
1057 | |
1058 | struct fuse_notify_retrieve_out { |
1059 | uint64_t notify_unique; |
1060 | uint64_t nodeid; |
1061 | uint64_t offset; |
1062 | uint32_t size; |
1063 | uint32_t padding; |
1064 | }; |
1065 | |
1066 | /* Matches the size of fuse_write_in */ |
1067 | struct fuse_notify_retrieve_in { |
1068 | uint64_t dummy1; |
1069 | uint64_t offset; |
1070 | uint32_t size; |
1071 | uint32_t dummy2; |
1072 | uint64_t dummy3; |
1073 | uint64_t dummy4; |
1074 | }; |
1075 | |
1076 | struct fuse_backing_map { |
1077 | int32_t fd; |
1078 | uint32_t flags; |
1079 | uint64_t padding; |
1080 | }; |
1081 | |
1082 | /* Device ioctls: */ |
1083 | #define FUSE_DEV_IOC_MAGIC 229 |
1084 | #define FUSE_DEV_IOC_CLONE _IOR(FUSE_DEV_IOC_MAGIC, 0, uint32_t) |
1085 | #define FUSE_DEV_IOC_BACKING_OPEN _IOW(FUSE_DEV_IOC_MAGIC, 1, \ |
1086 | struct fuse_backing_map) |
1087 | #define FUSE_DEV_IOC_BACKING_CLOSE _IOW(FUSE_DEV_IOC_MAGIC, 2, uint32_t) |
1088 | |
1089 | struct fuse_lseek_in { |
1090 | uint64_t fh; |
1091 | uint64_t offset; |
1092 | uint32_t whence; |
1093 | uint32_t padding; |
1094 | }; |
1095 | |
1096 | struct fuse_lseek_out { |
1097 | uint64_t offset; |
1098 | }; |
1099 | |
1100 | struct fuse_copy_file_range_in { |
1101 | uint64_t fh_in; |
1102 | uint64_t off_in; |
1103 | uint64_t nodeid_out; |
1104 | uint64_t fh_out; |
1105 | uint64_t off_out; |
1106 | uint64_t len; |
1107 | uint64_t flags; |
1108 | }; |
1109 | |
1110 | #define FUSE_SETUPMAPPING_FLAG_WRITE (1ull << 0) |
1111 | #define FUSE_SETUPMAPPING_FLAG_READ (1ull << 1) |
1112 | struct fuse_setupmapping_in { |
1113 | /* An already open handle */ |
1114 | uint64_t fh; |
1115 | /* Offset into the file to start the mapping */ |
1116 | uint64_t foffset; |
1117 | /* Length of mapping required */ |
1118 | uint64_t len; |
1119 | /* Flags, FUSE_SETUPMAPPING_FLAG_* */ |
1120 | uint64_t flags; |
1121 | /* Offset in Memory Window */ |
1122 | uint64_t moffset; |
1123 | }; |
1124 | |
1125 | struct fuse_removemapping_in { |
1126 | /* number of fuse_removemapping_one follows */ |
1127 | uint32_t count; |
1128 | }; |
1129 | |
1130 | struct fuse_removemapping_one { |
1131 | /* Offset into the dax window start the unmapping */ |
1132 | uint64_t moffset; |
1133 | /* Length of mapping required */ |
1134 | uint64_t len; |
1135 | }; |
1136 | |
1137 | #define FUSE_REMOVEMAPPING_MAX_ENTRY \ |
1138 | (PAGE_SIZE / sizeof(struct fuse_removemapping_one)) |
1139 | |
1140 | struct fuse_syncfs_in { |
1141 | uint64_t padding; |
1142 | }; |
1143 | |
1144 | /* |
1145 | * For each security context, send fuse_secctx with size of security context |
1146 | * fuse_secctx will be followed by security context name and this in turn |
1147 | * will be followed by actual context label. |
1148 | * fuse_secctx, name, context |
1149 | */ |
1150 | struct fuse_secctx { |
1151 | uint32_t size; |
1152 | uint32_t padding; |
1153 | }; |
1154 | |
1155 | /* |
1156 | * Contains the information about how many fuse_secctx structures are being |
1157 | * sent and what's the total size of all security contexts (including |
1158 | * size of fuse_secctx_header). |
1159 | * |
1160 | */ |
1161 | struct { |
1162 | uint32_t ; |
1163 | uint32_t ; |
1164 | }; |
1165 | |
1166 | /** |
1167 | * struct fuse_ext_header - extension header |
1168 | * @size: total size of this extension including this header |
1169 | * @type: type of extension |
1170 | * |
1171 | * This is made compatible with fuse_secctx_header by using type values > |
1172 | * FUSE_MAX_NR_SECCTX |
1173 | */ |
1174 | struct { |
1175 | uint32_t ; |
1176 | uint32_t ; |
1177 | }; |
1178 | |
1179 | /** |
1180 | * struct fuse_supp_groups - Supplementary group extension |
1181 | * @nr_groups: number of supplementary groups |
1182 | * @groups: flexible array of group IDs |
1183 | */ |
1184 | struct fuse_supp_groups { |
1185 | uint32_t nr_groups; |
1186 | uint32_t groups[]; |
1187 | }; |
1188 | |
1189 | #endif /* _LINUX_FUSE_H */ |
1190 | |