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