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