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