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