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