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