1/*
2    This file defines the kernel interface of FUSE
3    Copyright (C) 2001-2007  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    This -- and only this -- header file may also be distributed under
9    the terms of the BSD Licence as follows:
10
11    Copyright (C) 2001-2007 Miklos Szeredi. All rights reserved.
12
13    Redistribution and use in source and binary forms, with or without
14    modification, are permitted provided that the following conditions
15    are met:
16    1. Redistributions of source code must retain the above copyright
17       notice, this list of conditions and the following disclaimer.
18    2. Redistributions in binary form must reproduce the above copyright
19       notice, this list of conditions and the following disclaimer in the
20       documentation and/or other materials provided with the distribution.
21
22    THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25    ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
26    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32    SUCH DAMAGE.
33*/
34
35#ifndef linux
36#include <sys/types.h>
37#define __u64 uint64_t
38#define __u32 uint32_t
39#define __s32 int32_t
40#else
41#include <asm/types.h>
42#include <linux/major.h>
43#endif
44
45/** Version number of this interface */
46#define FUSE_KERNEL_VERSION 7
47
48/** Minor version number of this interface */
49#define FUSE_KERNEL_MINOR_VERSION 8
50
51/** The node ID of the root inode */
52#define FUSE_ROOT_ID 1
53
54/** The major number of the fuse character device */
55#define FUSE_MAJOR MISC_MAJOR
56
57/** The minor number of the fuse character device */
58#define FUSE_MINOR 229
59
60/* Make sure all structures are padded to 64bit boundary, so 32bit
61   userspace works under 64bit kernels */
62
63struct fuse_attr {
64	__u64	ino;
65	__u64	size;
66	__u64	blocks;
67	__u64	atime;
68	__u64	mtime;
69	__u64	ctime;
70	__u32	atimensec;
71	__u32	mtimensec;
72	__u32	ctimensec;
73	__u32	mode;
74	__u32	nlink;
75	__u32	uid;
76	__u32	gid;
77	__u32	rdev;
78};
79
80struct fuse_kstatfs {
81	__u64	blocks;
82	__u64	bfree;
83	__u64	bavail;
84	__u64	files;
85	__u64	ffree;
86	__u32	bsize;
87	__u32	namelen;
88	__u32	frsize;
89	__u32	padding;
90	__u32	spare[6];
91};
92
93struct fuse_file_lock {
94	__u64	start;
95	__u64	end;
96	__u32	type;
97	__u32	pid; /* tgid */
98};
99
100/**
101 * Bitmasks for fuse_setattr_in.valid
102 */
103#define FATTR_MODE	(1 << 0)
104#define FATTR_UID	(1 << 1)
105#define FATTR_GID	(1 << 2)
106#define FATTR_SIZE	(1 << 3)
107#define FATTR_ATIME	(1 << 4)
108#define FATTR_MTIME	(1 << 5)
109#define FATTR_FH	(1 << 6)
110
111/**
112 * Flags returned by the OPEN request
113 *
114 * FOPEN_DIRECT_IO: bypass page cache for this open file
115 * FOPEN_KEEP_CACHE: don't invalidate the data cache on open
116 */
117#define FOPEN_DIRECT_IO		(1 << 0)
118#define FOPEN_KEEP_CACHE	(1 << 1)
119
120/**
121 * INIT request/reply flags
122 */
123#define FUSE_ASYNC_READ		(1 << 0)
124#define FUSE_POSIX_LOCKS	(1 << 1)
125
126/**
127 * Release flags
128 */
129#define FUSE_RELEASE_FLUSH	(1 << 0)
130
131enum fuse_opcode {
132	FUSE_LOOKUP	   = 1,
133	FUSE_FORGET	   = 2,  /* no reply */
134	FUSE_GETATTR	   = 3,
135	FUSE_SETATTR	   = 4,
136	FUSE_READLINK	   = 5,
137	FUSE_SYMLINK	   = 6,
138	FUSE_MKNOD	   = 8,
139	FUSE_MKDIR	   = 9,
140	FUSE_UNLINK	   = 10,
141	FUSE_RMDIR	   = 11,
142	FUSE_RENAME	   = 12,
143	FUSE_LINK	   = 13,
144	FUSE_OPEN	   = 14,
145	FUSE_READ	   = 15,
146	FUSE_WRITE	   = 16,
147	FUSE_STATFS	   = 17,
148	FUSE_RELEASE       = 18,
149	FUSE_FSYNC         = 20,
150	FUSE_SETXATTR      = 21,
151	FUSE_GETXATTR      = 22,
152	FUSE_LISTXATTR     = 23,
153	FUSE_REMOVEXATTR   = 24,
154	FUSE_FLUSH         = 25,
155	FUSE_INIT          = 26,
156	FUSE_OPENDIR       = 27,
157	FUSE_READDIR       = 28,
158	FUSE_RELEASEDIR    = 29,
159	FUSE_FSYNCDIR      = 30,
160	FUSE_GETLK         = 31,
161	FUSE_SETLK         = 32,
162	FUSE_SETLKW        = 33,
163	FUSE_ACCESS        = 34,
164	FUSE_CREATE        = 35,
165	FUSE_INTERRUPT     = 36,
166	FUSE_BMAP          = 37,
167	FUSE_DESTROY       = 38,
168};
169
170/* The read buffer is required to be at least 8k, but may be much larger */
171#define FUSE_MIN_READ_BUFFER 8192
172
173struct fuse_entry_out {
174	__u64	nodeid;		/* Inode ID */
175	__u64	generation;	/* Inode generation: nodeid:gen must
176				   be unique for the fs's lifetime */
177	__u64	entry_valid;	/* Cache timeout for the name */
178	__u64	attr_valid;	/* Cache timeout for the attributes */
179	__u32	entry_valid_nsec;
180	__u32	attr_valid_nsec;
181	struct fuse_attr attr;
182};
183
184struct fuse_forget_in {
185	__u64	nlookup;
186};
187
188struct fuse_attr_out {
189	__u64	attr_valid;	/* Cache timeout for the attributes */
190	__u32	attr_valid_nsec;
191	__u32	dummy;
192	struct fuse_attr attr;
193};
194
195struct fuse_mknod_in {
196	__u32	mode;
197	__u32	rdev;
198};
199
200struct fuse_mkdir_in {
201	__u32	mode;
202	__u32	padding;
203};
204
205struct fuse_rename_in {
206	__u64	newdir;
207};
208
209struct fuse_link_in {
210	__u64	oldnodeid;
211};
212
213struct fuse_setattr_in {
214	__u32	valid;
215	__u32	padding;
216	__u64	fh;
217	__u64	size;
218	__u64	unused1;
219	__u64	atime;
220	__u64	mtime;
221	__u64	unused2;
222	__u32	atimensec;
223	__u32	mtimensec;
224	__u32	unused3;
225	__u32	mode;
226	__u32	unused4;
227	__u32	uid;
228	__u32	gid;
229	__u32	unused5;
230};
231
232struct fuse_open_in {
233	__u32	flags;
234	__u32	mode;
235};
236
237struct fuse_open_out {
238	__u64	fh;
239	__u32	open_flags;
240	__u32	padding;
241};
242
243struct fuse_release_in {
244	__u64	fh;
245	__u32	flags;
246	__u32	release_flags;
247	__u64	lock_owner;
248};
249
250struct fuse_flush_in {
251	__u64	fh;
252	__u32	unused;
253	__u32	padding;
254	__u64	lock_owner;
255};
256
257struct fuse_read_in {
258	__u64	fh;
259	__u64	offset;
260	__u32	size;
261	__u32	padding;
262};
263
264struct fuse_write_in {
265	__u64	fh;
266	__u64	offset;
267	__u32	size;
268	__u32	write_flags;
269};
270
271struct fuse_write_out {
272	__u32	size;
273	__u32	padding;
274};
275
276#define FUSE_COMPAT_STATFS_SIZE 48
277
278struct fuse_statfs_out {
279	struct fuse_kstatfs st;
280};
281
282struct fuse_fsync_in {
283	__u64	fh;
284	__u32	fsync_flags;
285	__u32	padding;
286};
287
288struct fuse_setxattr_in {
289	__u32	size;
290	__u32	flags;
291};
292
293struct fuse_getxattr_in {
294	__u32	size;
295	__u32	padding;
296};
297
298struct fuse_getxattr_out {
299	__u32	size;
300	__u32	padding;
301};
302
303struct fuse_lk_in {
304	__u64	fh;
305	__u64	owner;
306	struct fuse_file_lock lk;
307};
308
309struct fuse_lk_out {
310	struct fuse_file_lock lk;
311};
312
313struct fuse_access_in {
314	__u32	mask;
315	__u32	padding;
316};
317
318struct fuse_init_in {
319	__u32	major;
320	__u32	minor;
321	__u32	max_readahead;
322	__u32	flags;
323};
324
325struct fuse_init_out {
326	__u32	major;
327	__u32	minor;
328	__u32	max_readahead;
329	__u32	flags;
330	__u32	unused;
331	__u32	max_write;
332};
333
334struct fuse_interrupt_in {
335	__u64	unique;
336};
337
338struct fuse_bmap_in {
339	__u64	block;
340	__u32	blocksize;
341	__u32	padding;
342};
343
344struct fuse_bmap_out {
345	__u64	block;
346};
347
348struct fuse_in_header {
349	__u32	len;
350	__u32	opcode;
351	__u64	unique;
352	__u64	nodeid;
353	__u32	uid;
354	__u32	gid;
355	__u32	pid;
356	__u32	padding;
357};
358
359struct fuse_out_header {
360	__u32	len;
361	__s32	error;
362	__u64	unique;
363};
364
365struct fuse_dirent {
366	__u64	ino;
367	__u64	off;
368	__u32	namelen;
369	__u32	type;
370	char name[0];
371};
372
373#define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
374#define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1))
375#define FUSE_DIRENT_SIZE(d) \
376	FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
377