vnode.h revision 6946
1251883Speter/*
2251883Speter * Copyright (c) 1989, 1993
3251883Speter *	The Regents of the University of California.  All rights reserved.
4251883Speter *
5251883Speter * Redistribution and use in source and binary forms, with or without
6251883Speter * modification, are permitted provided that the following conditions
7251883Speter * are met:
8251883Speter * 1. Redistributions of source code must retain the above copyright
9251883Speter *    notice, this list of conditions and the following disclaimer.
10251883Speter * 2. Redistributions in binary form must reproduce the above copyright
11251883Speter *    notice, this list of conditions and the following disclaimer in the
12251883Speter *    documentation and/or other materials provided with the distribution.
13251883Speter * 3. All advertising materials mentioning features or use of this software
14251883Speter *    must display the following acknowledgement:
15251883Speter *	This product includes software developed by the University of
16251883Speter *	California, Berkeley and its contributors.
17251883Speter * 4. Neither the name of the University nor the names of its contributors
18251883Speter *    may be used to endorse or promote products derived from this software
19251883Speter *    without specific prior written permission.
20251883Speter *
21251883Speter * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22251883Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23251883Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24251883Speter * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25251883Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26251883Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27251883Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28251883Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29251883Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30251883Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31251883Speter * SUCH DAMAGE.
32251883Speter *
33251883Speter *	@(#)vnode.h	8.7 (Berkeley) 2/4/94
34251883Speter * $Id: vnode.h,v 1.15 1995/01/05 16:22:17 gibbs Exp $
35251883Speter */
36251883Speter
37251883Speter#ifndef _SYS_VNODE_H_
38251883Speter#define	_SYS_VNODE_H_
39251883Speter
40251883Speter#include <sys/queue.h>
41251883Speter
42251883Speter/*
43251883Speter * The vnode is the focus of all file activity in UNIX.  There is a
44251883Speter * unique vnode allocated for each active file, each current directory,
45251883Speter * each mounted-on file, text file, and the root.
46251883Speter */
47251883Speter
48251883Speter/*
49251883Speter * Vnode types.  VNON means no type.
50251883Speter */
51251883Speterenum vtype	{ VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD };
52251883Speter
53251883Speter/*
54251883Speter * Vnode tag types.
55251883Speter * These are for the benefit of external programs only (e.g., pstat)
56251883Speter * and should NEVER be inspected by the kernel.
57251883Speter */
58251883Speterenum vtagtype	{
59251883Speter	VT_NON, VT_UFS, VT_NFS, VT_MFS, VT_PC, VT_LFS, VT_LOFS, VT_FDESC,
60251883Speter	VT_PORTAL, VT_NULL, VT_UMAP, VT_KERNFS, VT_PROCFS, VT_AFS, VT_ISOFS,
61251883Speter	VT_UNION, VT_MSDOSFS
62251883Speter};
63251883Speter
64251883Speter/*
65251883Speter * Each underlying filesystem allocates its own private area and hangs
66251883Speter * it from v_data.  If non-null, this area is freed in getnewvnode().
67251883Speter */
68251883SpeterLIST_HEAD(buflists, buf);
69251883Speter
70251883Speterstruct vnode {
71251883Speter	u_long	v_flag;				/* vnode flags (see below) */
72251883Speter	short	v_usecount;			/* reference count of users */
73251883Speter	short	v_writecount;			/* reference count of writers */
74251883Speter	long	v_holdcnt;			/* page & buffer references */
75251883Speter	daddr_t	v_lastr;			/* last read (read-ahead) */
76251883Speter	u_long	v_id;				/* capability identifier */
77251883Speter	struct	mount *v_mount;			/* ptr to vfs we are in */
78251883Speter	int 	(**v_op)();			/* vnode operations vector */
79251883Speter	TAILQ_ENTRY(vnode) v_freelist;		/* vnode freelist */
80251883Speter	LIST_ENTRY(vnode) v_mntvnodes;		/* vnodes for mount point */
81251883Speter	struct	buflists v_cleanblkhd;		/* clean blocklist head */
82251883Speter	struct	buflists v_dirtyblkhd;		/* dirty blocklist head */
83251883Speter	long	v_numoutput;			/* num of writes in progress */
84251883Speter	enum	vtype v_type;			/* vnode type */
85251883Speter	union {
86251883Speter		struct mount	*vu_mountedhere;/* ptr to mounted vfs (VDIR) */
87251883Speter		struct socket	*vu_socket;	/* unix ipc (VSOCK) */
88251883Speter		struct specinfo	*vu_specinfo;	/* device (VCHR, VBLK) */
89251883Speter		struct fifoinfo	*vu_fifoinfo;	/* fifo (VFIFO) */
90251883Speter	} v_un;
91251883Speter	struct	nqlease *v_lease;		/* Soft reference to lease */
92251883Speter	daddr_t	v_lastw;			/* last write (write cluster) */
93251883Speter	daddr_t	v_cstart;			/* start block of cluster */
94251883Speter	daddr_t	v_lasta;			/* last allocation */
95251883Speter	int	v_clen;				/* length of current cluster */
96251883Speter	int	v_ralen;			/* Read-ahead length */
97251883Speter	daddr_t	v_maxra;			/* last readahead block */
98251883Speter	caddr_t	v_vmdata;			/* Place to store VM pager */
99251883Speter	enum	vtagtype v_tag;			/* type of underlying data */
100251883Speter	void 	*v_data;			/* private data for fs */
101251883Speter};
102251883Speter#define	v_mountedhere	v_un.vu_mountedhere
103251883Speter#define	v_socket	v_un.vu_socket
104251883Speter#define	v_specinfo	v_un.vu_specinfo
105251883Speter#define	v_fifoinfo	v_un.vu_fifoinfo
106251883Speter
107251883Speter/*
108251883Speter * Vnode flags.
109251883Speter */
110251883Speter#define	VROOT		0x0001	/* root of its file system */
111251883Speter#define	VTEXT		0x0002	/* vnode is a pure text prototype */
112251883Speter#define	VSYSTEM		0x0004	/* vnode being used by kernel */
113251883Speter#define	VXLOCK		0x0100	/* vnode is locked to change underlying type */
114251883Speter#define	VXWANT		0x0200	/* process is waiting for vnode */
115251883Speter#define	VBWAIT		0x0400	/* waiting for output to complete */
116251883Speter#define	VALIASED	0x0800	/* vnode has an alias */
117251883Speter#define	VDIROP		0x1000	/* LFS: vnode is involved in a directory op */
118251883Speter#define VVMIO		0x2000	/* VMIO flag */
119251883Speter#define VNINACT		0x4000  /* LFS: skip ufs_inactive() in lfs_vunref */
120251883Speter#define VAGE		0x8000	/* Insert vnode at head of free list */
121251883Speter
122251883Speter/*
123251883Speter * Vnode attributes.  A field value of VNOVAL represents a field whose value
124251883Speter * is unavailable (getattr) or which is not to be changed (setattr).
125251883Speter */
126251883Speterstruct vattr {
127251883Speter	enum vtype	va_type;	/* vnode type (for create) */
128251883Speter	u_short		va_mode;	/* files access mode and type */
129251883Speter	short		va_nlink;	/* number of references to file */
130251883Speter	uid_t		va_uid;		/* owner user id */
131251883Speter	gid_t		va_gid;		/* owner group id */
132251883Speter	long		va_fsid;	/* file system id (dev for now) */
133251883Speter	long		va_fileid;	/* file id */
134251883Speter	u_quad_t	va_size;	/* file size in bytes */
135251883Speter	long		va_blocksize;	/* blocksize preferred for i/o */
136251883Speter	struct timespec	va_atime;	/* time of last access */
137251883Speter	struct timespec	va_mtime;	/* time of last modification */
138251883Speter	struct timespec	va_ctime;	/* time file changed */
139251883Speter	u_long		va_gen;		/* generation number of file */
140251883Speter	u_long		va_flags;	/* flags defined for file */
141251883Speter	dev_t		va_rdev;	/* device the special file represents */
142251883Speter	u_quad_t	va_bytes;	/* bytes of disk space held by file */
143251883Speter	u_quad_t	va_filerev;	/* file modification number */
144251883Speter	u_int		va_vaflags;	/* operations flags, see below */
145251883Speter	long		va_spare;	/* remain quad aligned */
146251883Speter};
147251883Speter
148251883Speter/*
149251883Speter * Flags for va_cflags.
150251883Speter */
151251883Speter#define	VA_UTIMES_NULL	0x01		/* utimes argument was NULL */
152251883Speter
153251883Speter/*
154251883Speter * Flags for ioflag.
155251883Speter */
156251883Speter#define	IO_UNIT		0x01		/* do I/O as atomic unit */
157251883Speter#define	IO_APPEND	0x02		/* append write to end */
158251883Speter#define	IO_SYNC		0x04		/* do I/O synchronously */
159251883Speter#define	IO_NODELOCKED	0x08		/* underlying node already locked */
160251883Speter#define	IO_NDELAY	0x10		/* FNDELAY flag set in file table */
161251883Speter
162251883Speter/*
163251883Speter *  Modes.  Some values same as Ixxx entries from inode.h for now.
164251883Speter */
165251883Speter#define	VSUID	04000		/* set user id on execution */
166251883Speter#define	VSGID	02000		/* set group id on execution */
167251883Speter#define	VSVTX	01000		/* save swapped text even after use */
168251883Speter#define	VREAD	00400		/* read, write, execute permissions */
169251883Speter#define	VWRITE	00200
170251883Speter#define	VEXEC	00100
171251883Speter
172251883Speter/*
173251883Speter * Token indicating no attribute value yet assigned.
174251883Speter */
175251883Speter#define	VNOVAL	(-1)
176251883Speter
177251883Speter#ifdef KERNEL
178251883Speter/*
179251883Speter * Convert between vnode types and inode formats (since POSIX.1
180251883Speter * defines mode word of stat structure in terms of inode formats).
181251883Speter */
182251883Speterextern enum vtype	iftovt_tab[];
183251883Speterextern int		vttoif_tab[];
184251883Speter#define IFTOVT(mode)	(iftovt_tab[((mode) & S_IFMT) >> 12])
185251883Speter#define VTTOIF(indx)	(vttoif_tab[(int)(indx)])
186251883Speter#define MAKEIMODE(indx, mode)	(int)(VTTOIF(indx) | (mode))
187251883Speter
188251883Speter/*
189251883Speter * Flags to various vnode functions.
190251883Speter */
191251883Speter#define	SKIPSYSTEM	0x0001		/* vflush: skip vnodes marked VSYSTEM */
192251883Speter#define	FORCECLOSE	0x0002		/* vflush: force file closeure */
193251883Speter#define	WRITECLOSE	0x0004		/* vflush: only close writeable files */
194251883Speter#define	DOCLOSE		0x0008		/* vclean: close active files */
195251883Speter#define	V_SAVE		0x0001		/* vinvalbuf: sync file first */
196251883Speter#define	V_SAVEMETA	0x0002		/* vinvalbuf: leave indirect blocks */
197251883Speter
198251883Speter#ifdef DIAGNOSTIC
199251883Speter#define	HOLDRELE(vp)	holdrele(vp)
200251883Speter#define	VATTR_NULL(vap)	vattr_null(vap)
201251883Speter#define	VHOLD(vp)	vhold(vp)
202251883Speter#define	VREF(vp)	vref(vp)
203251883Speter
204251883Spetervoid	holdrele __P((struct vnode *));
205251883Spetervoid	vhold __P((struct vnode *));
206251883Speter#else
207251883Speter#define	HOLDRELE(vp)	(vp)->v_holdcnt--	/* decrease buf or page ref */
208251883Speter#define	VATTR_NULL(vap)	(*(vap) = va_null)	/* initialize a vattr */
209251883Speter#define	VHOLD(vp)	(vp)->v_holdcnt++	/* increase buf or page ref */
210251883Speter#define	VREF(vp)	(vp)->v_usecount++	/* increase reference */
211251883Speter#endif
212251883Speter
213251883Speter#define	NULLVP	((struct vnode *)NULL)
214251883Speter
215251883Speter#ifdef VFS_LKM
216251883Speter#define VNODEOP_SET(f) DATA_SET(MODVNOPS,f)
217251883Speter#else
218251883Speter#define VNODEOP_SET(f) DATA_SET(vfs_opv_descs_,f)
219251883Speter#endif
220251883Speter
221251883Speter/*
222251883Speter * Global vnode data.
223251883Speter */
224251883Speterextern	struct vnode *rootvnode;	/* root (i.e. "/") vnode */
225251883Speterextern	int desiredvnodes;		/* number of vnodes desired */
226251883Speterextern	struct vattr va_null;		/* predefined null vattr structure */
227251883Speter
228251883Speter/*
229251883Speter * Macro/function to check for client cache inconsistency w.r.t. leasing.
230251883Speter */
231251883Speter#define	LEASE_READ	0x1		/* Check lease for readers */
232251883Speter#define	LEASE_WRITE	0x2		/* Check lease for modifiers */
233251883Speter
234251883Speterextern void	(*lease_check) __P((struct vnode *vp, struct proc *p,
235251883Speter				    struct ucred *ucred, int flag));
236251883Speterextern void	(*lease_updatetime) __P((int deltat));
237251883Speter
238251883Speter#ifdef NFS
239251883Speter#define	LEASE_CHECK(vp, p, cred, flag)	lease_check((vp), (p), (cred), (flag))
240251883Speter#define	LEASE_UPDATETIME(dt)		lease_updatetime(dt)
241251883Speter#else
242251883Speter#define LEASE_CHECK(vp, p, cred, flag) \
243251883Speter	do { if(lease_check) lease_check((vp), (p), (cred), (flag)); } while(0)
244251883Speter#define LEASE_UPDATETIME(dt) \
245251883Speter	do { if(lease_updatetime) lease_updatetime(dt); } while(0)
246251883Speter#endif /* NFS */
247251883Speter#endif /* KERNEL */
248251883Speter
249251883Speter
250251883Speter/*
251251883Speter * Mods for exensibility.
252251883Speter */
253251883Speter
254251883Speter/*
255251883Speter * Flags for vdesc_flags:
256251883Speter */
257251883Speter#define VDESC_MAX_VPS		16
258251883Speter/* Low order 16 flag bits are reserved for willrele flags for vp arguments. */
259251883Speter#define VDESC_VP0_WILLRELE	0x0001
260251883Speter#define VDESC_VP1_WILLRELE	0x0002
261251883Speter#define VDESC_VP2_WILLRELE	0x0004
262251883Speter#define VDESC_VP3_WILLRELE	0x0008
263251883Speter#define VDESC_NOMAP_VPP		0x0100
264251883Speter#define VDESC_VPP_WILLRELE	0x0200
265251883Speter
266251883Speter/*
267251883Speter * VDESC_NO_OFFSET is used to identify the end of the offset list
268251883Speter * and in places where no such field exists.
269251883Speter */
270251883Speter#define VDESC_NO_OFFSET -1
271251883Speter
272251883Speter/*
273251883Speter * This structure describes the vnode operation taking place.
274251883Speter */
275251883Speterstruct vnodeop_desc {
276251883Speter	int	vdesc_offset;		/* offset in vector--first for speed */
277251883Speter	char    *vdesc_name;		/* a readable name for debugging */
278251883Speter	int	vdesc_flags;		/* VDESC_* flags */
279251883Speter
280251883Speter	/*
281251883Speter	 * These ops are used by bypass routines to map and locate arguments.
282251883Speter	 * Creds and procs are not needed in bypass routines, but sometimes
283251883Speter	 * they are useful to (for example) transport layers.
284251883Speter	 * Nameidata is useful because it has a cred in it.
285251883Speter	 */
286251883Speter	int	*vdesc_vp_offsets;	/* list ended by VDESC_NO_OFFSET */
287251883Speter	int	vdesc_vpp_offset;	/* return vpp location */
288251883Speter	int	vdesc_cred_offset;	/* cred location, if any */
289251883Speter	int	vdesc_proc_offset;	/* proc location, if any */
290251883Speter	int	vdesc_componentname_offset; /* if any */
291251883Speter	/*
292251883Speter	 * Finally, we've got a list of private data (about each operation)
293251883Speter	 * for each transport layer.  (Support to manage this list is not
294251883Speter	 * yet part of BSD.)
295251883Speter	 */
296251883Speter	caddr_t	*vdesc_transports;
297251883Speter};
298251883Speter
299251883Speter#ifdef KERNEL
300251883Speter/*
301251883Speter * A list of all the operation descs.
302251883Speter */
303251883Speterextern struct vnodeop_desc *vnodeop_descs[];
304251883Speter
305251883Speter
306251883Speter/*
307251883Speter * This macro is very helpful in defining those offsets in the vdesc struct.
308251883Speter *
309251883Speter * This is stolen from X11R4.  I ingored all the fancy stuff for
310251883Speter * Crays, so if you decide to port this to such a serious machine,
311251883Speter * you might want to consult Intrisics.h's XtOffset{,Of,To}.
312251883Speter */
313251883Speter#define VOPARG_OFFSET(p_type,field) \
314251883Speter        ((int) (((char *) (&(((p_type)NULL)->field))) - ((char *) NULL)))
315251883Speter#define VOPARG_OFFSETOF(s_type,field) \
316251883Speter	VOPARG_OFFSET(s_type*,field)
317251883Speter#define VOPARG_OFFSETTO(S_TYPE,S_OFFSET,STRUCT_P) \
318251883Speter	((S_TYPE)(((char*)(STRUCT_P))+(S_OFFSET)))
319251883Speter
320251883Speter
321251883Speter/*
322251883Speter * This structure is used to configure the new vnodeops vector.
323251883Speter */
324251883Speterstruct vnodeopv_entry_desc {
325251883Speter	struct vnodeop_desc *opve_op;   /* which operation this is */
326251883Speter	int (*opve_impl)();		/* code implementing this operation */
327251883Speter};
328251883Speterstruct vnodeopv_desc {
329251883Speter			/* ptr to the ptr to the vector where op should go */
330251883Speter	int (***opv_desc_vector_p)();
331251883Speter	struct vnodeopv_entry_desc *opv_desc_ops;   /* null terminated list */
332251883Speter};
333251883Speter
334251883Speter/*
335251883Speter * A default routine which just returns an error.
336251883Speter */
337251883Speterint vn_default_error __P((void));
338251883Speter
339251883Speter/*
340251883Speter * A generic structure.
341251883Speter * This can be used by bypass routines to identify generic arguments.
342251883Speter */
343251883Speterstruct vop_generic_args {
344251883Speter	struct vnodeop_desc *a_desc;
345251883Speter	/* other random data follows, presumably */
346251883Speter};
347251883Speter
348251883Speter/*
349251883Speter * VOCALL calls an op given an ops vector.  We break it out because BSD's
350251883Speter * vclean changes the ops vector and then wants to call ops with the old
351251883Speter * vector.
352251883Speter */
353251883Speter#define VOCALL(OPSV,OFF,AP) (( *((OPSV)[(OFF)])) (AP))
354251883Speter
355251883Speter/*
356251883Speter * This call works for vnodes in the kernel.
357251883Speter */
358251883Speter#define VCALL(VP,OFF,AP) VOCALL((VP)->v_op,(OFF),(AP))
359251883Speter#define VDESC(OP) (& __CONCAT(OP,_desc))
360251883Speter#define VOFFSET(OP) (VDESC(OP)->vdesc_offset)
361251883Speter
362251883Speter/*
363251883Speter * Finally, include the default set of vnode operations.
364251883Speter */
365251883Speter#include <vnode_if.h>
366251883Speter
367251883Speter/*
368251883Speter * Public vnode manipulation functions.
369251883Speter */
370251883Speterstruct componentname;
371251883Speterstruct file;
372251883Speterstruct mount;
373251883Speterstruct nameidata;
374251883Speterstruct proc;
375251883Speterstruct stat;
376251883Speterstruct ucred;
377251883Speterstruct uio;
378251883Speterstruct vattr;
379251883Speterstruct vnode;
380251883Speterstruct vop_bwrite_args;
381251883Speter
382251883Speterint 	bdevvp __P((dev_t dev, struct vnode **vpp));
383251883Speter/* cache_* may belong in namei.h. */
384251883Spetervoid	cache_enter __P((struct vnode *dvp, struct vnode *vp,
385251883Speter	    struct componentname *cnp));
386251883Speterint	cache_lookup __P((struct vnode *dvp, struct vnode **vpp,
387251883Speter	    struct componentname *cnp));
388251883Spetervoid	cache_purge __P((struct vnode *vp));
389251883Spetervoid	cache_purgevfs __P((struct mount *mp));
390251883Speterint 	getnewvnode __P((enum vtagtype tag,
391251883Speter	    struct mount *mp, int (**vops)(), struct vnode **vpp));
392251883Speterint	vinvalbuf __P((struct vnode *vp, int save, struct ucred *cred,
393251883Speter	    struct proc *p, int slpflag, int slptimeo));
394251883Spetervoid 	vattr_null __P((struct vattr *vap));
395251883Speterint 	vcount __P((struct vnode *vp));
396251883Speterint	vfinddev __P((dev_t dev, enum vtype type, struct vnode **vpp));
397251883Speterint 	vget __P((struct vnode *vp, int lockflag));
398251883Spetervoid 	vgone __P((struct vnode *vp));
399251883Spetervoid 	vgoneall __P((struct vnode *vp));
400251883Speterint	vn_bwrite __P((struct vop_bwrite_args *ap));
401251883Speterint 	vn_close __P((struct vnode *vp,
402251883Speter	    int flags, struct ucred *cred, struct proc *p));
403251883Speterint 	vn_closefile __P((struct file *fp, struct proc *p));
404251883Speterint	vn_ioctl __P((struct file *fp, int com, caddr_t data, struct proc *p));
405251883Speterint 	vn_open __P((struct nameidata *ndp, int fmode, int cmode));
406251883Speterint 	vn_rdwr __P((enum uio_rw rw, struct vnode *vp, caddr_t base,
407251883Speter	    int len, off_t offset, enum uio_seg segflg, int ioflg,
408251883Speter	    struct ucred *cred, int *aresid, struct proc *p));
409251883Speterint	vn_read __P((struct file *fp, struct uio *uio, struct ucred *cred));
410251883Speterint	vn_select __P((struct file *fp, int which, struct proc *p));
411251883Speterint	vn_stat __P((struct vnode *vp, struct stat *sb, struct proc *p));
412251883Speterint	vn_write __P((struct file *fp, struct uio *uio, struct ucred *cred));
413251883Speterstruct vnode *
414251883Speter	checkalias __P((struct vnode *vp, dev_t nvp_rdev, struct mount *mp));
415251883Spetervoid	vprint __P((char *, struct vnode *));
416251883Spetervoid 	vput __P((struct vnode *vp));
417251883Spetervoid 	vref __P((struct vnode *vp));
418251883Spetervoid 	vrele __P((struct vnode *vp));
419251883Speterint 	vn_writechk __P((struct vnode *vp));
420251883Speter
421251883Spetervoid	vfs_opv_init __P((struct vnodeopv_desc **));
422251883Speter#endif /* KERNEL */
423251883Speter
424251883Speter#endif /* !_SYS_VNODE_H_ */
425251883Speter