Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.9.
  1/*
  2    FUSE: Filesystem in Userspace
  3    Copyright (C) 2001-2008  Miklos Szeredi <miklos@szeredi.hu>
  4
  5    This program can be distributed under the terms of the GNU GPL.
  6    See the file COPYING.
  7*/
  8
  9/*
 10 * This file defines the kernel interface of FUSE
 11 *
 12 * Protocol changelog:
 13 *
 14 * 7.9:
 15 *  - new fuse_getattr_in input argument of GETATTR
 16 *  - add lk_flags in fuse_lk_in
 17 *  - add lock_owner field to fuse_setattr_in, fuse_read_in and fuse_write_in
 18 *  - add blksize field to fuse_attr
 19 *  - add file flags field to fuse_read_in and fuse_write_in
 20 *
 21 * 7.10
 22 *  - add nonseekable open flag
 23 *
 24 * 7.11
 25 *  - add IOCTL message
 26 *  - add unsolicited notification support
 27 *  - add POLL message and NOTIFY_POLL notification
 28 *
 29 * 7.12
 30 *  - add umask flag to input argument of open, mknod and mkdir
 31 *  - add notification messages for invalidation of inodes and
 32 *    directory entries
 33 *
 34 * 7.13
 35 *  - make max number of background requests and congestion threshold
 36 *    tunables
 37 *
 38 * 7.14
 39 *  - add splice support to fuse device
 40 *
 41 * 7.15
 42 *  - add store notify
 43 *  - add retrieve notify
 44 *
 45 * 7.16
 46 *  - add BATCH_FORGET request
 47 *  - FUSE_IOCTL_UNRESTRICTED shall now return with array of 'struct
 48 *    fuse_ioctl_iovec' instead of ambiguous 'struct iovec'
 49 *  - add FUSE_IOCTL_32BIT flag
 50 *
 51 * 7.17
 52 *  - add FUSE_FLOCK_LOCKS and FUSE_RELEASE_FLOCK_UNLOCK
 53 *
 54 * 7.18
 55 *  - add FUSE_IOCTL_DIR flag
 56 *  - add FUSE_NOTIFY_DELETE
 57 *
 58 * 7.19
 59 *  - add FUSE_FALLOCATE
 60 */
 61
 62#ifndef _LINUX_FUSE_H
 63#define _LINUX_FUSE_H
 64
 65#include <linux/types.h>
 66
 67/*
 68 * Version negotiation:
 69 *
 70 * Both the kernel and userspace send the version they support in the
 71 * INIT request and reply respectively.
 72 *
 73 * If the major versions match then both shall use the smallest
 74 * of the two minor versions for communication.
 75 *
 76 * If the kernel supports a larger major version, then userspace shall
 77 * reply with the major version it supports, ignore the rest of the
 78 * INIT message and expect a new INIT message from the kernel with a
 79 * matching major version.
 80 *
 81 * If the library supports a larger major version, then it shall fall
 82 * back to the major protocol version sent by the kernel for
 83 * communication and reply with that major version (and an arbitrary
 84 * supported minor version).
 85 */
 86
 87/** Version number of this interface */
 88#define FUSE_KERNEL_VERSION 7
 89
 90/** Minor version number of this interface */
 91#define FUSE_KERNEL_MINOR_VERSION 19
 92
 93/** The node ID of the root inode */
 94#define FUSE_ROOT_ID 1
 95
 96/* Make sure all structures are padded to 64bit boundary, so 32bit
 97   userspace works under 64bit kernels */
 98
 99struct fuse_attr {
100	__u64	ino;
101	__u64	size;
102	__u64	blocks;
103	__u64	atime;
104	__u64	mtime;
105	__u64	ctime;
106	__u32	atimensec;
107	__u32	mtimensec;
108	__u32	ctimensec;
109	__u32	mode;
110	__u32	nlink;
111	__u32	uid;
112	__u32	gid;
113	__u32	rdev;
114	__u32	blksize;
115	__u32	padding;
116};
117
118struct fuse_kstatfs {
119	__u64	blocks;
120	__u64	bfree;
121	__u64	bavail;
122	__u64	files;
123	__u64	ffree;
124	__u32	bsize;
125	__u32	namelen;
126	__u32	frsize;
127	__u32	padding;
128	__u32	spare[6];
129};
130
131struct fuse_file_lock {
132	__u64	start;
133	__u64	end;
134	__u32	type;
135	__u32	pid; /* tgid */
136};
137
138/**
139 * Bitmasks for fuse_setattr_in.valid
140 */
141#define FATTR_MODE	(1 << 0)
142#define FATTR_UID	(1 << 1)
143#define FATTR_GID	(1 << 2)
144#define FATTR_SIZE	(1 << 3)
145#define FATTR_ATIME	(1 << 4)
146#define FATTR_MTIME	(1 << 5)
147#define FATTR_FH	(1 << 6)
148#define FATTR_ATIME_NOW	(1 << 7)
149#define FATTR_MTIME_NOW	(1 << 8)
150#define FATTR_LOCKOWNER	(1 << 9)
151
152/**
153 * Flags returned by the OPEN request
154 *
155 * FOPEN_DIRECT_IO: bypass page cache for this open file
156 * FOPEN_KEEP_CACHE: don't invalidate the data cache on open
157 * FOPEN_NONSEEKABLE: the file is not seekable
158 */
159#define FOPEN_DIRECT_IO		(1 << 0)
160#define FOPEN_KEEP_CACHE	(1 << 1)
161#define FOPEN_NONSEEKABLE	(1 << 2)
162
163/**
164 * INIT request/reply flags
165 *
166 * FUSE_POSIX_LOCKS: remote locking for POSIX file locks
167 * FUSE_EXPORT_SUPPORT: filesystem handles lookups of "." and ".."
168 * FUSE_DONT_MASK: don't apply umask to file mode on create operations
169 * FUSE_FLOCK_LOCKS: remote locking for BSD style file locks
170 */
171#define FUSE_ASYNC_READ		(1 << 0)
172#define FUSE_POSIX_LOCKS	(1 << 1)
173#define FUSE_FILE_OPS		(1 << 2)
174#define FUSE_ATOMIC_O_TRUNC	(1 << 3)
175#define FUSE_EXPORT_SUPPORT	(1 << 4)
176#define FUSE_BIG_WRITES		(1 << 5)
177#define FUSE_DONT_MASK		(1 << 6)
178#define FUSE_FLOCK_LOCKS	(1 << 10)
179
180/**
181 * CUSE INIT request/reply flags
182 *
183 * CUSE_UNRESTRICTED_IOCTL:  use unrestricted ioctl
184 */
185#define CUSE_UNRESTRICTED_IOCTL	(1 << 0)
186
187/**
188 * Release flags
189 */
190#define FUSE_RELEASE_FLUSH	(1 << 0)
191#define FUSE_RELEASE_FLOCK_UNLOCK	(1 << 1)
192
193/**
194 * Getattr flags
195 */
196#define FUSE_GETATTR_FH		(1 << 0)
197
198/**
199 * Lock flags
200 */
201#define FUSE_LK_FLOCK		(1 << 0)
202
203/**
204 * WRITE flags
205 *
206 * FUSE_WRITE_CACHE: delayed write from page cache, file handle is guessed
207 * FUSE_WRITE_LOCKOWNER: lock_owner field is valid
208 */
209#define FUSE_WRITE_CACHE	(1 << 0)
210#define FUSE_WRITE_LOCKOWNER	(1 << 1)
211
212/**
213 * Read flags
214 */
215#define FUSE_READ_LOCKOWNER	(1 << 1)
216
217/**
218 * Ioctl flags
219 *
220 * FUSE_IOCTL_COMPAT: 32bit compat ioctl on 64bit machine
221 * FUSE_IOCTL_UNRESTRICTED: not restricted to well-formed ioctls, retry allowed
222 * FUSE_IOCTL_RETRY: retry with new iovecs
223 * FUSE_IOCTL_32BIT: 32bit ioctl
224 * FUSE_IOCTL_DIR: is a directory
225 *
226 * FUSE_IOCTL_MAX_IOV: maximum of in_iovecs + out_iovecs
227 */
228#define FUSE_IOCTL_COMPAT	(1 << 0)
229#define FUSE_IOCTL_UNRESTRICTED	(1 << 1)
230#define FUSE_IOCTL_RETRY	(1 << 2)
231#define FUSE_IOCTL_32BIT	(1 << 3)
232#define FUSE_IOCTL_DIR		(1 << 4)
233
234#define FUSE_IOCTL_MAX_IOV	256
235
236/**
237 * Poll flags
238 *
239 * FUSE_POLL_SCHEDULE_NOTIFY: request poll notify
240 */
241#define FUSE_POLL_SCHEDULE_NOTIFY (1 << 0)
242
243enum fuse_opcode {
244	FUSE_LOOKUP	   = 1,
245	FUSE_FORGET	   = 2,  /* no reply */
246	FUSE_GETATTR	   = 3,
247	FUSE_SETATTR	   = 4,
248	FUSE_READLINK	   = 5,
249	FUSE_SYMLINK	   = 6,
250	FUSE_MKNOD	   = 8,
251	FUSE_MKDIR	   = 9,
252	FUSE_UNLINK	   = 10,
253	FUSE_RMDIR	   = 11,
254	FUSE_RENAME	   = 12,
255	FUSE_LINK	   = 13,
256	FUSE_OPEN	   = 14,
257	FUSE_READ	   = 15,
258	FUSE_WRITE	   = 16,
259	FUSE_STATFS	   = 17,
260	FUSE_RELEASE       = 18,
261	FUSE_FSYNC         = 20,
262	FUSE_SETXATTR      = 21,
263	FUSE_GETXATTR      = 22,
264	FUSE_LISTXATTR     = 23,
265	FUSE_REMOVEXATTR   = 24,
266	FUSE_FLUSH         = 25,
267	FUSE_INIT          = 26,
268	FUSE_OPENDIR       = 27,
269	FUSE_READDIR       = 28,
270	FUSE_RELEASEDIR    = 29,
271	FUSE_FSYNCDIR      = 30,
272	FUSE_GETLK         = 31,
273	FUSE_SETLK         = 32,
274	FUSE_SETLKW        = 33,
275	FUSE_ACCESS        = 34,
276	FUSE_CREATE        = 35,
277	FUSE_INTERRUPT     = 36,
278	FUSE_BMAP          = 37,
279	FUSE_DESTROY       = 38,
280	FUSE_IOCTL         = 39,
281	FUSE_POLL          = 40,
282	FUSE_NOTIFY_REPLY  = 41,
283	FUSE_BATCH_FORGET  = 42,
284	FUSE_FALLOCATE     = 43,
285
286	/* CUSE specific operations */
287	CUSE_INIT          = 4096,
288};
289
290enum fuse_notify_code {
291	FUSE_NOTIFY_POLL   = 1,
292	FUSE_NOTIFY_INVAL_INODE = 2,
293	FUSE_NOTIFY_INVAL_ENTRY = 3,
294	FUSE_NOTIFY_STORE = 4,
295	FUSE_NOTIFY_RETRIEVE = 5,
296	FUSE_NOTIFY_DELETE = 6,
297	FUSE_NOTIFY_CODE_MAX,
298};
299
300/* The read buffer is required to be at least 8k, but may be much larger */
301#define FUSE_MIN_READ_BUFFER 8192
302
303#define FUSE_COMPAT_ENTRY_OUT_SIZE 120
304
305struct fuse_entry_out {
306	__u64	nodeid;		/* Inode ID */
307	__u64	generation;	/* Inode generation: nodeid:gen must
308				   be unique for the fs's lifetime */
309	__u64	entry_valid;	/* Cache timeout for the name */
310	__u64	attr_valid;	/* Cache timeout for the attributes */
311	__u32	entry_valid_nsec;
312	__u32	attr_valid_nsec;
313	struct fuse_attr attr;
314};
315
316struct fuse_forget_in {
317	__u64	nlookup;
318};
319
320struct fuse_forget_one {
321	__u64	nodeid;
322	__u64	nlookup;
323};
324
325struct fuse_batch_forget_in {
326	__u32	count;
327	__u32	dummy;
328};
329
330struct fuse_getattr_in {
331	__u32	getattr_flags;
332	__u32	dummy;
333	__u64	fh;
334};
335
336#define FUSE_COMPAT_ATTR_OUT_SIZE 96
337
338struct fuse_attr_out {
339	__u64	attr_valid;	/* Cache timeout for the attributes */
340	__u32	attr_valid_nsec;
341	__u32	dummy;
342	struct fuse_attr attr;
343};
344
345#define FUSE_COMPAT_MKNOD_IN_SIZE 8
346
347struct fuse_mknod_in {
348	__u32	mode;
349	__u32	rdev;
350	__u32	umask;
351	__u32	padding;
352};
353
354struct fuse_mkdir_in {
355	__u32	mode;
356	__u32	umask;
357};
358
359struct fuse_rename_in {
360	__u64	newdir;
361};
362
363struct fuse_link_in {
364	__u64	oldnodeid;
365};
366
367struct fuse_setattr_in {
368	__u32	valid;
369	__u32	padding;
370	__u64	fh;
371	__u64	size;
372	__u64	lock_owner;
373	__u64	atime;
374	__u64	mtime;
375	__u64	unused2;
376	__u32	atimensec;
377	__u32	mtimensec;
378	__u32	unused3;
379	__u32	mode;
380	__u32	unused4;
381	__u32	uid;
382	__u32	gid;
383	__u32	unused5;
384};
385
386struct fuse_open_in {
387	__u32	flags;
388	__u32	unused;
389};
390
391struct fuse_create_in {
392	__u32	flags;
393	__u32	mode;
394	__u32	umask;
395	__u32	padding;
396};
397
398struct fuse_open_out {
399	__u64	fh;
400	__u32	open_flags;
401	__u32	padding;
402};
403
404struct fuse_release_in {
405	__u64	fh;
406	__u32	flags;
407	__u32	release_flags;
408	__u64	lock_owner;
409};
410
411struct fuse_flush_in {
412	__u64	fh;
413	__u32	unused;
414	__u32	padding;
415	__u64	lock_owner;
416};
417
418struct fuse_read_in {
419	__u64	fh;
420	__u64	offset;
421	__u32	size;
422	__u32	read_flags;
423	__u64	lock_owner;
424	__u32	flags;
425	__u32	padding;
426};
427
428#define FUSE_COMPAT_WRITE_IN_SIZE 24
429
430struct fuse_write_in {
431	__u64	fh;
432	__u64	offset;
433	__u32	size;
434	__u32	write_flags;
435	__u64	lock_owner;
436	__u32	flags;
437	__u32	padding;
438};
439
440struct fuse_write_out {
441	__u32	size;
442	__u32	padding;
443};
444
445#define FUSE_COMPAT_STATFS_SIZE 48
446
447struct fuse_statfs_out {
448	struct fuse_kstatfs st;
449};
450
451struct fuse_fsync_in {
452	__u64	fh;
453	__u32	fsync_flags;
454	__u32	padding;
455};
456
457struct fuse_setxattr_in {
458	__u32	size;
459	__u32	flags;
460};
461
462struct fuse_getxattr_in {
463	__u32	size;
464	__u32	padding;
465};
466
467struct fuse_getxattr_out {
468	__u32	size;
469	__u32	padding;
470};
471
472struct fuse_lk_in {
473	__u64	fh;
474	__u64	owner;
475	struct fuse_file_lock lk;
476	__u32	lk_flags;
477	__u32	padding;
478};
479
480struct fuse_lk_out {
481	struct fuse_file_lock lk;
482};
483
484struct fuse_access_in {
485	__u32	mask;
486	__u32	padding;
487};
488
489struct fuse_init_in {
490	__u32	major;
491	__u32	minor;
492	__u32	max_readahead;
493	__u32	flags;
494};
495
496struct fuse_init_out {
497	__u32	major;
498	__u32	minor;
499	__u32	max_readahead;
500	__u32	flags;
501	__u16   max_background;
502	__u16   congestion_threshold;
503	__u32	max_write;
504};
505
506#define CUSE_INIT_INFO_MAX 4096
507
508struct cuse_init_in {
509	__u32	major;
510	__u32	minor;
511	__u32	unused;
512	__u32	flags;
513};
514
515struct cuse_init_out {
516	__u32	major;
517	__u32	minor;
518	__u32	unused;
519	__u32	flags;
520	__u32	max_read;
521	__u32	max_write;
522	__u32	dev_major;		/* chardev major */
523	__u32	dev_minor;		/* chardev minor */
524	__u32	spare[10];
525};
526
527struct fuse_interrupt_in {
528	__u64	unique;
529};
530
531struct fuse_bmap_in {
532	__u64	block;
533	__u32	blocksize;
534	__u32	padding;
535};
536
537struct fuse_bmap_out {
538	__u64	block;
539};
540
541struct fuse_ioctl_in {
542	__u64	fh;
543	__u32	flags;
544	__u32	cmd;
545	__u64	arg;
546	__u32	in_size;
547	__u32	out_size;
548};
549
550struct fuse_ioctl_iovec {
551	__u64	base;
552	__u64	len;
553};
554
555struct fuse_ioctl_out {
556	__s32	result;
557	__u32	flags;
558	__u32	in_iovs;
559	__u32	out_iovs;
560};
561
562struct fuse_poll_in {
563	__u64	fh;
564	__u64	kh;
565	__u32	flags;
566	__u32   padding;
567};
568
569struct fuse_poll_out {
570	__u32	revents;
571	__u32	padding;
572};
573
574struct fuse_notify_poll_wakeup_out {
575	__u64	kh;
576};
577
578struct fuse_fallocate_in {
579	__u64	fh;
580	__u64	offset;
581	__u64	length;
582	__u32	mode;
583	__u32	padding;
584};
585
586struct fuse_in_header {
587	__u32	len;
588	__u32	opcode;
589	__u64	unique;
590	__u64	nodeid;
591	__u32	uid;
592	__u32	gid;
593	__u32	pid;
594	__u32	padding;
595};
596
597struct fuse_out_header {
598	__u32	len;
599	__s32	error;
600	__u64	unique;
601};
602
603struct fuse_dirent {
604	__u64	ino;
605	__u64	off;
606	__u32	namelen;
607	__u32	type;
608	char name[];
609};
610
611#define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
612#define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1))
613#define FUSE_DIRENT_SIZE(d) \
614	FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
615
616struct fuse_notify_inval_inode_out {
617	__u64	ino;
618	__s64	off;
619	__s64	len;
620};
621
622struct fuse_notify_inval_entry_out {
623	__u64	parent;
624	__u32	namelen;
625	__u32	padding;
626};
627
628struct fuse_notify_delete_out {
629	__u64	parent;
630	__u64	child;
631	__u32	namelen;
632	__u32	padding;
633};
634
635struct fuse_notify_store_out {
636	__u64	nodeid;
637	__u64	offset;
638	__u32	size;
639	__u32	padding;
640};
641
642struct fuse_notify_retrieve_out {
643	__u64	notify_unique;
644	__u64	nodeid;
645	__u64	offset;
646	__u32	size;
647	__u32	padding;
648};
649
650/* Matches the size of fuse_write_in */
651struct fuse_notify_retrieve_in {
652	__u64	dummy1;
653	__u64	offset;
654	__u32	size;
655	__u32	dummy2;
656	__u64	dummy3;
657	__u64	dummy4;
658};
659
660#endif /* _LINUX_FUSE_H */