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 | |
71 | struct 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 | |
91 | struct 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 | |
104 | struct 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 | |
146 | enum 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 | |
189 | struct 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 | |
200 | struct fuse_forget_in { |
201 | __u64 nlookup; |
202 | }; |
203 | |
204 | #define FUSE_COMPAT_FUSE_ATTR_OUT_SIZE 96 /* JPA */ |
205 | |
206 | struct 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 | |
215 | struct fuse_mknod_in { |
216 | __u32 mode; |
217 | __u32 rdev; |
218 | #ifdef POSIXACLS |
219 | __u32 umask; |
220 | __u32 padding; |
221 | #endif |
222 | }; |
223 | |
224 | struct fuse_mkdir_in { |
225 | __u32 mode; |
226 | __u32 umask; |
227 | }; |
228 | |
229 | struct fuse_rename_in { |
230 | __u64 newdir; |
231 | }; |
232 | |
233 | struct fuse_link_in { |
234 | __u64 oldnodeid; |
235 | }; |
236 | |
237 | struct 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 | |
256 | struct fuse_open_in { |
257 | __u32 flags; |
258 | #ifdef POSIXACLS |
259 | __u32 unused; |
260 | #else |
261 | __u32 mode; |
262 | #endif |
263 | }; |
264 | |
265 | struct fuse_create_in { |
266 | __u32 flags; |
267 | __u32 mode; |
268 | #ifdef POSIXACLS |
269 | __u32 umask; |
270 | __u32 padding; |
271 | #endif |
272 | }; |
273 | |
274 | struct fuse_open_out { |
275 | __u64 fh; |
276 | __u32 open_flags; |
277 | __u32 padding; |
278 | }; |
279 | |
280 | struct fuse_release_in { |
281 | __u64 fh; |
282 | __u32 flags; |
283 | __u32 release_flags; |
284 | __u64 lock_owner; |
285 | }; |
286 | |
287 | struct fuse_flush_in { |
288 | __u64 fh; |
289 | __u32 unused; |
290 | __u32 padding; |
291 | __u64 lock_owner; |
292 | }; |
293 | |
294 | struct 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 | |
303 | struct 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 | |
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_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 | |
403 | struct fuse_out_header { |
404 | __u32 len; |
405 | __s32 error; |
406 | __u64 unique; |
407 | }; |
408 | |
409 | struct 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 |