at v2.6.27 7.3 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 * FUSE_EXPORT_SUPPORT: filesystem handles lookups of "." and ".." 109 */ 110#define FUSE_ASYNC_READ (1 << 0) 111#define FUSE_POSIX_LOCKS (1 << 1) 112#define FUSE_FILE_OPS (1 << 2) 113#define FUSE_ATOMIC_O_TRUNC (1 << 3) 114#define FUSE_EXPORT_SUPPORT (1 << 4) 115#define FUSE_BIG_WRITES (1 << 5) 116 117/** 118 * Release flags 119 */ 120#define FUSE_RELEASE_FLUSH (1 << 0) 121 122/** 123 * Getattr flags 124 */ 125#define FUSE_GETATTR_FH (1 << 0) 126 127/** 128 * Lock flags 129 */ 130#define FUSE_LK_FLOCK (1 << 0) 131 132/** 133 * WRITE flags 134 * 135 * FUSE_WRITE_CACHE: delayed write from page cache, file handle is guessed 136 * FUSE_WRITE_LOCKOWNER: lock_owner field is valid 137 */ 138#define FUSE_WRITE_CACHE (1 << 0) 139#define FUSE_WRITE_LOCKOWNER (1 << 1) 140 141/** 142 * Read flags 143 */ 144#define FUSE_READ_LOCKOWNER (1 << 1) 145 146enum fuse_opcode { 147 FUSE_LOOKUP = 1, 148 FUSE_FORGET = 2, /* no reply */ 149 FUSE_GETATTR = 3, 150 FUSE_SETATTR = 4, 151 FUSE_READLINK = 5, 152 FUSE_SYMLINK = 6, 153 FUSE_MKNOD = 8, 154 FUSE_MKDIR = 9, 155 FUSE_UNLINK = 10, 156 FUSE_RMDIR = 11, 157 FUSE_RENAME = 12, 158 FUSE_LINK = 13, 159 FUSE_OPEN = 14, 160 FUSE_READ = 15, 161 FUSE_WRITE = 16, 162 FUSE_STATFS = 17, 163 FUSE_RELEASE = 18, 164 FUSE_FSYNC = 20, 165 FUSE_SETXATTR = 21, 166 FUSE_GETXATTR = 22, 167 FUSE_LISTXATTR = 23, 168 FUSE_REMOVEXATTR = 24, 169 FUSE_FLUSH = 25, 170 FUSE_INIT = 26, 171 FUSE_OPENDIR = 27, 172 FUSE_READDIR = 28, 173 FUSE_RELEASEDIR = 29, 174 FUSE_FSYNCDIR = 30, 175 FUSE_GETLK = 31, 176 FUSE_SETLK = 32, 177 FUSE_SETLKW = 33, 178 FUSE_ACCESS = 34, 179 FUSE_CREATE = 35, 180 FUSE_INTERRUPT = 36, 181 FUSE_BMAP = 37, 182 FUSE_DESTROY = 38, 183}; 184 185/* The read buffer is required to be at least 8k, but may be much larger */ 186#define FUSE_MIN_READ_BUFFER 8192 187 188#define FUSE_COMPAT_ENTRY_OUT_SIZE 120 189 190struct fuse_entry_out { 191 __u64 nodeid; /* Inode ID */ 192 __u64 generation; /* Inode generation: nodeid:gen must 193 be unique for the fs's lifetime */ 194 __u64 entry_valid; /* Cache timeout for the name */ 195 __u64 attr_valid; /* Cache timeout for the attributes */ 196 __u32 entry_valid_nsec; 197 __u32 attr_valid_nsec; 198 struct fuse_attr attr; 199}; 200 201struct fuse_forget_in { 202 __u64 nlookup; 203}; 204 205struct fuse_getattr_in { 206 __u32 getattr_flags; 207 __u32 dummy; 208 __u64 fh; 209}; 210 211#define FUSE_COMPAT_ATTR_OUT_SIZE 96 212 213struct fuse_attr_out { 214 __u64 attr_valid; /* Cache timeout for the attributes */ 215 __u32 attr_valid_nsec; 216 __u32 dummy; 217 struct fuse_attr attr; 218}; 219 220struct fuse_mknod_in { 221 __u32 mode; 222 __u32 rdev; 223}; 224 225struct fuse_mkdir_in { 226 __u32 mode; 227 __u32 padding; 228}; 229 230struct fuse_rename_in { 231 __u64 newdir; 232}; 233 234struct fuse_link_in { 235 __u64 oldnodeid; 236}; 237 238struct fuse_setattr_in { 239 __u32 valid; 240 __u32 padding; 241 __u64 fh; 242 __u64 size; 243 __u64 lock_owner; 244 __u64 atime; 245 __u64 mtime; 246 __u64 unused2; 247 __u32 atimensec; 248 __u32 mtimensec; 249 __u32 unused3; 250 __u32 mode; 251 __u32 unused4; 252 __u32 uid; 253 __u32 gid; 254 __u32 unused5; 255}; 256 257struct fuse_open_in { 258 __u32 flags; 259 __u32 mode; 260}; 261 262struct fuse_open_out { 263 __u64 fh; 264 __u32 open_flags; 265 __u32 padding; 266}; 267 268struct fuse_release_in { 269 __u64 fh; 270 __u32 flags; 271 __u32 release_flags; 272 __u64 lock_owner; 273}; 274 275struct fuse_flush_in { 276 __u64 fh; 277 __u32 unused; 278 __u32 padding; 279 __u64 lock_owner; 280}; 281 282struct fuse_read_in { 283 __u64 fh; 284 __u64 offset; 285 __u32 size; 286 __u32 read_flags; 287 __u64 lock_owner; 288 __u32 flags; 289 __u32 padding; 290}; 291 292#define FUSE_COMPAT_WRITE_IN_SIZE 24 293 294struct fuse_write_in { 295 __u64 fh; 296 __u64 offset; 297 __u32 size; 298 __u32 write_flags; 299 __u64 lock_owner; 300 __u32 flags; 301 __u32 padding; 302}; 303 304struct fuse_write_out { 305 __u32 size; 306 __u32 padding; 307}; 308 309#define FUSE_COMPAT_STATFS_SIZE 48 310 311struct fuse_statfs_out { 312 struct fuse_kstatfs st; 313}; 314 315struct fuse_fsync_in { 316 __u64 fh; 317 __u32 fsync_flags; 318 __u32 padding; 319}; 320 321struct fuse_setxattr_in { 322 __u32 size; 323 __u32 flags; 324}; 325 326struct fuse_getxattr_in { 327 __u32 size; 328 __u32 padding; 329}; 330 331struct fuse_getxattr_out { 332 __u32 size; 333 __u32 padding; 334}; 335 336struct fuse_lk_in { 337 __u64 fh; 338 __u64 owner; 339 struct fuse_file_lock lk; 340 __u32 lk_flags; 341 __u32 padding; 342}; 343 344struct fuse_lk_out { 345 struct fuse_file_lock lk; 346}; 347 348struct fuse_access_in { 349 __u32 mask; 350 __u32 padding; 351}; 352 353struct fuse_init_in { 354 __u32 major; 355 __u32 minor; 356 __u32 max_readahead; 357 __u32 flags; 358}; 359 360struct fuse_init_out { 361 __u32 major; 362 __u32 minor; 363 __u32 max_readahead; 364 __u32 flags; 365 __u32 unused; 366 __u32 max_write; 367}; 368 369struct fuse_interrupt_in { 370 __u64 unique; 371}; 372 373struct fuse_bmap_in { 374 __u64 block; 375 __u32 blocksize; 376 __u32 padding; 377}; 378 379struct fuse_bmap_out { 380 __u64 block; 381}; 382 383struct fuse_in_header { 384 __u32 len; 385 __u32 opcode; 386 __u64 unique; 387 __u64 nodeid; 388 __u32 uid; 389 __u32 gid; 390 __u32 pid; 391 __u32 padding; 392}; 393 394struct fuse_out_header { 395 __u32 len; 396 __s32 error; 397 __u64 unique; 398}; 399 400struct fuse_dirent { 401 __u64 ino; 402 __u64 off; 403 __u32 namelen; 404 __u32 type; 405 char name[0]; 406}; 407 408#define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name) 409#define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1)) 410#define FUSE_DIRENT_SIZE(d) \ 411 FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)