1*53ee8cc1Swenshuai.xi /* 2*53ee8cc1Swenshuai.xi FUSE: Filesystem in Userspace 3*53ee8cc1Swenshuai.xi Copyright (C) 2001-2006 Miklos Szeredi <miklos@szeredi.hu> 4*53ee8cc1Swenshuai.xi 5*53ee8cc1Swenshuai.xi This program can be distributed under the terms of the GNU GPL. 6*53ee8cc1Swenshuai.xi See the file COPYING. 7*53ee8cc1Swenshuai.xi */ 8*53ee8cc1Swenshuai.xi 9*53ee8cc1Swenshuai.xi /* 10*53ee8cc1Swenshuai.xi * This file defines the kernel interface of FUSE 11*53ee8cc1Swenshuai.xi * 12*53ee8cc1Swenshuai.xi * Protocol changelog: 13*53ee8cc1Swenshuai.xi * 14*53ee8cc1Swenshuai.xi * 7.9: 15*53ee8cc1Swenshuai.xi * - new fuse_getattr_in input argument of GETATTR 16*53ee8cc1Swenshuai.xi * - add lk_flags in fuse_lk_in 17*53ee8cc1Swenshuai.xi * - add lock_owner field to fuse_setattr_in, fuse_read_in and fuse_write_in 18*53ee8cc1Swenshuai.xi * - add blksize field to fuse_attr 19*53ee8cc1Swenshuai.xi * - add file flags field to fuse_read_in and fuse_write_in 20*53ee8cc1Swenshuai.xi */ 21*53ee8cc1Swenshuai.xi 22*53ee8cc1Swenshuai.xi #include <asm/types.h> 23*53ee8cc1Swenshuai.xi #include <linux/major.h> 24*53ee8cc1Swenshuai.xi 25*53ee8cc1Swenshuai.xi /** Version number of this interface */ 26*53ee8cc1Swenshuai.xi #define FUSE_KERNEL_VERSION 7 27*53ee8cc1Swenshuai.xi 28*53ee8cc1Swenshuai.xi /** Minor version number of this interface */ 29*53ee8cc1Swenshuai.xi #define FUSE_KERNEL_MINOR_VERSION 9 30*53ee8cc1Swenshuai.xi 31*53ee8cc1Swenshuai.xi /** The node ID of the root inode */ 32*53ee8cc1Swenshuai.xi #define FUSE_ROOT_ID 1 33*53ee8cc1Swenshuai.xi 34*53ee8cc1Swenshuai.xi /** The major number of the fuse character device */ 35*53ee8cc1Swenshuai.xi #define FUSE_MAJOR MISC_MAJOR 36*53ee8cc1Swenshuai.xi 37*53ee8cc1Swenshuai.xi /** The minor number of the fuse character device */ 38*53ee8cc1Swenshuai.xi #define FUSE_MINOR 229 39*53ee8cc1Swenshuai.xi 40*53ee8cc1Swenshuai.xi /* Make sure all structures are padded to 64bit boundary, so 32bit 41*53ee8cc1Swenshuai.xi userspace works under 64bit kernels */ 42*53ee8cc1Swenshuai.xi 43*53ee8cc1Swenshuai.xi struct fuse_attr { 44*53ee8cc1Swenshuai.xi __u64 ino; 45*53ee8cc1Swenshuai.xi __u64 size; 46*53ee8cc1Swenshuai.xi __u64 blocks; 47*53ee8cc1Swenshuai.xi __u64 atime; 48*53ee8cc1Swenshuai.xi __u64 mtime; 49*53ee8cc1Swenshuai.xi __u64 ctime; 50*53ee8cc1Swenshuai.xi __u32 atimensec; 51*53ee8cc1Swenshuai.xi __u32 mtimensec; 52*53ee8cc1Swenshuai.xi __u32 ctimensec; 53*53ee8cc1Swenshuai.xi __u32 mode; 54*53ee8cc1Swenshuai.xi __u32 nlink; 55*53ee8cc1Swenshuai.xi __u32 uid; 56*53ee8cc1Swenshuai.xi __u32 gid; 57*53ee8cc1Swenshuai.xi __u32 rdev; 58*53ee8cc1Swenshuai.xi __u32 blksize; 59*53ee8cc1Swenshuai.xi __u32 padding; 60*53ee8cc1Swenshuai.xi }; 61*53ee8cc1Swenshuai.xi 62*53ee8cc1Swenshuai.xi struct fuse_kstatfs { 63*53ee8cc1Swenshuai.xi __u64 blocks; 64*53ee8cc1Swenshuai.xi __u64 bfree; 65*53ee8cc1Swenshuai.xi __u64 bavail; 66*53ee8cc1Swenshuai.xi __u64 files; 67*53ee8cc1Swenshuai.xi __u64 ffree; 68*53ee8cc1Swenshuai.xi __u32 bsize; 69*53ee8cc1Swenshuai.xi __u32 namelen; 70*53ee8cc1Swenshuai.xi __u32 frsize; 71*53ee8cc1Swenshuai.xi __u32 padding; 72*53ee8cc1Swenshuai.xi __u32 spare[6]; 73*53ee8cc1Swenshuai.xi }; 74*53ee8cc1Swenshuai.xi 75*53ee8cc1Swenshuai.xi struct fuse_file_lock { 76*53ee8cc1Swenshuai.xi __u64 start; 77*53ee8cc1Swenshuai.xi __u64 end; 78*53ee8cc1Swenshuai.xi __u32 type; 79*53ee8cc1Swenshuai.xi __u32 pid; /* tgid */ 80*53ee8cc1Swenshuai.xi }; 81*53ee8cc1Swenshuai.xi 82*53ee8cc1Swenshuai.xi /** 83*53ee8cc1Swenshuai.xi * Bitmasks for fuse_setattr_in.valid 84*53ee8cc1Swenshuai.xi */ 85*53ee8cc1Swenshuai.xi #define FATTR_MODE (1 << 0) 86*53ee8cc1Swenshuai.xi #define FATTR_UID (1 << 1) 87*53ee8cc1Swenshuai.xi #define FATTR_GID (1 << 2) 88*53ee8cc1Swenshuai.xi #define FATTR_SIZE (1 << 3) 89*53ee8cc1Swenshuai.xi #define FATTR_ATIME (1 << 4) 90*53ee8cc1Swenshuai.xi #define FATTR_MTIME (1 << 5) 91*53ee8cc1Swenshuai.xi #define FATTR_FH (1 << 6) 92*53ee8cc1Swenshuai.xi #define FATTR_ATIME_NOW (1 << 7) 93*53ee8cc1Swenshuai.xi #define FATTR_MTIME_NOW (1 << 8) 94*53ee8cc1Swenshuai.xi #define FATTR_LOCKOWNER (1 << 9) 95*53ee8cc1Swenshuai.xi 96*53ee8cc1Swenshuai.xi /** 97*53ee8cc1Swenshuai.xi * Flags returned by the OPEN request 98*53ee8cc1Swenshuai.xi * 99*53ee8cc1Swenshuai.xi * FOPEN_DIRECT_IO: bypass page cache for this open file 100*53ee8cc1Swenshuai.xi * FOPEN_KEEP_CACHE: don't invalidate the data cache on open 101*53ee8cc1Swenshuai.xi */ 102*53ee8cc1Swenshuai.xi #define FOPEN_DIRECT_IO (1 << 0) 103*53ee8cc1Swenshuai.xi #define FOPEN_KEEP_CACHE (1 << 1) 104*53ee8cc1Swenshuai.xi 105*53ee8cc1Swenshuai.xi /** 106*53ee8cc1Swenshuai.xi * INIT request/reply flags 107*53ee8cc1Swenshuai.xi */ 108*53ee8cc1Swenshuai.xi #define FUSE_ASYNC_READ (1 << 0) 109*53ee8cc1Swenshuai.xi #define FUSE_POSIX_LOCKS (1 << 1) 110*53ee8cc1Swenshuai.xi #define FUSE_FILE_OPS (1 << 2) 111*53ee8cc1Swenshuai.xi #define FUSE_ATOMIC_O_TRUNC (1 << 3) 112*53ee8cc1Swenshuai.xi #define FUSE_BIG_WRITES (1 << 5) 113*53ee8cc1Swenshuai.xi 114*53ee8cc1Swenshuai.xi /** 115*53ee8cc1Swenshuai.xi * Release flags 116*53ee8cc1Swenshuai.xi */ 117*53ee8cc1Swenshuai.xi #define FUSE_RELEASE_FLUSH (1 << 0) 118*53ee8cc1Swenshuai.xi 119*53ee8cc1Swenshuai.xi /** 120*53ee8cc1Swenshuai.xi * Getattr flags 121*53ee8cc1Swenshuai.xi */ 122*53ee8cc1Swenshuai.xi #define FUSE_GETATTR_FH (1 << 0) 123*53ee8cc1Swenshuai.xi 124*53ee8cc1Swenshuai.xi /** 125*53ee8cc1Swenshuai.xi * Lock flags 126*53ee8cc1Swenshuai.xi */ 127*53ee8cc1Swenshuai.xi #define FUSE_LK_FLOCK (1 << 0) 128*53ee8cc1Swenshuai.xi 129*53ee8cc1Swenshuai.xi /** 130*53ee8cc1Swenshuai.xi * WRITE flags 131*53ee8cc1Swenshuai.xi * 132*53ee8cc1Swenshuai.xi * FUSE_WRITE_CACHE: delayed write from page cache, file handle is guessed 133*53ee8cc1Swenshuai.xi * FUSE_WRITE_LOCKOWNER: lock_owner field is valid 134*53ee8cc1Swenshuai.xi */ 135*53ee8cc1Swenshuai.xi #define FUSE_WRITE_CACHE (1 << 0) 136*53ee8cc1Swenshuai.xi #define FUSE_WRITE_LOCKOWNER (1 << 1) 137*53ee8cc1Swenshuai.xi 138*53ee8cc1Swenshuai.xi /** 139*53ee8cc1Swenshuai.xi * Read flags 140*53ee8cc1Swenshuai.xi */ 141*53ee8cc1Swenshuai.xi #define FUSE_READ_LOCKOWNER (1 << 1) 142*53ee8cc1Swenshuai.xi 143*53ee8cc1Swenshuai.xi enum fuse_opcode { 144*53ee8cc1Swenshuai.xi FUSE_LOOKUP = 1, 145*53ee8cc1Swenshuai.xi FUSE_FORGET = 2, /* no reply */ 146*53ee8cc1Swenshuai.xi FUSE_GETATTR = 3, 147*53ee8cc1Swenshuai.xi FUSE_SETATTR = 4, 148*53ee8cc1Swenshuai.xi FUSE_READLINK = 5, 149*53ee8cc1Swenshuai.xi FUSE_SYMLINK = 6, 150*53ee8cc1Swenshuai.xi FUSE_MKNOD = 8, 151*53ee8cc1Swenshuai.xi FUSE_MKDIR = 9, 152*53ee8cc1Swenshuai.xi FUSE_UNLINK = 10, 153*53ee8cc1Swenshuai.xi FUSE_RMDIR = 11, 154*53ee8cc1Swenshuai.xi FUSE_RENAME = 12, 155*53ee8cc1Swenshuai.xi FUSE_LINK = 13, 156*53ee8cc1Swenshuai.xi FUSE_OPEN = 14, 157*53ee8cc1Swenshuai.xi FUSE_READ = 15, 158*53ee8cc1Swenshuai.xi FUSE_WRITE = 16, 159*53ee8cc1Swenshuai.xi FUSE_STATFS = 17, 160*53ee8cc1Swenshuai.xi FUSE_RELEASE = 18, 161*53ee8cc1Swenshuai.xi FUSE_FSYNC = 20, 162*53ee8cc1Swenshuai.xi FUSE_SETXATTR = 21, 163*53ee8cc1Swenshuai.xi FUSE_GETXATTR = 22, 164*53ee8cc1Swenshuai.xi FUSE_LISTXATTR = 23, 165*53ee8cc1Swenshuai.xi FUSE_REMOVEXATTR = 24, 166*53ee8cc1Swenshuai.xi FUSE_FLUSH = 25, 167*53ee8cc1Swenshuai.xi FUSE_INIT = 26, 168*53ee8cc1Swenshuai.xi FUSE_OPENDIR = 27, 169*53ee8cc1Swenshuai.xi FUSE_READDIR = 28, 170*53ee8cc1Swenshuai.xi FUSE_RELEASEDIR = 29, 171*53ee8cc1Swenshuai.xi FUSE_FSYNCDIR = 30, 172*53ee8cc1Swenshuai.xi FUSE_GETLK = 31, 173*53ee8cc1Swenshuai.xi FUSE_SETLK = 32, 174*53ee8cc1Swenshuai.xi FUSE_SETLKW = 33, 175*53ee8cc1Swenshuai.xi FUSE_ACCESS = 34, 176*53ee8cc1Swenshuai.xi FUSE_CREATE = 35, 177*53ee8cc1Swenshuai.xi FUSE_INTERRUPT = 36, 178*53ee8cc1Swenshuai.xi FUSE_BMAP = 37, 179*53ee8cc1Swenshuai.xi FUSE_DESTROY = 38, 180*53ee8cc1Swenshuai.xi }; 181*53ee8cc1Swenshuai.xi 182*53ee8cc1Swenshuai.xi /* The read buffer is required to be at least 8k, but may be much larger */ 183*53ee8cc1Swenshuai.xi #define FUSE_MIN_READ_BUFFER 8192 184*53ee8cc1Swenshuai.xi 185*53ee8cc1Swenshuai.xi #define FUSE_COMPAT_ENTRY_OUT_SIZE 120 186*53ee8cc1Swenshuai.xi 187*53ee8cc1Swenshuai.xi struct fuse_entry_out { 188*53ee8cc1Swenshuai.xi __u64 nodeid; /* Inode ID */ 189*53ee8cc1Swenshuai.xi __u64 generation; /* Inode generation: nodeid:gen must 190*53ee8cc1Swenshuai.xi be unique for the fs's lifetime */ 191*53ee8cc1Swenshuai.xi __u64 entry_valid; /* Cache timeout for the name */ 192*53ee8cc1Swenshuai.xi __u64 attr_valid; /* Cache timeout for the attributes */ 193*53ee8cc1Swenshuai.xi __u32 entry_valid_nsec; 194*53ee8cc1Swenshuai.xi __u32 attr_valid_nsec; 195*53ee8cc1Swenshuai.xi struct fuse_attr attr; 196*53ee8cc1Swenshuai.xi }; 197*53ee8cc1Swenshuai.xi 198*53ee8cc1Swenshuai.xi struct fuse_forget_in { 199*53ee8cc1Swenshuai.xi __u64 nlookup; 200*53ee8cc1Swenshuai.xi }; 201*53ee8cc1Swenshuai.xi 202*53ee8cc1Swenshuai.xi struct fuse_getattr_in { 203*53ee8cc1Swenshuai.xi __u32 getattr_flags; 204*53ee8cc1Swenshuai.xi __u32 dummy; 205*53ee8cc1Swenshuai.xi __u64 fh; 206*53ee8cc1Swenshuai.xi }; 207*53ee8cc1Swenshuai.xi 208*53ee8cc1Swenshuai.xi #define FUSE_COMPAT_ATTR_OUT_SIZE 96 209*53ee8cc1Swenshuai.xi 210*53ee8cc1Swenshuai.xi struct fuse_attr_out { 211*53ee8cc1Swenshuai.xi __u64 attr_valid; /* Cache timeout for the attributes */ 212*53ee8cc1Swenshuai.xi __u32 attr_valid_nsec; 213*53ee8cc1Swenshuai.xi __u32 dummy; 214*53ee8cc1Swenshuai.xi struct fuse_attr attr; 215*53ee8cc1Swenshuai.xi }; 216*53ee8cc1Swenshuai.xi 217*53ee8cc1Swenshuai.xi struct fuse_mknod_in { 218*53ee8cc1Swenshuai.xi __u32 mode; 219*53ee8cc1Swenshuai.xi __u32 rdev; 220*53ee8cc1Swenshuai.xi }; 221*53ee8cc1Swenshuai.xi 222*53ee8cc1Swenshuai.xi struct fuse_mkdir_in { 223*53ee8cc1Swenshuai.xi __u32 mode; 224*53ee8cc1Swenshuai.xi __u32 padding; 225*53ee8cc1Swenshuai.xi }; 226*53ee8cc1Swenshuai.xi 227*53ee8cc1Swenshuai.xi struct fuse_rename_in { 228*53ee8cc1Swenshuai.xi __u64 newdir; 229*53ee8cc1Swenshuai.xi }; 230*53ee8cc1Swenshuai.xi 231*53ee8cc1Swenshuai.xi struct fuse_link_in { 232*53ee8cc1Swenshuai.xi __u64 oldnodeid; 233*53ee8cc1Swenshuai.xi }; 234*53ee8cc1Swenshuai.xi 235*53ee8cc1Swenshuai.xi struct fuse_setattr_in { 236*53ee8cc1Swenshuai.xi __u32 valid; 237*53ee8cc1Swenshuai.xi __u32 padding; 238*53ee8cc1Swenshuai.xi __u64 fh; 239*53ee8cc1Swenshuai.xi __u64 size; 240*53ee8cc1Swenshuai.xi __u64 lock_owner; 241*53ee8cc1Swenshuai.xi __u64 atime; 242*53ee8cc1Swenshuai.xi __u64 mtime; 243*53ee8cc1Swenshuai.xi __u64 unused2; 244*53ee8cc1Swenshuai.xi __u32 atimensec; 245*53ee8cc1Swenshuai.xi __u32 mtimensec; 246*53ee8cc1Swenshuai.xi __u32 unused3; 247*53ee8cc1Swenshuai.xi __u32 mode; 248*53ee8cc1Swenshuai.xi __u32 unused4; 249*53ee8cc1Swenshuai.xi __u32 uid; 250*53ee8cc1Swenshuai.xi __u32 gid; 251*53ee8cc1Swenshuai.xi __u32 unused5; 252*53ee8cc1Swenshuai.xi }; 253*53ee8cc1Swenshuai.xi 254*53ee8cc1Swenshuai.xi struct fuse_open_in { 255*53ee8cc1Swenshuai.xi __u32 flags; 256*53ee8cc1Swenshuai.xi __u32 mode; 257*53ee8cc1Swenshuai.xi }; 258*53ee8cc1Swenshuai.xi 259*53ee8cc1Swenshuai.xi struct fuse_open_out { 260*53ee8cc1Swenshuai.xi __u64 fh; 261*53ee8cc1Swenshuai.xi __u32 open_flags; 262*53ee8cc1Swenshuai.xi __u32 padding; 263*53ee8cc1Swenshuai.xi }; 264*53ee8cc1Swenshuai.xi 265*53ee8cc1Swenshuai.xi struct fuse_release_in { 266*53ee8cc1Swenshuai.xi __u64 fh; 267*53ee8cc1Swenshuai.xi __u32 flags; 268*53ee8cc1Swenshuai.xi __u32 release_flags; 269*53ee8cc1Swenshuai.xi __u64 lock_owner; 270*53ee8cc1Swenshuai.xi }; 271*53ee8cc1Swenshuai.xi 272*53ee8cc1Swenshuai.xi struct fuse_flush_in { 273*53ee8cc1Swenshuai.xi __u64 fh; 274*53ee8cc1Swenshuai.xi __u32 unused; 275*53ee8cc1Swenshuai.xi __u32 padding; 276*53ee8cc1Swenshuai.xi __u64 lock_owner; 277*53ee8cc1Swenshuai.xi }; 278*53ee8cc1Swenshuai.xi 279*53ee8cc1Swenshuai.xi struct fuse_read_in { 280*53ee8cc1Swenshuai.xi __u64 fh; 281*53ee8cc1Swenshuai.xi __u64 offset; 282*53ee8cc1Swenshuai.xi __u32 size; 283*53ee8cc1Swenshuai.xi __u32 read_flags; 284*53ee8cc1Swenshuai.xi __u64 lock_owner; 285*53ee8cc1Swenshuai.xi __u32 flags; 286*53ee8cc1Swenshuai.xi __u32 padding; 287*53ee8cc1Swenshuai.xi }; 288*53ee8cc1Swenshuai.xi 289*53ee8cc1Swenshuai.xi #define FUSE_COMPAT_WRITE_IN_SIZE 24 290*53ee8cc1Swenshuai.xi 291*53ee8cc1Swenshuai.xi struct fuse_write_in { 292*53ee8cc1Swenshuai.xi __u64 fh; 293*53ee8cc1Swenshuai.xi __u64 offset; 294*53ee8cc1Swenshuai.xi __u32 size; 295*53ee8cc1Swenshuai.xi __u32 write_flags; 296*53ee8cc1Swenshuai.xi __u64 lock_owner; 297*53ee8cc1Swenshuai.xi __u32 flags; 298*53ee8cc1Swenshuai.xi __u32 padding; 299*53ee8cc1Swenshuai.xi }; 300*53ee8cc1Swenshuai.xi 301*53ee8cc1Swenshuai.xi struct fuse_write_out { 302*53ee8cc1Swenshuai.xi __u32 size; 303*53ee8cc1Swenshuai.xi __u32 padding; 304*53ee8cc1Swenshuai.xi }; 305*53ee8cc1Swenshuai.xi 306*53ee8cc1Swenshuai.xi #define FUSE_COMPAT_STATFS_SIZE 48 307*53ee8cc1Swenshuai.xi 308*53ee8cc1Swenshuai.xi struct fuse_statfs_out { 309*53ee8cc1Swenshuai.xi struct fuse_kstatfs st; 310*53ee8cc1Swenshuai.xi }; 311*53ee8cc1Swenshuai.xi 312*53ee8cc1Swenshuai.xi struct fuse_fsync_in { 313*53ee8cc1Swenshuai.xi __u64 fh; 314*53ee8cc1Swenshuai.xi __u32 fsync_flags; 315*53ee8cc1Swenshuai.xi __u32 padding; 316*53ee8cc1Swenshuai.xi }; 317*53ee8cc1Swenshuai.xi 318*53ee8cc1Swenshuai.xi struct fuse_setxattr_in { 319*53ee8cc1Swenshuai.xi __u32 size; 320*53ee8cc1Swenshuai.xi __u32 flags; 321*53ee8cc1Swenshuai.xi }; 322*53ee8cc1Swenshuai.xi 323*53ee8cc1Swenshuai.xi struct fuse_getxattr_in { 324*53ee8cc1Swenshuai.xi __u32 size; 325*53ee8cc1Swenshuai.xi __u32 padding; 326*53ee8cc1Swenshuai.xi }; 327*53ee8cc1Swenshuai.xi 328*53ee8cc1Swenshuai.xi struct fuse_getxattr_out { 329*53ee8cc1Swenshuai.xi __u32 size; 330*53ee8cc1Swenshuai.xi __u32 padding; 331*53ee8cc1Swenshuai.xi }; 332*53ee8cc1Swenshuai.xi 333*53ee8cc1Swenshuai.xi struct fuse_lk_in { 334*53ee8cc1Swenshuai.xi __u64 fh; 335*53ee8cc1Swenshuai.xi __u64 owner; 336*53ee8cc1Swenshuai.xi struct fuse_file_lock lk; 337*53ee8cc1Swenshuai.xi __u32 lk_flags; 338*53ee8cc1Swenshuai.xi __u32 padding; 339*53ee8cc1Swenshuai.xi }; 340*53ee8cc1Swenshuai.xi 341*53ee8cc1Swenshuai.xi struct fuse_lk_out { 342*53ee8cc1Swenshuai.xi struct fuse_file_lock lk; 343*53ee8cc1Swenshuai.xi }; 344*53ee8cc1Swenshuai.xi 345*53ee8cc1Swenshuai.xi struct fuse_access_in { 346*53ee8cc1Swenshuai.xi __u32 mask; 347*53ee8cc1Swenshuai.xi __u32 padding; 348*53ee8cc1Swenshuai.xi }; 349*53ee8cc1Swenshuai.xi 350*53ee8cc1Swenshuai.xi struct fuse_init_in { 351*53ee8cc1Swenshuai.xi __u32 major; 352*53ee8cc1Swenshuai.xi __u32 minor; 353*53ee8cc1Swenshuai.xi __u32 max_readahead; 354*53ee8cc1Swenshuai.xi __u32 flags; 355*53ee8cc1Swenshuai.xi }; 356*53ee8cc1Swenshuai.xi 357*53ee8cc1Swenshuai.xi struct fuse_init_out { 358*53ee8cc1Swenshuai.xi __u32 major; 359*53ee8cc1Swenshuai.xi __u32 minor; 360*53ee8cc1Swenshuai.xi __u32 max_readahead; 361*53ee8cc1Swenshuai.xi __u32 flags; 362*53ee8cc1Swenshuai.xi __u32 unused; 363*53ee8cc1Swenshuai.xi __u32 max_write; 364*53ee8cc1Swenshuai.xi }; 365*53ee8cc1Swenshuai.xi 366*53ee8cc1Swenshuai.xi struct fuse_interrupt_in { 367*53ee8cc1Swenshuai.xi __u64 unique; 368*53ee8cc1Swenshuai.xi }; 369*53ee8cc1Swenshuai.xi 370*53ee8cc1Swenshuai.xi struct fuse_bmap_in { 371*53ee8cc1Swenshuai.xi __u64 block; 372*53ee8cc1Swenshuai.xi __u32 blocksize; 373*53ee8cc1Swenshuai.xi __u32 padding; 374*53ee8cc1Swenshuai.xi }; 375*53ee8cc1Swenshuai.xi 376*53ee8cc1Swenshuai.xi struct fuse_bmap_out { 377*53ee8cc1Swenshuai.xi __u64 block; 378*53ee8cc1Swenshuai.xi }; 379*53ee8cc1Swenshuai.xi 380*53ee8cc1Swenshuai.xi struct fuse_in_header { 381*53ee8cc1Swenshuai.xi __u32 len; 382*53ee8cc1Swenshuai.xi __u32 opcode; 383*53ee8cc1Swenshuai.xi __u64 unique; 384*53ee8cc1Swenshuai.xi __u64 nodeid; 385*53ee8cc1Swenshuai.xi __u32 uid; 386*53ee8cc1Swenshuai.xi __u32 gid; 387*53ee8cc1Swenshuai.xi __u32 pid; 388*53ee8cc1Swenshuai.xi __u32 padding; 389*53ee8cc1Swenshuai.xi }; 390*53ee8cc1Swenshuai.xi 391*53ee8cc1Swenshuai.xi struct fuse_out_header { 392*53ee8cc1Swenshuai.xi __u32 len; 393*53ee8cc1Swenshuai.xi __s32 error; 394*53ee8cc1Swenshuai.xi __u64 unique; 395*53ee8cc1Swenshuai.xi }; 396*53ee8cc1Swenshuai.xi 397*53ee8cc1Swenshuai.xi struct fuse_dirent { 398*53ee8cc1Swenshuai.xi __u64 ino; 399*53ee8cc1Swenshuai.xi __u64 off; 400*53ee8cc1Swenshuai.xi __u32 namelen; 401*53ee8cc1Swenshuai.xi __u32 type; 402*53ee8cc1Swenshuai.xi char name[0]; 403*53ee8cc1Swenshuai.xi }; 404*53ee8cc1Swenshuai.xi 405*53ee8cc1Swenshuai.xi #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name) 406*53ee8cc1Swenshuai.xi #define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1)) 407*53ee8cc1Swenshuai.xi #define FUSE_DIRENT_SIZE(d) \ 408*53ee8cc1Swenshuai.xi FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen) 409