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