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