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