blob: ea640e982de281851b2d33e99b4f65163399b7a9 [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 Szeredi13ed4822004-11-20 11:12:21 +000015#define FUSE_KERNEL_MINOR_VERSION 2
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 Szeredia25d4c22004-11-23 22:32:16 +000020/** The major number of the fuse character device */
21#define FUSE_MAJOR 10
22
23/** The minor number of the fuse character device */
24#define FUSE_MINOR 229
25
Miklos Szeredi8cffdb92001-11-09 14:49:18 +000026/** Opening this will yield a new control file */
Miklos Szeredi13ed4822004-11-20 11:12:21 +000027#define FUSE_DEV "/dev/fuse"
Miklos Szeredi8cffdb92001-11-09 14:49:18 +000028
Miklos Szeredic40748a2004-02-20 16:38:45 +000029/** The file containing the version in the form MAJOR.MINOR */
Miklos Szeredi13ed4822004-11-20 11:12:21 +000030#define FUSE_VERSION_FILE "/sys/fs/fuse/version"
Miklos Szeredic40748a2004-02-20 16:38:45 +000031
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000032struct fuse_attr {
Miklos Szeredia13d9002004-11-02 17:32:03 +000033 unsigned long ino;
Miklos Szeredi5e183482001-10-31 14:52:35 +000034 unsigned int mode;
35 unsigned int nlink;
36 unsigned int uid;
37 unsigned int gid;
38 unsigned int rdev;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000039 unsigned long long size;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000040 unsigned long blocks;
41 unsigned long atime;
Miklos Szeredib5958612004-02-20 14:10:49 +000042 unsigned long atimensec;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000043 unsigned long mtime;
Miklos Szeredib5958612004-02-20 14:10:49 +000044 unsigned long mtimensec;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000045 unsigned long ctime;
Miklos Szeredib5958612004-02-20 14:10:49 +000046 unsigned long ctimensec;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000047};
48
Miklos Szeredi24ed9452002-10-07 10:24:26 +000049struct fuse_kstatfs {
Miklos Szeredi18e75e42004-02-19 14:23:27 +000050 unsigned int bsize;
51 unsigned long long blocks;
52 unsigned long long bfree;
53 unsigned long long bavail;
54 unsigned long long files;
55 unsigned long long ffree;
56 unsigned int namelen;
Miklos Szeredi24ed9452002-10-07 10:24:26 +000057};
58
Miklos Szeredi5e183482001-10-31 14:52:35 +000059#define FATTR_MODE (1 << 0)
60#define FATTR_UID (1 << 1)
61#define FATTR_GID (1 << 2)
62#define FATTR_SIZE (1 << 3)
Miklos Szeredib5958612004-02-20 14:10:49 +000063#define FATTR_ATIME (1 << 4)
64#define FATTR_MTIME (1 << 5)
65#define FATTR_CTIME (1 << 6)
Miklos Szeredi5e183482001-10-31 14:52:35 +000066
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000067enum fuse_opcode {
Miklos Szeredi3ed84232004-03-30 15:17:26 +000068 FUSE_LOOKUP = 1,
69 FUSE_FORGET = 2, /* no reply */
70 FUSE_GETATTR = 3,
71 FUSE_SETATTR = 4,
72 FUSE_READLINK = 5,
73 FUSE_SYMLINK = 6,
74 FUSE_GETDIR = 7,
75 FUSE_MKNOD = 8,
76 FUSE_MKDIR = 9,
77 FUSE_UNLINK = 10,
78 FUSE_RMDIR = 11,
79 FUSE_RENAME = 12,
80 FUSE_LINK = 13,
81 FUSE_OPEN = 14,
82 FUSE_READ = 15,
83 FUSE_WRITE = 16,
84 FUSE_STATFS = 17,
Miklos Szeredi72cf5c92004-11-20 16:10:30 +000085 FUSE_RELEASE = 18,
Miklos Szeredi3ed84232004-03-30 15:17:26 +000086 FUSE_INVALIDATE = 19, /* user initiated */
87 FUSE_FSYNC = 20,
88 FUSE_SETXATTR = 21,
89 FUSE_GETXATTR = 22,
90 FUSE_LISTXATTR = 23,
91 FUSE_REMOVEXATTR = 24,
Miklos Szeredie2e4ac22004-05-18 08:45:28 +000092 FUSE_FLUSH = 25,
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000093};
94
95/* Conservative buffer size for the client */
96#define FUSE_MAX_IN 8192
97
Miklos Szeredic26c14d2004-04-09 17:48:32 +000098#define FUSE_NAME_MAX 1024
99#define FUSE_SYMLINK_MAX 4096
100#define FUSE_XATTR_SIZE_MAX 4096
101
Miklos Szeredi254d5ed2004-03-02 11:11:24 +0000102struct fuse_entry_out {
Miklos Szeredia13d9002004-11-02 17:32:03 +0000103 unsigned long nodeid; /* Inode ID */
104 unsigned long generation; /* Inode generation: nodeid:gen must
Miklos Szeredi254d5ed2004-03-02 11:11:24 +0000105 be unique for the fs's lifetime */
106 unsigned long entry_valid; /* Cache timeout for the name */
107 unsigned long entry_valid_nsec;
108 unsigned long attr_valid; /* Cache timeout for the attributes */
109 unsigned long attr_valid_nsec;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000110 struct fuse_attr attr;
111};
112
Miklos Szeredia181e612001-11-06 12:03:23 +0000113struct fuse_forget_in {
114 int version;
115};
116
Miklos Szeredi254d5ed2004-03-02 11:11:24 +0000117struct fuse_attr_out {
118 unsigned long attr_valid; /* Cache timeout for the attributes */
119 unsigned long attr_valid_nsec;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000120 struct fuse_attr attr;
121};
122
123struct fuse_getdir_out {
124 int fd;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000125};
126
127struct fuse_mknod_in {
Miklos Szeredi76f65782004-02-19 16:55:40 +0000128 unsigned int mode;
129 unsigned int rdev;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000130};
131
Miklos Szeredib483c932001-10-29 14:57:57 +0000132struct fuse_mkdir_in {
Miklos Szeredi76f65782004-02-19 16:55:40 +0000133 unsigned int mode;
Miklos Szeredib483c932001-10-29 14:57:57 +0000134};
135
Miklos Szeredib483c932001-10-29 14:57:57 +0000136struct fuse_rename_in {
137 unsigned long newdir;
Miklos Szeredi19dff1b2001-10-30 15:06:52 +0000138};
139
140struct fuse_link_in {
141 unsigned long newdir;
Miklos Szeredib483c932001-10-29 14:57:57 +0000142};
143
Miklos Szeredi5e183482001-10-31 14:52:35 +0000144struct fuse_setattr_in {
145 struct fuse_attr attr;
146 unsigned int valid;
147};
148
149struct fuse_open_in {
150 unsigned int flags;
151};
152
Miklos Szeredi209f5d02004-07-24 19:56:16 +0000153struct fuse_open_out {
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000154 unsigned long fh;
Miklos Szeredi3a6ea062004-11-11 10:33:58 +0000155 unsigned int _open_flags;
Miklos Szeredi209f5d02004-07-24 19:56:16 +0000156};
157
158struct fuse_release_in {
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000159 unsigned long fh;
Miklos Szeredi209f5d02004-07-24 19:56:16 +0000160 unsigned int flags;
161};
162
163struct fuse_flush_in {
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000164 unsigned long fh;
Miklos Szeredi3a6ea062004-11-11 10:33:58 +0000165 unsigned int _nref;
Miklos Szeredi209f5d02004-07-24 19:56:16 +0000166};
167
Miklos Szeredi5e183482001-10-31 14:52:35 +0000168struct fuse_read_in {
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000169 unsigned long fh;
Miklos Szeredi5e183482001-10-31 14:52:35 +0000170 unsigned long long offset;
171 unsigned int size;
172};
173
Miklos Szeredia181e612001-11-06 12:03:23 +0000174struct fuse_write_in {
Miklos Szeredi209f5d02004-07-24 19:56:16 +0000175 int writepage;
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000176 unsigned long fh;
Miklos Szeredia181e612001-11-06 12:03:23 +0000177 unsigned long long offset;
178 unsigned int size;
Miklos Szeredia181e612001-11-06 12:03:23 +0000179};
180
Miklos Szerediad051c32004-07-02 09:22:50 +0000181struct fuse_write_out {
182 unsigned int size;
183};
184
Mark Glinesd84b39a2002-01-07 16:32:02 +0000185struct fuse_statfs_out {
Miklos Szeredi24ed9452002-10-07 10:24:26 +0000186 struct fuse_kstatfs st;
Mark Glinesd84b39a2002-01-07 16:32:02 +0000187};
188
Miklos Szeredi5e43f2c2003-12-12 14:06:41 +0000189struct fuse_fsync_in {
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000190 unsigned long fh;
Miklos Szeredi5e43f2c2003-12-12 14:06:41 +0000191 int datasync;
192};
193
Miklos Szeredi3ed84232004-03-30 15:17:26 +0000194struct fuse_setxattr_in {
195 unsigned int size;
196 unsigned int flags;
197};
198
Miklos Szeredi03cebae2004-03-31 10:19:18 +0000199struct fuse_getxattr_in {
200 unsigned int size;
201};
202
203struct fuse_getxattr_out {
Miklos Szeredi3ed84232004-03-30 15:17:26 +0000204 unsigned int size;
205};
206
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000207struct fuse_in_header {
208 int unique;
209 enum fuse_opcode opcode;
Miklos Szeredia13d9002004-11-02 17:32:03 +0000210 unsigned long nodeid;
Miklos Szeredife25def2001-12-20 15:38:05 +0000211 unsigned int uid;
212 unsigned int gid;
Miklos Szeredi1f18db52004-09-27 06:54:49 +0000213 unsigned int pid;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000214};
215
216struct fuse_out_header {
217 int unique;
Miklos Szeredi19dff1b2001-10-30 15:06:52 +0000218 int error;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000219};
220
Miklos Szeredida4e4862003-09-08 11:14:11 +0000221struct fuse_user_header {
222 int unique; /* zero */
223 enum fuse_opcode opcode;
Miklos Szeredia13d9002004-11-02 17:32:03 +0000224 unsigned long nodeid;
225 unsigned long ino; /* Needed only on 2.4.x where ino is also
226 used for inode lookup */
Miklos Szeredida4e4862003-09-08 11:14:11 +0000227};
228
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000229struct fuse_dirent {
230 unsigned long ino;
231 unsigned short namelen;
232 unsigned char type;
233 char name[256];
234};
235
236#define FUSE_NAME_OFFSET ((unsigned int) ((struct fuse_dirent *) 0)->name)
237#define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(long) - 1) & ~(sizeof(long) - 1))
238#define FUSE_DIRENT_SIZE(d) \
239 FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)