xref: /csrg-svn/sys/miscfs/nullfs/null_vnops.c (revision 54753)
1*54753Sjohnh /*
2*54753Sjohnh  * Copyright (c) 1992 The Regents of the University of California
3*54753Sjohnh  * Copyright (c) 1990, 1992 Jan-Simon Pendry
4*54753Sjohnh  * All rights reserved.
5*54753Sjohnh  *
6*54753Sjohnh  * This code is derived from software donated to Berkeley by
7*54753Sjohnh  * Jan-Simon Pendry.
8*54753Sjohnh  *
9*54753Sjohnh  * %sccs.include.redist.c%
10*54753Sjohnh  *
11*54753Sjohnh  *	@(#)lofs_vnops.c	1.2 (Berkeley) 6/18/92
12*54753Sjohnh  *
13*54753Sjohnh  * $Id: lofs_vnops.c,v 1.11 1992/05/30 10:05:43 jsp Exp jsp $
14*54753Sjohnh  */
15*54753Sjohnh 
16*54753Sjohnh /*
17*54753Sjohnh  * Loopback Filesystem
18*54753Sjohnh  */
19*54753Sjohnh 
20*54753Sjohnh #include <sys/param.h>
21*54753Sjohnh #include <sys/systm.h>
22*54753Sjohnh #include <sys/proc.h>
23*54753Sjohnh #include <sys/time.h>
24*54753Sjohnh #include <sys/types.h>
25*54753Sjohnh #include <sys/vnode.h>
26*54753Sjohnh #include <sys/mount.h>
27*54753Sjohnh #include <sys/namei.h>
28*54753Sjohnh #include <sys/malloc.h>
29*54753Sjohnh #include <sys/buf.h>
30*54753Sjohnh #include <lofs/lofs.h>
31*54753Sjohnh 
32*54753Sjohnh /*
33*54753Sjohnh  * Basic strategy: as usual, do as little work as possible.
34*54753Sjohnh  * Nothing is ever locked in the lofs'ed filesystem, all
35*54753Sjohnh  * locks are held in the underlying filesystems.
36*54753Sjohnh  */
37*54753Sjohnh 
38*54753Sjohnh /*
39*54753Sjohnh  * Save a vnode and replace with
40*54753Sjohnh  * the lofs'ed one
41*54753Sjohnh  */
42*54753Sjohnh #define PUSHREF(v, nd) \
43*54753Sjohnh { \
44*54753Sjohnh 	struct { struct vnode *vnp; } v; \
45*54753Sjohnh 	v.vnp = (nd); \
46*54753Sjohnh 	(nd) = LOFSVP(v.vnp)
47*54753Sjohnh 
48*54753Sjohnh /*
49*54753Sjohnh  * Undo the PUSHREF
50*54753Sjohnh  */
51*54753Sjohnh #define POP(v, nd) \
52*54753Sjohnh 	\
53*54753Sjohnh 	(nd) = v.vnp; \
54*54753Sjohnh }
55*54753Sjohnh 
56*54753Sjohnh 
57*54753Sjohnh /*
58*54753Sjohnh  * vp is the current namei directory
59*54753Sjohnh  * ndp is the name to locate in that directory...
60*54753Sjohnh  */
61*54753Sjohnh lofs_lookup (ap)
62*54753Sjohnh 	struct vop_lookup_args *ap;
63*54753Sjohnh {
64*54753Sjohnh 	USES_VOP_LOOKUP;
65*54753Sjohnh 	struct vnode *dvp = ap->a_dvp;
66*54753Sjohnh 	struct vnode *newvp;
67*54753Sjohnh 	struct vnode *targetdvp;
68*54753Sjohnh 	int error;
69*54753Sjohnh 	int flag = ap->a_cnp->cn_nameiop /*& OPMASK*/;
70*54753Sjohnh 
71*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
72*54753Sjohnh 	printf("lofs_lookup(ap->a_dvp = %x->%x, \"%s\", op = %d)\n",
73*54753Sjohnh 		dvp, LOFSVP(dvp), ap->a_cnp->cn_nameptr, flag);
74*54753Sjohnh #endif
75*54753Sjohnh 
76*54753Sjohnh 	/*
77*54753Sjohnh 	 * (ap->a_dvp) was locked when passed in, and it will be replaced
78*54753Sjohnh 	 * with the target vnode, BUT that will already have been
79*54753Sjohnh 	 * locked when (ap->a_dvp) was locked [see lofs_lock].  all that
80*54753Sjohnh 	 * must be done here is to keep track of reference counts.
81*54753Sjohnh 	 */
82*54753Sjohnh 	targetdvp = LOFSVP(dvp);
83*54753Sjohnh 	/*VREF(targetdvp);*/
84*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
85*54753Sjohnh 	vprint("lofs VOP_LOOKUP", targetdvp);
86*54753Sjohnh #endif
87*54753Sjohnh 
88*54753Sjohnh 	/*
89*54753Sjohnh 	 * Call lookup on the looped vnode
90*54753Sjohnh 	 */
91*54753Sjohnh 	error = VOP_LOOKUP(targetdvp, &newvp, ap->a_cnp);
92*54753Sjohnh 	/*vrele(targetdvp);*/
93*54753Sjohnh 
94*54753Sjohnh 	if (error) {
95*54753Sjohnh 		*ap->a_vpp = NULLVP;
96*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
97*54753Sjohnh 		printf("lofs_lookup(%x->%x) = %d\n", dvp, LOFSVP(dvp), error);
98*54753Sjohnh #endif
99*54753Sjohnh 		return (error);
100*54753Sjohnh 	}
101*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
102*54753Sjohnh 	printf("lofs_lookup(%x->%x) = OK\n", dvp, LOFSVP(dvp));
103*54753Sjohnh #endif
104*54753Sjohnh 
105*54753Sjohnh 	*ap->a_vpp = newvp;
106*54753Sjohnh 
107*54753Sjohnh 	/*
108*54753Sjohnh 	 * If we just found a directory then make
109*54753Sjohnh 	 * a loopback node for it and return the loopback
110*54753Sjohnh 	 * instead of the real vnode.  Otherwise simply
111*54753Sjohnh 	 * return the aliased directory and vnode.
112*54753Sjohnh 	 */
113*54753Sjohnh 	if (newvp && newvp->v_type == VDIR && flag == LOOKUP) {
114*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
115*54753Sjohnh 		printf("lofs_lookup: found VDIR\n");
116*54753Sjohnh #endif
117*54753Sjohnh 		/*
118*54753Sjohnh 		 * At this point, newvp is the vnode to be looped.
119*54753Sjohnh 		 * Activate a loopback and return the looped vnode.
120*54753Sjohnh 		 */
121*54753Sjohnh 		return (make_lofs(dvp->v_mount, ap->a_vpp));
122*54753Sjohnh 	}
123*54753Sjohnh 
124*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
125*54753Sjohnh 	printf("lofs_lookup: not VDIR\n");
126*54753Sjohnh #endif
127*54753Sjohnh 
128*54753Sjohnh 	return (0);
129*54753Sjohnh }
130*54753Sjohnh 
131*54753Sjohnh /*
132*54753Sjohnh  * this = ni_dvp
133*54753Sjohnh  * ni_dvp references the locked directory.
134*54753Sjohnh  * ni_vp is NULL.
135*54753Sjohnh  */
136*54753Sjohnh lofs_mknod (ap)
137*54753Sjohnh 	struct vop_mknod_args *ap;
138*54753Sjohnh {
139*54753Sjohnh 	USES_VOP_MKNOD;
140*54753Sjohnh 	int error;
141*54753Sjohnh 
142*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
143*54753Sjohnh 	printf("lofs_mknod(vp = %x->%x)\n", ap->a_dvp, LOFSVP(ap->a_dvp));
144*54753Sjohnh #endif
145*54753Sjohnh 
146*54753Sjohnh 	PUSHREF(xdvp, ap->a_dvp);
147*54753Sjohnh 	VREF(ap->a_dvp);
148*54753Sjohnh 
149*54753Sjohnh 	error = VOP_MKNOD(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap);
150*54753Sjohnh 
151*54753Sjohnh 	POP(xdvp, ap->a_dvp);
152*54753Sjohnh 	vrele(ap->a_dvp);
153*54753Sjohnh 
154*54753Sjohnh 	return (error);
155*54753Sjohnh }
156*54753Sjohnh 
157*54753Sjohnh /*
158*54753Sjohnh  * this = ni_dvp;
159*54753Sjohnh  * ni_dvp references the locked directory
160*54753Sjohnh  * ni_vp is NULL.
161*54753Sjohnh  */
162*54753Sjohnh lofs_create (ap)
163*54753Sjohnh 	struct vop_create_args *ap;
164*54753Sjohnh {
165*54753Sjohnh 	USES_VOP_CREATE;
166*54753Sjohnh 	int error;
167*54753Sjohnh 
168*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
169*54753Sjohnh 	printf("lofs_create(ap->a_dvp = %x->%x)\n", ap->a_dvp, LOFSVP(ap->a_dvp));
170*54753Sjohnh #endif
171*54753Sjohnh 
172*54753Sjohnh 	PUSHREF(xdvp, ap->a_dvp);
173*54753Sjohnh 	VREF(ap->a_dvp);
174*54753Sjohnh 
175*54753Sjohnh 	error = VOP_CREATE(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap);
176*54753Sjohnh 
177*54753Sjohnh 	POP(xdvp, ap->a_dvp);
178*54753Sjohnh 	vrele(ap->a_dvp);
179*54753Sjohnh 
180*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
181*54753Sjohnh 	printf("lofs_create(ap->a_dvp = %x->%x)\n", ap->a_dvp, LOFSVP(ap->a_dvp));
182*54753Sjohnh #endif
183*54753Sjohnh 
184*54753Sjohnh 	return (error);
185*54753Sjohnh }
186*54753Sjohnh 
187*54753Sjohnh lofs_open (ap)
188*54753Sjohnh 	struct vop_open_args *ap;
189*54753Sjohnh {
190*54753Sjohnh 	USES_VOP_OPEN;
191*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
192*54753Sjohnh 	printf("lofs_open(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
193*54753Sjohnh #endif
194*54753Sjohnh 
195*54753Sjohnh 	return VOP_OPEN(LOFSVP(ap->a_vp), ap->a_mode, ap->a_cred, ap->a_p);
196*54753Sjohnh }
197*54753Sjohnh 
198*54753Sjohnh lofs_close (ap)
199*54753Sjohnh 	struct vop_close_args *ap;
200*54753Sjohnh {
201*54753Sjohnh 	USES_VOP_CLOSE;
202*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
203*54753Sjohnh 	printf("lofs_close(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
204*54753Sjohnh #endif
205*54753Sjohnh 
206*54753Sjohnh 	return VOP_CLOSE(LOFSVP(ap->a_vp), ap->a_fflag, ap->a_cred, ap->a_p);
207*54753Sjohnh }
208*54753Sjohnh 
209*54753Sjohnh lofs_access (ap)
210*54753Sjohnh 	struct vop_access_args *ap;
211*54753Sjohnh {
212*54753Sjohnh 	USES_VOP_ACCESS;
213*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
214*54753Sjohnh 	printf("lofs_access(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
215*54753Sjohnh #endif
216*54753Sjohnh 
217*54753Sjohnh 	return VOP_ACCESS(LOFSVP(ap->a_vp), ap->a_mode, ap->a_cred, ap->a_p);
218*54753Sjohnh }
219*54753Sjohnh 
220*54753Sjohnh lofs_getattr (ap)
221*54753Sjohnh 	struct vop_getattr_args *ap;
222*54753Sjohnh {
223*54753Sjohnh 	USES_VOP_GETATTR;
224*54753Sjohnh 	int error;
225*54753Sjohnh 
226*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
227*54753Sjohnh 	printf("lofs_getattr(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
228*54753Sjohnh #endif
229*54753Sjohnh 
230*54753Sjohnh 	/*
231*54753Sjohnh 	 * Get the stats from the underlying filesystem
232*54753Sjohnh 	 */
233*54753Sjohnh 	error = VOP_GETATTR(LOFSVP(ap->a_vp), ap->a_vap, ap->a_cred, ap->a_p);
234*54753Sjohnh 	if (error)
235*54753Sjohnh 		return (error);
236*54753Sjohnh 	/*
237*54753Sjohnh 	 * and replace the fsid field with the loopback number
238*54753Sjohnh 	 * to preserve the namespace.
239*54753Sjohnh 	 */
240*54753Sjohnh 	ap->a_vap->va_fsid = ap->a_vp->v_mount->mnt_stat.f_fsid.val[0];
241*54753Sjohnh 	return (0);
242*54753Sjohnh }
243*54753Sjohnh 
244*54753Sjohnh lofs_setattr (ap)
245*54753Sjohnh 	struct vop_setattr_args *ap;
246*54753Sjohnh {
247*54753Sjohnh 	USES_VOP_SETATTR;
248*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
249*54753Sjohnh 	printf("lofs_setattr(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
250*54753Sjohnh #endif
251*54753Sjohnh 
252*54753Sjohnh 	return VOP_SETATTR(LOFSVP(ap->a_vp), ap->a_vap, ap->a_cred, ap->a_p);
253*54753Sjohnh }
254*54753Sjohnh 
255*54753Sjohnh lofs_read (ap)
256*54753Sjohnh 	struct vop_read_args *ap;
257*54753Sjohnh {
258*54753Sjohnh 	USES_VOP_READ;
259*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
260*54753Sjohnh 	printf("lofs_read(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
261*54753Sjohnh #endif
262*54753Sjohnh 
263*54753Sjohnh 	return VOP_READ(LOFSVP(ap->a_vp), ap->a_uio, ap->a_ioflag, ap->a_cred);
264*54753Sjohnh }
265*54753Sjohnh 
266*54753Sjohnh lofs_write (ap)
267*54753Sjohnh 	struct vop_write_args *ap;
268*54753Sjohnh {
269*54753Sjohnh 	USES_VOP_WRITE;
270*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
271*54753Sjohnh 	printf("lofs_write(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
272*54753Sjohnh #endif
273*54753Sjohnh 
274*54753Sjohnh 	return VOP_WRITE(LOFSVP(ap->a_vp), ap->a_uio, ap->a_ioflag, ap->a_cred);
275*54753Sjohnh }
276*54753Sjohnh 
277*54753Sjohnh lofs_ioctl (ap)
278*54753Sjohnh 	struct vop_ioctl_args *ap;
279*54753Sjohnh {
280*54753Sjohnh 	USES_VOP_IOCTL;
281*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
282*54753Sjohnh 	printf("lofs_ioctl(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
283*54753Sjohnh #endif
284*54753Sjohnh 
285*54753Sjohnh 	return VOP_IOCTL(LOFSVP(ap->a_vp), ap->a_command, ap->a_data, ap->a_fflag, ap->a_cred, ap->a_p);
286*54753Sjohnh }
287*54753Sjohnh 
288*54753Sjohnh lofs_select (ap)
289*54753Sjohnh 	struct vop_select_args *ap;
290*54753Sjohnh {
291*54753Sjohnh 	USES_VOP_SELECT;
292*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
293*54753Sjohnh 	printf("lofs_select(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
294*54753Sjohnh #endif
295*54753Sjohnh 
296*54753Sjohnh 	return VOP_SELECT(LOFSVP(ap->a_vp), ap->a_which, ap->a_fflags, ap->a_cred, ap->a_p);
297*54753Sjohnh }
298*54753Sjohnh 
299*54753Sjohnh lofs_mmap (ap)
300*54753Sjohnh 	struct vop_mmap_args *ap;
301*54753Sjohnh {
302*54753Sjohnh 	USES_VOP_MMAP;
303*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
304*54753Sjohnh 	printf("lofs_mmap(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
305*54753Sjohnh #endif
306*54753Sjohnh 
307*54753Sjohnh 	return VOP_MMAP(LOFSVP(ap->a_vp), ap->a_fflags, ap->a_cred, ap->a_p);
308*54753Sjohnh }
309*54753Sjohnh 
310*54753Sjohnh lofs_fsync (ap)
311*54753Sjohnh 	struct vop_fsync_args *ap;
312*54753Sjohnh {
313*54753Sjohnh 	USES_VOP_FSYNC;
314*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
315*54753Sjohnh 	printf("lofs_fsync(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
316*54753Sjohnh #endif
317*54753Sjohnh 
318*54753Sjohnh 	return VOP_FSYNC(LOFSVP(ap->a_vp), ap->a_fflags, ap->a_cred, ap->a_waitfor, ap->a_p);
319*54753Sjohnh }
320*54753Sjohnh 
321*54753Sjohnh lofs_seek (ap)
322*54753Sjohnh 	struct vop_seek_args *ap;
323*54753Sjohnh {
324*54753Sjohnh 	USES_VOP_SEEK;
325*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
326*54753Sjohnh 	printf("lofs_seek(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
327*54753Sjohnh #endif
328*54753Sjohnh 
329*54753Sjohnh 	return VOP_SEEK(LOFSVP(ap->a_vp), ap->a_oldoff, ap->a_newoff, ap->a_cred);
330*54753Sjohnh }
331*54753Sjohnh 
332*54753Sjohnh lofs_remove (ap)
333*54753Sjohnh 	struct vop_remove_args *ap;
334*54753Sjohnh {
335*54753Sjohnh 	USES_VOP_REMOVE;
336*54753Sjohnh 	int error;
337*54753Sjohnh 
338*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
339*54753Sjohnh 	printf("lofs_remove(ap->a_vp = %x->%x)\n", ap->a_dvp, LOFSVP(ap->a_dvp));
340*54753Sjohnh #endif
341*54753Sjohnh 
342*54753Sjohnh 	PUSHREF(xdvp, ap->a_dvp);
343*54753Sjohnh 	VREF(ap->a_dvp);
344*54753Sjohnh 	PUSHREF(xvp, ap->a_vp);
345*54753Sjohnh 	VREF(ap->a_vp);
346*54753Sjohnh 
347*54753Sjohnh 	error = VOP_REMOVE(ap->a_dvp, ap->a_vp, ap->a_cnp);
348*54753Sjohnh 
349*54753Sjohnh 	POP(xvp, ap->a_vp);
350*54753Sjohnh 	vrele(ap->a_vp);
351*54753Sjohnh 	POP(xdvp, ap->a_dvp);
352*54753Sjohnh 	vrele(ap->a_dvp);
353*54753Sjohnh 
354*54753Sjohnh 	return (error);
355*54753Sjohnh }
356*54753Sjohnh 
357*54753Sjohnh /*
358*54753Sjohnh  * vp is this.
359*54753Sjohnh  * ni_dvp is the locked parent of the target.
360*54753Sjohnh  * ni_vp is NULL.
361*54753Sjohnh  */
362*54753Sjohnh lofs_link (ap)
363*54753Sjohnh 	struct vop_link_args *ap;
364*54753Sjohnh {
365*54753Sjohnh 	USES_VOP_LINK;
366*54753Sjohnh 	int error;
367*54753Sjohnh 
368*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
369*54753Sjohnh 	printf("lofs_link(ap->a_tdvp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
370*54753Sjohnh #endif
371*54753Sjohnh 
372*54753Sjohnh 	PUSHREF(xdvp, ap->a_vp);
373*54753Sjohnh 	VREF(ap->a_vp);
374*54753Sjohnh 
375*54753Sjohnh 	error = VOP_LINK(ap->a_vp, LOFSVP(ap->a_tdvp), ap->a_cnp);
376*54753Sjohnh 
377*54753Sjohnh 	POP(xdvp, ap->a_vp);
378*54753Sjohnh 	vrele(ap->a_vp);
379*54753Sjohnh 
380*54753Sjohnh 	return (error);
381*54753Sjohnh }
382*54753Sjohnh 
383*54753Sjohnh lofs_rename (ap)
384*54753Sjohnh 	struct vop_rename_args *ap;
385*54753Sjohnh {
386*54753Sjohnh 	USES_VOP_RENAME;
387*54753Sjohnh 	struct vnode *fvp, *tvp;
388*54753Sjohnh 	struct vnode *tdvp;
389*54753Sjohnh #if 0
390*54753Sjohnh 	struct vnode *fsvp, *tsvp;
391*54753Sjohnh #endif
392*54753Sjohnh 	int error;
393*54753Sjohnh 
394*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
395*54753Sjohnh 	printf("lofs_rename(fdvp = %x->%x)\n", ap->a_fdvp, LOFSVP(ap->a_fdvp));
396*54753Sjohnh 	/*printf("lofs_rename(tdvp = %x->%x)\n", tndp->ni_dvp, LOFSVP(tndp->ni_dvp));*/
397*54753Sjohnh #endif
398*54753Sjohnh 
399*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
400*54753Sjohnh 	printf("lofs_rename - switch source dvp\n");
401*54753Sjohnh #endif
402*54753Sjohnh 	/*
403*54753Sjohnh 	 * Switch source directory to point to lofsed vnode
404*54753Sjohnh 	 */
405*54753Sjohnh 	PUSHREF(fdvp, ap->a_fdvp);
406*54753Sjohnh 	VREF(ap->a_fdvp);
407*54753Sjohnh 
408*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
409*54753Sjohnh 	printf("lofs_rename - switch source vp\n");
410*54753Sjohnh #endif
411*54753Sjohnh 	/*
412*54753Sjohnh 	 * And source object if it is lofsed...
413*54753Sjohnh 	 */
414*54753Sjohnh 	fvp = ap->a_fvp;
415*54753Sjohnh 	if (fvp && fvp->v_op == lofs_vnodeop_p) {
416*54753Sjohnh 		ap->a_fvp = LOFSVP(fvp);
417*54753Sjohnh 		VREF(ap->a_fvp);
418*54753Sjohnh 	} else {
419*54753Sjohnh 		fvp = 0;
420*54753Sjohnh 	}
421*54753Sjohnh 
422*54753Sjohnh #if 0
423*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
424*54753Sjohnh 	printf("lofs_rename - switch source start vp\n");
425*54753Sjohnh #endif
426*54753Sjohnh 	/*
427*54753Sjohnh 	 * And source startdir object if it is lofsed...
428*54753Sjohnh 	 */
429*54753Sjohnh 	fsvp = fndp->ni_startdir;
430*54753Sjohnh 	if (fsvp && fsvp->v_op == lofs_vnodeop_p) {
431*54753Sjohnh 		fndp->ni_startdir = LOFSVP(fsvp);
432*54753Sjohnh 		VREF(fndp->ni_startdir);
433*54753Sjohnh 	} else {
434*54753Sjohnh 		fsvp = 0;
435*54753Sjohnh 	}
436*54753Sjohnh #endif
437*54753Sjohnh 
438*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
439*54753Sjohnh 	printf("lofs_rename - switch target dvp\n");
440*54753Sjohnh #endif
441*54753Sjohnh 	/*
442*54753Sjohnh  	 * Switch target directory to point to lofsed vnode
443*54753Sjohnh 	 */
444*54753Sjohnh 	tdvp = ap->a_tdvp;
445*54753Sjohnh 	if (tdvp && tdvp->v_op == lofs_vnodeop_p) {
446*54753Sjohnh 		ap->a_tdvp = LOFSVP(tdvp);
447*54753Sjohnh 		VREF(ap->a_tdvp);
448*54753Sjohnh 	} else {
449*54753Sjohnh 		tdvp = 0;
450*54753Sjohnh 	}
451*54753Sjohnh 
452*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
453*54753Sjohnh 	printf("lofs_rename - switch target vp\n");
454*54753Sjohnh #endif
455*54753Sjohnh 	/*
456*54753Sjohnh 	 * And target object if it is lofsed...
457*54753Sjohnh 	 */
458*54753Sjohnh 	tvp = ap->a_tvp;
459*54753Sjohnh 	if (tvp && tvp->v_op == lofs_vnodeop_p) {
460*54753Sjohnh 		ap->a_tvp = LOFSVP(tvp);
461*54753Sjohnh 		VREF(ap->a_tvp);
462*54753Sjohnh 	} else {
463*54753Sjohnh 		tvp = 0;
464*54753Sjohnh 	}
465*54753Sjohnh 
466*54753Sjohnh #if 0
467*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
468*54753Sjohnh 	printf("lofs_rename - switch target start vp\n");
469*54753Sjohnh #endif
470*54753Sjohnh 	/*
471*54753Sjohnh 	 * And target startdir object if it is lofsed...
472*54753Sjohnh 	 */
473*54753Sjohnh 	tsvp = tndp->ni_startdir;
474*54753Sjohnh 	if (tsvp && tsvp->v_op == lofs_vnodeop_p) {
475*54753Sjohnh 		tndp->ni_startdir = LOFSVP(fsvp);
476*54753Sjohnh 		VREF(tndp->ni_startdir);
477*54753Sjohnh 	} else {
478*54753Sjohnh 		tsvp = 0;
479*54753Sjohnh 	}
480*54753Sjohnh #endif
481*54753Sjohnh 
482*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
483*54753Sjohnh 	printf("lofs_rename - VOP_RENAME(%x, %x, %x, %x)\n",
484*54753Sjohnh 		ap->a_fdvp, ap->a_fvp, ap->a_tdvp, ap->a_tvp);
485*54753Sjohnh 	vprint("ap->a_fdvp", ap->a_fdvp);
486*54753Sjohnh 	vprint("ap->a_fvp", ap->a_fvp);
487*54753Sjohnh 	vprint("ap->a_tdvp", ap->a_tdvp);
488*54753Sjohnh 	if (ap->a_tvp) vprint("ap->a_tvp", ap->a_tvp);
489*54753Sjohnh 	DELAY(16000000);
490*54753Sjohnh #endif
491*54753Sjohnh 
492*54753Sjohnh 	error = VOP_RENAME(ap->a_fdvp, ap->a_fvp, ap->a_fcnp, ap->a_tdvp, ap->a_tvp, ap->a_tcnp);
493*54753Sjohnh 
494*54753Sjohnh 	/*
495*54753Sjohnh 	 * Put everything back...
496*54753Sjohnh 	 */
497*54753Sjohnh 
498*54753Sjohnh #if 0
499*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
500*54753Sjohnh 	printf("lofs_rename - restore target startdir\n");
501*54753Sjohnh #endif
502*54753Sjohnh 
503*54753Sjohnh 	if (tsvp) {
504*54753Sjohnh 		if (tndp->ni_startdir)
505*54753Sjohnh 			vrele(tndp->ni_startdir);
506*54753Sjohnh 		tndp->ni_startdir = tsvp;
507*54753Sjohnh 	}
508*54753Sjohnh #endif
509*54753Sjohnh 
510*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
511*54753Sjohnh 	printf("lofs_rename - restore target vp\n");
512*54753Sjohnh #endif
513*54753Sjohnh 
514*54753Sjohnh 	if (tvp) {
515*54753Sjohnh 		ap->a_tvp = tvp;
516*54753Sjohnh 		vrele(ap->a_tvp);
517*54753Sjohnh 	}
518*54753Sjohnh 
519*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
520*54753Sjohnh 	printf("lofs_rename - restore target dvp\n");
521*54753Sjohnh #endif
522*54753Sjohnh 
523*54753Sjohnh 	if (tdvp) {
524*54753Sjohnh 		ap->a_tdvp = tdvp;
525*54753Sjohnh 		vrele(ap->a_tdvp);
526*54753Sjohnh 	}
527*54753Sjohnh 
528*54753Sjohnh #if 0
529*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
530*54753Sjohnh 	printf("lofs_rename - restore source startdir\n");
531*54753Sjohnh #endif
532*54753Sjohnh 
533*54753Sjohnh 	if (fsvp) {
534*54753Sjohnh 		if (fndp->ni_startdir)
535*54753Sjohnh 			vrele(fndp->ni_startdir);
536*54753Sjohnh 		fndp->ni_startdir = fsvp;
537*54753Sjohnh 	}
538*54753Sjohnh #endif
539*54753Sjohnh 
540*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
541*54753Sjohnh 	printf("lofs_rename - restore source vp\n");
542*54753Sjohnh #endif
543*54753Sjohnh 
544*54753Sjohnh 
545*54753Sjohnh 	if (fvp) {
546*54753Sjohnh 		ap->a_fvp = fvp;
547*54753Sjohnh 		vrele(ap->a_fvp);
548*54753Sjohnh 	}
549*54753Sjohnh 
550*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
551*54753Sjohnh 	printf("lofs_rename - restore source dvp\n");
552*54753Sjohnh #endif
553*54753Sjohnh 
554*54753Sjohnh 	POP(fdvp, ap->a_fdvp);
555*54753Sjohnh 	vrele(ap->a_fdvp);
556*54753Sjohnh 
557*54753Sjohnh 	return (error);
558*54753Sjohnh }
559*54753Sjohnh 
560*54753Sjohnh /*
561*54753Sjohnh  * ni_dvp is the locked (alias) parent.
562*54753Sjohnh  * ni_vp is NULL.
563*54753Sjohnh  */
564*54753Sjohnh lofs_mkdir (ap)
565*54753Sjohnh 	struct vop_mkdir_args *ap;
566*54753Sjohnh {
567*54753Sjohnh 	USES_VOP_MKDIR;
568*54753Sjohnh 	int error;
569*54753Sjohnh 	struct vnode *dvp = ap->a_dvp;
570*54753Sjohnh 	struct vnode *xdvp;
571*54753Sjohnh 	struct vnode *newvp;
572*54753Sjohnh 
573*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
574*54753Sjohnh 	printf("lofs_mkdir(vp = %x->%x)\n", dvp, LOFSVP(dvp));
575*54753Sjohnh #endif
576*54753Sjohnh 
577*54753Sjohnh 	xdvp = dvp;
578*54753Sjohnh 	dvp = LOFSVP(xdvp);
579*54753Sjohnh 	/*VREF(dvp);*/
580*54753Sjohnh 
581*54753Sjohnh 	error = VOP_MKDIR(dvp, &newvp, ap->a_cnp, ap->a_vap);
582*54753Sjohnh 
583*54753Sjohnh 	if (error) {
584*54753Sjohnh 		*ap->a_vpp = NULLVP;
585*54753Sjohnh 		/*vrele(xdvp);*/
586*54753Sjohnh 		return (error);
587*54753Sjohnh 	}
588*54753Sjohnh 
589*54753Sjohnh 	/*
590*54753Sjohnh 	 * Make a new lofs node
591*54753Sjohnh 	 */
592*54753Sjohnh 	/*VREF(dvp);*/
593*54753Sjohnh 
594*54753Sjohnh 	error = make_lofs(dvp->v_mount, &newvp);
595*54753Sjohnh 
596*54753Sjohnh 	*ap->a_vpp = newvp;
597*54753Sjohnh 
598*54753Sjohnh 	return (error);
599*54753Sjohnh }
600*54753Sjohnh 
601*54753Sjohnh /*
602*54753Sjohnh  * ni_dvp is the locked parent.
603*54753Sjohnh  * ni_vp is the entry to be removed.
604*54753Sjohnh  */
605*54753Sjohnh lofs_rmdir (ap)
606*54753Sjohnh 	struct vop_rmdir_args *ap;
607*54753Sjohnh {
608*54753Sjohnh 	USES_VOP_RMDIR;
609*54753Sjohnh 	struct vnode *vp = ap->a_vp;
610*54753Sjohnh 	struct vnode *dvp = ap->a_dvp;
611*54753Sjohnh 	int error;
612*54753Sjohnh 
613*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
614*54753Sjohnh 	printf("lofs_rmdir(dvp = %x->%x)\n", dvp, LOFSVP(dvp));
615*54753Sjohnh #endif
616*54753Sjohnh 
617*54753Sjohnh 	PUSHREF(xdvp, dvp);
618*54753Sjohnh 	VREF(dvp);
619*54753Sjohnh 	PUSHREF(xvp, vp);
620*54753Sjohnh 	VREF(vp);
621*54753Sjohnh 
622*54753Sjohnh 	error = VOP_RMDIR(dvp, vp, ap->a_cnp);
623*54753Sjohnh 
624*54753Sjohnh 	POP(xvp, vp);
625*54753Sjohnh 	vrele(vp);
626*54753Sjohnh 	POP(xdvp, dvp);
627*54753Sjohnh 	vrele(dvp);
628*54753Sjohnh 
629*54753Sjohnh 	return (error);
630*54753Sjohnh }
631*54753Sjohnh 
632*54753Sjohnh /*
633*54753Sjohnh  * ni_dvp is the locked parent.
634*54753Sjohnh  * ni_vp is NULL.
635*54753Sjohnh  */
636*54753Sjohnh lofs_symlink (ap)
637*54753Sjohnh 	struct vop_symlink_args *ap;
638*54753Sjohnh {
639*54753Sjohnh 	USES_VOP_SYMLINK;
640*54753Sjohnh 	int error;
641*54753Sjohnh 
642*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
643*54753Sjohnh 	printf("VOP_SYMLINK(vp = %x->%x)\n", ap->a_dvp, LOFSVP(ap->a_dvp));
644*54753Sjohnh #endif
645*54753Sjohnh 
646*54753Sjohnh 	PUSHREF(xdvp, ap->a_dvp);
647*54753Sjohnh 	VREF(ap->a_dvp);
648*54753Sjohnh 
649*54753Sjohnh 	error = VOP_SYMLINK(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap, ap->a_target);
650*54753Sjohnh 
651*54753Sjohnh 	POP(xdvp, ap->a_dvp);
652*54753Sjohnh 	vrele(ap->a_dvp);
653*54753Sjohnh 
654*54753Sjohnh 	return (error);
655*54753Sjohnh }
656*54753Sjohnh 
657*54753Sjohnh lofs_readdir (ap)
658*54753Sjohnh 	struct vop_readdir_args *ap;
659*54753Sjohnh {
660*54753Sjohnh 	USES_VOP_READDIR;
661*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
662*54753Sjohnh 	printf("lofs_readdir(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
663*54753Sjohnh #endif
664*54753Sjohnh 
665*54753Sjohnh 	return VOP_READDIR(LOFSVP(ap->a_vp), ap->a_uio, ap->a_cred, ap->a_eofflagp);
666*54753Sjohnh }
667*54753Sjohnh 
668*54753Sjohnh lofs_readlink (ap)
669*54753Sjohnh 	struct vop_readlink_args *ap;
670*54753Sjohnh {
671*54753Sjohnh 	USES_VOP_READLINK;
672*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
673*54753Sjohnh 	printf("lofs_readlink(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
674*54753Sjohnh #endif
675*54753Sjohnh 
676*54753Sjohnh 	return VOP_READLINK(LOFSVP(ap->a_vp), ap->a_uio, ap->a_cred);
677*54753Sjohnh }
678*54753Sjohnh 
679*54753Sjohnh /*
680*54753Sjohnh  * Anyone's guess...
681*54753Sjohnh  */
682*54753Sjohnh lofs_abortop (ap)
683*54753Sjohnh 	struct vop_abortop_args *ap;
684*54753Sjohnh {
685*54753Sjohnh 	USES_VOP_ABORTOP;
686*54753Sjohnh 	int error;
687*54753Sjohnh 
688*54753Sjohnh 	PUSHREF(xdvp, ap->a_dvp);
689*54753Sjohnh 
690*54753Sjohnh 	error = VOP_ABORTOP(ap->a_dvp, ap->a_cnp);
691*54753Sjohnh 
692*54753Sjohnh 	POP(xdvp, ap->a_dvp);
693*54753Sjohnh 
694*54753Sjohnh 	return (error);
695*54753Sjohnh }
696*54753Sjohnh 
697*54753Sjohnh lofs_inactive (ap)
698*54753Sjohnh 	struct vop_inactive_args *ap;
699*54753Sjohnh {
700*54753Sjohnh 	USES_VOP_INACTIVE;
701*54753Sjohnh 	struct vnode *targetvp = LOFSVP(ap->a_vp);
702*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
703*54753Sjohnh 	printf("lofs_inactive(ap->a_vp = %x->%x)\n", ap->a_vp, targetvp);
704*54753Sjohnh #endif
705*54753Sjohnh 
706*54753Sjohnh #ifdef DIAGNOSTIC
707*54753Sjohnh 	{ extern int prtactive;
708*54753Sjohnh 	if (prtactive && ap->a_vp->v_usecount != 0)
709*54753Sjohnh 		vprint("lofs_inactive: pushing active", ap->a_vp);
710*54753Sjohnh 	}
711*54753Sjohnh #endif
712*54753Sjohnh 
713*54753Sjohnh 	if (targetvp) {
714*54753Sjohnh 		vrele(targetvp);
715*54753Sjohnh 		LOFSP(ap->a_vp)->a_lofsvp = 0;
716*54753Sjohnh 	}
717*54753Sjohnh }
718*54753Sjohnh 
719*54753Sjohnh lofs_reclaim (ap)
720*54753Sjohnh 	struct vop_reclaim_args *ap;
721*54753Sjohnh {
722*54753Sjohnh 	USES_VOP_RECLAIM;
723*54753Sjohnh 	struct vnode *targetvp;
724*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
725*54753Sjohnh 	printf("lofs_reclaim(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
726*54753Sjohnh #endif
727*54753Sjohnh 	remque(LOFSP(ap->a_vp));
728*54753Sjohnh 	targetvp = LOFSVP(ap->a_vp);
729*54753Sjohnh 	if (targetvp) {
730*54753Sjohnh 		printf("lofs: delayed vrele of %x\n", targetvp);
731*54753Sjohnh 		vrele(targetvp);	/* XXX should never happen */
732*54753Sjohnh 	}
733*54753Sjohnh 	FREE(ap->a_vp->v_data, M_TEMP);
734*54753Sjohnh 	ap->a_vp->v_data = 0;
735*54753Sjohnh 	return (0);
736*54753Sjohnh }
737*54753Sjohnh 
738*54753Sjohnh lofs_lock (ap)
739*54753Sjohnh 	struct vop_lock_args *ap;
740*54753Sjohnh {
741*54753Sjohnh 	USES_VOP_LOCK;
742*54753Sjohnh 	int error;
743*54753Sjohnh 	struct vnode *targetvp = LOFSVP(ap->a_vp);
744*54753Sjohnh 
745*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
746*54753Sjohnh 	printf("lofs_lock(ap->a_vp = %x->%x)\n", ap->a_vp, targetvp);
747*54753Sjohnh 	/*vprint("lofs_lock ap->a_vp", ap->a_vp);
748*54753Sjohnh 	if (targetvp)
749*54753Sjohnh 		vprint("lofs_lock ->ap->a_vp", targetvp);
750*54753Sjohnh 	else
751*54753Sjohnh 		printf("lofs_lock ->ap->a_vp = NIL\n");*/
752*54753Sjohnh #endif
753*54753Sjohnh 
754*54753Sjohnh 	if (targetvp) {
755*54753Sjohnh 		error = VOP_LOCK(targetvp);
756*54753Sjohnh 		if (error)
757*54753Sjohnh 			return (error);
758*54753Sjohnh 	}
759*54753Sjohnh 
760*54753Sjohnh 	return (0);
761*54753Sjohnh }
762*54753Sjohnh 
763*54753Sjohnh lofs_unlock (ap)
764*54753Sjohnh 	struct vop_unlock_args *ap;
765*54753Sjohnh {
766*54753Sjohnh 	USES_VOP_UNLOCK;
767*54753Sjohnh 	struct vnode *targetvp = LOFSVP(ap->a_vp);
768*54753Sjohnh 
769*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
770*54753Sjohnh 	printf("lofs_unlock(ap->a_vp = %x->%x)\n", ap->a_vp, targetvp);
771*54753Sjohnh #endif
772*54753Sjohnh 
773*54753Sjohnh 	if (targetvp)
774*54753Sjohnh 		return (VOP_UNLOCK(targetvp));
775*54753Sjohnh 	return (0);
776*54753Sjohnh }
777*54753Sjohnh 
778*54753Sjohnh lofs_bmap (ap)
779*54753Sjohnh 	struct vop_bmap_args *ap;
780*54753Sjohnh {
781*54753Sjohnh 	USES_VOP_BMAP;
782*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
783*54753Sjohnh 	printf("lofs_bmap(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp));
784*54753Sjohnh #endif
785*54753Sjohnh 
786*54753Sjohnh 	return VOP_BMAP(LOFSVP(ap->a_vp), ap->a_bn, ap->a_vpp, ap->a_bnp);
787*54753Sjohnh }
788*54753Sjohnh 
789*54753Sjohnh lofs_strategy (ap)
790*54753Sjohnh 	struct vop_strategy_args *ap;
791*54753Sjohnh {
792*54753Sjohnh 	USES_VOP_STRATEGY;
793*54753Sjohnh 	int error;
794*54753Sjohnh 
795*54753Sjohnh #ifdef LOFS_DIAGNOSTIC
796*54753Sjohnh 	printf("lofs_strategy(vp = %x->%x)\n", ap->a_bp->b_vp, LOFSVP(ap->a_bp->b_vp));
797*54753Sjohnh #endif
798*54753Sjohnh 
799*54753Sjohnh 	PUSHREF(vp, ap->a_bp->b_vp);
800*54753Sjohnh 
801*54753Sjohnh 	error = VOP_STRATEGY(ap->a_bp);
802*54753Sjohnh 
803*54753Sjohnh 	POP(vp, ap->a_bp->b_vp);
804*54753Sjohnh 
805*54753Sjohnh 	return (error);
806*54753Sjohnh }
807*54753Sjohnh 
808*54753Sjohnh lofs_print (ap)
809*54753Sjohnh 	struct vop_print_args *ap;
810*54753Sjohnh {
811*54753Sjohnh 	USES_VOP_PRINT;
812*54753Sjohnh 	struct vnode *targetvp = LOFSVP(ap->a_vp);
813*54753Sjohnh 	printf("tag VT_LOFS ref ");
814*54753Sjohnh 	if (targetvp)
815*54753Sjohnh 		return (VOP_PRINT(targetvp));
816*54753Sjohnh 	printf("NULLVP\n");
817*54753Sjohnh 	return (0);
818*54753Sjohnh }
819*54753Sjohnh 
820*54753Sjohnh lofs_islocked (ap)
821*54753Sjohnh 	struct vop_islocked_args *ap;
822*54753Sjohnh {
823*54753Sjohnh 	USES_VOP_ISLOCKED;
824*54753Sjohnh 	struct vnode *targetvp = LOFSVP(ap->a_vp);
825*54753Sjohnh 	if (targetvp)
826*54753Sjohnh 		return (VOP_ISLOCKED(targetvp));
827*54753Sjohnh 	return (0);
828*54753Sjohnh }
829*54753Sjohnh 
830*54753Sjohnh lofs_advlock (ap)
831*54753Sjohnh 	struct vop_advlock_args *ap;
832*54753Sjohnh {
833*54753Sjohnh 	USES_VOP_ADVLOCK;
834*54753Sjohnh 	return VOP_ADVLOCK(LOFSVP(ap->a_vp), ap->a_id, ap->a_op, ap->a_fl, ap->a_flags);
835*54753Sjohnh }
836*54753Sjohnh 
837*54753Sjohnh /*
838*54753Sjohnh  * LOFS directory offset lookup.
839*54753Sjohnh  * Currently unsupported.
840*54753Sjohnh  */
841*54753Sjohnh lofs_blkatoff (ap)
842*54753Sjohnh 	struct vop_blkatoff_args *ap;
843*54753Sjohnh {
844*54753Sjohnh 
845*54753Sjohnh 	return (EOPNOTSUPP);
846*54753Sjohnh }
847*54753Sjohnh 
848*54753Sjohnh /*
849*54753Sjohnh  * LOFS flat namespace lookup.
850*54753Sjohnh  * Currently unsupported.
851*54753Sjohnh  */
852*54753Sjohnh lofs_vget (ap)
853*54753Sjohnh 	struct vop_vget_args *ap;
854*54753Sjohnh {
855*54753Sjohnh 
856*54753Sjohnh 	return (EOPNOTSUPP);
857*54753Sjohnh }
858*54753Sjohnh 
859*54753Sjohnh /*
860*54753Sjohnh  * LOFS flat namespace allocation.
861*54753Sjohnh  * Currently unsupported.
862*54753Sjohnh  */
863*54753Sjohnh lofs_valloc (ap)
864*54753Sjohnh 	struct vop_valloc_args *ap;
865*54753Sjohnh {
866*54753Sjohnh 
867*54753Sjohnh 	return (EOPNOTSUPP);
868*54753Sjohnh }
869*54753Sjohnh 
870*54753Sjohnh /*
871*54753Sjohnh  * LOFS flat namespace free.
872*54753Sjohnh  * Currently unsupported.
873*54753Sjohnh  */
874*54753Sjohnh /*void*/
875*54753Sjohnh lofs_vfree (ap)
876*54753Sjohnh 	struct vop_vfree_args *ap;
877*54753Sjohnh {
878*54753Sjohnh 
879*54753Sjohnh 	return;
880*54753Sjohnh }
881*54753Sjohnh 
882*54753Sjohnh /*
883*54753Sjohnh  * LOFS file truncation.
884*54753Sjohnh  */
885*54753Sjohnh lofs_truncate (ap)
886*54753Sjohnh 	struct vop_truncate_args *ap;
887*54753Sjohnh {
888*54753Sjohnh 
889*54753Sjohnh 	/* Use lofs_setattr */
890*54753Sjohnh 	printf("lofs_truncate: need to implement!!");
891*54753Sjohnh 	return (EOPNOTSUPP);
892*54753Sjohnh }
893*54753Sjohnh 
894*54753Sjohnh /*
895*54753Sjohnh  * LOFS update.
896*54753Sjohnh  */
897*54753Sjohnh lofs_update (ap)
898*54753Sjohnh 	struct vop_update_args *ap;
899*54753Sjohnh {
900*54753Sjohnh 
901*54753Sjohnh 	/* Use lofs_setattr */
902*54753Sjohnh 	printf("lofs_update: need to implement!!");
903*54753Sjohnh 	return (EOPNOTSUPP);
904*54753Sjohnh }
905*54753Sjohnh 
906*54753Sjohnh /*
907*54753Sjohnh  * LOFS bwrite
908*54753Sjohnh  */
909*54753Sjohnh lofs_bwrite (ap)
910*54753Sjohnh 	struct vop_bwrite_args *ap;
911*54753Sjohnh {
912*54753Sjohnh 	return (EOPNOTSUPP);
913*54753Sjohnh }
914*54753Sjohnh 
915*54753Sjohnh /*
916*54753Sjohnh  * Global vfs data structures for ufs
917*54753Sjohnh  */
918*54753Sjohnh int (**lofs_vnodeop_p)();
919*54753Sjohnh struct vnodeopv_entry_desc lofs_vnodeop_entries[] = {
920*54753Sjohnh 	{ &vop_default_desc, vn_default_error },
921*54753Sjohnh 	{ &vop_lookup_desc, lofs_lookup },		/* lookup */
922*54753Sjohnh 	{ &vop_create_desc, lofs_create },		/* create */
923*54753Sjohnh 	{ &vop_mknod_desc, lofs_mknod },		/* mknod */
924*54753Sjohnh 	{ &vop_open_desc, lofs_open },		/* open */
925*54753Sjohnh 	{ &vop_close_desc, lofs_close },		/* close */
926*54753Sjohnh 	{ &vop_access_desc, lofs_access },		/* access */
927*54753Sjohnh 	{ &vop_getattr_desc, lofs_getattr },		/* getattr */
928*54753Sjohnh 	{ &vop_setattr_desc, lofs_setattr },		/* setattr */
929*54753Sjohnh 	{ &vop_read_desc, lofs_read },		/* read */
930*54753Sjohnh 	{ &vop_write_desc, lofs_write },		/* write */
931*54753Sjohnh 	{ &vop_ioctl_desc, lofs_ioctl },		/* ioctl */
932*54753Sjohnh 	{ &vop_select_desc, lofs_select },		/* select */
933*54753Sjohnh 	{ &vop_mmap_desc, lofs_mmap },		/* mmap */
934*54753Sjohnh 	{ &vop_fsync_desc, lofs_fsync },		/* fsync */
935*54753Sjohnh 	{ &vop_seek_desc, lofs_seek },		/* seek */
936*54753Sjohnh 	{ &vop_remove_desc, lofs_remove },		/* remove */
937*54753Sjohnh 	{ &vop_link_desc, lofs_link },		/* link */
938*54753Sjohnh 	{ &vop_rename_desc, lofs_rename },		/* rename */
939*54753Sjohnh 	{ &vop_mkdir_desc, lofs_mkdir },		/* mkdir */
940*54753Sjohnh 	{ &vop_rmdir_desc, lofs_rmdir },		/* rmdir */
941*54753Sjohnh 	{ &vop_symlink_desc, lofs_symlink },		/* symlink */
942*54753Sjohnh 	{ &vop_readdir_desc, lofs_readdir },		/* readdir */
943*54753Sjohnh 	{ &vop_readlink_desc, lofs_readlink },		/* readlink */
944*54753Sjohnh 	{ &vop_abortop_desc, lofs_abortop },		/* abortop */
945*54753Sjohnh 	{ &vop_inactive_desc, lofs_inactive },		/* inactive */
946*54753Sjohnh 	{ &vop_reclaim_desc, lofs_reclaim },		/* reclaim */
947*54753Sjohnh 	{ &vop_lock_desc, lofs_lock },		/* lock */
948*54753Sjohnh 	{ &vop_unlock_desc, lofs_unlock },		/* unlock */
949*54753Sjohnh 	{ &vop_bmap_desc, lofs_bmap },		/* bmap */
950*54753Sjohnh 	{ &vop_strategy_desc, lofs_strategy },		/* strategy */
951*54753Sjohnh 	{ &vop_print_desc, lofs_print },		/* print */
952*54753Sjohnh 	{ &vop_islocked_desc, lofs_islocked },		/* islocked */
953*54753Sjohnh 	{ &vop_advlock_desc, lofs_advlock },		/* advlock */
954*54753Sjohnh 	{ &vop_blkatoff_desc, lofs_blkatoff },		/* blkatoff */
955*54753Sjohnh 	{ &vop_vget_desc, lofs_vget },		/* vget */
956*54753Sjohnh 	{ &vop_valloc_desc, lofs_valloc },		/* valloc */
957*54753Sjohnh 	{ &vop_vfree_desc, lofs_vfree },		/* vfree */
958*54753Sjohnh 	{ &vop_truncate_desc, lofs_truncate },		/* truncate */
959*54753Sjohnh 	{ &vop_update_desc, lofs_update },		/* update */
960*54753Sjohnh 	{ &vop_bwrite_desc, lofs_bwrite },		/* bwrite */
961*54753Sjohnh 	{ (struct vnodeop_desc*)NULL, (int(*)())NULL }
962*54753Sjohnh };
963*54753Sjohnh struct vnodeopv_desc lofs_vnodeop_opv_desc =
964*54753Sjohnh 	{ &lofs_vnodeop_p, lofs_vnodeop_entries };
965