fuse.h 6.35 KB
Newer Older
Miklos Szeredi's avatar
Miklos Szeredi committed
1
2
/*
    FUSE: Filesystem in Userspace
3
    Copyright (C) 2001-2006  Miklos Szeredi <miklos@szeredi.hu>
Miklos Szeredi's avatar
Miklos Szeredi committed
4
5
6
7
8

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

9
10
11
12
13
14
15
/*
 * This file defines the kernel interface of FUSE
 *
 * Protocol changelog:
 *
 * 7.9:
 *  - new fuse_getattr_in input argument of GETATTR
16
 *  - add lk_flags in fuse_lk_in
17
 */
Miklos Szeredi's avatar
Miklos Szeredi committed
18
19

#include <asm/types.h>
Jan Engelhardt's avatar
Jan Engelhardt committed
20
#include <linux/major.h>
Miklos Szeredi's avatar
Miklos Szeredi committed
21
22

/** Version number of this interface */
23
#define FUSE_KERNEL_VERSION 7
Miklos Szeredi's avatar
Miklos Szeredi committed
24
25

/** Minor version number of this interface */
26
#define FUSE_KERNEL_MINOR_VERSION 9
Miklos Szeredi's avatar
Miklos Szeredi committed
27
28
29
30

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

31
/** The major number of the fuse character device */
Jan Engelhardt's avatar
Jan Engelhardt committed
32
#define FUSE_MAJOR MISC_MAJOR
33
34
35
36

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

Miklos Szeredi's avatar
Miklos Szeredi committed
37
38
39
/* Make sure all structures are padded to 64bit boundary, so 32bit
   userspace works under 64bit kernels */

Miklos Szeredi's avatar
Miklos Szeredi committed
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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;
};

57
58
59
60
61
62
63
64
struct fuse_kstatfs {
	__u64	blocks;
	__u64	bfree;
	__u64	bavail;
	__u64	files;
	__u64	ffree;
	__u32	bsize;
	__u32	namelen;
65
66
67
	__u32	frsize;
	__u32	padding;
	__u32	spare[6];
68
69
};

70
71
72
73
74
75
76
struct fuse_file_lock {
	__u64	start;
	__u64	end;
	__u32	type;
	__u32	pid; /* tgid */
};

77
78
79
/**
 * Bitmasks for fuse_setattr_in.valid
 */
80
81
82
83
84
85
#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)
86
#define FATTR_FH	(1 << 6)
Miklos Szeredi's avatar
Miklos Szeredi committed
87
88
#define FATTR_ATIME_NOW	(1 << 7)
#define FATTR_MTIME_NOW	(1 << 8)
89

90
91
92
93
94
95
96
97
98
/**
 * 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)

99
100
101
102
/**
 * INIT request/reply flags
 */
#define FUSE_ASYNC_READ		(1 << 0)
103
#define FUSE_POSIX_LOCKS	(1 << 1)
104
#define FUSE_FILE_OPS		(1 << 2)
105
#define FUSE_ATOMIC_O_TRUNC	(1 << 3)
106

107
108
109
110
111
/**
 * Release flags
 */
#define FUSE_RELEASE_FLUSH	(1 << 0)

112
113
114
115
116
/**
 * Getattr flags
 */
#define FUSE_GETATTR_FH		(1 << 0)

117
118
119
120
121
/**
 * Lock flags
 */
#define FUSE_LK_FLOCK		(1 << 0)

122
123
124
125
126
127
128
/**
 * WRITE flags
 *
 * FUSE_WRITE_CACHE: delayed write from page cache, file handle is guessed
 */
#define FUSE_WRITE_CACHE	(1 << 0)

129
enum fuse_opcode {
130
131
132
	FUSE_LOOKUP	   = 1,
	FUSE_FORGET	   = 2,  /* no reply */
	FUSE_GETATTR	   = 3,
133
	FUSE_SETATTR	   = 4,
134
	FUSE_READLINK	   = 5,
135
136
137
138
139
140
141
	FUSE_SYMLINK	   = 6,
	FUSE_MKNOD	   = 8,
	FUSE_MKDIR	   = 9,
	FUSE_UNLINK	   = 10,
	FUSE_RMDIR	   = 11,
	FUSE_RENAME	   = 12,
	FUSE_LINK	   = 13,
142
143
144
	FUSE_OPEN	   = 14,
	FUSE_READ	   = 15,
	FUSE_WRITE	   = 16,
145
	FUSE_STATFS	   = 17,
146
147
	FUSE_RELEASE       = 18,
	FUSE_FSYNC         = 20,
148
149
150
151
	FUSE_SETXATTR      = 21,
	FUSE_GETXATTR      = 22,
	FUSE_LISTXATTR     = 23,
	FUSE_REMOVEXATTR   = 24,
152
	FUSE_FLUSH         = 25,
153
154
155
	FUSE_INIT          = 26,
	FUSE_OPENDIR       = 27,
	FUSE_READDIR       = 28,
156
	FUSE_RELEASEDIR    = 29,
Miklos Szeredi's avatar
Miklos Szeredi committed
157
	FUSE_FSYNCDIR      = 30,
158
159
160
	FUSE_GETLK         = 31,
	FUSE_SETLK         = 32,
	FUSE_SETLKW        = 33,
161
	FUSE_ACCESS        = 34,
162
163
	FUSE_CREATE        = 35,
	FUSE_INTERRUPT     = 36,
164
	FUSE_BMAP          = 37,
165
	FUSE_DESTROY       = 38,
166
167
};

168
169
/* The read buffer is required to be at least 8k, but may be much larger */
#define FUSE_MIN_READ_BUFFER 8192
170
171
172
173
174
175
176
177
178
179
180
181
182

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 {
183
	__u64	nlookup;
184
185
};

186
187
188
189
190
191
struct fuse_getattr_in {
	__u32	getattr_flags;
	__u32	dummy;
	__u64	fh;
};

192
193
194
195
196
197
198
struct fuse_attr_out {
	__u64	attr_valid;	/* Cache timeout for the attributes */
	__u32	attr_valid_nsec;
	__u32	dummy;
	struct fuse_attr attr;
};

199
200
201
202
203
204
205
struct fuse_mknod_in {
	__u32	mode;
	__u32	rdev;
};

struct fuse_mkdir_in {
	__u32	mode;
Miklos Szeredi's avatar
Miklos Szeredi committed
206
	__u32	padding;
207
208
209
210
211
212
213
214
215
216
217
218
};

struct fuse_rename_in {
	__u64	newdir;
};

struct fuse_link_in {
	__u64	oldnodeid;
};

struct fuse_setattr_in {
	__u32	valid;
Miklos Szeredi's avatar
Miklos Szeredi committed
219
	__u32	padding;
220
221
222
223
224
225
226
227
228
229
230
231
232
233
	__u64	fh;
	__u64	size;
	__u64	unused1;
	__u64	atime;
	__u64	mtime;
	__u64	unused2;
	__u32	atimensec;
	__u32	mtimensec;
	__u32	unused3;
	__u32	mode;
	__u32	unused4;
	__u32	uid;
	__u32	gid;
	__u32	unused5;
234
235
};

236
237
struct fuse_open_in {
	__u32	flags;
238
	__u32	mode;
239
240
241
242
243
};

struct fuse_open_out {
	__u64	fh;
	__u32	open_flags;
Miklos Szeredi's avatar
Miklos Szeredi committed
244
	__u32	padding;
245
246
247
248
249
};

struct fuse_release_in {
	__u64	fh;
	__u32	flags;
250
251
	__u32	release_flags;
	__u64	lock_owner;
252
253
254
255
};

struct fuse_flush_in {
	__u64	fh;
256
	__u32	unused;
Miklos Szeredi's avatar
Miklos Szeredi committed
257
	__u32	padding;
258
	__u64	lock_owner;
259
260
261
262
263
264
};

struct fuse_read_in {
	__u64	fh;
	__u64	offset;
	__u32	size;
Miklos Szeredi's avatar
Miklos Szeredi committed
265
	__u32	padding;
266
267
268
269
270
271
272
273
274
275
276
};

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

struct fuse_write_out {
	__u32	size;
Miklos Szeredi's avatar
Miklos Szeredi committed
277
	__u32	padding;
278
279
};

280
281
#define FUSE_COMPAT_STATFS_SIZE 48

282
283
284
285
struct fuse_statfs_out {
	struct fuse_kstatfs st;
};

286
287
288
struct fuse_fsync_in {
	__u64	fh;
	__u32	fsync_flags;
Miklos Szeredi's avatar
Miklos Szeredi committed
289
	__u32	padding;
290
291
};

292
293
294
295
296
297
298
struct fuse_setxattr_in {
	__u32	size;
	__u32	flags;
};

struct fuse_getxattr_in {
	__u32	size;
Miklos Szeredi's avatar
Miklos Szeredi committed
299
	__u32	padding;
300
301
302
303
};

struct fuse_getxattr_out {
	__u32	size;
Miklos Szeredi's avatar
Miklos Szeredi committed
304
	__u32	padding;
305
306
};

307
308
309
310
struct fuse_lk_in {
	__u64	fh;
	__u64	owner;
	struct fuse_file_lock lk;
311
312
	__u32	lk_flags;
	__u32	padding;
313
314
315
316
317
318
};

struct fuse_lk_out {
	struct fuse_file_lock lk;
};

Miklos Szeredi's avatar
Miklos Szeredi committed
319
320
321
322
323
struct fuse_access_in {
	__u32	mask;
	__u32	padding;
};

324
struct fuse_init_in {
325
326
	__u32	major;
	__u32	minor;
327
328
	__u32	max_readahead;
	__u32	flags;
329
330
};

331
332
333
struct fuse_init_out {
	__u32	major;
	__u32	minor;
334
335
336
	__u32	max_readahead;
	__u32	flags;
	__u32	unused;
337
338
339
	__u32	max_write;
};

340
341
342
343
struct fuse_interrupt_in {
	__u64	unique;
};

344
345
346
347
348
349
350
351
352
353
struct fuse_bmap_in {
	__u64	block;
	__u32	blocksize;
	__u32	padding;
};

struct fuse_bmap_out {
	__u64	block;
};

354
355
356
357
358
359
360
361
struct fuse_in_header {
	__u32	len;
	__u32	opcode;
	__u64	unique;
	__u64	nodeid;
	__u32	uid;
	__u32	gid;
	__u32	pid;
Miklos Szeredi's avatar
Miklos Szeredi committed
362
	__u32	padding;
363
364
365
366
367
368
369
370
};

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

371
372
373
374
375
376
377
378
struct fuse_dirent {
	__u64	ino;
	__u64	off;
	__u32	namelen;
	__u32	type;
	char name[0];
};

Andrew Morton's avatar
Andrew Morton committed
379
#define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
380
381
382
#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)