xref: /netbsd-src/sys/miscfs/deadfs/dead_vnops.c (revision 26784725eeed8e5fc5898ec384aab2af43e2e264)
1*26784725Sriastradh /*	$NetBSD: dead_vnops.c,v 1.67 2022/10/26 23:39:43 riastradh Exp $	*/
2cf92afd6Scgd 
361f28255Scgd /*
4cde1d475Smycroft  * Copyright (c) 1989, 1993
5cde1d475Smycroft  *	The Regents of the University of California.  All rights reserved.
661f28255Scgd  *
761f28255Scgd  * Redistribution and use in source and binary forms, with or without
861f28255Scgd  * modification, are permitted provided that the following conditions
961f28255Scgd  * are met:
1061f28255Scgd  * 1. Redistributions of source code must retain the above copyright
1161f28255Scgd  *    notice, this list of conditions and the following disclaimer.
1261f28255Scgd  * 2. Redistributions in binary form must reproduce the above copyright
1361f28255Scgd  *    notice, this list of conditions and the following disclaimer in the
1461f28255Scgd  *    documentation and/or other materials provided with the distribution.
15aad01611Sagc  * 3. Neither the name of the University nor the names of its contributors
1661f28255Scgd  *    may be used to endorse or promote products derived from this software
1761f28255Scgd  *    without specific prior written permission.
1861f28255Scgd  *
1961f28255Scgd  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2061f28255Scgd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2161f28255Scgd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2261f28255Scgd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2361f28255Scgd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2461f28255Scgd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2561f28255Scgd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2661f28255Scgd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2761f28255Scgd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2861f28255Scgd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2961f28255Scgd  * SUCH DAMAGE.
3061f28255Scgd  *
3199005388Smycroft  *	@(#)dead_vnops.c	8.2 (Berkeley) 11/21/94
3261f28255Scgd  */
3361f28255Scgd 
34e4b00f43Slukem #include <sys/cdefs.h>
35*26784725Sriastradh __KERNEL_RCSID(0, "$NetBSD: dead_vnops.c,v 1.67 2022/10/26 23:39:43 riastradh Exp $");
36e4b00f43Slukem 
370560892dSmycroft #include <sys/param.h>
380560892dSmycroft #include <sys/systm.h>
390560892dSmycroft #include <sys/time.h>
400560892dSmycroft #include <sys/vnode.h>
410560892dSmycroft #include <sys/errno.h>
420560892dSmycroft #include <sys/namei.h>
430560892dSmycroft #include <sys/buf.h>
44631ccba6Schristos #include <sys/proc.h>
4561f28255Scgd 
46*26784725Sriastradh #include <miscfs/deadfs/deadfs.h>
47c52352c8Smycroft #include <miscfs/genfs/genfs.h>
48c52352c8Smycroft 
4961f28255Scgd /*
5061f28255Scgd  * Prototypes for dead operations on vnodes.
5161f28255Scgd  */
5265bcb93bShannken int	dead_lookup(void *);
53af97f2e8Sxtraeme int	dead_open(void *);
54af97f2e8Sxtraeme int	dead_read(void *);
55af97f2e8Sxtraeme int	dead_write(void *);
56af97f2e8Sxtraeme int	dead_ioctl(void *);
57af97f2e8Sxtraeme int	dead_poll(void *);
5865bcb93bShannken int	dead_remove(void *);
5965bcb93bShannken int	dead_link(void *);
6065bcb93bShannken int	dead_rename(void *);
6165bcb93bShannken int	dead_rmdir(void *);
6265bcb93bShannken int	dead_inactive(void *);
63af97f2e8Sxtraeme int	dead_bmap(void *);
64af97f2e8Sxtraeme int	dead_strategy(void *);
65af97f2e8Sxtraeme int	dead_print(void *);
664013808fSpooka int	dead_getpages(void *);
6765bcb93bShannken int	dead_putpages(void *);
6861f28255Scgd 
69c398ae97Schs int	dead_default_error(void *);
70631ccba6Schristos 
71af97f2e8Sxtraeme int (**dead_vnodeop_p)(void *);
72631ccba6Schristos 
73*26784725Sriastradh static const struct vnodeopv_entry_desc dead_vnodeop_entries[] = {
74c398ae97Schs 	{ &vop_default_desc, dead_default_error },
7541715070Sdholland 	{ &vop_bwrite_desc, vn_bwrite },		/* bwrite */
76c6c16cd0Sdholland 	{ &vop_parsepath_desc, genfs_parsepath },	/* parsepath */
7765bcb93bShannken 	{ &vop_lookup_desc, dead_lookup },		/* lookup */
78cde1d475Smycroft 	{ &vop_open_desc, dead_open },			/* open */
7941715070Sdholland 	{ &vop_close_desc, genfs_nullop },		/* close */
80cde1d475Smycroft 	{ &vop_read_desc, dead_read },			/* read */
81cde1d475Smycroft 	{ &vop_write_desc, dead_write },		/* write */
8205d075b3Sdholland 	{ &vop_fallocate_desc, genfs_eopnotsupp },	/* fallocate */
8305d075b3Sdholland 	{ &vop_fdiscard_desc, genfs_eopnotsupp },	/* fdiscard */
8441715070Sdholland 	{ &vop_fcntl_desc, genfs_nullop },		/* fcntl */
85cde1d475Smycroft 	{ &vop_ioctl_desc, dead_ioctl },		/* ioctl */
862bc73666Smycroft 	{ &vop_poll_desc, dead_poll },			/* poll */
8765bcb93bShannken 	{ &vop_remove_desc, dead_remove },		/* remove */
8865bcb93bShannken 	{ &vop_link_desc, dead_link },			/* link */
8965bcb93bShannken 	{ &vop_rename_desc, dead_rename },		/* rename */
9065bcb93bShannken 	{ &vop_rmdir_desc, dead_rmdir },		/* rmdir */
9141715070Sdholland 	{ &vop_fsync_desc, genfs_nullop },		/* fsync */
9241715070Sdholland 	{ &vop_seek_desc, genfs_nullop },		/* seek */
93cde1d475Smycroft 	{ &vop_inactive_desc, dead_inactive },		/* inactive */
9441715070Sdholland 	{ &vop_reclaim_desc, genfs_nullop },		/* reclaim */
9541715070Sdholland 	{ &vop_lock_desc, genfs_deadlock },		/* lock */
9641715070Sdholland 	{ &vop_unlock_desc, genfs_deadunlock },		/* unlock */
97cde1d475Smycroft 	{ &vop_bmap_desc, dead_bmap },			/* bmap */
98cde1d475Smycroft 	{ &vop_strategy_desc, dead_strategy },		/* strategy */
99cde1d475Smycroft 	{ &vop_print_desc, dead_print },		/* print */
10041715070Sdholland 	{ &vop_islocked_desc, genfs_deadislocked },	/* islocked */
10141715070Sdholland 	{ &vop_revoke_desc, genfs_nullop },		/* revoke */
1024013808fSpooka 	{ &vop_getpages_desc, dead_getpages },		/* getpages */
1035a690c92Schs 	{ &vop_putpages_desc, dead_putpages },		/* putpages */
1045a690c92Schs 	{ NULL, NULL }
10561f28255Scgd };
106d9466585Sjdolecek const struct vnodeopv_desc dead_vnodeop_opv_desc =
107cde1d475Smycroft 	{ &dead_vnodeop_p, dead_vnodeop_entries };
10861f28255Scgd 
10965bcb93bShannken /* ARGSUSED */
1100e6cb953Sandrew int
dead_default_error(void * v)111c398ae97Schs dead_default_error(void *v)
112631ccba6Schristos {
11361f28255Scgd 
114c398ae97Schs 	return EBADF;
11561f28255Scgd }
11661f28255Scgd 
11765bcb93bShannken int
dead_bmap(void * v)11865bcb93bShannken dead_bmap(void *v)
11965bcb93bShannken {
120f9534e4dSriastradh 	struct vop_bmap_args /* {
12165bcb93bShannken 		struct vnode *a_vp;
12265bcb93bShannken 		daddr_t  a_bn;
12365bcb93bShannken 		struct vnode **a_vpp;
12465bcb93bShannken 		daddr_t *a_bnp;
12565bcb93bShannken 		int *a_runp;
126f9534e4dSriastradh 	} */ *ap = v;
127f9534e4dSriastradh 
128f9534e4dSriastradh 	(void)ap;
12965bcb93bShannken 
13065bcb93bShannken 	return (EIO);
13165bcb93bShannken }
13265bcb93bShannken 
13365bcb93bShannken int
dead_lookup(void * v)13465bcb93bShannken dead_lookup(void *v)
13565bcb93bShannken {
13697834f7bShannken 	struct vop_lookup_v2_args /* {
13765bcb93bShannken 		struct vnode *a_dvp;
13865bcb93bShannken 		struct vnode **a_vpp;
13965bcb93bShannken 		struct componentname *a_cnp;
14065bcb93bShannken 	} */ *ap = v;
14165bcb93bShannken 
14265bcb93bShannken 	*(ap->a_vpp) = NULL;
14365bcb93bShannken 
144d940ddccShannken 	return ENOENT;
14565bcb93bShannken }
14665bcb93bShannken 
147631ccba6Schristos int
dead_open(void * v)148168cd830Schristos dead_open(void *v)
14961f28255Scgd {
150f9534e4dSriastradh 	struct vop_open_args /* {
15165bcb93bShannken 		struct vnode *a_vp;
15265bcb93bShannken 		int a_mode;
15365bcb93bShannken 		kauth_cred_t a_cred;
154f9534e4dSriastradh 	} */ *ap = v;
155f9534e4dSriastradh 
156f9534e4dSriastradh 	(void)ap;
15761f28255Scgd 
15861f28255Scgd 	return (ENXIO);
15961f28255Scgd }
16061f28255Scgd 
161631ccba6Schristos int
dead_read(void * v)16282357f6dSdsl dead_read(void *v)
163631ccba6Schristos {
164cde1d475Smycroft 	struct vop_read_args /* {
165cde1d475Smycroft 		struct vnode *a_vp;
166cde1d475Smycroft 		struct uio *a_uio;
167cde1d475Smycroft 		int  a_ioflag;
168fc9422c9Selad 		kauth_cred_t a_cred;
169631ccba6Schristos 	} */ *ap = v;
17061f28255Scgd 
17161f28255Scgd 	/*
17299005388Smycroft 	 * Return EOF for tty devices, EIO for others
17361f28255Scgd 	 */
1747dad9f73Sad 	if ((ap->a_vp->v_vflag & VV_ISTTY) == 0)
17561f28255Scgd 		return (EIO);
17661f28255Scgd 	return (0);
17761f28255Scgd }
17861f28255Scgd 
179631ccba6Schristos int
dead_write(void * v)18082357f6dSdsl dead_write(void *v)
181631ccba6Schristos {
182f9534e4dSriastradh 	struct vop_write_args /* {
183cde1d475Smycroft 		struct vnode *a_vp;
184cde1d475Smycroft 		struct uio *a_uio;
185cde1d475Smycroft 		int  a_ioflag;
186fc9422c9Selad 		kauth_cred_t a_cred;
187f9534e4dSriastradh 	} */ *ap = v;
188f9534e4dSriastradh 
189f9534e4dSriastradh 	(void)ap;
19061f28255Scgd 
19161f28255Scgd 	return (EIO);
19261f28255Scgd }
19361f28255Scgd 
194631ccba6Schristos int
dead_ioctl(void * v)19582357f6dSdsl dead_ioctl(void *v)
196631ccba6Schristos {
197f9534e4dSriastradh 	struct vop_ioctl_args /* {
198cde1d475Smycroft 		struct vnode *a_vp;
1996ac2bbfcScgd 		u_long a_command;
200fc97fd57Sjrf 		void *a_data;
201cde1d475Smycroft 		int  a_fflag;
202fc9422c9Selad 		kauth_cred_t a_cred;
20395e1ffb1Schristos 		struct lwp *a_l;
204f9534e4dSriastradh 	} */ *ap = v;
205f9534e4dSriastradh 
206f9534e4dSriastradh 	(void)ap;
20761f28255Scgd 
20861f28255Scgd 	return (EBADF);
20961f28255Scgd }
21061f28255Scgd 
211631ccba6Schristos int
dead_poll(void * v)21282357f6dSdsl dead_poll(void *v)
21361f28255Scgd {
2142bc73666Smycroft 	struct vop_poll_args /* {
215c52352c8Smycroft 		struct vnode *a_vp;
2162bc73666Smycroft 		int a_events;
21795e1ffb1Schristos 		struct lwp *a_l;
218c52352c8Smycroft 	} */ *ap = v;
219c52352c8Smycroft 
22061f28255Scgd 	/*
22161f28255Scgd 	 * Let the user find out that the descriptor is gone.
22261f28255Scgd 	 */
2232bc73666Smycroft 	return (ap->a_events);
22461f28255Scgd }
22561f28255Scgd 
22665bcb93bShannken int
dead_remove(void * v)22765bcb93bShannken dead_remove(void *v)
22865bcb93bShannken {
229982ae832Sthorpej 	struct vop_remove_v3_args /* {
23065bcb93bShannken 		struct vnode *a_dvp;
23165bcb93bShannken 		struct vnode *a_vp;
23265bcb93bShannken 		struct componentname *a_cnp;
233982ae832Sthorpej 		nlink_t ctx_vp_new_nlink;
23465bcb93bShannken 	} */ *ap = v;
23565bcb93bShannken 
23665bcb93bShannken 	vput(ap->a_vp);
23765bcb93bShannken 
23865bcb93bShannken 	return EIO;
23965bcb93bShannken }
24065bcb93bShannken 
24165bcb93bShannken int
dead_link(void * v)24265bcb93bShannken dead_link(void *v)
24365bcb93bShannken {
24446e71c7dSriastradh 	struct vop_link_v2_args /* {
24565bcb93bShannken 		struct vnode *a_dvp;
24665bcb93bShannken 		struct vnode *a_vp;
24765bcb93bShannken 		struct componentname *a_cnp;
24865bcb93bShannken 	} */ *ap = v;
24965bcb93bShannken 
25046e71c7dSriastradh 	(void)ap;
25165bcb93bShannken 
25265bcb93bShannken 	return EIO;
25365bcb93bShannken }
25465bcb93bShannken 
25565bcb93bShannken int
dead_rename(void * v)25665bcb93bShannken dead_rename(void *v)
25765bcb93bShannken {
25865bcb93bShannken 	struct vop_rename_args /* {
25965bcb93bShannken 		struct vnode *a_fdvp;
26065bcb93bShannken 		struct vnode *a_fvp;
26165bcb93bShannken 		struct componentname *a_fcnp;
26265bcb93bShannken 		struct vnode *a_tdvp;
26365bcb93bShannken 		struct vnode *a_tvp;
26465bcb93bShannken 		struct componentname *a_tcnp;
26565bcb93bShannken 	} */ *ap = v;
26665bcb93bShannken 
26765bcb93bShannken 	vrele(ap->a_fdvp);
26865bcb93bShannken 	vrele(ap->a_fvp);
26965bcb93bShannken 	if (ap->a_tvp != NULL && ap->a_tvp != ap->a_tdvp)
27065bcb93bShannken 		VOP_UNLOCK(ap->a_tvp);
27165bcb93bShannken 	vput(ap->a_tdvp);
27265bcb93bShannken 	if (ap->a_tvp != NULL)
27365bcb93bShannken 		vrele(ap->a_tvp);
27465bcb93bShannken 
27565bcb93bShannken 	return EIO;
27665bcb93bShannken }
27765bcb93bShannken 
27865bcb93bShannken int
dead_rmdir(void * v)27965bcb93bShannken dead_rmdir(void *v)
28065bcb93bShannken {
2816fa7b158Sriastradh 	struct vop_rmdir_v2_args /* {
28265bcb93bShannken 		struct vnode *a_dvp;
28365bcb93bShannken 		struct vnode *a_vp;
28465bcb93bShannken 		struct componentname *a_cnp;
28565bcb93bShannken 	} */ *ap = v;
28665bcb93bShannken 
28765bcb93bShannken 	vput(ap->a_vp);
28865bcb93bShannken 
28965bcb93bShannken 	return EIO;
29065bcb93bShannken }
29165bcb93bShannken 
29265bcb93bShannken int
dead_inactive(void * v)29365bcb93bShannken dead_inactive(void *v)
29465bcb93bShannken {
29587fb3229Sriastradh 	struct vop_inactive_v2_args /* {
29665bcb93bShannken 		struct vnode *a_vp;
29765bcb93bShannken 		bool *a_recycle;
29865bcb93bShannken 	} */ *ap = v;
29965bcb93bShannken 
30065bcb93bShannken 	*ap->a_recycle = false;
30165bcb93bShannken 
30265bcb93bShannken 	return 0;
30365bcb93bShannken }
30465bcb93bShannken 
305631ccba6Schristos int
dead_strategy(void * v)30682357f6dSdsl dead_strategy(void *v)
30761f28255Scgd {
308631ccba6Schristos 	struct vop_strategy_args /* {
3093db4e2acShannken 		struct vnode *a_vp;
310631ccba6Schristos 		struct buf *a_bp;
311631ccba6Schristos 	} */ *ap = v;
3127dad9f73Sad 	struct buf *bp;
31365bcb93bShannken 
3147dad9f73Sad 	bp = ap->a_bp;
3157dad9f73Sad 	bp->b_error = EIO;
3167dad9f73Sad 	bp->b_resid = bp->b_bcount;
317cde1d475Smycroft 	biodone(ap->a_bp);
31861f28255Scgd 	return (EIO);
31961f28255Scgd }
32061f28255Scgd 
32161f28255Scgd /* ARGSUSED */
322631ccba6Schristos int
dead_print(void * v)323168cd830Schristos dead_print(void *v)
32461f28255Scgd {
32592a808f1Schristos 	printf("tag VT_NON, dead vnode\n");
326631ccba6Schristos 	return 0;
32761f28255Scgd }
32861f28255Scgd 
3294013808fSpooka int
dead_getpages(void * v)3304013808fSpooka dead_getpages(void *v)
3314013808fSpooka {
3324013808fSpooka 	struct vop_getpages_args /* {
3334013808fSpooka 		struct vnode *a_vp;
3344013808fSpooka 		voff_t a_offset;
3354013808fSpooka 		struct vm_page **a_m;
3364013808fSpooka 		int *a_count;
3374013808fSpooka 		int a_centeridx;
3384013808fSpooka 		vm_prot_t a_access_type;
3394013808fSpooka 		int a_advice;
3404013808fSpooka 		int a_flags;
3414013808fSpooka 	} */ *ap = v;
3424013808fSpooka 
3434013808fSpooka 	if ((ap->a_flags & PGO_LOCKED) == 0)
344d2a0ebb6Sad 		rw_exit(ap->a_vp->v_uobj.vmobjlock);
3454013808fSpooka 
3464013808fSpooka 	return (EFAULT);
3474013808fSpooka }
3484013808fSpooka 
349631ccba6Schristos int
dead_putpages(void * v)35065bcb93bShannken dead_putpages(void *v)
35161f28255Scgd {
35265bcb93bShannken         struct vop_putpages_args /* {
35365bcb93bShannken 		struct vnode *a_vp;
35465bcb93bShannken 		voff_t a_offlo;
35565bcb93bShannken 		voff_t a_offhi;
35665bcb93bShannken 		int a_flags;
35765bcb93bShannken 	} */ *ap = v;
35861f28255Scgd 
359d2a0ebb6Sad 	rw_exit(ap->a_vp->v_uobj.vmobjlock);
36065bcb93bShannken 	return (EFAULT);
36161f28255Scgd }
362