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