xref: /csrg-svn/sys/miscfs/deadfs/dead_vnops.c (revision 39483)
1*39483Smckusick /*
2*39483Smckusick  * Copyright (c) 1989 The Regents of the University of California.
3*39483Smckusick  * All rights reserved.
4*39483Smckusick  *
5*39483Smckusick  * Redistribution and use in source and binary forms are permitted
6*39483Smckusick  * provided that the above copyright notice and this paragraph are
7*39483Smckusick  * duplicated in all such forms and that any documentation,
8*39483Smckusick  * advertising materials, and other materials related to such
9*39483Smckusick  * distribution and use acknowledge that the software was developed
10*39483Smckusick  * by the University of California, Berkeley.  The name of the
11*39483Smckusick  * University may not be used to endorse or promote products derived
12*39483Smckusick  * from this software without specific prior written permission.
13*39483Smckusick  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14*39483Smckusick  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15*39483Smckusick  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16*39483Smckusick  *
17*39483Smckusick  *	@(#)dead_vnops.c	7.1 (Berkeley) 11/02/89
18*39483Smckusick  */
19*39483Smckusick 
20*39483Smckusick #include "param.h"
21*39483Smckusick #include "time.h"
22*39483Smckusick #include "vnode.h"
23*39483Smckusick #include "errno.h"
24*39483Smckusick #include "namei.h"
25*39483Smckusick #include "buf.h"
26*39483Smckusick 
27*39483Smckusick int	dead_lookup(),
28*39483Smckusick 	dead_open(),
29*39483Smckusick 	dead_read(),
30*39483Smckusick 	dead_write(),
31*39483Smckusick 	dead_strategy(),
32*39483Smckusick 	dead_ioctl(),
33*39483Smckusick 	dead_select(),
34*39483Smckusick 	dead_lock(),
35*39483Smckusick 	dead_badop(),
36*39483Smckusick 	dead_nullop();
37*39483Smckusick 
38*39483Smckusick struct vnodeops dead_vnodeops = {
39*39483Smckusick 	dead_lookup,	/* lookup */
40*39483Smckusick 	dead_badop,	/* create */
41*39483Smckusick 	dead_badop,	/* mknod */
42*39483Smckusick 	dead_open,	/* open */
43*39483Smckusick 	dead_nullop,	/* close */
44*39483Smckusick 	dead_badop,	/* access */
45*39483Smckusick 	dead_badop,	/* getattr */
46*39483Smckusick 	dead_badop,	/* setattr */
47*39483Smckusick 	dead_read,	/* read */
48*39483Smckusick 	dead_write,	/* write */
49*39483Smckusick 	dead_ioctl,	/* ioctl */
50*39483Smckusick 	dead_select,	/* select */
51*39483Smckusick 	dead_badop,	/* mmap */
52*39483Smckusick 	dead_nullop,	/* fsync */
53*39483Smckusick 	dead_nullop,	/* seek */
54*39483Smckusick 	dead_badop,	/* remove */
55*39483Smckusick 	dead_badop,	/* link */
56*39483Smckusick 	dead_badop,	/* rename */
57*39483Smckusick 	dead_badop,	/* mkdir */
58*39483Smckusick 	dead_badop,	/* rmdir */
59*39483Smckusick 	dead_badop,	/* symlink */
60*39483Smckusick 	dead_badop,	/* readdir */
61*39483Smckusick 	dead_badop,	/* readlink */
62*39483Smckusick 	dead_badop,	/* abortop */
63*39483Smckusick 	dead_nullop,	/* inactive */
64*39483Smckusick 	dead_nullop,	/* reclaim */
65*39483Smckusick 	dead_lock,	/* lock */
66*39483Smckusick 	dead_nullop,	/* unlock */
67*39483Smckusick 	dead_badop,	/* bmap */
68*39483Smckusick 	dead_strategy,	/* strategy */
69*39483Smckusick };
70*39483Smckusick 
71*39483Smckusick /*
72*39483Smckusick  * Trivial lookup routine that always fails.
73*39483Smckusick  */
74*39483Smckusick dead_lookup(vp, ndp)
75*39483Smckusick 	struct vnode *vp;
76*39483Smckusick 	struct nameidata *ndp;
77*39483Smckusick {
78*39483Smckusick 
79*39483Smckusick 	ndp->ni_dvp = vp;
80*39483Smckusick 	ndp->ni_vp = NULL;
81*39483Smckusick 	return (ENOTDIR);
82*39483Smckusick }
83*39483Smckusick 
84*39483Smckusick /*
85*39483Smckusick  * Open always fails as if device did not exist.
86*39483Smckusick  */
87*39483Smckusick /* ARGSUSED */
88*39483Smckusick dead_open(vp, mode, cred)
89*39483Smckusick 	struct vnode *vp;
90*39483Smckusick 	int mode;
91*39483Smckusick 	struct ucred *cred;
92*39483Smckusick {
93*39483Smckusick 
94*39483Smckusick 	return (ENXIO);
95*39483Smckusick }
96*39483Smckusick 
97*39483Smckusick /*
98*39483Smckusick  * Vnode op for read
99*39483Smckusick  */
100*39483Smckusick dead_read(vp, uio, offp, ioflag, cred)
101*39483Smckusick 	struct vnode *vp;
102*39483Smckusick 	struct uio *uio;
103*39483Smckusick 	off_t *offp;
104*39483Smckusick 	int ioflag;
105*39483Smckusick 	struct ucred *cred;
106*39483Smckusick {
107*39483Smckusick 	int locked = 0;
108*39483Smckusick 
109*39483Smckusick 	/*
110*39483Smckusick 	 * We have to wait during times when the vnode is
111*39483Smckusick 	 * in a state of change.
112*39483Smckusick 	 */
113*39483Smckusick 	while (vp->v_flag & VXLOCK) {
114*39483Smckusick 		vp->v_flag |= VXWANT;
115*39483Smckusick 		sleep((caddr_t)vp, PINOD);
116*39483Smckusick 		locked = 1;
117*39483Smckusick 	}
118*39483Smckusick 	if (!locked)
119*39483Smckusick 		return (EIO);
120*39483Smckusick 	return (VOP_READ(vp, uio, offp, ioflag, cred));
121*39483Smckusick }
122*39483Smckusick 
123*39483Smckusick /*
124*39483Smckusick  * Vnode op for write
125*39483Smckusick  */
126*39483Smckusick dead_write(vp, uio, offp, ioflag, cred)
127*39483Smckusick 	register struct vnode *vp;
128*39483Smckusick 	struct uio *uio;
129*39483Smckusick 	off_t *offp;
130*39483Smckusick 	int ioflag;
131*39483Smckusick 	struct ucred *cred;
132*39483Smckusick {
133*39483Smckusick 	int locked = 0;
134*39483Smckusick 
135*39483Smckusick 	/*
136*39483Smckusick 	 * We have to wait during times when the vnode is
137*39483Smckusick 	 * in a state of change.
138*39483Smckusick 	 */
139*39483Smckusick 	while (vp->v_flag & VXLOCK) {
140*39483Smckusick 		vp->v_flag |= VXWANT;
141*39483Smckusick 		sleep((caddr_t)vp, PINOD);
142*39483Smckusick 		locked = 1;
143*39483Smckusick 	}
144*39483Smckusick 	if (!locked)
145*39483Smckusick 		return (EIO);
146*39483Smckusick 	return (VOP_WRITE(vp, uio, offp, ioflag, cred));
147*39483Smckusick }
148*39483Smckusick 
149*39483Smckusick /*
150*39483Smckusick  * Device ioctl operation.
151*39483Smckusick  */
152*39483Smckusick /* ARGSUSED */
153*39483Smckusick dead_ioctl(vp, com, data, fflag, cred)
154*39483Smckusick 	struct vnode *vp;
155*39483Smckusick 	register int com;
156*39483Smckusick 	caddr_t data;
157*39483Smckusick 	int fflag;
158*39483Smckusick 	struct ucred *cred;
159*39483Smckusick {
160*39483Smckusick 	int locked = 0;
161*39483Smckusick 
162*39483Smckusick 	/*
163*39483Smckusick 	 * We have to wait during times when the vnode is
164*39483Smckusick 	 * in a state of change.
165*39483Smckusick 	 */
166*39483Smckusick 	while (vp->v_flag & VXLOCK) {
167*39483Smckusick 		vp->v_flag |= VXWANT;
168*39483Smckusick 		sleep((caddr_t)vp, PINOD);
169*39483Smckusick 		locked = 1;
170*39483Smckusick 	}
171*39483Smckusick 	if (!locked)
172*39483Smckusick 		return (EBADF);
173*39483Smckusick 	return (VOP_IOCTL(vp, com, data, fflag, cred));
174*39483Smckusick }
175*39483Smckusick 
176*39483Smckusick /* ARGSUSED */
177*39483Smckusick dead_select(vp, which, cred)
178*39483Smckusick 	struct vnode *vp;
179*39483Smckusick 	int which;
180*39483Smckusick 	struct ucred *cred;
181*39483Smckusick {
182*39483Smckusick 
183*39483Smckusick 	/*
184*39483Smckusick 	 * Let the user find out that the descriptor is gone.
185*39483Smckusick 	 */
186*39483Smckusick 	return (1);
187*39483Smckusick }
188*39483Smckusick 
189*39483Smckusick /*
190*39483Smckusick  * Just call the device strategy routine
191*39483Smckusick  */
192*39483Smckusick dead_strategy(bp)
193*39483Smckusick 	register struct buf *bp;
194*39483Smckusick {
195*39483Smckusick 	int locked = 0;
196*39483Smckusick 
197*39483Smckusick 	/*
198*39483Smckusick 	 * We have to wait during times when the vnode is
199*39483Smckusick 	 * in a state of change.
200*39483Smckusick 	 */
201*39483Smckusick 	while (bp->b_vp->v_flag & VXLOCK) {
202*39483Smckusick 		bp->b_vp->v_flag |= VXWANT;
203*39483Smckusick 		sleep((caddr_t)bp->b_vp, PINOD);
204*39483Smckusick 		locked = 1;
205*39483Smckusick 	}
206*39483Smckusick 	if (!locked)
207*39483Smckusick 		return (EIO);
208*39483Smckusick 	return (VOP_STRATEGY(bp));
209*39483Smckusick }
210*39483Smckusick 
211*39483Smckusick /*
212*39483Smckusick  * Wait until the vnode has finished changing state.
213*39483Smckusick  */
214*39483Smckusick dead_lock(vp)
215*39483Smckusick 	struct vnode *vp;
216*39483Smckusick {
217*39483Smckusick 	int locked = 0;
218*39483Smckusick 
219*39483Smckusick 	/*
220*39483Smckusick 	 * We have to wait during times when the vnode is
221*39483Smckusick 	 * in a state of change.
222*39483Smckusick 	 */
223*39483Smckusick 	while (vp->v_flag & VXLOCK) {
224*39483Smckusick 		vp->v_flag |= VXWANT;
225*39483Smckusick 		sleep((caddr_t)vp, PINOD);
226*39483Smckusick 		locked = 1;
227*39483Smckusick 	}
228*39483Smckusick 	if (!locked)
229*39483Smckusick 		return (0);
230*39483Smckusick 	return (VOP_LOCK(vp));
231*39483Smckusick }
232*39483Smckusick 
233*39483Smckusick /*
234*39483Smckusick  * Empty vnode bad operation
235*39483Smckusick  */
236*39483Smckusick dead_badop()
237*39483Smckusick {
238*39483Smckusick 
239*39483Smckusick 	panic("dead_badop called");
240*39483Smckusick 	/* NOTREACHED */
241*39483Smckusick }
242*39483Smckusick 
243*39483Smckusick /*
244*39483Smckusick  * Empty vnode null operation
245*39483Smckusick  */
246*39483Smckusick dead_nullop()
247*39483Smckusick {
248*39483Smckusick 
249*39483Smckusick 	return (0);
250*39483Smckusick }
251