xref: /original-bsd/sys/miscfs/deadfs/dead_vnops.c (revision 753853ba)
1 /*
2  * Copyright (c) 1989 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  *
7  *	@(#)dead_vnops.c	7.15 (Berkeley) 02/03/92
8  */
9 
10 #include "param.h"
11 #include "systm.h"
12 #include "time.h"
13 #include "vnode.h"
14 #include "errno.h"
15 #include "namei.h"
16 #include "buf.h"
17 
18 /*
19  * Prototypes for dead operations on vnodes.
20  */
21 int	dead_badop(),
22 	dead_ebadf();
23 int	dead_lookup __P((
24 		struct vnode *dvp,
25 		struct vnode **vpp,
26 		struct componentname *cnp));
27 #define dead_create ((int (*) __P(( \
28 		struct vnode *dvp, \
29  		struct vnode **vpp, \
30 		struct componentname *cnp, \
31 		struct vattr *vap))) dead_badop)
32 #define dead_mknod ((int (*) __P(( \
33 		struct vnode *dvp, \
34 		struct vnode **vpp, \
35 		struct componentname *cnp, \
36 		struct vattr *vap))) dead_badop)
37 int	dead_open __P((
38 		struct vnode *vp,
39 		int mode,
40 		struct ucred *cred,
41 		struct proc *p));
42 #define dead_close ((int (*) __P(( \
43 		struct vnode *vp, \
44 		int fflag, \
45 		struct ucred *cred, \
46 		struct proc *p))) nullop)
47 #define dead_access ((int (*) __P(( \
48 		struct vnode *vp, \
49 		int mode, \
50 		struct ucred *cred, \
51 		struct proc *p))) dead_ebadf)
52 #define dead_getattr ((int (*) __P(( \
53 		struct vnode *vp, \
54 		struct vattr *vap, \
55 		struct ucred *cred, \
56 		struct proc *p))) dead_ebadf)
57 #define dead_setattr ((int (*) __P(( \
58 		struct vnode *vp, \
59 		struct vattr *vap, \
60 		struct ucred *cred, \
61 		struct proc *p))) dead_ebadf)
62 int	dead_read __P((
63 		struct vnode *vp,
64 		struct uio *uio,
65 		int ioflag,
66 		struct ucred *cred));
67 int	dead_write __P((
68 		struct vnode *vp,
69 		struct uio *uio,
70 		int ioflag,
71 		struct ucred *cred));
72 int	dead_ioctl __P((
73 		struct vnode *vp,
74 		int command,
75 		caddr_t data,
76 		int fflag,
77 		struct ucred *cred,
78 		struct proc *p));
79 int	dead_select __P((
80 		struct vnode *vp,
81 		int which,
82 		int fflags,
83 		struct ucred *cred,
84 		struct proc *p));
85 #define dead_mmap ((int (*) __P(( \
86 		struct vnode *vp, \
87 		int fflags, \
88 		struct ucred *cred, \
89 		struct proc *p))) dead_badop)
90 #define dead_fsync ((int (*) __P(( \
91 		struct vnode *vp, \
92 		int fflags, \
93 		struct ucred *cred, \
94 		int waitfor, \
95 		struct proc *p))) nullop)
96 #define dead_seek ((int (*) __P(( \
97 		struct vnode *vp, \
98 		off_t oldoff, \
99 		off_t newoff, \
100 		struct ucred *cred))) nullop)
101 #define dead_remove ((int (*) __P(( \
102 		struct vnode *dvp, \
103 	        struct vnode *vp, \
104 		struct componentname *cnp))) dead_badop)
105 #define dead_link ((int (*) __P(( \
106 		register struct vnode *vp, \
107 		struct vnode *tdvp, \
108 		struct componentname *cnp))) dead_badop)
109 #define dead_rename ((int (*) __P(( \
110 		struct vnode *fdvp, \
111 	        struct vnode *fvp, \
112 		struct componentname *fcnp, \
113 		struct vnode *tdvp, \
114 		struct vnode *tvp, \
115 		struct componentname *tcnp))) dead_badop)
116 #define dead_mkdir ((int (*) __P(( \
117 		struct vnode *dvp, \
118 		struct vnode **vpp, \
119 		struct componentname *cnp, \
120 		struct vattr *vap))) dead_badop)
121 #define dead_rmdir ((int (*) __P(( \
122 		struct vnode *dvp, \
123 		struct vnode *vp, \
124 		struct componentname *cnp))) dead_badop)
125 #define dead_symlink ((int (*) __P(( \
126 		struct vnode *dvp, \
127 		struct vnode **vpp, \
128 		struct componentname *cnp, \
129 		struct vattr *vap, \
130 		char *target))) dead_badop)
131 #define dead_readdir ((int (*) __P(( \
132 		struct vnode *vp, \
133 		struct uio *uio, \
134 		struct ucred *cred, \
135 		int *eofflagp))) dead_ebadf)
136 #define dead_readlink ((int (*) __P(( \
137 		struct vnode *vp, \
138 		struct uio *uio, \
139 		struct ucred *cred))) dead_ebadf)
140 #define dead_abortop ((int (*) __P(( \
141 		struct vnode *dvp, \
142 		struct componentname *cnp))) dead_badop)
143 #define dead_inactive ((int (*) __P(( \
144 		struct vnode *vp, \
145 		struct proc *p))) nullop)
146 #define dead_reclaim ((int (*) __P(( \
147 		struct vnode *vp))) nullop)
148 int	dead_lock __P((
149 		struct vnode *vp));
150 #define dead_unlock ((int (*) __P(( \
151 		struct vnode *vp))) nullop)
152 int	dead_bmap __P((
153 		struct vnode *vp,
154 		daddr_t bn,
155 		struct vnode **vpp,
156 		daddr_t *bnp));
157 int	dead_strategy __P((
158 		struct buf *bp));
159 int	dead_print __P((
160 		struct vnode *vp));
161 #define dead_islocked ((int (*) __P(( \
162 		struct vnode *vp))) nullop)
163 #define dead_advlock ((int (*) __P(( \
164 		struct vnode *vp, \
165 		caddr_t id, \
166 		int op, \
167 		struct flock *fl, \
168 		int flags))) dead_ebadf)
169 #define dead_blkatoff ((int (*) __P(( \
170 		struct vnode *vp, \
171 		off_t offset, \
172 		char **res, \
173 		struct buf **bpp))) dead_badop)
174 #define dead_vget ((int (*) __P(( \
175 		struct mount *mp, \
176 		ino_t ino, \
177 		struct vnode **vpp))) dead_badop)
178 #define dead_valloc ((int (*) __P(( \
179 		struct vnode *pvp, \
180 		int mode, \
181 		struct ucred *cred, \
182 		struct vnode **vpp))) dead_badop)
183 #define dead_vfree ((void (*) __P(( \
184 		struct vnode *pvp, \
185 		ino_t ino, \
186 		int mode))) dead_badop)
187 #define dead_truncate ((int (*) __P(( \
188 		struct vnode *vp, \
189 		u_long length, \
190 		int flags))) nullop)
191 #define dead_update ((int (*) __P(( \
192 		struct vnode *vp, \
193 		struct timeval *ta, \
194 		struct timeval *tm, \
195 		int waitfor))) nullop)
196 #define dead_bwrite ((int (*) __P(( \
197 		struct buf *bp))) nullop)
198 
199 struct vnodeops dead_vnodeops = {
200 	dead_lookup,	/* lookup */
201 	dead_create,	/* create */
202 	dead_mknod,	/* mknod */
203 	dead_open,	/* open */
204 	dead_close,	/* close */
205 	dead_access,	/* access */
206 	dead_getattr,	/* getattr */
207 	dead_setattr,	/* setattr */
208 	dead_read,	/* read */
209 	dead_write,	/* write */
210 	dead_ioctl,	/* ioctl */
211 	dead_select,	/* select */
212 	dead_mmap,	/* mmap */
213 	dead_fsync,	/* fsync */
214 	dead_seek,	/* seek */
215 	dead_remove,	/* remove */
216 	dead_link,	/* link */
217 	dead_rename,	/* rename */
218 	dead_mkdir,	/* mkdir */
219 	dead_rmdir,	/* rmdir */
220 	dead_symlink,	/* symlink */
221 	dead_readdir,	/* readdir */
222 	dead_readlink,	/* readlink */
223 	dead_abortop,	/* abortop */
224 	dead_inactive,	/* inactive */
225 	dead_reclaim,	/* reclaim */
226 	dead_lock,	/* lock */
227 	dead_unlock,	/* unlock */
228 	dead_bmap,	/* bmap */
229 	dead_strategy,	/* strategy */
230 	dead_print,	/* print */
231 	dead_islocked,	/* islocked */
232 	dead_advlock,	/* advlock */
233 	dead_blkatoff,	/* blkatoff */
234 	dead_vget,	/* vget */
235 	dead_valloc,	/* valloc */
236 	dead_vfree,	/* vfree */
237 	dead_truncate,	/* truncate */
238 	dead_update,	/* update */
239 	dead_bwrite,	/* bwrite */
240 };
241 
242 /*
243  * Trivial lookup routine that always fails.
244  */
245 /* ARGSUSED */
246 int
247 dead_lookup(dvp, vpp, cnp)
248 	struct vnode *dvp;
249 	struct vnode **vpp;
250 	struct componentname *cnp;
251 {
252 
253 	*vpp = NULL;
254 	return (ENOTDIR);
255 }
256 
257 /*
258  * Open always fails as if device did not exist.
259  */
260 /* ARGSUSED */
261 dead_open(vp, mode, cred, p)
262 	struct vnode *vp;
263 	int mode;
264 	struct ucred *cred;
265 	struct proc *p;
266 {
267 
268 	return (ENXIO);
269 }
270 
271 /*
272  * Vnode op for read
273  */
274 /* ARGSUSED */
275 dead_read(vp, uio, ioflag, cred)
276 	struct vnode *vp;
277 	struct uio *uio;
278 	int ioflag;
279 	struct ucred *cred;
280 {
281 
282 	if (chkvnlock(vp))
283 		panic("dead_read: lock");
284 	/*
285 	 * Return EOF for character devices, EIO for others
286 	 */
287 	if (vp->v_type != VCHR)
288 		return (EIO);
289 	return (0);
290 }
291 
292 /*
293  * Vnode op for write
294  */
295 /* ARGSUSED */
296 dead_write(vp, uio, ioflag, cred)
297 	register struct vnode *vp;
298 	struct uio *uio;
299 	int ioflag;
300 	struct ucred *cred;
301 {
302 
303 	if (chkvnlock(vp))
304 		panic("dead_write: lock");
305 	return (EIO);
306 }
307 
308 /*
309  * Device ioctl operation.
310  */
311 /* ARGSUSED */
312 dead_ioctl(vp, com, data, fflag, cred, p)
313 	struct vnode *vp;
314 	register int com;
315 	caddr_t data;
316 	int fflag;
317 	struct ucred *cred;
318 	struct proc *p;
319 {
320 
321 	if (!chkvnlock(vp))
322 		return (EBADF);
323 	return (VOP_IOCTL(vp, com, data, fflag, cred, p));
324 }
325 
326 /* ARGSUSED */
327 dead_select(vp, which, fflags, cred, p)
328 	struct vnode *vp;
329 	int which, fflags;
330 	struct ucred *cred;
331 	struct proc *p;
332 {
333 
334 	/*
335 	 * Let the user find out that the descriptor is gone.
336 	 */
337 	return (1);
338 }
339 
340 /*
341  * Just call the device strategy routine
342  */
343 dead_strategy(bp)
344 	register struct buf *bp;
345 {
346 
347 	if (bp->b_vp == NULL || !chkvnlock(bp->b_vp)) {
348 		bp->b_flags |= B_ERROR;
349 		biodone(bp);
350 		return (EIO);
351 	}
352 	return (VOP_STRATEGY(bp));
353 }
354 
355 /*
356  * Wait until the vnode has finished changing state.
357  */
358 dead_lock(vp)
359 	struct vnode *vp;
360 {
361 
362 	if (!chkvnlock(vp))
363 		return (0);
364 	return (VOP_LOCK(vp));
365 }
366 
367 /*
368  * Wait until the vnode has finished changing state.
369  */
370 dead_bmap(vp, bn, vpp, bnp)
371 	struct vnode *vp;
372 	daddr_t bn;
373 	struct vnode **vpp;
374 	daddr_t *bnp;
375 {
376 
377 	if (!chkvnlock(vp))
378 		return (EIO);
379 	return (VOP_BMAP(vp, bn, vpp, bnp));
380 }
381 
382 /*
383  * Print out the contents of a dead vnode.
384  */
385 /* ARGSUSED */
386 dead_print(vp)
387 	struct vnode *vp;
388 {
389 
390 	printf("tag VT_NON, dead vnode\n");
391 }
392 
393 /*
394  * Empty vnode failed operation
395  */
396 dead_ebadf()
397 {
398 
399 	return (EBADF);
400 }
401 
402 /*
403  * Empty vnode bad operation
404  */
405 dead_badop()
406 {
407 
408 	panic("dead_badop called");
409 	/* NOTREACHED */
410 }
411 
412 /*
413  * Empty vnode null operation
414  */
415 dead_nullop()
416 {
417 
418 	return (0);
419 }
420 
421 /*
422  * We have to wait during times when the vnode is
423  * in a state of change.
424  */
425 chkvnlock(vp)
426 	register struct vnode *vp;
427 {
428 	int locked = 0;
429 
430 	while (vp->v_flag & VXLOCK) {
431 		vp->v_flag |= VXWANT;
432 		sleep((caddr_t)vp, PINOD);
433 		locked = 1;
434 	}
435 	return (locked);
436 }
437