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