blob: 9f9609ecd0d94168999cd18305c961ca04c167c4 [file] [log] [blame]
Miklos Szeredi85c74fc2001-10-28 19:44:14 +00001/*
2 FUSE: Filesystem in Userspace
3 Copyright (C) 2001 Miklos Szeredi (mszeredi@inf.bme.hu)
4
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 Szeredife25def2001-12-20 15:38:05 +000012#define FUSE_KERNEL_VERSION 2
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000013
Miklos Szeredi2f3d9402003-12-15 12:11:33 +000014/** Minor version number of this interface */
15#define FUSE_KERNEL_MINOR_VERSION 1
16
Miklos Szeredi8cffdb92001-11-09 14:49:18 +000017/** The inode number of the root indode */
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000018#define FUSE_ROOT_INO 1
19
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 Szeredi36ca5562003-11-03 19:32:14 +000023/** Read combining parameters */
24#define FUSE_BLOCK_SHIFT 16
25#define FUSE_BLOCK_SIZE 65536
26#define FUSE_BLOCK_MASK 0xffff0000
27
Miklos Szeredi8cffdb92001-11-09 14:49:18 +000028/** Data passed to mount */
29struct fuse_mount_data {
30 /** Must be set to FUSE_KERNEL_VERSION */
31 int version;
32
33 /** The control file descriptor */
34 int fd;
35
36 /** The file type of the root inode */
37 unsigned int rootmode;
38
39 /** The user ID of the user initiating this mount */
40 unsigned int uid;
41
42 /** FUSE specific mount flags */
43 unsigned int flags;
44};
45
Miklos Szeredife25def2001-12-20 15:38:05 +000046/* FUSE mount flags: */
47
48/** If the FUSE_DEFAULT_PERMISSIONS flag is given, the filesystem
49module will check permissions based on the file mode. Otherwise no
50permission checking is done in the kernel */
51#define FUSE_DEFAULT_PERMISSIONS (1 << 0)
52
53/** If the FUSE_ALLOW_OTHER flag is given, then not only the user
54 doing the mount will be allowed to access the filesystem */
55#define FUSE_ALLOW_OTHER (1 << 1)
56
Miklos Szeredida4e4862003-09-08 11:14:11 +000057/** If the FUSE_KERNEL_CACHE flag is given, then files will be cached
58 until the INVALIDATE operation is invoked */
59#define FUSE_KERNEL_CACHE (1 << 2)
60
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000061struct fuse_attr {
Miklos Szeredi5e183482001-10-31 14:52:35 +000062 unsigned int mode;
63 unsigned int nlink;
64 unsigned int uid;
65 unsigned int gid;
66 unsigned int rdev;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000067 unsigned long long size;
Miklos Szeredi05033042001-11-13 16:11:35 +000068 unsigned long _dummy;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000069 unsigned long blocks;
70 unsigned long atime;
71 unsigned long mtime;
72 unsigned long ctime;
73};
74
Miklos Szeredi24ed9452002-10-07 10:24:26 +000075struct fuse_kstatfs {
76 long block_size;
77 long blocks;
78 long blocks_free;
79 long files;
80 long files_free;
81 long namelen;
82};
83
Miklos Szeredi5e183482001-10-31 14:52:35 +000084#define FATTR_MODE (1 << 0)
85#define FATTR_UID (1 << 1)
86#define FATTR_GID (1 << 2)
87#define FATTR_SIZE (1 << 3)
88#define FATTR_UTIME (1 << 4)
89
Miklos Szeredi85c74fc2001-10-28 19:44:14 +000090enum fuse_opcode {
Miklos Szeredi43696432001-11-18 19:15:05 +000091 FUSE_LOOKUP = 1,
Miklos Szeredida4e4862003-09-08 11:14:11 +000092 FUSE_FORGET = 2, /* no reply */
Miklos Szeredi43696432001-11-18 19:15:05 +000093 FUSE_GETATTR = 3,
94 FUSE_SETATTR = 4,
95 FUSE_READLINK = 5,
96 FUSE_SYMLINK = 6,
97 FUSE_GETDIR = 7,
98 FUSE_MKNOD = 8,
99 FUSE_MKDIR = 9,
100 FUSE_UNLINK = 10,
101 FUSE_RMDIR = 11,
102 FUSE_RENAME = 12,
103 FUSE_LINK = 13,
104 FUSE_OPEN = 14,
105 FUSE_READ = 15,
106 FUSE_WRITE = 16,
Mark Glinesd84b39a2002-01-07 16:32:02 +0000107 FUSE_STATFS = 17,
Miklos Szeredida4e4862003-09-08 11:14:11 +0000108 FUSE_RELEASE = 18, /* no reply */
Miklos Szeredi5e43f2c2003-12-12 14:06:41 +0000109 FUSE_INVALIDATE = 19, /* user initiated */
110 FUSE_FSYNC = 20
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000111};
112
113/* Conservative buffer size for the client */
114#define FUSE_MAX_IN 8192
115
116struct fuse_lookup_out {
117 unsigned long ino;
118 struct fuse_attr attr;
119};
120
Miklos Szeredia181e612001-11-06 12:03:23 +0000121struct fuse_forget_in {
122 int version;
123};
124
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000125struct fuse_getattr_out {
126 struct fuse_attr attr;
127};
128
129struct fuse_getdir_out {
130 int fd;
131 void *file; /* Used by kernel only */
132};
133
134struct fuse_mknod_in {
135 unsigned short mode;
136 unsigned short rdev;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000137};
138
139struct fuse_mknod_out {
140 unsigned long ino;
141 struct fuse_attr attr;
142};
143
Miklos Szeredib483c932001-10-29 14:57:57 +0000144struct fuse_mkdir_in {
145 unsigned short mode;
Miklos Szeredib483c932001-10-29 14:57:57 +0000146};
147
Miklos Szeredib483c932001-10-29 14:57:57 +0000148struct fuse_rename_in {
149 unsigned long newdir;
Miklos Szeredi19dff1b2001-10-30 15:06:52 +0000150};
151
152struct fuse_link_in {
153 unsigned long newdir;
Miklos Szeredib483c932001-10-29 14:57:57 +0000154};
155
Miklos Szeredi5e183482001-10-31 14:52:35 +0000156struct fuse_setattr_in {
157 struct fuse_attr attr;
158 unsigned int valid;
159};
160
Miklos Szeredia181e612001-11-06 12:03:23 +0000161struct fuse_setattr_out {
Miklos Szeredif3ea83b2001-11-07 14:55:16 +0000162 struct fuse_attr attr;
Miklos Szeredia181e612001-11-06 12:03:23 +0000163};
164
Miklos Szeredi5e183482001-10-31 14:52:35 +0000165struct fuse_open_in {
166 unsigned int flags;
167};
168
169struct fuse_read_in {
170 unsigned long long offset;
171 unsigned int size;
172};
173
Miklos Szeredia181e612001-11-06 12:03:23 +0000174struct fuse_write_in {
175 unsigned long long offset;
176 unsigned int size;
Miklos Szeredia181e612001-11-06 12:03:23 +0000177};
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 {
184 int datasync;
185};
186
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000187struct fuse_in_header {
188 int unique;
189 enum fuse_opcode opcode;
Miklos Szeredib483c932001-10-29 14:57:57 +0000190 unsigned long ino;
Miklos Szeredife25def2001-12-20 15:38:05 +0000191 unsigned int uid;
192 unsigned int gid;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000193};
194
195struct fuse_out_header {
196 int unique;
Miklos Szeredi19dff1b2001-10-30 15:06:52 +0000197 int error;
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000198};
199
Miklos Szeredida4e4862003-09-08 11:14:11 +0000200struct fuse_user_header {
201 int unique; /* zero */
202 enum fuse_opcode opcode;
203 unsigned long ino;
204};
205
Miklos Szeredi85c74fc2001-10-28 19:44:14 +0000206struct fuse_dirent {
207 unsigned long ino;
208 unsigned short namelen;
209 unsigned char type;
210 char name[256];
211};
212
213#define FUSE_NAME_OFFSET ((unsigned int) ((struct fuse_dirent *) 0)->name)
214#define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(long) - 1) & ~(sizeof(long) - 1))
215#define FUSE_DIRENT_SIZE(d) \
216 FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
217
218/*
219 * Local Variables:
220 * indent-tabs-mode: t
221 * c-basic-offset: 8
222 * End:
223 */