xref: /csrg-svn/sys/miscfs/nullfs/null_vnops.c (revision 54754)
154753Sjohnh /*
254753Sjohnh  * Copyright (c) 1992 The Regents of the University of California
354753Sjohnh  * Copyright (c) 1990, 1992 Jan-Simon Pendry
454753Sjohnh  * All rights reserved.
554753Sjohnh  *
654753Sjohnh  * This code is derived from software donated to Berkeley by
754753Sjohnh  * Jan-Simon Pendry.
854753Sjohnh  *
954753Sjohnh  * %sccs.include.redist.c%
1054753Sjohnh  *
1154753Sjohnh  *	@(#)lofs_vnops.c	1.2 (Berkeley) 6/18/92
1254753Sjohnh  *
1354753Sjohnh  * $Id: lofs_vnops.c,v 1.11 1992/05/30 10:05:43 jsp Exp jsp $
1454753Sjohnh  */
1554753Sjohnh 
1654753Sjohnh /*
17*54754Sjohnh  * Null layer Filesystem
1854753Sjohnh  */
1954753Sjohnh 
2054753Sjohnh #include <sys/param.h>
2154753Sjohnh #include <sys/systm.h>
2254753Sjohnh #include <sys/proc.h>
2354753Sjohnh #include <sys/time.h>
2454753Sjohnh #include <sys/types.h>
2554753Sjohnh #include <sys/vnode.h>
2654753Sjohnh #include <sys/mount.h>
2754753Sjohnh #include <sys/namei.h>
2854753Sjohnh #include <sys/malloc.h>
2954753Sjohnh #include <sys/buf.h>
3054753Sjohnh #include <lofs/lofs.h>
3154753Sjohnh 
3254753Sjohnh /*
3354753Sjohnh  * Basic strategy: as usual, do as little work as possible.
3454753Sjohnh  * Nothing is ever locked in the lofs'ed filesystem, all
3554753Sjohnh  * locks are held in the underlying filesystems.
3654753Sjohnh  */
3754753Sjohnh 
3854753Sjohnh /*
3954753Sjohnh  * Save a vnode and replace with
4054753Sjohnh  * the lofs'ed one
4154753Sjohnh  */
4254753Sjohnh #define PUSHREF(v, nd) \
4354753Sjohnh { \
4454753Sjohnh 	struct { struct vnode *vnp; } v; \
4554753Sjohnh 	v.vnp = (nd); \
46*54754Sjohnh 	(nd) = NULLTOLOWERVP(v.vnp)
4754753Sjohnh 
4854753Sjohnh /*
4954753Sjohnh  * Undo the PUSHREF
5054753Sjohnh  */
5154753Sjohnh #define POP(v, nd) \
5254753Sjohnh 	\
5354753Sjohnh 	(nd) = v.vnp; \
5454753Sjohnh }
5554753Sjohnh 
5654753Sjohnh 
5754753Sjohnh /*
5854753Sjohnh  * vp is the current namei directory
5954753Sjohnh  * ndp is the name to locate in that directory...
6054753Sjohnh  */
61*54754Sjohnh null_lookup (ap)
6254753Sjohnh 	struct vop_lookup_args *ap;
6354753Sjohnh {
6454753Sjohnh 	USES_VOP_LOOKUP;
6554753Sjohnh 	struct vnode *dvp = ap->a_dvp;
6654753Sjohnh 	struct vnode *newvp;
6754753Sjohnh 	struct vnode *targetdvp;
6854753Sjohnh 	int error;
6954753Sjohnh 	int flag = ap->a_cnp->cn_nameiop /*& OPMASK*/;
7054753Sjohnh 
71*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
72*54754Sjohnh 	printf("null_lookup(ap->a_dvp = %x->%x, \"%s\", op = %d)\n",
73*54754Sjohnh 		dvp, NULLTOLOWERVP(dvp), ap->a_cnp->cn_nameptr, flag);
7454753Sjohnh #endif
7554753Sjohnh 
7654753Sjohnh 	/*
7754753Sjohnh 	 * (ap->a_dvp) was locked when passed in, and it will be replaced
7854753Sjohnh 	 * with the target vnode, BUT that will already have been
79*54754Sjohnh 	 * locked when (ap->a_dvp) was locked [see null_lock].  all that
8054753Sjohnh 	 * must be done here is to keep track of reference counts.
8154753Sjohnh 	 */
82*54754Sjohnh 	targetdvp = NULLTOLOWERVP(dvp);
8354753Sjohnh 	/*VREF(targetdvp);*/
84*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
8554753Sjohnh 	vprint("lofs VOP_LOOKUP", targetdvp);
8654753Sjohnh #endif
8754753Sjohnh 
8854753Sjohnh 	/*
8954753Sjohnh 	 * Call lookup on the looped vnode
9054753Sjohnh 	 */
9154753Sjohnh 	error = VOP_LOOKUP(targetdvp, &newvp, ap->a_cnp);
9254753Sjohnh 	/*vrele(targetdvp);*/
9354753Sjohnh 
9454753Sjohnh 	if (error) {
9554753Sjohnh 		*ap->a_vpp = NULLVP;
96*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
97*54754Sjohnh 		printf("null_lookup(%x->%x) = %d\n", dvp, NULLTOLOWERVP(dvp), error);
9854753Sjohnh #endif
9954753Sjohnh 		return (error);
10054753Sjohnh 	}
101*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
102*54754Sjohnh 	printf("null_lookup(%x->%x) = OK\n", dvp, NULLTOLOWERVP(dvp));
10354753Sjohnh #endif
10454753Sjohnh 
10554753Sjohnh 	*ap->a_vpp = newvp;
10654753Sjohnh 
10754753Sjohnh 	/*
10854753Sjohnh 	 * If we just found a directory then make
10954753Sjohnh 	 * a loopback node for it and return the loopback
11054753Sjohnh 	 * instead of the real vnode.  Otherwise simply
11154753Sjohnh 	 * return the aliased directory and vnode.
11254753Sjohnh 	 */
11354753Sjohnh 	if (newvp && newvp->v_type == VDIR && flag == LOOKUP) {
114*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
115*54754Sjohnh 		printf("null_lookup: found VDIR\n");
11654753Sjohnh #endif
11754753Sjohnh 		/*
11854753Sjohnh 		 * At this point, newvp is the vnode to be looped.
11954753Sjohnh 		 * Activate a loopback and return the looped vnode.
12054753Sjohnh 		 */
121*54754Sjohnh 		return (make_null_node(dvp->v_mount, ap->a_vpp));
12254753Sjohnh 	}
12354753Sjohnh 
124*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
125*54754Sjohnh 	printf("null_lookup: not VDIR\n");
12654753Sjohnh #endif
12754753Sjohnh 
12854753Sjohnh 	return (0);
12954753Sjohnh }
13054753Sjohnh 
13154753Sjohnh /*
13254753Sjohnh  * this = ni_dvp
13354753Sjohnh  * ni_dvp references the locked directory.
13454753Sjohnh  * ni_vp is NULL.
13554753Sjohnh  */
136*54754Sjohnh null_mknod (ap)
13754753Sjohnh 	struct vop_mknod_args *ap;
13854753Sjohnh {
13954753Sjohnh 	USES_VOP_MKNOD;
14054753Sjohnh 	int error;
14154753Sjohnh 
142*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
143*54754Sjohnh 	printf("null_mknod(vp = %x->%x)\n", ap->a_dvp, NULLTOLOWERVP(ap->a_dvp));
14454753Sjohnh #endif
14554753Sjohnh 
14654753Sjohnh 	PUSHREF(xdvp, ap->a_dvp);
14754753Sjohnh 	VREF(ap->a_dvp);
14854753Sjohnh 
14954753Sjohnh 	error = VOP_MKNOD(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap);
15054753Sjohnh 
15154753Sjohnh 	POP(xdvp, ap->a_dvp);
15254753Sjohnh 	vrele(ap->a_dvp);
15354753Sjohnh 
15454753Sjohnh 	return (error);
15554753Sjohnh }
15654753Sjohnh 
15754753Sjohnh /*
15854753Sjohnh  * this = ni_dvp;
15954753Sjohnh  * ni_dvp references the locked directory
16054753Sjohnh  * ni_vp is NULL.
16154753Sjohnh  */
162*54754Sjohnh null_create (ap)
16354753Sjohnh 	struct vop_create_args *ap;
16454753Sjohnh {
16554753Sjohnh 	USES_VOP_CREATE;
16654753Sjohnh 	int error;
16754753Sjohnh 
168*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
169*54754Sjohnh 	printf("null_create(ap->a_dvp = %x->%x)\n", ap->a_dvp, NULLTOLOWERVP(ap->a_dvp));
17054753Sjohnh #endif
17154753Sjohnh 
17254753Sjohnh 	PUSHREF(xdvp, ap->a_dvp);
17354753Sjohnh 	VREF(ap->a_dvp);
17454753Sjohnh 
17554753Sjohnh 	error = VOP_CREATE(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap);
17654753Sjohnh 
17754753Sjohnh 	POP(xdvp, ap->a_dvp);
17854753Sjohnh 	vrele(ap->a_dvp);
17954753Sjohnh 
180*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
181*54754Sjohnh 	printf("null_create(ap->a_dvp = %x->%x)\n", ap->a_dvp, NULLTOLOWERVP(ap->a_dvp));
18254753Sjohnh #endif
18354753Sjohnh 
18454753Sjohnh 	return (error);
18554753Sjohnh }
18654753Sjohnh 
187*54754Sjohnh null_open (ap)
18854753Sjohnh 	struct vop_open_args *ap;
18954753Sjohnh {
19054753Sjohnh 	USES_VOP_OPEN;
191*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
192*54754Sjohnh 	printf("null_open(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
19354753Sjohnh #endif
19454753Sjohnh 
195*54754Sjohnh 	return VOP_OPEN(NULLTOLOWERVP(ap->a_vp), ap->a_mode, ap->a_cred, ap->a_p);
19654753Sjohnh }
19754753Sjohnh 
198*54754Sjohnh null_close (ap)
19954753Sjohnh 	struct vop_close_args *ap;
20054753Sjohnh {
20154753Sjohnh 	USES_VOP_CLOSE;
202*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
203*54754Sjohnh 	printf("null_close(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
20454753Sjohnh #endif
20554753Sjohnh 
206*54754Sjohnh 	return VOP_CLOSE(NULLTOLOWERVP(ap->a_vp), ap->a_fflag, ap->a_cred, ap->a_p);
20754753Sjohnh }
20854753Sjohnh 
209*54754Sjohnh null_access (ap)
21054753Sjohnh 	struct vop_access_args *ap;
21154753Sjohnh {
21254753Sjohnh 	USES_VOP_ACCESS;
213*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
214*54754Sjohnh 	printf("null_access(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
21554753Sjohnh #endif
21654753Sjohnh 
217*54754Sjohnh 	return VOP_ACCESS(NULLTOLOWERVP(ap->a_vp), ap->a_mode, ap->a_cred, ap->a_p);
21854753Sjohnh }
21954753Sjohnh 
220*54754Sjohnh null_getattr (ap)
22154753Sjohnh 	struct vop_getattr_args *ap;
22254753Sjohnh {
22354753Sjohnh 	USES_VOP_GETATTR;
22454753Sjohnh 	int error;
22554753Sjohnh 
226*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
227*54754Sjohnh 	printf("null_getattr(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
22854753Sjohnh #endif
22954753Sjohnh 
23054753Sjohnh 	/*
23154753Sjohnh 	 * Get the stats from the underlying filesystem
23254753Sjohnh 	 */
233*54754Sjohnh 	error = VOP_GETATTR(NULLTOLOWERVP(ap->a_vp), ap->a_vap, ap->a_cred, ap->a_p);
23454753Sjohnh 	if (error)
23554753Sjohnh 		return (error);
23654753Sjohnh 	/*
23754753Sjohnh 	 * and replace the fsid field with the loopback number
23854753Sjohnh 	 * to preserve the namespace.
23954753Sjohnh 	 */
24054753Sjohnh 	ap->a_vap->va_fsid = ap->a_vp->v_mount->mnt_stat.f_fsid.val[0];
24154753Sjohnh 	return (0);
24254753Sjohnh }
24354753Sjohnh 
244*54754Sjohnh null_setattr (ap)
24554753Sjohnh 	struct vop_setattr_args *ap;
24654753Sjohnh {
24754753Sjohnh 	USES_VOP_SETATTR;
248*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
249*54754Sjohnh 	printf("null_setattr(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
25054753Sjohnh #endif
25154753Sjohnh 
252*54754Sjohnh 	return VOP_SETATTR(NULLTOLOWERVP(ap->a_vp), ap->a_vap, ap->a_cred, ap->a_p);
25354753Sjohnh }
25454753Sjohnh 
255*54754Sjohnh null_read (ap)
25654753Sjohnh 	struct vop_read_args *ap;
25754753Sjohnh {
25854753Sjohnh 	USES_VOP_READ;
259*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
260*54754Sjohnh 	printf("null_read(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
26154753Sjohnh #endif
26254753Sjohnh 
263*54754Sjohnh 	return VOP_READ(NULLTOLOWERVP(ap->a_vp), ap->a_uio, ap->a_ioflag, ap->a_cred);
26454753Sjohnh }
26554753Sjohnh 
266*54754Sjohnh null_write (ap)
26754753Sjohnh 	struct vop_write_args *ap;
26854753Sjohnh {
26954753Sjohnh 	USES_VOP_WRITE;
270*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
271*54754Sjohnh 	printf("null_write(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
27254753Sjohnh #endif
27354753Sjohnh 
274*54754Sjohnh 	return VOP_WRITE(NULLTOLOWERVP(ap->a_vp), ap->a_uio, ap->a_ioflag, ap->a_cred);
27554753Sjohnh }
27654753Sjohnh 
277*54754Sjohnh null_ioctl (ap)
27854753Sjohnh 	struct vop_ioctl_args *ap;
27954753Sjohnh {
28054753Sjohnh 	USES_VOP_IOCTL;
281*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
282*54754Sjohnh 	printf("null_ioctl(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
28354753Sjohnh #endif
28454753Sjohnh 
285*54754Sjohnh 	return VOP_IOCTL(NULLTOLOWERVP(ap->a_vp), ap->a_command, ap->a_data, ap->a_fflag, ap->a_cred, ap->a_p);
28654753Sjohnh }
28754753Sjohnh 
288*54754Sjohnh null_select (ap)
28954753Sjohnh 	struct vop_select_args *ap;
29054753Sjohnh {
29154753Sjohnh 	USES_VOP_SELECT;
292*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
293*54754Sjohnh 	printf("null_select(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
29454753Sjohnh #endif
29554753Sjohnh 
296*54754Sjohnh 	return VOP_SELECT(NULLTOLOWERVP(ap->a_vp), ap->a_which, ap->a_fflags, ap->a_cred, ap->a_p);
29754753Sjohnh }
29854753Sjohnh 
299*54754Sjohnh null_mmap (ap)
30054753Sjohnh 	struct vop_mmap_args *ap;
30154753Sjohnh {
30254753Sjohnh 	USES_VOP_MMAP;
303*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
304*54754Sjohnh 	printf("null_mmap(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
30554753Sjohnh #endif
30654753Sjohnh 
307*54754Sjohnh 	return VOP_MMAP(NULLTOLOWERVP(ap->a_vp), ap->a_fflags, ap->a_cred, ap->a_p);
30854753Sjohnh }
30954753Sjohnh 
310*54754Sjohnh null_fsync (ap)
31154753Sjohnh 	struct vop_fsync_args *ap;
31254753Sjohnh {
31354753Sjohnh 	USES_VOP_FSYNC;
314*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
315*54754Sjohnh 	printf("null_fsync(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
31654753Sjohnh #endif
31754753Sjohnh 
318*54754Sjohnh 	return VOP_FSYNC(NULLTOLOWERVP(ap->a_vp), ap->a_fflags, ap->a_cred, ap->a_waitfor, ap->a_p);
31954753Sjohnh }
32054753Sjohnh 
321*54754Sjohnh null_seek (ap)
32254753Sjohnh 	struct vop_seek_args *ap;
32354753Sjohnh {
32454753Sjohnh 	USES_VOP_SEEK;
325*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
326*54754Sjohnh 	printf("null_seek(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
32754753Sjohnh #endif
32854753Sjohnh 
329*54754Sjohnh 	return VOP_SEEK(NULLTOLOWERVP(ap->a_vp), ap->a_oldoff, ap->a_newoff, ap->a_cred);
33054753Sjohnh }
33154753Sjohnh 
332*54754Sjohnh null_remove (ap)
33354753Sjohnh 	struct vop_remove_args *ap;
33454753Sjohnh {
33554753Sjohnh 	USES_VOP_REMOVE;
33654753Sjohnh 	int error;
33754753Sjohnh 
338*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
339*54754Sjohnh 	printf("null_remove(ap->a_vp = %x->%x)\n", ap->a_dvp, NULLTOLOWERVP(ap->a_dvp));
34054753Sjohnh #endif
34154753Sjohnh 
34254753Sjohnh 	PUSHREF(xdvp, ap->a_dvp);
34354753Sjohnh 	VREF(ap->a_dvp);
34454753Sjohnh 	PUSHREF(xvp, ap->a_vp);
34554753Sjohnh 	VREF(ap->a_vp);
34654753Sjohnh 
34754753Sjohnh 	error = VOP_REMOVE(ap->a_dvp, ap->a_vp, ap->a_cnp);
34854753Sjohnh 
34954753Sjohnh 	POP(xvp, ap->a_vp);
35054753Sjohnh 	vrele(ap->a_vp);
35154753Sjohnh 	POP(xdvp, ap->a_dvp);
35254753Sjohnh 	vrele(ap->a_dvp);
35354753Sjohnh 
35454753Sjohnh 	return (error);
35554753Sjohnh }
35654753Sjohnh 
35754753Sjohnh /*
35854753Sjohnh  * vp is this.
35954753Sjohnh  * ni_dvp is the locked parent of the target.
36054753Sjohnh  * ni_vp is NULL.
36154753Sjohnh  */
362*54754Sjohnh null_link (ap)
36354753Sjohnh 	struct vop_link_args *ap;
36454753Sjohnh {
36554753Sjohnh 	USES_VOP_LINK;
36654753Sjohnh 	int error;
36754753Sjohnh 
368*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
369*54754Sjohnh 	printf("null_link(ap->a_tdvp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
37054753Sjohnh #endif
37154753Sjohnh 
37254753Sjohnh 	PUSHREF(xdvp, ap->a_vp);
37354753Sjohnh 	VREF(ap->a_vp);
37454753Sjohnh 
375*54754Sjohnh 	error = VOP_LINK(ap->a_vp, NULLTOLOWERVP(ap->a_tdvp), ap->a_cnp);
37654753Sjohnh 
37754753Sjohnh 	POP(xdvp, ap->a_vp);
37854753Sjohnh 	vrele(ap->a_vp);
37954753Sjohnh 
38054753Sjohnh 	return (error);
38154753Sjohnh }
38254753Sjohnh 
383*54754Sjohnh null_rename (ap)
38454753Sjohnh 	struct vop_rename_args *ap;
38554753Sjohnh {
38654753Sjohnh 	USES_VOP_RENAME;
38754753Sjohnh 	struct vnode *fvp, *tvp;
38854753Sjohnh 	struct vnode *tdvp;
38954753Sjohnh #if 0
39054753Sjohnh 	struct vnode *fsvp, *tsvp;
39154753Sjohnh #endif
39254753Sjohnh 	int error;
39354753Sjohnh 
394*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
395*54754Sjohnh 	printf("null_rename(fdvp = %x->%x)\n", ap->a_fdvp, NULLTOLOWERVP(ap->a_fdvp));
396*54754Sjohnh 	/*printf("null_rename(tdvp = %x->%x)\n", tndp->ni_dvp, NULLTOLOWERVP(tndp->ni_dvp));*/
39754753Sjohnh #endif
39854753Sjohnh 
399*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
400*54754Sjohnh 	printf("null_rename - switch source dvp\n");
40154753Sjohnh #endif
40254753Sjohnh 	/*
40354753Sjohnh 	 * Switch source directory to point to lofsed vnode
40454753Sjohnh 	 */
40554753Sjohnh 	PUSHREF(fdvp, ap->a_fdvp);
40654753Sjohnh 	VREF(ap->a_fdvp);
40754753Sjohnh 
408*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
409*54754Sjohnh 	printf("null_rename - switch source vp\n");
41054753Sjohnh #endif
41154753Sjohnh 	/*
41254753Sjohnh 	 * And source object if it is lofsed...
41354753Sjohnh 	 */
41454753Sjohnh 	fvp = ap->a_fvp;
415*54754Sjohnh 	if (fvp && fvp->v_op == null_vnodeop_p) {
416*54754Sjohnh 		ap->a_fvp = NULLTOLOWERVP(fvp);
41754753Sjohnh 		VREF(ap->a_fvp);
41854753Sjohnh 	} else {
41954753Sjohnh 		fvp = 0;
42054753Sjohnh 	}
42154753Sjohnh 
42254753Sjohnh #if 0
423*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
424*54754Sjohnh 	printf("null_rename - switch source start vp\n");
42554753Sjohnh #endif
42654753Sjohnh 	/*
42754753Sjohnh 	 * And source startdir object if it is lofsed...
42854753Sjohnh 	 */
42954753Sjohnh 	fsvp = fndp->ni_startdir;
430*54754Sjohnh 	if (fsvp && fsvp->v_op == null_vnodeop_p) {
431*54754Sjohnh 		fndp->ni_startdir = NULLTOLOWERVP(fsvp);
43254753Sjohnh 		VREF(fndp->ni_startdir);
43354753Sjohnh 	} else {
43454753Sjohnh 		fsvp = 0;
43554753Sjohnh 	}
43654753Sjohnh #endif
43754753Sjohnh 
438*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
439*54754Sjohnh 	printf("null_rename - switch target dvp\n");
44054753Sjohnh #endif
44154753Sjohnh 	/*
44254753Sjohnh  	 * Switch target directory to point to lofsed vnode
44354753Sjohnh 	 */
44454753Sjohnh 	tdvp = ap->a_tdvp;
445*54754Sjohnh 	if (tdvp && tdvp->v_op == null_vnodeop_p) {
446*54754Sjohnh 		ap->a_tdvp = NULLTOLOWERVP(tdvp);
44754753Sjohnh 		VREF(ap->a_tdvp);
44854753Sjohnh 	} else {
44954753Sjohnh 		tdvp = 0;
45054753Sjohnh 	}
45154753Sjohnh 
452*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
453*54754Sjohnh 	printf("null_rename - switch target vp\n");
45454753Sjohnh #endif
45554753Sjohnh 	/*
45654753Sjohnh 	 * And target object if it is lofsed...
45754753Sjohnh 	 */
45854753Sjohnh 	tvp = ap->a_tvp;
459*54754Sjohnh 	if (tvp && tvp->v_op == null_vnodeop_p) {
460*54754Sjohnh 		ap->a_tvp = NULLTOLOWERVP(tvp);
46154753Sjohnh 		VREF(ap->a_tvp);
46254753Sjohnh 	} else {
46354753Sjohnh 		tvp = 0;
46454753Sjohnh 	}
46554753Sjohnh 
46654753Sjohnh #if 0
467*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
468*54754Sjohnh 	printf("null_rename - switch target start vp\n");
46954753Sjohnh #endif
47054753Sjohnh 	/*
47154753Sjohnh 	 * And target startdir object if it is lofsed...
47254753Sjohnh 	 */
47354753Sjohnh 	tsvp = tndp->ni_startdir;
474*54754Sjohnh 	if (tsvp && tsvp->v_op == null_vnodeop_p) {
475*54754Sjohnh 		tndp->ni_startdir = NULLTOLOWERVP(fsvp);
47654753Sjohnh 		VREF(tndp->ni_startdir);
47754753Sjohnh 	} else {
47854753Sjohnh 		tsvp = 0;
47954753Sjohnh 	}
48054753Sjohnh #endif
48154753Sjohnh 
482*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
483*54754Sjohnh 	printf("null_rename - VOP_RENAME(%x, %x, %x, %x)\n",
48454753Sjohnh 		ap->a_fdvp, ap->a_fvp, ap->a_tdvp, ap->a_tvp);
48554753Sjohnh 	vprint("ap->a_fdvp", ap->a_fdvp);
48654753Sjohnh 	vprint("ap->a_fvp", ap->a_fvp);
48754753Sjohnh 	vprint("ap->a_tdvp", ap->a_tdvp);
48854753Sjohnh 	if (ap->a_tvp) vprint("ap->a_tvp", ap->a_tvp);
48954753Sjohnh 	DELAY(16000000);
49054753Sjohnh #endif
49154753Sjohnh 
49254753Sjohnh 	error = VOP_RENAME(ap->a_fdvp, ap->a_fvp, ap->a_fcnp, ap->a_tdvp, ap->a_tvp, ap->a_tcnp);
49354753Sjohnh 
49454753Sjohnh 	/*
49554753Sjohnh 	 * Put everything back...
49654753Sjohnh 	 */
49754753Sjohnh 
49854753Sjohnh #if 0
499*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
500*54754Sjohnh 	printf("null_rename - restore target startdir\n");
50154753Sjohnh #endif
50254753Sjohnh 
50354753Sjohnh 	if (tsvp) {
50454753Sjohnh 		if (tndp->ni_startdir)
50554753Sjohnh 			vrele(tndp->ni_startdir);
50654753Sjohnh 		tndp->ni_startdir = tsvp;
50754753Sjohnh 	}
50854753Sjohnh #endif
50954753Sjohnh 
510*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
511*54754Sjohnh 	printf("null_rename - restore target vp\n");
51254753Sjohnh #endif
51354753Sjohnh 
51454753Sjohnh 	if (tvp) {
51554753Sjohnh 		ap->a_tvp = tvp;
51654753Sjohnh 		vrele(ap->a_tvp);
51754753Sjohnh 	}
51854753Sjohnh 
519*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
520*54754Sjohnh 	printf("null_rename - restore target dvp\n");
52154753Sjohnh #endif
52254753Sjohnh 
52354753Sjohnh 	if (tdvp) {
52454753Sjohnh 		ap->a_tdvp = tdvp;
52554753Sjohnh 		vrele(ap->a_tdvp);
52654753Sjohnh 	}
52754753Sjohnh 
52854753Sjohnh #if 0
529*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
530*54754Sjohnh 	printf("null_rename - restore source startdir\n");
53154753Sjohnh #endif
53254753Sjohnh 
53354753Sjohnh 	if (fsvp) {
53454753Sjohnh 		if (fndp->ni_startdir)
53554753Sjohnh 			vrele(fndp->ni_startdir);
53654753Sjohnh 		fndp->ni_startdir = fsvp;
53754753Sjohnh 	}
53854753Sjohnh #endif
53954753Sjohnh 
540*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
541*54754Sjohnh 	printf("null_rename - restore source vp\n");
54254753Sjohnh #endif
54354753Sjohnh 
54454753Sjohnh 
54554753Sjohnh 	if (fvp) {
54654753Sjohnh 		ap->a_fvp = fvp;
54754753Sjohnh 		vrele(ap->a_fvp);
54854753Sjohnh 	}
54954753Sjohnh 
550*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
551*54754Sjohnh 	printf("null_rename - restore source dvp\n");
55254753Sjohnh #endif
55354753Sjohnh 
55454753Sjohnh 	POP(fdvp, ap->a_fdvp);
55554753Sjohnh 	vrele(ap->a_fdvp);
55654753Sjohnh 
55754753Sjohnh 	return (error);
55854753Sjohnh }
55954753Sjohnh 
56054753Sjohnh /*
56154753Sjohnh  * ni_dvp is the locked (alias) parent.
56254753Sjohnh  * ni_vp is NULL.
56354753Sjohnh  */
564*54754Sjohnh null_mkdir (ap)
56554753Sjohnh 	struct vop_mkdir_args *ap;
56654753Sjohnh {
56754753Sjohnh 	USES_VOP_MKDIR;
56854753Sjohnh 	int error;
56954753Sjohnh 	struct vnode *dvp = ap->a_dvp;
57054753Sjohnh 	struct vnode *xdvp;
57154753Sjohnh 	struct vnode *newvp;
57254753Sjohnh 
573*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
574*54754Sjohnh 	printf("null_mkdir(vp = %x->%x)\n", dvp, NULLTOLOWERVP(dvp));
57554753Sjohnh #endif
57654753Sjohnh 
57754753Sjohnh 	xdvp = dvp;
578*54754Sjohnh 	dvp = NULLTOLOWERVP(xdvp);
57954753Sjohnh 	/*VREF(dvp);*/
58054753Sjohnh 
58154753Sjohnh 	error = VOP_MKDIR(dvp, &newvp, ap->a_cnp, ap->a_vap);
58254753Sjohnh 
58354753Sjohnh 	if (error) {
58454753Sjohnh 		*ap->a_vpp = NULLVP;
58554753Sjohnh 		/*vrele(xdvp);*/
58654753Sjohnh 		return (error);
58754753Sjohnh 	}
58854753Sjohnh 
58954753Sjohnh 	/*
59054753Sjohnh 	 * Make a new lofs node
59154753Sjohnh 	 */
59254753Sjohnh 	/*VREF(dvp);*/
59354753Sjohnh 
594*54754Sjohnh 	error = make_null_node(dvp->v_mount, &newvp);
59554753Sjohnh 
59654753Sjohnh 	*ap->a_vpp = newvp;
59754753Sjohnh 
59854753Sjohnh 	return (error);
59954753Sjohnh }
60054753Sjohnh 
60154753Sjohnh /*
60254753Sjohnh  * ni_dvp is the locked parent.
60354753Sjohnh  * ni_vp is the entry to be removed.
60454753Sjohnh  */
605*54754Sjohnh null_rmdir (ap)
60654753Sjohnh 	struct vop_rmdir_args *ap;
60754753Sjohnh {
60854753Sjohnh 	USES_VOP_RMDIR;
60954753Sjohnh 	struct vnode *vp = ap->a_vp;
61054753Sjohnh 	struct vnode *dvp = ap->a_dvp;
61154753Sjohnh 	int error;
61254753Sjohnh 
613*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
614*54754Sjohnh 	printf("null_rmdir(dvp = %x->%x)\n", dvp, NULLTOLOWERVP(dvp));
61554753Sjohnh #endif
61654753Sjohnh 
61754753Sjohnh 	PUSHREF(xdvp, dvp);
61854753Sjohnh 	VREF(dvp);
61954753Sjohnh 	PUSHREF(xvp, vp);
62054753Sjohnh 	VREF(vp);
62154753Sjohnh 
62254753Sjohnh 	error = VOP_RMDIR(dvp, vp, ap->a_cnp);
62354753Sjohnh 
62454753Sjohnh 	POP(xvp, vp);
62554753Sjohnh 	vrele(vp);
62654753Sjohnh 	POP(xdvp, dvp);
62754753Sjohnh 	vrele(dvp);
62854753Sjohnh 
62954753Sjohnh 	return (error);
63054753Sjohnh }
63154753Sjohnh 
63254753Sjohnh /*
63354753Sjohnh  * ni_dvp is the locked parent.
63454753Sjohnh  * ni_vp is NULL.
63554753Sjohnh  */
636*54754Sjohnh null_symlink (ap)
63754753Sjohnh 	struct vop_symlink_args *ap;
63854753Sjohnh {
63954753Sjohnh 	USES_VOP_SYMLINK;
64054753Sjohnh 	int error;
64154753Sjohnh 
642*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
643*54754Sjohnh 	printf("VOP_SYMLINK(vp = %x->%x)\n", ap->a_dvp, NULLTOLOWERVP(ap->a_dvp));
64454753Sjohnh #endif
64554753Sjohnh 
64654753Sjohnh 	PUSHREF(xdvp, ap->a_dvp);
64754753Sjohnh 	VREF(ap->a_dvp);
64854753Sjohnh 
64954753Sjohnh 	error = VOP_SYMLINK(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap, ap->a_target);
65054753Sjohnh 
65154753Sjohnh 	POP(xdvp, ap->a_dvp);
65254753Sjohnh 	vrele(ap->a_dvp);
65354753Sjohnh 
65454753Sjohnh 	return (error);
65554753Sjohnh }
65654753Sjohnh 
657*54754Sjohnh null_readdir (ap)
65854753Sjohnh 	struct vop_readdir_args *ap;
65954753Sjohnh {
66054753Sjohnh 	USES_VOP_READDIR;
661*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
662*54754Sjohnh 	printf("null_readdir(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
66354753Sjohnh #endif
66454753Sjohnh 
665*54754Sjohnh 	return VOP_READDIR(NULLTOLOWERVP(ap->a_vp), ap->a_uio, ap->a_cred, ap->a_eofflagp);
66654753Sjohnh }
66754753Sjohnh 
668*54754Sjohnh null_readlink (ap)
66954753Sjohnh 	struct vop_readlink_args *ap;
67054753Sjohnh {
67154753Sjohnh 	USES_VOP_READLINK;
672*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
673*54754Sjohnh 	printf("null_readlink(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
67454753Sjohnh #endif
67554753Sjohnh 
676*54754Sjohnh 	return VOP_READLINK(NULLTOLOWERVP(ap->a_vp), ap->a_uio, ap->a_cred);
67754753Sjohnh }
67854753Sjohnh 
67954753Sjohnh /*
68054753Sjohnh  * Anyone's guess...
68154753Sjohnh  */
682*54754Sjohnh null_abortop (ap)
68354753Sjohnh 	struct vop_abortop_args *ap;
68454753Sjohnh {
68554753Sjohnh 	USES_VOP_ABORTOP;
68654753Sjohnh 	int error;
68754753Sjohnh 
68854753Sjohnh 	PUSHREF(xdvp, ap->a_dvp);
68954753Sjohnh 
69054753Sjohnh 	error = VOP_ABORTOP(ap->a_dvp, ap->a_cnp);
69154753Sjohnh 
69254753Sjohnh 	POP(xdvp, ap->a_dvp);
69354753Sjohnh 
69454753Sjohnh 	return (error);
69554753Sjohnh }
69654753Sjohnh 
697*54754Sjohnh null_inactive (ap)
69854753Sjohnh 	struct vop_inactive_args *ap;
69954753Sjohnh {
70054753Sjohnh 	USES_VOP_INACTIVE;
701*54754Sjohnh 	struct vnode *targetvp = NULLTOLOWERVP(ap->a_vp);
702*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
703*54754Sjohnh 	printf("null_inactive(ap->a_vp = %x->%x)\n", ap->a_vp, targetvp);
70454753Sjohnh #endif
70554753Sjohnh 
70654753Sjohnh #ifdef DIAGNOSTIC
70754753Sjohnh 	{ extern int prtactive;
70854753Sjohnh 	if (prtactive && ap->a_vp->v_usecount != 0)
709*54754Sjohnh 		vprint("null_inactive: pushing active", ap->a_vp);
71054753Sjohnh 	}
71154753Sjohnh #endif
71254753Sjohnh 
71354753Sjohnh 	if (targetvp) {
71454753Sjohnh 		vrele(targetvp);
715*54754Sjohnh 		VTONULLNODE(ap->a_vp)->null_lowervp = 0;
71654753Sjohnh 	}
71754753Sjohnh }
71854753Sjohnh 
719*54754Sjohnh null_reclaim (ap)
72054753Sjohnh 	struct vop_reclaim_args *ap;
72154753Sjohnh {
72254753Sjohnh 	USES_VOP_RECLAIM;
72354753Sjohnh 	struct vnode *targetvp;
724*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
725*54754Sjohnh 	printf("null_reclaim(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
72654753Sjohnh #endif
727*54754Sjohnh 	remque(VTONULLNODE(ap->a_vp));
728*54754Sjohnh 	targetvp = NULLTOLOWERVP(ap->a_vp);
72954753Sjohnh 	if (targetvp) {
73054753Sjohnh 		printf("lofs: delayed vrele of %x\n", targetvp);
73154753Sjohnh 		vrele(targetvp);	/* XXX should never happen */
73254753Sjohnh 	}
73354753Sjohnh 	FREE(ap->a_vp->v_data, M_TEMP);
73454753Sjohnh 	ap->a_vp->v_data = 0;
73554753Sjohnh 	return (0);
73654753Sjohnh }
73754753Sjohnh 
738*54754Sjohnh null_lock (ap)
73954753Sjohnh 	struct vop_lock_args *ap;
74054753Sjohnh {
74154753Sjohnh 	USES_VOP_LOCK;
74254753Sjohnh 	int error;
743*54754Sjohnh 	struct vnode *targetvp = NULLTOLOWERVP(ap->a_vp);
74454753Sjohnh 
745*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
746*54754Sjohnh 	printf("null_lock(ap->a_vp = %x->%x)\n", ap->a_vp, targetvp);
747*54754Sjohnh 	/*vprint("null_lock ap->a_vp", ap->a_vp);
74854753Sjohnh 	if (targetvp)
749*54754Sjohnh 		vprint("null_lock ->ap->a_vp", targetvp);
75054753Sjohnh 	else
751*54754Sjohnh 		printf("null_lock ->ap->a_vp = NIL\n");*/
75254753Sjohnh #endif
75354753Sjohnh 
75454753Sjohnh 	if (targetvp) {
75554753Sjohnh 		error = VOP_LOCK(targetvp);
75654753Sjohnh 		if (error)
75754753Sjohnh 			return (error);
75854753Sjohnh 	}
75954753Sjohnh 
76054753Sjohnh 	return (0);
76154753Sjohnh }
76254753Sjohnh 
763*54754Sjohnh null_unlock (ap)
76454753Sjohnh 	struct vop_unlock_args *ap;
76554753Sjohnh {
76654753Sjohnh 	USES_VOP_UNLOCK;
767*54754Sjohnh 	struct vnode *targetvp = NULLTOLOWERVP(ap->a_vp);
76854753Sjohnh 
769*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
770*54754Sjohnh 	printf("null_unlock(ap->a_vp = %x->%x)\n", ap->a_vp, targetvp);
77154753Sjohnh #endif
77254753Sjohnh 
77354753Sjohnh 	if (targetvp)
77454753Sjohnh 		return (VOP_UNLOCK(targetvp));
77554753Sjohnh 	return (0);
77654753Sjohnh }
77754753Sjohnh 
778*54754Sjohnh null_bmap (ap)
77954753Sjohnh 	struct vop_bmap_args *ap;
78054753Sjohnh {
78154753Sjohnh 	USES_VOP_BMAP;
782*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
783*54754Sjohnh 	printf("null_bmap(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp));
78454753Sjohnh #endif
78554753Sjohnh 
786*54754Sjohnh 	return VOP_BMAP(NULLTOLOWERVP(ap->a_vp), ap->a_bn, ap->a_vpp, ap->a_bnp);
78754753Sjohnh }
78854753Sjohnh 
789*54754Sjohnh null_strategy (ap)
79054753Sjohnh 	struct vop_strategy_args *ap;
79154753Sjohnh {
79254753Sjohnh 	USES_VOP_STRATEGY;
79354753Sjohnh 	int error;
79454753Sjohnh 
795*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC
796*54754Sjohnh 	printf("null_strategy(vp = %x->%x)\n", ap->a_bp->b_vp, NULLTOLOWERVP(ap->a_bp->b_vp));
79754753Sjohnh #endif
79854753Sjohnh 
79954753Sjohnh 	PUSHREF(vp, ap->a_bp->b_vp);
80054753Sjohnh 
80154753Sjohnh 	error = VOP_STRATEGY(ap->a_bp);
80254753Sjohnh 
80354753Sjohnh 	POP(vp, ap->a_bp->b_vp);
80454753Sjohnh 
80554753Sjohnh 	return (error);
80654753Sjohnh }
80754753Sjohnh 
808*54754Sjohnh null_print (ap)
80954753Sjohnh 	struct vop_print_args *ap;
81054753Sjohnh {
81154753Sjohnh 	USES_VOP_PRINT;
812*54754Sjohnh 	struct vnode *targetvp = NULLTOLOWERVP(ap->a_vp);
81354753Sjohnh 	printf("tag VT_LOFS ref ");
81454753Sjohnh 	if (targetvp)
81554753Sjohnh 		return (VOP_PRINT(targetvp));
81654753Sjohnh 	printf("NULLVP\n");
81754753Sjohnh 	return (0);
81854753Sjohnh }
81954753Sjohnh 
820*54754Sjohnh null_islocked (ap)
82154753Sjohnh 	struct vop_islocked_args *ap;
82254753Sjohnh {
82354753Sjohnh 	USES_VOP_ISLOCKED;
824*54754Sjohnh 	struct vnode *targetvp = NULLTOLOWERVP(ap->a_vp);
82554753Sjohnh 	if (targetvp)
82654753Sjohnh 		return (VOP_ISLOCKED(targetvp));
82754753Sjohnh 	return (0);
82854753Sjohnh }
82954753Sjohnh 
830*54754Sjohnh null_advlock (ap)
83154753Sjohnh 	struct vop_advlock_args *ap;
83254753Sjohnh {
83354753Sjohnh 	USES_VOP_ADVLOCK;
834*54754Sjohnh 	return VOP_ADVLOCK(NULLTOLOWERVP(ap->a_vp), ap->a_id, ap->a_op, ap->a_fl, ap->a_flags);
83554753Sjohnh }
83654753Sjohnh 
83754753Sjohnh /*
83854753Sjohnh  * LOFS directory offset lookup.
83954753Sjohnh  * Currently unsupported.
84054753Sjohnh  */
841*54754Sjohnh null_blkatoff (ap)
84254753Sjohnh 	struct vop_blkatoff_args *ap;
84354753Sjohnh {
84454753Sjohnh 
84554753Sjohnh 	return (EOPNOTSUPP);
84654753Sjohnh }
84754753Sjohnh 
84854753Sjohnh /*
84954753Sjohnh  * LOFS flat namespace lookup.
85054753Sjohnh  * Currently unsupported.
85154753Sjohnh  */
852*54754Sjohnh null_vget (ap)
85354753Sjohnh 	struct vop_vget_args *ap;
85454753Sjohnh {
85554753Sjohnh 
85654753Sjohnh 	return (EOPNOTSUPP);
85754753Sjohnh }
85854753Sjohnh 
85954753Sjohnh /*
86054753Sjohnh  * LOFS flat namespace allocation.
86154753Sjohnh  * Currently unsupported.
86254753Sjohnh  */
863*54754Sjohnh null_valloc (ap)
86454753Sjohnh 	struct vop_valloc_args *ap;
86554753Sjohnh {
86654753Sjohnh 
86754753Sjohnh 	return (EOPNOTSUPP);
86854753Sjohnh }
86954753Sjohnh 
87054753Sjohnh /*
87154753Sjohnh  * LOFS flat namespace free.
87254753Sjohnh  * Currently unsupported.
87354753Sjohnh  */
87454753Sjohnh /*void*/
875*54754Sjohnh null_vfree (ap)
87654753Sjohnh 	struct vop_vfree_args *ap;
87754753Sjohnh {
87854753Sjohnh 
87954753Sjohnh 	return;
88054753Sjohnh }
88154753Sjohnh 
88254753Sjohnh /*
88354753Sjohnh  * LOFS file truncation.
88454753Sjohnh  */
885*54754Sjohnh null_truncate (ap)
88654753Sjohnh 	struct vop_truncate_args *ap;
88754753Sjohnh {
88854753Sjohnh 
889*54754Sjohnh 	/* Use null_setattr */
890*54754Sjohnh 	printf("null_truncate: need to implement!!");
89154753Sjohnh 	return (EOPNOTSUPP);
89254753Sjohnh }
89354753Sjohnh 
89454753Sjohnh /*
89554753Sjohnh  * LOFS update.
89654753Sjohnh  */
897*54754Sjohnh null_update (ap)
89854753Sjohnh 	struct vop_update_args *ap;
89954753Sjohnh {
90054753Sjohnh 
901*54754Sjohnh 	/* Use null_setattr */
902*54754Sjohnh 	printf("null_update: need to implement!!");
90354753Sjohnh 	return (EOPNOTSUPP);
90454753Sjohnh }
90554753Sjohnh 
90654753Sjohnh /*
90754753Sjohnh  * LOFS bwrite
90854753Sjohnh  */
909*54754Sjohnh null_bwrite (ap)
91054753Sjohnh 	struct vop_bwrite_args *ap;
91154753Sjohnh {
91254753Sjohnh 	return (EOPNOTSUPP);
91354753Sjohnh }
91454753Sjohnh 
91554753Sjohnh /*
91654753Sjohnh  * Global vfs data structures for ufs
91754753Sjohnh  */
918*54754Sjohnh int (**null_vnodeop_p)();
91954753Sjohnh struct vnodeopv_entry_desc lofs_vnodeop_entries[] = {
92054753Sjohnh 	{ &vop_default_desc, vn_default_error },
921*54754Sjohnh 	{ &vop_lookup_desc, null_lookup },		/* lookup */
922*54754Sjohnh 	{ &vop_create_desc, null_create },		/* create */
923*54754Sjohnh 	{ &vop_mknod_desc, null_mknod },		/* mknod */
924*54754Sjohnh 	{ &vop_open_desc, null_open },		/* open */
925*54754Sjohnh 	{ &vop_close_desc, null_close },		/* close */
926*54754Sjohnh 	{ &vop_access_desc, null_access },		/* access */
927*54754Sjohnh 	{ &vop_getattr_desc, null_getattr },		/* getattr */
928*54754Sjohnh 	{ &vop_setattr_desc, null_setattr },		/* setattr */
929*54754Sjohnh 	{ &vop_read_desc, null_read },		/* read */
930*54754Sjohnh 	{ &vop_write_desc, null_write },		/* write */
931*54754Sjohnh 	{ &vop_ioctl_desc, null_ioctl },		/* ioctl */
932*54754Sjohnh 	{ &vop_select_desc, null_select },		/* select */
933*54754Sjohnh 	{ &vop_mmap_desc, null_mmap },		/* mmap */
934*54754Sjohnh 	{ &vop_fsync_desc, null_fsync },		/* fsync */
935*54754Sjohnh 	{ &vop_seek_desc, null_seek },		/* seek */
936*54754Sjohnh 	{ &vop_remove_desc, null_remove },		/* remove */
937*54754Sjohnh 	{ &vop_link_desc, null_link },		/* link */
938*54754Sjohnh 	{ &vop_rename_desc, null_rename },		/* rename */
939*54754Sjohnh 	{ &vop_mkdir_desc, null_mkdir },		/* mkdir */
940*54754Sjohnh 	{ &vop_rmdir_desc, null_rmdir },		/* rmdir */
941*54754Sjohnh 	{ &vop_symlink_desc, null_symlink },		/* symlink */
942*54754Sjohnh 	{ &vop_readdir_desc, null_readdir },		/* readdir */
943*54754Sjohnh 	{ &vop_readlink_desc, null_readlink },		/* readlink */
944*54754Sjohnh 	{ &vop_abortop_desc, null_abortop },		/* abortop */
945*54754Sjohnh 	{ &vop_inactive_desc, null_inactive },		/* inactive */
946*54754Sjohnh 	{ &vop_reclaim_desc, null_reclaim },		/* reclaim */
947*54754Sjohnh 	{ &vop_lock_desc, null_lock },		/* lock */
948*54754Sjohnh 	{ &vop_unlock_desc, null_unlock },		/* unlock */
949*54754Sjohnh 	{ &vop_bmap_desc, null_bmap },		/* bmap */
950*54754Sjohnh 	{ &vop_strategy_desc, null_strategy },		/* strategy */
951*54754Sjohnh 	{ &vop_print_desc, null_print },		/* print */
952*54754Sjohnh 	{ &vop_islocked_desc, null_islocked },		/* islocked */
953*54754Sjohnh 	{ &vop_advlock_desc, null_advlock },		/* advlock */
954*54754Sjohnh 	{ &vop_blkatoff_desc, null_blkatoff },		/* blkatoff */
955*54754Sjohnh 	{ &vop_vget_desc, null_vget },		/* vget */
956*54754Sjohnh 	{ &vop_valloc_desc, null_valloc },		/* valloc */
957*54754Sjohnh 	{ &vop_vfree_desc, null_vfree },		/* vfree */
958*54754Sjohnh 	{ &vop_truncate_desc, null_truncate },		/* truncate */
959*54754Sjohnh 	{ &vop_update_desc, null_update },		/* update */
960*54754Sjohnh 	{ &vop_bwrite_desc, null_bwrite },		/* bwrite */
96154753Sjohnh 	{ (struct vnodeop_desc*)NULL, (int(*)())NULL }
96254753Sjohnh };
96354753Sjohnh struct vnodeopv_desc lofs_vnodeop_opv_desc =
964*54754Sjohnh 	{ &null_vnodeop_p, lofs_vnodeop_entries };
965