at v2.6.25 7.1 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 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 43struct 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 62struct 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 75struct 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 142enum 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 186struct 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 197struct fuse_forget_in { 198 __u64 nlookup; 199}; 200 201struct fuse_getattr_in { 202 __u32 getattr_flags; 203 __u32 dummy; 204 __u64 fh; 205}; 206 207#define FUSE_COMPAT_ATTR_OUT_SIZE 96 208 209struct 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 216struct fuse_mknod_in { 217 __u32 mode; 218 __u32 rdev; 219}; 220 221struct fuse_mkdir_in { 222 __u32 mode; 223 __u32 padding; 224}; 225 226struct fuse_rename_in { 227 __u64 newdir; 228}; 229 230struct fuse_link_in { 231 __u64 oldnodeid; 232}; 233 234struct 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 253struct fuse_open_in { 254 __u32 flags; 255 __u32 mode; 256}; 257 258struct fuse_open_out { 259 __u64 fh; 260 __u32 open_flags; 261 __u32 padding; 262}; 263 264struct fuse_release_in { 265 __u64 fh; 266 __u32 flags; 267 __u32 release_flags; 268 __u64 lock_owner; 269}; 270 271struct fuse_flush_in { 272 __u64 fh; 273 __u32 unused; 274 __u32 padding; 275 __u64 lock_owner; 276}; 277 278struct 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 290struct 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 300struct fuse_write_out { 301 __u32 size; 302 __u32 padding; 303}; 304 305#define FUSE_COMPAT_STATFS_SIZE 48 306 307struct fuse_statfs_out { 308 struct fuse_kstatfs st; 309}; 310 311struct fuse_fsync_in { 312 __u64 fh; 313 __u32 fsync_flags; 314 __u32 padding; 315}; 316 317struct fuse_setxattr_in { 318 __u32 size; 319 __u32 flags; 320}; 321 322struct fuse_getxattr_in { 323 __u32 size; 324 __u32 padding; 325}; 326 327struct fuse_getxattr_out { 328 __u32 size; 329 __u32 padding; 330}; 331 332struct fuse_lk_in { 333 __u64 fh; 334 __u64 owner; 335 struct fuse_file_lock lk; 336 __u32 lk_flags; 337 __u32 padding; 338}; 339 340struct fuse_lk_out { 341 struct fuse_file_lock lk; 342}; 343 344struct fuse_access_in { 345 __u32 mask; 346 __u32 padding; 347}; 348 349struct fuse_init_in { 350 __u32 major; 351 __u32 minor; 352 __u32 max_readahead; 353 __u32 flags; 354}; 355 356struct 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 365struct fuse_interrupt_in { 366 __u64 unique; 367}; 368 369struct fuse_bmap_in { 370 __u64 block; 371 __u32 blocksize; 372 __u32 padding; 373}; 374 375struct fuse_bmap_out { 376 __u64 block; 377}; 378 379struct 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 390struct fuse_out_header { 391 __u32 len; 392 __s32 error; 393 __u64 unique; 394}; 395 396struct 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)