fuse.h 4.5 KB
Newer Older
M
Miklos Szeredi 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
/*
    FUSE: Filesystem in Userspace
    Copyright (C) 2001-2005  Miklos Szeredi <miklos@szeredi.hu>

    This program can be distributed under the terms of the GNU GPL.
    See the file COPYING.
*/

/* This file defines the kernel interface of FUSE */

#include <asm/types.h>

/** Version number of this interface */
14
#define FUSE_KERNEL_VERSION 7
M
Miklos Szeredi 已提交
15 16

/** Minor version number of this interface */
17
#define FUSE_KERNEL_MINOR_VERSION 3
M
Miklos Szeredi 已提交
18 19 20 21

/** The node ID of the root inode */
#define FUSE_ROOT_ID 1

M
Miklos Szeredi 已提交
22 23 24 25 26 27
/** The major number of the fuse character device */
#define FUSE_MAJOR 10

/** The minor number of the fuse character device */
#define FUSE_MINOR 229

M
Miklos Szeredi 已提交
28 29 30
/* Make sure all structures are padded to 64bit boundary, so 32bit
   userspace works under 64bit kernels */

M
Miklos Szeredi 已提交
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
struct fuse_attr {
	__u64	ino;
	__u64	size;
	__u64	blocks;
	__u64	atime;
	__u64	mtime;
	__u64	ctime;
	__u32	atimensec;
	__u32	mtimensec;
	__u32	ctimensec;
	__u32	mode;
	__u32	nlink;
	__u32	uid;
	__u32	gid;
	__u32	rdev;
};

48 49 50 51 52 53 54 55 56 57
struct fuse_kstatfs {
	__u64	blocks;
	__u64	bfree;
	__u64	bavail;
	__u64	files;
	__u64	ffree;
	__u32	bsize;
	__u32	namelen;
};

58 59 60 61 62 63 64
#define FATTR_MODE	(1 << 0)
#define FATTR_UID	(1 << 1)
#define FATTR_GID	(1 << 2)
#define FATTR_SIZE	(1 << 3)
#define FATTR_ATIME	(1 << 4)
#define FATTR_MTIME	(1 << 5)

65 66 67 68 69 70 71 72 73
/**
 * Flags returned by the OPEN request
 *
 * FOPEN_DIRECT_IO: bypass page cache for this open file
 * FOPEN_KEEP_CACHE: don't invalidate the data cache on open
 */
#define FOPEN_DIRECT_IO		(1 << 0)
#define FOPEN_KEEP_CACHE	(1 << 1)

M
Miklos Szeredi 已提交
74
enum fuse_opcode {
75 76 77
	FUSE_LOOKUP	   = 1,
	FUSE_FORGET	   = 2,  /* no reply */
	FUSE_GETATTR	   = 3,
78
	FUSE_SETATTR	   = 4,
79
	FUSE_READLINK	   = 5,
80 81 82 83 84 85 86
	FUSE_SYMLINK	   = 6,
	FUSE_MKNOD	   = 8,
	FUSE_MKDIR	   = 9,
	FUSE_UNLINK	   = 10,
	FUSE_RMDIR	   = 11,
	FUSE_RENAME	   = 12,
	FUSE_LINK	   = 13,
M
Miklos Szeredi 已提交
87 88 89
	FUSE_OPEN	   = 14,
	FUSE_READ	   = 15,
	FUSE_WRITE	   = 16,
90
	FUSE_STATFS	   = 17,
M
Miklos Szeredi 已提交
91 92
	FUSE_RELEASE       = 18,
	FUSE_FSYNC         = 20,
93 94 95 96
	FUSE_SETXATTR      = 21,
	FUSE_GETXATTR      = 22,
	FUSE_LISTXATTR     = 23,
	FUSE_REMOVEXATTR   = 24,
M
Miklos Szeredi 已提交
97
	FUSE_FLUSH         = 25,
98 99 100
	FUSE_INIT          = 26,
	FUSE_OPENDIR       = 27,
	FUSE_READDIR       = 28,
101
	FUSE_RELEASEDIR    = 29,
M
Miklos Szeredi 已提交
102 103
	FUSE_FSYNCDIR      = 30,
	FUSE_ACCESS        = 34
M
Miklos Szeredi 已提交
104 105 106 107 108
};

/* Conservative buffer size for the client */
#define FUSE_MAX_IN 8192

109
#define FUSE_NAME_MAX 1024
110
#define FUSE_SYMLINK_MAX 4096
111
#define FUSE_XATTR_SIZE_MAX 4096
112 113 114 115 116 117 118 119 120 121 122 123 124

struct fuse_entry_out {
	__u64	nodeid;		/* Inode ID */
	__u64	generation;	/* Inode generation: nodeid:gen must
				   be unique for the fs's lifetime */
	__u64	entry_valid;	/* Cache timeout for the name */
	__u64	attr_valid;	/* Cache timeout for the attributes */
	__u32	entry_valid_nsec;
	__u32	attr_valid_nsec;
	struct fuse_attr attr;
};

struct fuse_forget_in {
125
	__u64	nlookup;
126 127 128 129 130 131 132 133 134
};

struct fuse_attr_out {
	__u64	attr_valid;	/* Cache timeout for the attributes */
	__u32	attr_valid_nsec;
	__u32	dummy;
	struct fuse_attr attr;
};

135 136 137 138 139 140 141
struct fuse_mknod_in {
	__u32	mode;
	__u32	rdev;
};

struct fuse_mkdir_in {
	__u32	mode;
M
Miklos Szeredi 已提交
142
	__u32	padding;
143 144 145 146 147 148 149 150 151 152 153 154
};

struct fuse_rename_in {
	__u64	newdir;
};

struct fuse_link_in {
	__u64	oldnodeid;
};

struct fuse_setattr_in {
	__u32	valid;
M
Miklos Szeredi 已提交
155
	__u32	padding;
156 157 158
	struct fuse_attr attr;
};

M
Miklos Szeredi 已提交
159 160
struct fuse_open_in {
	__u32	flags;
M
Miklos Szeredi 已提交
161
	__u32	padding;
M
Miklos Szeredi 已提交
162 163 164 165 166
};

struct fuse_open_out {
	__u64	fh;
	__u32	open_flags;
M
Miklos Szeredi 已提交
167
	__u32	padding;
M
Miklos Szeredi 已提交
168 169 170 171 172
};

struct fuse_release_in {
	__u64	fh;
	__u32	flags;
M
Miklos Szeredi 已提交
173
	__u32	padding;
M
Miklos Szeredi 已提交
174 175 176 177 178
};

struct fuse_flush_in {
	__u64	fh;
	__u32	flush_flags;
M
Miklos Szeredi 已提交
179
	__u32	padding;
M
Miklos Szeredi 已提交
180 181 182 183 184 185
};

struct fuse_read_in {
	__u64	fh;
	__u64	offset;
	__u32	size;
M
Miklos Szeredi 已提交
186
	__u32	padding;
M
Miklos Szeredi 已提交
187 188 189 190 191 192 193 194 195 196 197
};

struct fuse_write_in {
	__u64	fh;
	__u64	offset;
	__u32	size;
	__u32	write_flags;
};

struct fuse_write_out {
	__u32	size;
M
Miklos Szeredi 已提交
198
	__u32	padding;
M
Miklos Szeredi 已提交
199 200
};

201 202 203 204
struct fuse_statfs_out {
	struct fuse_kstatfs st;
};

M
Miklos Szeredi 已提交
205 206 207
struct fuse_fsync_in {
	__u64	fh;
	__u32	fsync_flags;
M
Miklos Szeredi 已提交
208
	__u32	padding;
M
Miklos Szeredi 已提交
209 210
};

211 212 213 214 215 216 217
struct fuse_setxattr_in {
	__u32	size;
	__u32	flags;
};

struct fuse_getxattr_in {
	__u32	size;
M
Miklos Szeredi 已提交
218
	__u32	padding;
219 220 221 222
};

struct fuse_getxattr_out {
	__u32	size;
M
Miklos Szeredi 已提交
223
	__u32	padding;
224 225
};

M
Miklos Szeredi 已提交
226 227 228 229 230
struct fuse_access_in {
	__u32	mask;
	__u32	padding;
};

M
Miklos Szeredi 已提交
231 232 233 234 235 236 237 238 239 240 241 242 243
struct fuse_init_in_out {
	__u32	major;
	__u32	minor;
};

struct fuse_in_header {
	__u32	len;
	__u32	opcode;
	__u64	unique;
	__u64	nodeid;
	__u32	uid;
	__u32	gid;
	__u32	pid;
M
Miklos Szeredi 已提交
244
	__u32	padding;
M
Miklos Szeredi 已提交
245 246 247 248 249 250 251 252
};

struct fuse_out_header {
	__u32	len;
	__s32	error;
	__u64	unique;
};

253 254 255 256 257 258 259 260 261 262 263 264
struct fuse_dirent {
	__u64	ino;
	__u64	off;
	__u32	namelen;
	__u32	type;
	char name[0];
};

#define FUSE_NAME_OFFSET ((unsigned) ((struct fuse_dirent *) 0)->name)
#define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1))
#define FUSE_DIRENT_SIZE(d) \
	FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)