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