1 /* 2 FUSE: Filesystem in Userspace 3 Copyright (C) 2001-2008 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 9 /* 10 * This file defines the kernel interface of FUSE 11 * 12 * Protocol changelog: 13 * 14 * 7.9: 15 * - new fuse_getattr_in input argument of GETATTR 16 * - add lk_flags in fuse_lk_in 17 * - add lock_owner field to fuse_setattr_in, fuse_read_in and fuse_write_in 18 * - add blksize field to fuse_attr 19 * - add file flags field to fuse_read_in and fuse_write_in 20 * 21 * 7.10 22 * - add nonseekable open flag 23 * 24 * 7.11 25 * - add IOCTL message 26 * - add unsolicited notification support 27 * - add POLL message and NOTIFY_POLL notification 28 */ 29 30 #ifndef _LINUX_FUSE_H 31 #define _LINUX_FUSE_H 32 33 #include <linux/types.h> 34 35 /** Version number of this interface */ 36 #define FUSE_KERNEL_VERSION 7 37 38 /** Minor version number of this interface */ 39 #define FUSE_KERNEL_MINOR_VERSION 11 40 41 /** The node ID of the root inode */ 42 #define FUSE_ROOT_ID 1 43 44 /* Make sure all structures are padded to 64bit boundary, so 32bit 45 userspace works under 64bit kernels */ 46 47 struct fuse_attr { 48 __u64 ino; 49 __u64 size; 50 __u64 blocks; 51 __u64 atime; 52 __u64 mtime; 53 __u64 ctime; 54 __u32 atimensec; 55 __u32 mtimensec; 56 __u32 ctimensec; 57 __u32 mode; 58 __u32 nlink; 59 __u32 uid; 60 __u32 gid; 61 __u32 rdev; 62 __u32 blksize; 63 __u32 padding; 64 }; 65 66 struct fuse_kstatfs { 67 __u64 blocks; 68 __u64 bfree; 69 __u64 bavail; 70 __u64 files; 71 __u64 ffree; 72 __u32 bsize; 73 __u32 namelen; 74 __u32 frsize; 75 __u32 padding; 76 __u32 spare[6]; 77 }; 78 79 struct fuse_file_lock { 80 __u64 start; 81 __u64 end; 82 __u32 type; 83 __u32 pid; /* tgid */ 84 }; 85 86 /** 87 * Bitmasks for fuse_setattr_in.valid 88 */ 89 #define FATTR_MODE (1 << 0) 90 #define FATTR_UID (1 << 1) 91 #define FATTR_GID (1 << 2) 92 #define FATTR_SIZE (1 << 3) 93 #define FATTR_ATIME (1 << 4) 94 #define FATTR_MTIME (1 << 5) 95 #define FATTR_FH (1 << 6) 96 #define FATTR_ATIME_NOW (1 << 7) 97 #define FATTR_MTIME_NOW (1 << 8) 98 #define FATTR_LOCKOWNER (1 << 9) 99 100 /** 101 * Flags returned by the OPEN request 102 * 103 * FOPEN_DIRECT_IO: bypass page cache for this open file 104 * FOPEN_KEEP_CACHE: don't invalidate the data cache on open 105 * FOPEN_NONSEEKABLE: the file is not seekable 106 */ 107 #define FOPEN_DIRECT_IO (1 << 0) 108 #define FOPEN_KEEP_CACHE (1 << 1) 109 #define FOPEN_NONSEEKABLE (1 << 2) 110 111 /** 112 * INIT request/reply flags 113 * 114 * FUSE_EXPORT_SUPPORT: filesystem handles lookups of "." and ".." 115 */ 116 #define FUSE_ASYNC_READ (1 << 0) 117 #define FUSE_POSIX_LOCKS (1 << 1) 118 #define FUSE_FILE_OPS (1 << 2) 119 #define FUSE_ATOMIC_O_TRUNC (1 << 3) 120 #define FUSE_EXPORT_SUPPORT (1 << 4) 121 #define FUSE_BIG_WRITES (1 << 5) 122 123 /** 124 * Release flags 125 */ 126 #define FUSE_RELEASE_FLUSH (1 << 0) 127 128 /** 129 * Getattr flags 130 */ 131 #define FUSE_GETATTR_FH (1 << 0) 132 133 /** 134 * Lock flags 135 */ 136 #define FUSE_LK_FLOCK (1 << 0) 137 138 /** 139 * WRITE flags 140 * 141 * FUSE_WRITE_CACHE: delayed write from page cache, file handle is guessed 142 * FUSE_WRITE_LOCKOWNER: lock_owner field is valid 143 */ 144 #define FUSE_WRITE_CACHE (1 << 0) 145 #define FUSE_WRITE_LOCKOWNER (1 << 1) 146 147 /** 148 * Read flags 149 */ 150 #define FUSE_READ_LOCKOWNER (1 << 1) 151 152 /** 153 * Ioctl flags 154 * 155 * FUSE_IOCTL_COMPAT: 32bit compat ioctl on 64bit machine 156 * FUSE_IOCTL_UNRESTRICTED: not restricted to well-formed ioctls, retry allowed 157 * FUSE_IOCTL_RETRY: retry with new iovecs 158 * 159 * FUSE_IOCTL_MAX_IOV: maximum of in_iovecs + out_iovecs 160 */ 161 #define FUSE_IOCTL_COMPAT (1 << 0) 162 #define FUSE_IOCTL_UNRESTRICTED (1 << 1) 163 #define FUSE_IOCTL_RETRY (1 << 2) 164 165 #define FUSE_IOCTL_MAX_IOV 256 166 167 /** 168 * Poll flags 169 * 170 * FUSE_POLL_SCHEDULE_NOTIFY: request poll notify 171 */ 172 #define FUSE_POLL_SCHEDULE_NOTIFY (1 << 0) 173 174 enum fuse_opcode { 175 FUSE_LOOKUP = 1, 176 FUSE_FORGET = 2, /* no reply */ 177 FUSE_GETATTR = 3, 178 FUSE_SETATTR = 4, 179 FUSE_READLINK = 5, 180 FUSE_SYMLINK = 6, 181 FUSE_MKNOD = 8, 182 FUSE_MKDIR = 9, 183 FUSE_UNLINK = 10, 184 FUSE_RMDIR = 11, 185 FUSE_RENAME = 12, 186 FUSE_LINK = 13, 187 FUSE_OPEN = 14, 188 FUSE_READ = 15, 189 FUSE_WRITE = 16, 190 FUSE_STATFS = 17, 191 FUSE_RELEASE = 18, 192 FUSE_FSYNC = 20, 193 FUSE_SETXATTR = 21, 194 FUSE_GETXATTR = 22, 195 FUSE_LISTXATTR = 23, 196 FUSE_REMOVEXATTR = 24, 197 FUSE_FLUSH = 25, 198 FUSE_INIT = 26, 199 FUSE_OPENDIR = 27, 200 FUSE_READDIR = 28, 201 FUSE_RELEASEDIR = 29, 202 FUSE_FSYNCDIR = 30, 203 FUSE_GETLK = 31, 204 FUSE_SETLK = 32, 205 FUSE_SETLKW = 33, 206 FUSE_ACCESS = 34, 207 FUSE_CREATE = 35, 208 FUSE_INTERRUPT = 36, 209 FUSE_BMAP = 37, 210 FUSE_DESTROY = 38, 211 FUSE_IOCTL = 39, 212 FUSE_POLL = 40, 213 }; 214 215 enum fuse_notify_code { 216 FUSE_NOTIFY_POLL = 1, 217 FUSE_NOTIFY_CODE_MAX, 218 }; 219 220 /* The read buffer is required to be at least 8k, but may be much larger */ 221 #define FUSE_MIN_READ_BUFFER 8192 222 223 #define FUSE_COMPAT_ENTRY_OUT_SIZE 120 224 225 struct fuse_entry_out { 226 __u64 nodeid; /* Inode ID */ 227 __u64 generation; /* Inode generation: nodeid:gen must 228 be unique for the fs's lifetime */ 229 __u64 entry_valid; /* Cache timeout for the name */ 230 __u64 attr_valid; /* Cache timeout for the attributes */ 231 __u32 entry_valid_nsec; 232 __u32 attr_valid_nsec; 233 struct fuse_attr attr; 234 }; 235 236 struct fuse_forget_in { 237 __u64 nlookup; 238 }; 239 240 struct fuse_getattr_in { 241 __u32 getattr_flags; 242 __u32 dummy; 243 __u64 fh; 244 }; 245 246 #define FUSE_COMPAT_ATTR_OUT_SIZE 96 247 248 struct fuse_attr_out { 249 __u64 attr_valid; /* Cache timeout for the attributes */ 250 __u32 attr_valid_nsec; 251 __u32 dummy; 252 struct fuse_attr attr; 253 }; 254 255 struct fuse_mknod_in { 256 __u32 mode; 257 __u32 rdev; 258 }; 259 260 struct fuse_mkdir_in { 261 __u32 mode; 262 __u32 padding; 263 }; 264 265 struct fuse_rename_in { 266 __u64 newdir; 267 }; 268 269 struct fuse_link_in { 270 __u64 oldnodeid; 271 }; 272 273 struct fuse_setattr_in { 274 __u32 valid; 275 __u32 padding; 276 __u64 fh; 277 __u64 size; 278 __u64 lock_owner; 279 __u64 atime; 280 __u64 mtime; 281 __u64 unused2; 282 __u32 atimensec; 283 __u32 mtimensec; 284 __u32 unused3; 285 __u32 mode; 286 __u32 unused4; 287 __u32 uid; 288 __u32 gid; 289 __u32 unused5; 290 }; 291 292 struct fuse_open_in { 293 __u32 flags; 294 __u32 mode; 295 }; 296 297 struct fuse_open_out { 298 __u64 fh; 299 __u32 open_flags; 300 __u32 padding; 301 }; 302 303 struct fuse_release_in { 304 __u64 fh; 305 __u32 flags; 306 __u32 release_flags; 307 __u64 lock_owner; 308 }; 309 310 struct fuse_flush_in { 311 __u64 fh; 312 __u32 unused; 313 __u32 padding; 314 __u64 lock_owner; 315 }; 316 317 struct fuse_read_in { 318 __u64 fh; 319 __u64 offset; 320 __u32 size; 321 __u32 read_flags; 322 __u64 lock_owner; 323 __u32 flags; 324 __u32 padding; 325 }; 326 327 #define FUSE_COMPAT_WRITE_IN_SIZE 24 328 329 struct fuse_write_in { 330 __u64 fh; 331 __u64 offset; 332 __u32 size; 333 __u32 write_flags; 334 __u64 lock_owner; 335 __u32 flags; 336 __u32 padding; 337 }; 338 339 struct fuse_write_out { 340 __u32 size; 341 __u32 padding; 342 }; 343 344 #define FUSE_COMPAT_STATFS_SIZE 48 345 346 struct fuse_statfs_out { 347 struct fuse_kstatfs st; 348 }; 349 350 struct fuse_fsync_in { 351 __u64 fh; 352 __u32 fsync_flags; 353 __u32 padding; 354 }; 355 356 struct fuse_setxattr_in { 357 __u32 size; 358 __u32 flags; 359 }; 360 361 struct fuse_getxattr_in { 362 __u32 size; 363 __u32 padding; 364 }; 365 366 struct fuse_getxattr_out { 367 __u32 size; 368 __u32 padding; 369 }; 370 371 struct fuse_lk_in { 372 __u64 fh; 373 __u64 owner; 374 struct fuse_file_lock lk; 375 __u32 lk_flags; 376 __u32 padding; 377 }; 378 379 struct fuse_lk_out { 380 struct fuse_file_lock lk; 381 }; 382 383 struct fuse_access_in { 384 __u32 mask; 385 __u32 padding; 386 }; 387 388 struct fuse_init_in { 389 __u32 major; 390 __u32 minor; 391 __u32 max_readahead; 392 __u32 flags; 393 }; 394 395 struct fuse_init_out { 396 __u32 major; 397 __u32 minor; 398 __u32 max_readahead; 399 __u32 flags; 400 __u32 unused; 401 __u32 max_write; 402 }; 403 404 struct fuse_interrupt_in { 405 __u64 unique; 406 }; 407 408 struct fuse_bmap_in { 409 __u64 block; 410 __u32 blocksize; 411 __u32 padding; 412 }; 413 414 struct fuse_bmap_out { 415 __u64 block; 416 }; 417 418 struct fuse_ioctl_in { 419 __u64 fh; 420 __u32 flags; 421 __u32 cmd; 422 __u64 arg; 423 __u32 in_size; 424 __u32 out_size; 425 }; 426 427 struct fuse_ioctl_out { 428 __s32 result; 429 __u32 flags; 430 __u32 in_iovs; 431 __u32 out_iovs; 432 }; 433 434 struct fuse_poll_in { 435 __u64 fh; 436 __u64 kh; 437 __u32 flags; 438 __u32 padding; 439 }; 440 441 struct fuse_poll_out { 442 __u32 revents; 443 __u32 padding; 444 }; 445 446 struct fuse_notify_poll_wakeup_out { 447 __u64 kh; 448 }; 449 450 struct fuse_in_header { 451 __u32 len; 452 __u32 opcode; 453 __u64 unique; 454 __u64 nodeid; 455 __u32 uid; 456 __u32 gid; 457 __u32 pid; 458 __u32 padding; 459 }; 460 461 struct fuse_out_header { 462 __u32 len; 463 __s32 error; 464 __u64 unique; 465 }; 466 467 struct fuse_dirent { 468 __u64 ino; 469 __u64 off; 470 __u32 namelen; 471 __u32 type; 472 char name[0]; 473 }; 474 475 #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name) 476 #define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1)) 477 #define FUSE_DIRENT_SIZE(d) \ 478 FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen) 479 480 #endif /* _LINUX_FUSE_H */ 481