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