blob: f5f7405be244848cb0ab5648e67cbe43233f859f [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 Szeredi8cffdb92001-11-09 14:49:18 +000020/** Opening this will yield a new control file */
Miklos Szeredi13ed4822004-11-20 11:12:21 +000021#define FUSE_DEV "/dev/fuse"
Miklos Szeredi8cffdb92001-11-09 14:49:18 +000022
Miklos Szeredic40748a2004-02-20 16:38:45 +000023/** The file containing the version in the form MAJOR.MINOR */
Miklos Szeredi13ed4822004-11-20 11:12:21 +000024#define FUSE_VERSION_FILE "/sys/fs/fuse/version"
Miklos Szeredic40748a2004-02-20 16:38:45 +000025
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,
Miklos Szeredi72cf5c92004-11-20 16:10:30 +000079 FUSE_RELEASE = 18,
Miklos Szeredi3ed84232004-03-30 15:17:26 +000080 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 Szeredi3a6ea062004-11-11 10:33:58 +0000149 unsigned int _open_flags;
Miklos Szeredi209f5d02004-07-24 19:56:16 +0000150};
151
152struct fuse_release_in {
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000153 unsigned long fh;
Miklos Szeredi209f5d02004-07-24 19:56:16 +0000154 unsigned int flags;
155};
156
157struct fuse_flush_in {
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000158 unsigned long fh;
Miklos Szeredi3a6ea062004-11-11 10:33:58 +0000159 unsigned int _nref;
Miklos Szeredi209f5d02004-07-24 19:56:16 +0000160};
161
Miklos Szeredi5e183482001-10-31 14:52:35 +0000162struct fuse_read_in {
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000163 unsigned long fh;
Miklos Szeredi5e183482001-10-31 14:52:35 +0000164 unsigned long long offset;
165 unsigned int size;
166};
167
Miklos Szeredia181e612001-11-06 12:03:23 +0000168struct fuse_write_in {
Miklos Szeredi209f5d02004-07-24 19:56:16 +0000169 int writepage;
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000170 unsigned long fh;
Miklos Szeredia181e612001-11-06 12:03:23 +0000171 unsigned long long offset;
172 unsigned int size;
Miklos Szeredia181e612001-11-06 12:03:23 +0000173};
174
Miklos Szerediad051c32004-07-02 09:22:50 +0000175struct fuse_write_out {
176 unsigned int size;
177};
178
Mark Glinesd84b39a2002-01-07 16:32:02 +0000179struct fuse_statfs_out {
Miklos Szeredi24ed9452002-10-07 10:24:26 +0000180 struct fuse_kstatfs st;
Mark Glinesd84b39a2002-01-07 16:32:02 +0000181};
182
Miklos Szeredi5e43f2c2003-12-12 14:06:41 +0000183struct fuse_fsync_in {
Miklos Szeredi1eea0322004-09-27 18:50:11 +0000184 unsigned long fh;
Miklos Szeredi5e43f2c2003-12-12 14:06:41 +0000185 int datasync;
186};
187
Miklos Szeredi3ed84232004-03-30 15:17:26 +0000188struct fuse_setxattr_in {
189 unsigned int size;
190 unsigned int flags;
191};
192
Miklos Szeredi03cebae2004-03-31 10:19:18 +0000193struct fuse_getxattr_in {
194 unsigned int size;
195};
196
197struct fuse_getxattr_out {
Miklos Szeredi3ed84232004-03-30 15:17:26 +0000198 unsigned int size;
199};
200
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000201struct fuse_in_header {
202 int unique;
203 enum fuse_opcode opcode;
Miklos Szeredia13d9002004-11-02 17:32:03 +0000204 unsigned long nodeid;
Miklos Szeredife25def2001-12-20 15:38:05 +0000205 unsigned int uid;
206 unsigned int gid;
Miklos Szeredi1f18db52004-09-27 06:54:49 +0000207 unsigned int pid;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000208};
209
210struct fuse_out_header {
211 int unique;
Miklos Szeredi19dff1b2001-10-30 15:06:52 +0000212 int error;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000213};
214
Miklos Szeredida4e4862003-09-08 11:14:11 +0000215struct fuse_user_header {
216 int unique; /* zero */
217 enum fuse_opcode opcode;
Miklos Szeredia13d9002004-11-02 17:32:03 +0000218 unsigned long nodeid;
219 unsigned long ino; /* Needed only on 2.4.x where ino is also
220 used for inode lookup */
Miklos Szeredida4e4862003-09-08 11:14:11 +0000221};
222
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000223struct fuse_dirent {
224 unsigned long ino;
225 unsigned short namelen;
226 unsigned char type;
227 char name[256];
228};
229
230#define FUSE_NAME_OFFSET ((unsigned int) ((struct fuse_dirent *) 0)->name)
231#define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(long) - 1) & ~(sizeof(long) - 1))
232#define FUSE_DIRENT_SIZE(d) \
233 FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)