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