blob: e5f9a6cc1917e4e9cbbab4a41348fa20e0937ab6 [file] [log] [blame]
Miklos Szeredi85c74fc2001-10-28 19:44:14 +00001/*
2 FUSE: Filesystem in Userspace
Miklos Szeredi2e6b6f22004-07-07 19:19:53 +00003 Copyright (C) 2001-2004 Miklos Szeredi <miklos@szeredi.hu>
Miklos Szeredi85c74fc2001-10-28 19:44:14 +00004
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
Miklos Szeredi8cffdb92001-11-09 14:49:18 +000011/** Version number of this interface */
Miklos Szeredia13d9002004-11-02 17:32:03 +000012#define FUSE_KERNEL_VERSION 4
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000013
Miklos Szeredi2f3d9402003-12-15 12:11:33 +000014/** Minor version number of this interface */
Miklos Szeredi18e75e42004-02-19 14:23:27 +000015#define FUSE_KERNEL_MINOR_VERSION 1
Miklos Szeredi2f3d9402003-12-15 12:11:33 +000016
Miklos Szeredia13d9002004-11-02 17:32:03 +000017/** The node ID of the root inode */
18#define FUSE_ROOT_ID 1
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000019
Miklos Szeredi8cffdb92001-11-09 14:49:18 +000020/** Opening this will yield a new control file */
21#define FUSE_DEV "/proc/fs/fuse/dev"
22
Miklos Szeredic40748a2004-02-20 16:38:45 +000023/** The file containing the version in the form MAJOR.MINOR */
24#define FUSE_VERSION_FILE "/proc/fs/fuse/version"
25
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000026struct fuse_attr {
Miklos Szeredia13d9002004-11-02 17:32:03 +000027 unsigned long ino;
Miklos Szeredi5e183482001-10-31 14:52:35 +000028 unsigned int mode;
29 unsigned int nlink;
30 unsigned int uid;
31 unsigned int gid;
32 unsigned int rdev;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000033 unsigned long long size;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000034 unsigned long blocks;
35 unsigned long atime;
Miklos Szeredib5958612004-02-20 14:10:49 +000036 unsigned long atimensec;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000037 unsigned long mtime;
Miklos Szeredib5958612004-02-20 14:10:49 +000038 unsigned long mtimensec;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000039 unsigned long ctime;
Miklos Szeredib5958612004-02-20 14:10:49 +000040 unsigned long ctimensec;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000041};
42
Miklos Szeredi24ed9452002-10-07 10:24:26 +000043struct fuse_kstatfs {
Miklos Szeredi18e75e42004-02-19 14:23:27 +000044 unsigned int bsize;
45 unsigned long long blocks;
46 unsigned long long bfree;
47 unsigned long long bavail;
48 unsigned long long files;
49 unsigned long long ffree;
50 unsigned int namelen;
Miklos Szeredi24ed9452002-10-07 10:24:26 +000051};
52
Miklos Szeredi5e183482001-10-31 14:52:35 +000053#define FATTR_MODE (1 << 0)
54#define FATTR_UID (1 << 1)
55#define FATTR_GID (1 << 2)
56#define FATTR_SIZE (1 << 3)
Miklos Szeredib5958612004-02-20 14:10:49 +000057#define FATTR_ATIME (1 << 4)
58#define FATTR_MTIME (1 << 5)
59#define FATTR_CTIME (1 << 6)
Miklos Szeredi5e183482001-10-31 14:52:35 +000060
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000061enum fuse_opcode {
Miklos Szeredi3ed84232004-03-30 15:17:26 +000062 FUSE_LOOKUP = 1,
63 FUSE_FORGET = 2, /* no reply */
64 FUSE_GETATTR = 3,
65 FUSE_SETATTR = 4,
66 FUSE_READLINK = 5,
67 FUSE_SYMLINK = 6,
68 FUSE_GETDIR = 7,
69 FUSE_MKNOD = 8,
70 FUSE_MKDIR = 9,
71 FUSE_UNLINK = 10,
72 FUSE_RMDIR = 11,
73 FUSE_RENAME = 12,
74 FUSE_LINK = 13,
75 FUSE_OPEN = 14,
76 FUSE_READ = 15,
77 FUSE_WRITE = 16,
78 FUSE_STATFS = 17,
79 FUSE_RELEASE = 18, /* no reply */
80 FUSE_INVALIDATE = 19, /* user initiated */
81 FUSE_FSYNC = 20,
82 FUSE_SETXATTR = 21,
83 FUSE_GETXATTR = 22,
84 FUSE_LISTXATTR = 23,
85 FUSE_REMOVEXATTR = 24,
Miklos Szeredie2e4ac22004-05-18 08:45:28 +000086 FUSE_FLUSH = 25,
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000087};
88
89/* Conservative buffer size for the client */
90#define FUSE_MAX_IN 8192
91
Miklos Szeredic26c14d2004-04-09 17:48:32 +000092#define FUSE_NAME_MAX 1024
93#define FUSE_SYMLINK_MAX 4096
94#define FUSE_XATTR_SIZE_MAX 4096
95
Miklos Szeredi254d5ed2004-03-02 11:11:24 +000096struct fuse_entry_out {
Miklos Szeredia13d9002004-11-02 17:32:03 +000097 unsigned long nodeid; /* Inode ID */
98 unsigned long generation; /* Inode generation: nodeid:gen must
Miklos Szeredi254d5ed2004-03-02 11:11:24 +000099 be unique for the fs's lifetime */
100 unsigned long entry_valid; /* Cache timeout for the name */
101 unsigned long entry_valid_nsec;
102 unsigned long attr_valid; /* Cache timeout for the attributes */
103 unsigned long attr_valid_nsec;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000104 struct fuse_attr attr;
105};
106
Miklos Szeredia181e612001-11-06 12:03:23 +0000107struct fuse_forget_in {
108 int version;
109};
110
Miklos Szeredi254d5ed2004-03-02 11:11:24 +0000111struct fuse_attr_out {
112 unsigned long attr_valid; /* Cache timeout for the attributes */
113 unsigned long attr_valid_nsec;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000114 struct fuse_attr attr;
115};
116
117struct fuse_getdir_out {
118 int fd;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000119};
120
121struct fuse_mknod_in {
Miklos Szeredi76f65782004-02-19 16:55:40 +0000122 unsigned int mode;
123 unsigned int rdev;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000124};
125
Miklos Szeredib483c932001-10-29 14:57:57 +0000126struct fuse_mkdir_in {
Miklos Szeredi76f65782004-02-19 16:55:40 +0000127 unsigned int mode;
Miklos Szeredib483c932001-10-29 14:57:57 +0000128};
129
Miklos Szeredib483c932001-10-29 14:57:57 +0000130struct fuse_rename_in {
131 unsigned long newdir;
Miklos Szeredi19dff1b2001-10-30 15:06:52 +0000132};
133
134struct fuse_link_in {
135 unsigned long newdir;
Miklos Szeredib483c932001-10-29 14:57:57 +0000136};
137
Miklos Szeredi5e183482001-10-31 14:52:35 +0000138struct fuse_setattr_in {
139 struct fuse_attr attr;
140 unsigned int valid;
141};
142
143struct fuse_open_in {
144 unsigned int flags;
145};
146
Miklos Szeredi209f5d02004-07-24 19:56:16 +0000147struct fuse_open_out {
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000148 unsigned long fh;
Miklos Szeredi209f5d02004-07-24 19:56:16 +0000149};
150
151struct fuse_release_in {
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000152 unsigned long fh;
Miklos Szeredi209f5d02004-07-24 19:56:16 +0000153 unsigned int flags;
154};
155
156struct fuse_flush_in {
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000157 unsigned long fh;
Miklos Szeredi209f5d02004-07-24 19:56:16 +0000158};
159
Miklos Szeredi5e183482001-10-31 14:52:35 +0000160struct fuse_read_in {
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000161 unsigned long fh;
Miklos Szeredi5e183482001-10-31 14:52:35 +0000162 unsigned long long offset;
163 unsigned int size;
164};
165
Miklos Szeredia181e612001-11-06 12:03:23 +0000166struct fuse_write_in {
Miklos Szeredi209f5d02004-07-24 19:56:16 +0000167 int writepage;
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000168 unsigned long fh;
Miklos Szeredia181e612001-11-06 12:03:23 +0000169 unsigned long long offset;
170 unsigned int size;
Miklos Szeredia181e612001-11-06 12:03:23 +0000171};
172
Miklos Szerediad051c32004-07-02 09:22:50 +0000173struct fuse_write_out {
174 unsigned int size;
175};
176
Mark Glinesd84b39a2002-01-07 16:32:02 +0000177struct fuse_statfs_out {
Miklos Szeredi24ed9452002-10-07 10:24:26 +0000178 struct fuse_kstatfs st;
Mark Glinesd84b39a2002-01-07 16:32:02 +0000179};
180
Miklos Szeredi5e43f2c2003-12-12 14:06:41 +0000181struct fuse_fsync_in {
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000182 unsigned long fh;
Miklos Szeredi5e43f2c2003-12-12 14:06:41 +0000183 int datasync;
184};
185
Miklos Szeredi3ed84232004-03-30 15:17:26 +0000186struct fuse_setxattr_in {
187 unsigned int size;
188 unsigned int flags;
189};
190
Miklos Szeredi03cebae2004-03-31 10:19:18 +0000191struct fuse_getxattr_in {
192 unsigned int size;
193};
194
195struct fuse_getxattr_out {
Miklos Szeredi3ed84232004-03-30 15:17:26 +0000196 unsigned int size;
197};
198
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000199struct fuse_in_header {
200 int unique;
201 enum fuse_opcode opcode;
Miklos Szeredia13d9002004-11-02 17:32:03 +0000202 unsigned long nodeid;
Miklos Szeredife25def2001-12-20 15:38:05 +0000203 unsigned int uid;
204 unsigned int gid;
Miklos Szeredi1f18db52004-09-27 06:54:49 +0000205 unsigned int pid;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000206};
207
208struct fuse_out_header {
209 int unique;
Miklos Szeredi19dff1b2001-10-30 15:06:52 +0000210 int error;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000211};
212
Miklos Szeredida4e4862003-09-08 11:14:11 +0000213struct fuse_user_header {
214 int unique; /* zero */
215 enum fuse_opcode opcode;
Miklos Szeredia13d9002004-11-02 17:32:03 +0000216 unsigned long nodeid;
217 unsigned long ino; /* Needed only on 2.4.x where ino is also
218 used for inode lookup */
Miklos Szeredida4e4862003-09-08 11:14:11 +0000219};
220
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000221struct fuse_dirent {
222 unsigned long ino;
223 unsigned short namelen;
224 unsigned char type;
225 char name[256];
226};
227
228#define FUSE_NAME_OFFSET ((unsigned int) ((struct fuse_dirent *) 0)->name)
229#define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(long) - 1) & ~(sizeof(long) - 1))
230#define FUSE_DIRENT_SIZE(d) \
231 FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
232
233/*
234 * Local Variables:
235 * indent-tabs-mode: t
236 * c-basic-offset: 8
237 * End:
238 */