xref: /386bsd/usr/src/kernel/include/fs/specdev.h (revision dc8b130e)
1 /*
2  * Copyright (c) 1990 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  *	@(#)specdev.h	7.4 (Berkeley) 4/19/91
34  */
35 
36 /*
37  * This structure defines the information maintained about
38  * special devices. It is allocated in checkalias and freed
39  * in vgone.
40  */
41 struct specinfo {
42 	struct	vnode **si_hashchain;
43 	struct	vnode *si_specnext;
44 	long	si_flags;
45 	dev_t	si_rdev;
46 };
47 /*
48  * Exported shorthand
49  */
50 #define v_rdev v_specinfo->si_rdev
51 #define v_hashchain v_specinfo->si_hashchain
52 #define v_specnext v_specinfo->si_specnext
53 #define v_specflags v_specinfo->si_flags
54 
55 /*
56  * Flags for specinfo
57  */
58 #define	SI_MOUNTEDON	0x0001	/* block special device is mounted on */
59 
60 /*
61  * Special device management
62  */
63 #define	SPECHSZ	64
64 #if	((SPECHSZ&(SPECHSZ-1)) == 0)
65 #define	SPECHASH(rdev)	(((rdev>>5)+(rdev))&(SPECHSZ-1))
66 #else
67 #define	SPECHASH(rdev)	(((unsigned)((rdev>>5)+(rdev)))%SPECHSZ)
68 #endif
69 
70 extern struct vnode *speclisth[];
71 
72 /*
73  * Prototypes for special file operations on vnodes.
74  */
75 /*struct	nameidata;
76 struct	ucred;
77 struct	flock;
78 struct	buf;
79 struct	uio; */
80 
81 int	spec_badop(),
82 	spec_ebadf();
83 
84 int	spec_lookup __P((
85 		struct vnode *vp,
86 		struct nameidata *ndp,
87 		struct proc *p));
88 #define spec_create ((int (*) __P(( \
89 		struct nameidata *ndp, \
90 		struct vattr *vap, \
91 		struct proc *p))) spec_badop)
92 #define spec_mknod ((int (*) __P(( \
93 		struct nameidata *ndp, \
94 		struct vattr *vap, \
95 		struct ucred *cred, \
96 		struct proc *p))) spec_badop)
97 int	spec_open __P((
98 		struct vnode *vp,
99 		int mode,
100 		struct ucred *cred,
101 		struct proc *p));
102 int	spec_close __P((
103 		struct vnode *vp,
104 		int fflag,
105 		struct ucred *cred,
106 		struct proc *p));
107 #define spec_access ((int (*) __P(( \
108 		struct vnode *vp, \
109 		int mode, \
110 		struct ucred *cred, \
111 		struct proc *p))) spec_ebadf)
112 #define spec_getattr ((int (*) __P(( \
113 		struct vnode *vp, \
114 		struct vattr *vap, \
115 		struct ucred *cred, \
116 		struct proc *p))) spec_ebadf)
117 #define spec_setattr ((int (*) __P(( \
118 		struct vnode *vp, \
119 		struct vattr *vap, \
120 		struct ucred *cred, \
121 		struct proc *p))) spec_ebadf)
122 int	spec_read __P((
123 		struct vnode *vp,
124 		struct uio *uio,
125 		int ioflag,
126 		struct ucred *cred));
127 int	spec_write __P((
128 		struct vnode *vp,
129 		struct uio *uio,
130 		int ioflag,
131 		struct ucred *cred));
132 int	spec_ioctl __P((
133 		struct vnode *vp,
134 		int command,
135 		caddr_t data,
136 		int fflag,
137 		struct ucred *cred,
138 		struct proc *p));
139 int	spec_select __P((
140 		struct vnode *vp,
141 		int which,
142 		int fflags,
143 		struct ucred *cred,
144 		struct proc *p));
145 #define spec_mmap ((int (*) __P(( \
146 		struct vnode *vp, \
147 		int fflags, \
148 		struct ucred *cred, \
149 		struct proc *p))) spec_badop)
150 #define spec_fsync ((int (*) __P(( \
151 		struct vnode *vp, \
152 		int fflags, \
153 		struct ucred *cred, \
154 		int waitfor, \
155 		struct proc *p))) nullop)
156 #define spec_seek ((int (*) __P(( \
157 		struct vnode *vp, \
158 		off_t oldoff, \
159 		off_t newoff, \
160 		struct ucred *cred))) spec_badop)
161 #define spec_remove ((int (*) __P(( \
162 		struct nameidata *ndp, \
163 		struct proc *p))) spec_badop)
164 #define spec_link ((int (*) __P(( \
165 		struct vnode *vp, \
166 		struct nameidata *ndp, \
167 		struct proc *p))) spec_badop)
168 #define spec_rename ((int (*) __P(( \
169 		struct nameidata *fndp, \
170 		struct nameidata *tdnp, \
171 		struct proc *p))) spec_badop)
172 #define spec_mkdir ((int (*) __P(( \
173 		struct nameidata *ndp, \
174 		struct vattr *vap, \
175 		struct proc *p))) spec_badop)
176 #define spec_rmdir ((int (*) __P(( \
177 		struct nameidata *ndp, \
178 		struct proc *p))) spec_badop)
179 #define spec_symlink ((int (*) __P(( \
180 		struct nameidata *ndp, \
181 		struct vattr *vap, \
182 		char *target, \
183 		struct proc *p))) spec_badop)
184 #define spec_readdir ((int (*) __P(( \
185 		struct vnode *vp, \
186 		struct uio *uio, \
187 		struct ucred *cred, \
188 		int *eofflagp))) spec_badop)
189 #define spec_readlink ((int (*) __P(( \
190 		struct vnode *vp, \
191 		struct uio *uio, \
192 		struct ucred *cred))) spec_badop)
193 #define spec_abortop ((int (*) __P(( \
194 		struct nameidata *ndp))) spec_badop)
195 #define spec_inactive ((int (*) __P(( \
196 		struct vnode *vp, \
197 		struct proc *p))) nullop)
198 #define spec_reclaim ((int (*) __P(( \
199 		struct vnode *vp))) nullop)
200 int	spec_lock __P((
201 		struct vnode *vp));
202 int	spec_unlock __P((
203 		struct vnode *vp));
204 int	spec_bmap __P((
205 		struct vnode *vp,
206 		daddr_t bn,
207 		struct vnode **vpp,
208 		daddr_t *bnp));
209 int	spec_strategy __P((
210 		struct buf *bp));
211 int	spec_print __P((
212 		struct vnode *vp));
213 #define spec_islocked ((int (*) __P(( \
214 		struct vnode *vp))) nullop)
215 int	spec_advlock __P((
216 		struct vnode *vp,
217 		caddr_t id,
218 		int op,
219 		struct flock *fl,
220 		int flags));
221