xref: /386bsd/usr/src/kernel/include/fs/vnode.h (revision a2142627)
1 /*
2  * Copyright (c) 1989 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *	This product includes software developed by the University of
16  *	California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  *	@(#)vnode.h	7.39 (Berkeley) 6/27/91
34  */
35 
36 /*#ifndef KERNEL
37 #include <machine/endian.h>
38 #endif*/
39 
40 /*
41  * The vnode is the focus of all file activity in UNIX.
42  * There is a unique vnode allocated for each active file,
43  * each current directory, each mounted-on file, text file, and the root.
44  */
45 
46 /*
47  * vnode types. VNON means no type.
48  */
49 enum vtype 	{ VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD };
50 
51 /*
52  * Vnode tag types.
53  * These are for the benefit of external programs only (e.g., pstat)
54  * and should NEVER be inspected inside the kernel.
55  */
56 enum vtagtype	{ VT_NON, VT_UFS, VT_NFS, VT_MFS };
57 
58 /*
59  * This defines the maximum size of the private data area
60  * permitted for any file system type. A defined constant
61  * is used rather than a union structure to cut down on the
62  * number of header files that must be included.
63  */
64 #define	VN_MAXPRIVATE	188
65 
66 /*
67  * XXX non-canonical vnode "name" length:
68  * All objects in the kernel should have a canonical name.
69  * For now, record a portion of the file's name with each
70  * vnode to identify it. This should be changed to be a
71  * malloc()ed full component name, used by the namei cache,
72  * and deallocated on vnode reclaims.
73  */
74 #define	VN_MAXNAME	16
75 
76 struct vnode {
77 	u_long		v_flag;			/* vnode flags (see below) */
78 	short		v_usecount;		/* reference count of users */
79 	short		v_writecount;		/* reference count of writers */
80 	long		v_holdcnt;		/* page & buffer references */
81 	off_t		v_lastr;		/* last read (read-ahead) */
82 	u_long		v_id;			/* capability identifier */
83 	struct mount	*v_mount;		/* ptr to vfs we are in */
84 	struct vnodeops	*v_op;			/* vnode operations */
85 	struct vnode	*v_freef;		/* vnode freelist forward */
86 	struct vnode	**v_freeb;		/* vnode freelist back */
87 	struct vnode	*v_mountf;		/* vnode mountlist forward */
88 	struct vnode	**v_mountb;		/* vnode mountlist back */
89 	struct buf	*v_cleanblkhd;		/* clean blocklist head */
90 	struct buf	*v_dirtyblkhd;		/* dirty blocklist head */
91 	long		v_numoutput;		/* num of writes in progress */
92 	enum vtype	v_type;			/* vnode type */
93 	union {
94 		struct mount	*vu_mountedhere;/* ptr to mounted vfs (VDIR) */
95 		struct socket	*vu_socket;	/* unix ipc (VSOCK) */
96 		caddr_t		vu_vmdata;	/* private data for vm (VREG) */
97 		struct specinfo	*vu_specinfo;	/* device (VCHR, VBLK) */
98 		struct fifoinfo	*vu_fifoinfo;	/* fifo (VFIFO) */
99 	} v_un;
100 	enum vtagtype	v_tag;			/* type of underlying data */
101 	char v_name[VN_MAXNAME];		/* name of associated file */
102 	char v_data[VN_MAXPRIVATE];		/* private data for fs */
103 };
104 #define	v_mountedhere	v_un.vu_mountedhere
105 #define	v_socket	v_un.vu_socket
106 #define	v_vmdata	v_un.vu_vmdata
107 #define	v_specinfo	v_un.vu_specinfo
108 #define	v_fifoinfo	v_un.vu_fifoinfo
109 
110 /*
111  * vnode flags.
112  */
113 #define	VROOT		0x0001	/* root of its file system */
114 #define	VTEXT		0x0002	/* vnode is a pure text prototype */
115 #define	VSYSTEM		0x0004	/* vnode being used by kernel */
116 #define	VXLOCK		0x0100	/* vnode is locked to change underlying type */
117 #define	VXWANT		0x0200	/* process is waiting for vnode */
118 #define	VBWAIT		0x0400	/* waiting for output to complete */
119 #define	VALIASED	0x0800	/* vnode has an alias */
120 
121 /*
122  * Vnode attributes.  A field value of VNOVAL
123  * represents a field whose value is unavailable
124  * (getattr) or which is not to be changed (setattr).
125  */
126 struct vattr {
127 	enum vtype	va_type;	/* vnode type (for create) */
128 	u_short		va_mode;	/* files access mode and type */
129 	short		va_nlink;	/* number of references to file */
130 	uid_t		va_uid;		/* owner user id */
131 	gid_t		va_gid;		/* owner group id */
132 	long		va_fsid;	/* file system id (dev for now) */
133 	long		va_fileid;	/* file id */
134 	u_quad		va_qsize;	/* file size in bytes */
135 	long		va_blocksize;	/* blocksize preferred for i/o */
136 	struct timeval	va_atime;	/* time of last access */
137 	struct timeval	va_mtime;	/* time of last modification */
138 	struct timeval	va_ctime;	/* time file changed */
139 	u_long		va_gen;		/* generation number of file */
140 	u_long		va_flags;	/* flags defined for file */
141 	dev_t		va_rdev;	/* device the special file represents */
142 	u_quad		va_qbytes;	/* bytes of disk space held by file */
143 };
144 #if BYTE_ORDER == LITTLE_ENDIAN
145 #define	va_size		va_qsize.val[0]
146 #define	va_size_rsv	va_qsize.val[1]
147 #define	va_bytes	va_qbytes.val[0]
148 #define	va_bytes_rsv	va_qbytes.val[1]
149 #else
150 #define	va_size		va_qsize.val[1]
151 #define	va_size_rsv	va_qsize.val[0]
152 #define	va_bytes	va_qbytes.val[1]
153 #define	va_bytes_rsv	va_qbytes.val[0]
154 #endif
155 
156 /*
157  * Operations on vnodes.
158  */
159 #ifdef __STDC__
160 struct flock;
161 struct nameidata;
162 #endif
163 
164 struct vnodeops {
165 	int	(*vop_lookup)	__P((struct vnode *vp, struct nameidata *ndp,
166 				    struct proc *p));
167 	int	(*vop_create)	__P((struct nameidata *ndp, struct vattr *vap,
168 				    struct proc *p));
169 	int	(*vop_mknod)	__P((struct nameidata *ndp, struct vattr *vap,
170 				    struct ucred *cred, struct proc *p));
171 	int	(*vop_open)	__P((struct vnode *vp, int mode,
172 				    struct ucred *cred, struct proc *p));
173 	int	(*vop_close)	__P((struct vnode *vp, int fflag,
174 				    struct ucred *cred, struct proc *p));
175 	int	(*vop_access)	__P((struct vnode *vp, int mode,
176 				    struct ucred *cred, struct proc *p));
177 	int	(*vop_getattr)	__P((struct vnode *vp, struct vattr *vap,
178 				    struct ucred *cred, struct proc *p));
179 	int	(*vop_setattr)	__P((struct vnode *vp, struct vattr *vap,
180 				    struct ucred *cred, struct proc *p));
181 	int	(*vop_read)	__P((struct vnode *vp, struct uio *uio,
182 				    int ioflag, struct ucred *cred));
183 	int	(*vop_write)	__P((struct vnode *vp, struct uio *uio,
184 				    int ioflag, struct ucred *cred));
185 	int	(*vop_ioctl)	__P((struct vnode *vp, int command,
186 				    caddr_t data, int fflag,
187 				    struct ucred *cred, struct proc *p));
188 	int	(*vop_select)	__P((struct vnode *vp, int which, int fflags,
189 				    struct ucred *cred, struct proc *p));
190 	int	(*vop_mmap)	__P((struct vnode *vp, int fflags,
191 				    struct ucred *cred, struct proc *p));
192 	int	(*vop_fsync)	__P((struct vnode *vp, int fflags,
193 				    struct ucred *cred, int waitfor,
194 				    struct proc *p));
195 	int	(*vop_seek)	__P((struct vnode *vp, off_t oldoff,
196 				    off_t newoff, struct ucred *cred));
197 	int	(*vop_remove)	__P((struct nameidata *ndp, struct proc *p));
198 	int	(*vop_link)	__P((struct vnode *vp, struct nameidata *ndp,
199 				    struct proc *p));
200 	int	(*vop_rename)	__P((struct nameidata *fndp,
201 				    struct nameidata *tdnp, struct proc *p));
202 	int	(*vop_mkdir)	__P((struct nameidata *ndp, struct vattr *vap,
203 				    struct proc *p));
204 	int	(*vop_rmdir)	__P((struct nameidata *ndp, struct proc *p));
205 	int	(*vop_symlink)	__P((struct nameidata *ndp, struct vattr *vap,
206 				    char *target, struct proc *p));
207 	int	(*vop_readdir)	__P((struct vnode *vp, struct uio *uio,
208 				    struct ucred *cred, int *eofflagp));
209 	int	(*vop_readlink)	__P((struct vnode *vp, struct uio *uio,
210 				    struct ucred *cred));
211 	int	(*vop_abortop)	__P((struct nameidata *ndp));
212 	int	(*vop_inactive)	__P((struct vnode *vp, struct proc *p));
213 	int	(*vop_reclaim)	__P((struct vnode *vp));
214 	int	(*vop_lock)	__P((struct vnode *vp));
215 	int	(*vop_unlock)	__P((struct vnode *vp));
216 	int	(*vop_bmap)	__P((struct vnode *vp, daddr_t bn,
217 				    struct vnode **vpp, daddr_t *bnp));
218 	int	(*vop_strategy)	__P((struct buf *bp));
219 	int	(*vop_print)	__P((struct vnode *vp));
220 	int	(*vop_islocked)	__P((struct vnode *vp));
221 	int	(*vop_advlock)	__P((struct vnode *vp, caddr_t id, int op,
222 				    struct flock *fl, int flags));
223 };
224 
225 /* Macros to call the vnode ops */
226 #define	VOP_LOOKUP(v,n,p)	(*((v)->v_op->vop_lookup))(v,n,p)
227 #define	VOP_CREATE(n,a,p)	(*((n)->ni_dvp->v_op->vop_create))(n,a,p)
228 #define	VOP_MKNOD(n,a,c,p)	(*((n)->ni_dvp->v_op->vop_mknod))(n,a,c,p)
229 #define	VOP_OPEN(v,f,c,p)	(*((v)->v_op->vop_open))(v,f,c,p)
230 #define	VOP_CLOSE(v,f,c,p)	(*((v)->v_op->vop_close))(v,f,c,p)
231 #define	VOP_ACCESS(v,f,c,p)	(*((v)->v_op->vop_access))(v,f,c,p)
232 #define	VOP_GETATTR(v,a,c,p)	(*((v)->v_op->vop_getattr))(v,a,c,p)
233 #define	VOP_SETATTR(v,a,c,p)	(*((v)->v_op->vop_setattr))(v,a,c,p)
234 #define	VOP_READ(v,u,i,c)	(*((v)->v_op->vop_read))(v,u,i,c)
235 #define	VOP_WRITE(v,u,i,c)	(*((v)->v_op->vop_write))(v,u,i,c)
236 #define	VOP_IOCTL(v,o,d,f,c,p)	(*((v)->v_op->vop_ioctl))(v,o,d,f,c,p)
237 #define	VOP_SELECT(v,w,f,c,p)	(*((v)->v_op->vop_select))(v,w,f,c,p)
238 #define	VOP_MMAP(v,c,p)		(*((v)->v_op->vop_mmap))(v,c,p)
239 #define	VOP_FSYNC(v,f,c,w,p)	(*((v)->v_op->vop_fsync))(v,f,c,w,p)
240 #define	VOP_SEEK(v,p,o,w)	(*((v)->v_op->vop_seek))(v,p,o,w)
241 #define	VOP_REMOVE(n,p)		(*((n)->ni_dvp->v_op->vop_remove))(n,p)
242 #define	VOP_LINK(v,n,p)		(*((n)->ni_dvp->v_op->vop_link))(v,n,p)
243 #define	VOP_RENAME(s,t,p)	(*((s)->ni_dvp->v_op->vop_rename))(s,t,p)
244 #define	VOP_MKDIR(n,a,p)	(*((n)->ni_dvp->v_op->vop_mkdir))(n,a,p)
245 #define	VOP_RMDIR(n,p)		(*((n)->ni_dvp->v_op->vop_rmdir))(n,p)
246 #define	VOP_SYMLINK(n,a,m,p)	(*((n)->ni_dvp->v_op->vop_symlink))(n,a,m,p)
247 #define	VOP_READDIR(v,u,c,e)	(*((v)->v_op->vop_readdir))(v,u,c,e)
248 #define	VOP_READLINK(v,u,c)	(*((v)->v_op->vop_readlink))(v,u,c)
249 #define	VOP_ABORTOP(n)		(*((n)->ni_dvp->v_op->vop_abortop))(n)
250 #define	VOP_INACTIVE(v,p)	(*((v)->v_op->vop_inactive))(v,p)
251 #define	VOP_RECLAIM(v)		(*((v)->v_op->vop_reclaim))(v)
252 #define	VOP_LOCK(v)		(*((v)->v_op->vop_lock))(v)
253 #define	VOP_UNLOCK(v)		(*((v)->v_op->vop_unlock))(v)
254 #define	VOP_BMAP(v,s,p,n)	(*((v)->v_op->vop_bmap))(v,s,p,n)
255 #define	VOP_STRATEGY(b)		(*((b)->b_vp->v_op->vop_strategy))(b)
256 #define	VOP_PRINT(v)		(*((v)->v_op->vop_print))(v)
257 #define	VOP_ISLOCKED(v)		(((v)->v_flag & VXLOCK) || \
258 				(*((v)->v_op->vop_islocked))(v))
259 #define	VOP_ADVLOCK(v,p,o,l,f)	(*((v)->v_op->vop_advlock))(v,p,o,l,f)
260 
261 /*
262  * flags for ioflag
263  */
264 #define	IO_UNIT		0x01		/* do I/O as atomic unit */
265 #define	IO_APPEND	0x02		/* append write to end */
266 #define	IO_SYNC		0x04		/* do I/O synchronously */
267 #define	IO_NODELOCKED	0x08		/* underlying node already locked */
268 #define	IO_NDELAY	0x10		/* FNDELAY flag set in file table */
269 
270 /*
271  *  Modes. Some values same as Ixxx entries from inode.h for now
272  */
273 #define	VSUID	04000		/* set user id on execution */
274 #define	VSGID	02000		/* set group id on execution */
275 #define	VSVTX	01000		/* save swapped text even after use */
276 #define	VREAD	0400		/* read, write, execute permissions */
277 #define	VWRITE	0200
278 #define	VEXEC	0100
279 
280 /* XXX temporary mode mask to match any executable bit */
281 #define	VANYEXECMASK	(VEXEC | (VEXEC>>4) | (VEXEC>>8))
282 
283 /*
284  * Token indicating no attribute value yet assigned
285  */
286 #define	VNOVAL	((unsigned)0xffffffff)
287 
288 #ifdef KERNEL
289 /*
290  * public vnode manipulation functions
291  */
292 int 	vn_open __P((struct nameidata *ndp, struct proc *p, int fmode,
293 	    int cmode));
294 int 	vn_close __P((struct vnode *vp, int flags, struct ucred *cred,
295 	    struct proc *p));
296 int 	vn_rdwr __P((enum uio_rw rw, struct vnode *vp, caddr_t base,
297 	    int len, off_t offset, enum uio_seg segflg, int ioflg,
298 	    struct ucred *cred, int *aresid, struct proc *p));
299 int	vn_read __P((struct file *fp, struct uio *uio, struct ucred *cred));
300 int	vn_write __P((struct file *fp, struct uio *uio, struct ucred *cred));
301 int	vn_ioctl __P((struct file *fp, int com, caddr_t data, struct proc *p));
302 int	vn_select __P((struct file *fp, int which, struct proc *p));
303 int 	vn_closefile __P((struct file *fp, struct proc *p));
304 int 	bdevvp __P((dev_t dev, struct vnode **vpp));
305 void 	vattr_null __P((struct vattr *vap));
306 int 	vcount __P((struct vnode *vp));	/* total references to a device */
307 int 	vget __P((struct vnode *vp));	/* get first reference to a vnode */
308 void 	vref __P((struct vnode *vp));	/* increase reference to a vnode */
309 void 	vput __P((struct vnode *vp));	/* unlock and release vnode */
310 void 	vrele __P((struct vnode *vp));	/* release vnode */
311 void 	vgone __P((struct vnode *vp));	/* completely recycle vnode */
312 void 	vgoneall __P((struct vnode *vp));/* recycle vnode and all its aliases */
313 void vfsinit(void);
314 void vflushbuf(struct vnode *vp, int flags, struct buf *bp);
315 void vwakeup(struct buf *bp);
316 int vinvalbuf(struct vnode *vp, int save);
317 void bgetvp(struct vnode *vp, struct buf *bp);
318 void brelvp(struct buf *bp);
319 void reassignbuf(struct buf *bp, struct vnode *newvp);
320 void vhold(struct vnode *vp);
321 void holdrele(struct vnode *vp);
322 int vfinddev(dev_t dev, enum vtype type, struct vnode **vpp);
323 void vclean(struct vnode *vp, int flags);
324 	/* check for special device aliases */
325 struct 	vnode *checkalias __P((struct vnode *vp, dev_t nvp_rdev,
326 	    struct mount *mp));
327 int 	getnewvnode __P((enum vtagtype tag, struct mount *mp,
328 	    struct vnodeops *vops, struct vnode **vpp));
329 
330 /* XXX temp vm interface */
331 int vnode_pager_uncache(struct vnode *vp);
332 void vnode_pager_setsize(struct vnode *vp, u_long nsize);
333 
334 /*
335  * Flags to various vnode functions.
336  */
337 #define	SKIPSYSTEM	0x0001		/* vflush: skip vnodes marked VSYSTEM */
338 #define	FORCECLOSE	0x0002		/* vflush: force file closeure */
339 #define	DOCLOSE		0x0004		/* vclean: close active files */
340 
341 #ifndef DIAGNOSTIC
342 #define	VREF(vp)	(vp)->v_usecount++	/* increase reference */
343 #define	VHOLD(vp)	(vp)->v_holdcnt++	/* increase buf or page ref */
344 #define	HOLDRELE(vp)	(vp)->v_holdcnt--	/* decrease buf or page ref */
345 #define	VATTR_NULL(vap)	(*(vap) = va_null)	/* initialize a vattr */
346 #else /* DIAGNOSTIC */
347 #define	VREF(vp)	vref(vp)
348 #define	VHOLD(vp)	vhold(vp)
349 #define	HOLDRELE(vp)	holdrele(vp)
350 #define	VATTR_NULL(vap)	vattr_null(vap)
351 #endif
352 
353 #define	NULLVP	((struct vnode *)NULL)
354 
355 /*
356  * Global vnode data.
357  */
358 extern	struct vnode *rootdir;		/* root (i.e. "/") vnode */
359 extern	long desiredvnodes;		/* number of vnodes desired */
360 extern	struct vattr va_null;		/* predefined null vattr structure */
361 #endif
362