2 This file defines the kernel interface of FUSE
3 Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
5 This program can be distributed under the terms of the GNU GPL.
8 This -- and only this -- header file may also be distributed under
9 the terms of the BSD Licence as follows:
11 Copyright (C) 2001-2007 Miklos Szeredi. All rights reserved.
13 Redistribution and use in source and binary forms, with or without
14 modification, are permitted provided that the following conditions
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.
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
36 * This file defines the kernel interface of FUSE
41 * - new fuse_getattr_in input argument of GETATTR
42 * - add lk_flags in fuse_lk_in
43 * - add lock_owner field to fuse_setattr_in, fuse_read_in and fuse_write_in
44 * - add blksize field to fuse_attr
45 * - add file flags field to fuse_read_in and fuse_write_in
49 #include <sys/types.h>
50 #define __u64 uint64_t
51 #define __u32 uint32_t
54 #include <asm/types.h>
55 #include <linux/major.h>
58 /** Version number of this interface */
59 #define FUSE_KERNEL_VERSION 7
61 /** Minor version number of this interface */
62 #define FUSE_KERNEL_MINOR_VERSION 9
64 /** The node ID of the root inode */
65 #define FUSE_ROOT_ID 1
67 /** The major number of the fuse character device */
68 #define FUSE_MAJOR MISC_MAJOR
70 /** The minor number of the fuse character device */
71 #define FUSE_MINOR 229
73 /* Make sure all structures are padded to 64bit boundary, so 32bit
74 userspace works under 64bit kernels */
108 struct fuse_file_lock
{
112 __u32 pid
; /* tgid */
116 * Bitmasks for fuse_setattr_in.valid
118 #define FATTR_MODE (1 << 0)
119 #define FATTR_UID (1 << 1)
120 #define FATTR_GID (1 << 2)
121 #define FATTR_SIZE (1 << 3)
122 #define FATTR_ATIME (1 << 4)
123 #define FATTR_MTIME (1 << 5)
124 #define FATTR_FH (1 << 6)
125 #define FATTR_ATIME_NOW (1 << 7)
126 #define FATTR_MTIME_NOW (1 << 8)
127 #define FATTR_LOCKOWNER (1 << 9)
130 * Flags returned by the OPEN request
132 * FOPEN_DIRECT_IO: bypass page cache for this open file
133 * FOPEN_KEEP_CACHE: don't invalidate the data cache on open
135 #define FOPEN_DIRECT_IO (1 << 0)
136 #define FOPEN_KEEP_CACHE (1 << 1)
139 * INIT request/reply flags
141 #define FUSE_ASYNC_READ (1 << 0)
142 #define FUSE_POSIX_LOCKS (1 << 1)
143 #define FUSE_FILE_OPS (1 << 2)
144 #define FUSE_ATOMIC_O_TRUNC (1 << 3)
145 #define FUSE_BIG_WRITES (1 << 5)
150 #define FUSE_RELEASE_FLUSH (1 << 0)
155 #define FUSE_GETATTR_FH (1 << 0)
160 #define FUSE_LK_FLOCK (1 << 0)
165 * FUSE_WRITE_CACHE: delayed write from page cache, file handle is guessed
166 * FUSE_WRITE_LOCKOWNER: lock_owner field is valid
168 #define FUSE_WRITE_CACHE (1 << 0)
169 #define FUSE_WRITE_LOCKOWNER (1 << 1)
174 #define FUSE_READ_LOCKOWNER (1 << 1)
178 FUSE_FORGET
= 2, /* no reply */
198 FUSE_REMOVEXATTR
= 24,
203 FUSE_RELEASEDIR
= 29,
215 /* The read buffer is required to be at least 8k, but may be much larger */
216 #define FUSE_MIN_READ_BUFFER 8192
218 #define FUSE_COMPAT_ENTRY_OUT_SIZE 120
220 struct fuse_entry_out
{
221 __u64 nodeid
; /* Inode ID */
222 __u64 generation
; /* Inode generation: nodeid:gen must
223 be unique for the fs's lifetime */
224 __u64 entry_valid
; /* Cache timeout for the name */
225 __u64 attr_valid
; /* Cache timeout for the attributes */
226 __u32 entry_valid_nsec
;
227 __u32 attr_valid_nsec
;
228 struct fuse_attr attr
;
231 struct fuse_forget_in
{
235 struct fuse_getattr_in
{
241 #define FUSE_COMPAT_ATTR_OUT_SIZE 96
243 struct fuse_attr_out
{
244 __u64 attr_valid
; /* Cache timeout for the attributes */
245 __u32 attr_valid_nsec
;
247 struct fuse_attr attr
;
250 struct fuse_mknod_in
{
255 struct fuse_mkdir_in
{
260 struct fuse_rename_in
{
264 struct fuse_link_in
{
268 struct fuse_setattr_in
{
287 struct fuse_open_in
{
292 struct fuse_open_out
{
298 struct fuse_release_in
{
305 struct fuse_flush_in
{
312 struct fuse_read_in
{
322 #define FUSE_COMPAT_WRITE_IN_SIZE 24
324 struct fuse_write_in
{
334 struct fuse_write_out
{
339 #define FUSE_COMPAT_STATFS_SIZE 48
341 struct fuse_statfs_out
{
342 struct fuse_kstatfs st
;
345 struct fuse_fsync_in
{
351 struct fuse_setxattr_in
{
356 struct fuse_getxattr_in
{
361 struct fuse_getxattr_out
{
369 struct fuse_file_lock lk
;
375 struct fuse_file_lock lk
;
378 struct fuse_access_in
{
383 struct fuse_init_in
{
390 struct fuse_init_out
{
399 struct fuse_interrupt_in
{
403 struct fuse_bmap_in
{
409 struct fuse_bmap_out
{
413 struct fuse_in_header
{
424 struct fuse_out_header
{
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)