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 * We introduce ourself as 7.18 (Posix ACLS : 7.12, IOCTL_DIR : 7.18) 53 * and we expect features features defined for 7.18, but not implemented 54 * here to not be triggered by ntfs-3g. 55 */ 56 #define FUSE_KERNEL_MINOR_VERSION 18 57 58 /* 59 * For binary compatibility with old kernels we accept falling back 60 * to 7.12 or earlier maximum version supported by the kernel 61 */ 62 63 #define FUSE_KERNEL_MAJOR_FALLBACK 7 64 #define FUSE_KERNEL_MINOR_FALLBACK 12 65 66 /** The node ID of the root inode */ 67 #define FUSE_ROOT_ID 1 68 69 /** The major number of the fuse character device */ 70 #define FUSE_MAJOR MISC_MAJOR 71 72 /** The minor number of the fuse character device */ 73 #define FUSE_MINOR 229 74 75 /* Make sure all structures are padded to 64bit boundary, so 32bit 76 userspace works under 64bit kernels */ 77 78 struct fuse_attr { 79 __u64 ino; 80 __u64 size; 81 __u64 blocks; 82 __u64 atime; 83 __u64 mtime; 84 __u64 ctime; 85 __u32 atimensec; 86 __u32 mtimensec; 87 __u32 ctimensec; 88 __u32 mode; 89 __u32 nlink; 90 __u32 uid; 91 __u32 gid; 92 __u32 rdev; 93 __u64 filling; /* JPA needed for minor >= 12, but meaning unknown */ 94 }; 95 96 struct fuse_kstatfs { 97 __u64 blocks; 98 __u64 bfree; 99 __u64 bavail; 100 __u64 files; 101 __u64 ffree; 102 __u32 bsize; 103 __u32 namelen; 104 __u32 frsize; 105 __u32 padding; 106 __u32 spare[6]; 107 }; 108 109 struct fuse_file_lock { 110 __u64 start; 111 __u64 end; 112 __u32 type; 113 __u32 pid; /* tgid */ 114 }; 115 116 /** 117 * Bitmasks for fuse_setattr_in.valid 118 */ 119 #define FATTR_MODE (1 << 0) 120 #define FATTR_UID (1 << 1) 121 #define FATTR_GID (1 << 2) 122 #define FATTR_SIZE (1 << 3) 123 #define FATTR_ATIME (1 << 4) 124 #define FATTR_MTIME (1 << 5) 125 #define FATTR_FH (1 << 6) 126 127 /** 128 * Flags returned by the OPEN request 129 * 130 * FOPEN_DIRECT_IO: bypass page cache for this open file 131 * FOPEN_KEEP_CACHE: don't invalidate the data cache on open 132 */ 133 #define FOPEN_DIRECT_IO (1 << 0) 134 #define FOPEN_KEEP_CACHE (1 << 1) 135 136 /** 137 * INIT request/reply flags 138 * FUSE_BIG_WRITES: allow big writes to be issued to the file system 139 * FUSE_DONT_MASK: don't apply umask to file mode on create operations 140 * FUSE_HAS_IOCTL_DIR: kernel supports ioctl on directories 141 * FUSE_POSIX_ACL: kernel supports Posix ACLs 142 */ 143 #define FUSE_ASYNC_READ (1 << 0) 144 #define FUSE_POSIX_LOCKS (1 << 1) 145 #define FUSE_BIG_WRITES (1 << 5) 146 #define FUSE_DONT_MASK (1 << 6) 147 #define FUSE_HAS_IOCTL_DIR (1 << 11) 148 #define FUSE_POSIX_ACL (1 << 19) 149 150 /** 151 * Release flags 152 */ 153 #define FUSE_RELEASE_FLUSH (1 << 0) 154 155 enum fuse_opcode { 156 FUSE_LOOKUP = 1, 157 FUSE_FORGET = 2, /* no reply */ 158 FUSE_GETATTR = 3, 159 FUSE_SETATTR = 4, 160 FUSE_READLINK = 5, 161 FUSE_SYMLINK = 6, 162 FUSE_MKNOD = 8, 163 FUSE_MKDIR = 9, 164 FUSE_UNLINK = 10, 165 FUSE_RMDIR = 11, 166 FUSE_RENAME = 12, 167 FUSE_LINK = 13, 168 FUSE_OPEN = 14, 169 FUSE_READ = 15, 170 FUSE_WRITE = 16, 171 FUSE_STATFS = 17, 172 FUSE_RELEASE = 18, 173 FUSE_FSYNC = 20, 174 FUSE_SETXATTR = 21, 175 FUSE_GETXATTR = 22, 176 FUSE_LISTXATTR = 23, 177 FUSE_REMOVEXATTR = 24, 178 FUSE_FLUSH = 25, 179 FUSE_INIT = 26, 180 FUSE_OPENDIR = 27, 181 FUSE_READDIR = 28, 182 FUSE_RELEASEDIR = 29, 183 FUSE_FSYNCDIR = 30, 184 FUSE_GETLK = 31, 185 FUSE_SETLK = 32, 186 FUSE_SETLKW = 33, 187 FUSE_ACCESS = 34, 188 FUSE_CREATE = 35, 189 FUSE_INTERRUPT = 36, 190 FUSE_BMAP = 37, 191 FUSE_DESTROY = 38, 192 FUSE_IOCTL = 39, 193 }; 194 195 /* The read buffer is required to be at least 8k, but may be much larger */ 196 #define FUSE_MIN_READ_BUFFER 8192 197 #define FUSE_COMPAT_ENTRY_OUT_SIZE 120 /* JPA */ 198 199 struct fuse_entry_out { 200 __u64 nodeid; /* Inode ID */ 201 __u64 generation; /* Inode generation: nodeid:gen must 202 be unique for the fs's lifetime */ 203 __u64 entry_valid; /* Cache timeout for the name */ 204 __u64 attr_valid; /* Cache timeout for the attributes */ 205 __u32 entry_valid_nsec; 206 __u32 attr_valid_nsec; 207 struct fuse_attr attr; 208 }; 209 210 struct fuse_forget_in { 211 __u64 nlookup; 212 }; 213 214 #define FUSE_COMPAT_FUSE_ATTR_OUT_SIZE 96 /* JPA */ 215 216 struct fuse_attr_out { 217 __u64 attr_valid; /* Cache timeout for the attributes */ 218 __u32 attr_valid_nsec; 219 __u32 dummy; 220 struct fuse_attr attr; 221 }; 222 223 #define FUSE_COMPAT_MKNOD_IN_SIZE 8 224 225 struct fuse_mknod_in { 226 __u32 mode; 227 __u32 rdev; 228 __u32 umask; 229 __u32 padding; 230 }; 231 232 struct fuse_mkdir_in { 233 __u32 mode; 234 __u32 umask; 235 }; 236 237 struct fuse_rename_in { 238 __u64 newdir; 239 }; 240 241 struct fuse_link_in { 242 __u64 oldnodeid; 243 }; 244 245 struct fuse_setattr_in { 246 __u32 valid; 247 __u32 padding; 248 __u64 fh; 249 __u64 size; 250 __u64 unused1; 251 __u64 atime; 252 __u64 mtime; 253 __u64 unused2; 254 __u32 atimensec; 255 __u32 mtimensec; 256 __u32 unused3; 257 __u32 mode; 258 __u32 unused4; 259 __u32 uid; 260 __u32 gid; 261 __u32 unused5; 262 }; 263 264 struct fuse_open_in { 265 __u32 flags; 266 __u32 mode; /* unused for protocol < 7.12 */ 267 }; 268 269 struct fuse_create_in { 270 __u32 flags; 271 __u32 mode; 272 __u32 umask; 273 __u32 padding; 274 }; 275 276 struct fuse_open_out { 277 __u64 fh; 278 __u32 open_flags; 279 __u32 padding; 280 }; 281 282 struct fuse_release_in { 283 __u64 fh; 284 __u32 flags; 285 __u32 release_flags; 286 __u64 lock_owner; 287 }; 288 289 struct fuse_flush_in { 290 __u64 fh; 291 __u32 unused; 292 __u32 padding; 293 __u64 lock_owner; 294 }; 295 296 struct fuse_read_in { 297 __u64 fh; 298 __u64 offset; 299 __u32 size; 300 __u32 padding; 301 }; 302 303 #define FUSE_COMPAT_WRITE_IN_SIZE 24 /* JPA */ 304 305 struct fuse_write_in { 306 __u64 fh; 307 __u64 offset; 308 __u32 size; 309 __u32 write_flags; 310 __u64 lock_owner; /* JPA */ 311 __u32 flags; /* JPA */ 312 __u32 padding; /* JPA */ 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_ioctl_in { 393 __u64 fh; 394 __u32 flags; 395 __u32 cmd; 396 __u64 arg; 397 __u32 in_size; 398 __u32 out_size; 399 }; 400 401 struct fuse_ioctl_iovec { 402 __u64 base; 403 __u64 len; 404 }; 405 406 struct fuse_ioctl_out { 407 __s32 result; 408 __u32 flags; 409 __u32 in_iovs; 410 __u32 out_iovs; 411 }; 412 413 struct fuse_in_header { 414 __u32 len; 415 __u32 opcode; 416 __u64 unique; 417 __u64 nodeid; 418 __u32 uid; 419 __u32 gid; 420 __u32 pid; 421 __u32 padding; 422 }; 423 424 struct fuse_out_header { 425 __u32 len; 426 __s32 error; 427 __u64 unique; 428 }; 429 430 struct fuse_dirent { 431 __u64 ino; 432 __u64 off; 433 __u32 namelen; 434 __u32 type; 435 char name[0]; 436 }; 437 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) 442