summaryrefslogtreecommitdiffstats
path: root/share/doc/papers/fsinterface/slides.t
blob: 3caaafbeea59fda2ceea9e8ef0eadada1d5d3927 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
.\" Copyright (c) 1986 The Regents of the University of California.
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice, this list of conditions and the following disclaimer in the
.\"    documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\"    must display the following acknowledgement:
.\"	This product includes software developed by the University of
.\"	California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\"    may be used to endorse or promote products derived from this software
.\"    without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\"	@(#)slides.t	5.2 (Berkeley) 4/16/91
.\"
.so macros
.nf
.LL
Encapsulation of namei parameters
.NP 0
.ta .5i +\w'caddr_t\0\0'u +\w'struct\0\0'u +\w'vnode *nc_prevdir;\0\0\0\0\0'u
struct nameidata {
   /* arguments and context: */
	caddr_t	ni_dirp;
	enum	uio_seg ni_seg;
	short	ni_nameiop;
	struct	vnode *ni_cdir;
	struct	vnode *ni_rdir;
	struct	ucred *ni_cred;
.sp .2
   /* shared with lookup and commit: */
	caddr_t	ni_pnbuf;
	char	*ni_ptr;
	int	ni_pathlen;
	short	ni_more;
	short	ni_loopcnt;
.sp .2
   /* results: */
	struct	vnode *ni_vp;
	struct	vnode *ni_dvp;
.sp .2
/* BEGIN UFS SPECIFIC */
	struct diroffcache {
		struct	vnode *nc_prevdir;
		long	nc_id;
		off_t	nc_prevoffset;
	} ni_nc;
/* END UFS SPECIFIC */
};
.bp


.LL
Namei operations and modifiers

.NP 0
.ta \w'#define\0\0'u +\w'WANTPARENT\0\0'u +\w'0x40\0\0\0\0\0\0\0'u
#define	LOOKUP	0	/* name lookup only */
#define	CREATE	1	/* setup for creation */
#define	DELETE	2	/* setup for deletion */
#define	WANTPARENT	0x10	/* return parent vnode also */
#define	NOCACHE	0x20	/* remove name from cache */
#define	FOLLOW	0x40	/* follow symbolic links */
.bp

.LL
Namei operations and modifiers

.NP 0
.ta \w'#define\0\0'u +\w'WANTPARENT\0\0'u +\w'0x40\0\0\0\0\0\0\0'u
#define	LOOKUP	0
#define	CREATE	1
#define	DELETE	2
#define	WANTPARENT	0x10
#define	NOCACHE	0x20
#define	FOLLOW	0x40
.bp


.LL
Credentials

.NP 0
.ta .5i +\w'caddr_t\0\0\0'u +\w'struct\0\0'u +\w'vnode *nc_prevdir;\0\0\0\0\0'u
struct ucred {
	u_short	cr_ref;
	uid_t	cr_uid;
	short	cr_ngroups;
	gid_t	cr_groups[NGROUPS];
	/*
	 * The following either should not be here,
	 * or should be treated as opaque.
	 */
	uid_t   cr_ruid;
	gid_t   cr_svgid;
};
.bp
.LL
Scatter-gather I/O
.NP 0
.ta .5i +\w'caddr_t\0\0\0'u +\w'struct\0\0'u +\w'vnode *nc_prevdir;\0\0\0\0\0'u
struct uio {
	struct	iovec *uio_iov;
	int	uio_iovcnt;
	off_t	uio_offset;
	int	uio_resid;
	enum	uio_rw uio_rw;
};

enum	uio_rw { UIO_READ, UIO_WRITE };



.ta .5i +\w'caddr_t\0\0\0'u +\w'vnode *nc_prevdir;\0\0\0\0\0'u
struct iovec {
	caddr_t	iov_base;
	int	iov_len;
	enum	uio_seg iov_segflg;
	int	(*iov_op)();
};
.bp
.LL
Per-filesystem information
.NP 0
.ta .25i +\w'struct vfsops\0\0\0'u +\w'*vfs_vnodecovered;\0\0\0\0\0'u
struct vfs {
	struct vfs	*vfs_next;
\fB+\fP	struct vfs	*vfs_prev;
	struct vfsops	*vfs_op;
	struct vnode	*vfs_vnodecovered;
	int	vfs_flag;
\fB!\fP	int	vfs_fsize;
\fB+\fP	int	vfs_bsize;
\fB!\fP	uid_t	vfs_exroot;
	short	vfs_exflags;
	caddr_t	vfs_data;
};

.NP 0
.ta \w'\fB+\fP 'u +\w'#define\0\0'u +\w'VFS_EXPORTED\0\0'u +\w'0x40\0\0\0\0\0'u
	/* vfs flags: */
	#define	VFS_RDONLY	0x01
\fB+\fP	#define	VFS_NOEXEC	0x02
	#define	VFS_MLOCK	0x04
	#define	VFS_MWAIT	0x08
	#define	VFS_NOSUID	0x10
	#define	VFS_EXPORTED	0x20

	/* exported vfs flags: */
	#define	EX_RDONLY	0x01
.bp


.LL
Operations supported on virtual file system.

.NP 0
.ta .25i +\w'int\0\0'u +\w'*vfs_mountroot();\0'u
struct vfsops {
\fB!\fP	int	(*vfs_mount)(vfs, path, data, len);
\fB!\fP	int	(*vfs_unmount)(vfs, forcibly);
\fB+\fP	int	(*vfs_mountroot)();
	int	(*vfs_root)(vfs, vpp);
	int	(*vfs_statfs)(vfs, sbp);
\fB!\fP	int	(*vfs_sync)(vfs, waitfor);
\fB+\fP	int	(*vfs_fhtovp)(vfs, fhp, vpp);
\fB+\fP	int	(*vfs_vptofh)(vp, fhp);
};
.bp


.LL
Dynamic file system information

.NP 0
.ta .5i +\w'struct\0\0\0'u +\w'*vfs_vnodecovered;\0\0\0\0\0'u
struct statfs {
\fB!\fP	short	f_type;
\fB+\fP	short	f_flags;
\fB!\fP	long	f_fsize;
\fB+\fP	long	f_bsize;
	long	f_blocks;
	long	f_bfree;
	long	f_bavail;
	long	f_files;
	long	f_ffree;
	fsid_t	f_fsid;
\fB+\fP	char	*f_mntonname;
\fB+\fP	char	*f_mntfromname;
	long	f_spare[7];
};

typedef long fsid_t[2];
.bp
.LL
Filesystem objects (vnodes)
.NP 0
.ta .25i +\w'struct vnodeops\0\0'u +\w'*v_vfsmountedhere;\0\0\0'u
enum vtype 	{ VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK };

struct vnode {
	u_short	v_flag;
	u_short	v_count;
	u_short	v_shlockc;
	u_short	v_exlockc;
	struct vfs	*v_vfsmountedhere;
	struct vfs	*v_vfsp;
	struct vnodeops	*v_op;
\fB+\fP	struct text	*v_text;
	enum vtype	v_type;
	caddr_t	v_data;
};
.ta \w'#define\0\0'u +\w'NOFOLLOW\0\0'u +\w'0x40\0\0\0\0\0\0\0'u

/* vnode flags */
#define	VROOT	0x01
#define	VTEXT	0x02
#define	VEXLOCK	0x10
#define	VSHLOCK	0x20
#define	VLWAIT	0x40
.bp
.LL
Operations on vnodes

.NP 0
.ta .25i +\w'int\0\0'u  +\w'(*vn_getattr)(\0\0\0\0\0'u
struct vnodeops {
\fB!\fP	int	(*vn_lookup)(ndp);
\fB!\fP	int	(*vn_create)(ndp, vap, fflags);
\fB+\fP	int	(*vn_mknod)(ndp, vap, fflags);
\fB!\fP	int	(*vn_open)(vp, fflags, cred);
	int	(*vn_close)(vp, fflags, cred);
	int	(*vn_access)(vp, fflags, cred);
	int	(*vn_getattr)(vp, vap, cred);
	int	(*vn_setattr)(vp, vap, cred);
.sp .5
\fB+\fP	int	(*vn_read)(vp, uiop,
		        offp, ioflag, cred);
\fB+\fP	int	(*vn_write)(vp, uiop,
		        offp, ioflag, cred);
\fB!\fP	int	(*vn_ioctl)(vp, com,
		        data, fflag, cred);
	int	(*vn_select)(vp, which, cred);
\fB+\fP	int	(*vn_mmap)(vp, ..., cred);
	int	(*vn_fsync)(vp, cred);
\fB+\fP	int	(*vn_seek)(vp, offp, off,
		        whence);
.bp
.LL
Operations on vnodes (cont)

.NP 0
.ta .25i +\w'int\0\0'u  +\w'(*vn_getattr)(\0\0\0\0\0'u

\fB!\fP	int	(*vn_remove)(ndp);
\fB!\fP	int	(*vn_link)(vp, ndp);
\fB!\fP	int	(*vn_rename)(sndp, tndp);
\fB!\fP	int	(*vn_mkdir)(ndp, vap);
\fB!\fP	int	(*vn_rmdir)(ndp);
\fB!\fP	int	(*vn_symlink)(ndp, vap, nm);
\fB!\fP	int	(*vn_readdir)(vp, uiop,
		        offp, ioflag, cred);
\fB!\fP	int	(*vn_readlink)(vp, uiop,
		        offp, ioflag, cred);
.sp .5
\fB+\fP	int	(*vn_abortop)(ndp);
\fB!\fP	int	(*vn_inactive)(vp);
};

.NP 0
.ta \w'#define\0\0'u +\w'NOFOLLOW\0\0'u +\w'0x40\0\0\0\0\0'u
/* flags for ioflag */
#define	IO_UNIT	0x01
#define	IO_APPEND	0x02
#define	IO_SYNC	0x04
.bp

.LL
Vnode attributes

.NP 0
.ta .5i +\w'struct timeval\0\0'u +\w'*v_vfsmountedhere;\0\0\0'u
struct vattr {
	enum vtype	va_type;
	u_short	va_mode;
\fB!\fP	uid_t	va_uid;
\fB!\fP	gid_t	va_gid;
	long	va_fsid;
\fB!\fP	long	va_fileid;
	short	va_nlink;
	u_long	va_size;
\fB+\fP	u_long	va_size1;
	long	va_blocksize;
	struct timeval	va_atime;
	struct timeval	va_mtime;
	struct timeval	va_ctime;
	dev_t	va_rdev;
\fB!\fP	u_long	va_bytes;
\fB+\fP	u_long	va_bytes1;
};
OpenPOWER on IntegriCloud