1 /* $NetBSD: dead_vnops.c,v 1.57 2014/07/25 08:20:52 dholland Exp $ */ 2 3 /* 4 * Copyright (c) 1989, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of the University nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 * 31 * @(#)dead_vnops.c 8.2 (Berkeley) 11/21/94 32 */ 33 34 #include <sys/cdefs.h> 35 __KERNEL_RCSID(0, "$NetBSD: dead_vnops.c,v 1.57 2014/07/25 08:20:52 dholland Exp $"); 36 37 #include <sys/param.h> 38 #include <sys/systm.h> 39 #include <sys/time.h> 40 #include <sys/vnode.h> 41 #include <sys/errno.h> 42 #include <sys/namei.h> 43 #include <sys/buf.h> 44 #include <sys/proc.h> 45 46 #include <miscfs/genfs/genfs.h> 47 48 /* 49 * Prototypes for dead operations on vnodes. 50 */ 51 #define dead_bwrite genfs_nullop 52 int dead_lookup(void *); 53 int dead_open(void *); 54 #define dead_close genfs_nullop 55 int dead_read(void *); 56 int dead_write(void *); 57 #define dead_fcntl genfs_nullop 58 int dead_ioctl(void *); 59 int dead_poll(void *); 60 int dead_remove(void *); 61 int dead_link(void *); 62 int dead_rename(void *); 63 int dead_rmdir(void *); 64 #define dead_fsync genfs_nullop 65 #define dead_seek genfs_nullop 66 int dead_inactive(void *); 67 #define dead_reclaim genfs_nullop 68 #define dead_lock genfs_deadlock 69 #define dead_unlock genfs_deadunlock 70 int dead_bmap(void *); 71 int dead_strategy(void *); 72 int dead_print(void *); 73 #define dead_islocked genfs_deadislocked 74 #define dead_revoke genfs_nullop 75 int dead_getpages(void *); 76 int dead_putpages(void *); 77 78 int dead_default_error(void *); 79 80 int (**dead_vnodeop_p)(void *); 81 82 const struct vnodeopv_entry_desc dead_vnodeop_entries[] = { 83 { &vop_default_desc, dead_default_error }, 84 { &vop_bwrite_desc, dead_bwrite }, /* bwrite */ 85 { &vop_lookup_desc, dead_lookup }, /* lookup */ 86 { &vop_open_desc, dead_open }, /* open */ 87 { &vop_close_desc, dead_close }, /* close */ 88 { &vop_read_desc, dead_read }, /* read */ 89 { &vop_write_desc, dead_write }, /* write */ 90 { &vop_fallocate_desc, genfs_eopnotsupp }, /* fallocate */ 91 { &vop_fdiscard_desc, genfs_eopnotsupp }, /* fdiscard */ 92 { &vop_fcntl_desc, dead_fcntl }, /* fcntl */ 93 { &vop_ioctl_desc, dead_ioctl }, /* ioctl */ 94 { &vop_poll_desc, dead_poll }, /* poll */ 95 { &vop_remove_desc, dead_remove }, /* remove */ 96 { &vop_link_desc, dead_link }, /* link */ 97 { &vop_rename_desc, dead_rename }, /* rename */ 98 { &vop_rmdir_desc, dead_rmdir }, /* rmdir */ 99 { &vop_fsync_desc, dead_fsync }, /* fsync */ 100 { &vop_seek_desc, dead_seek }, /* seek */ 101 { &vop_inactive_desc, dead_inactive }, /* inactive */ 102 { &vop_reclaim_desc, dead_reclaim }, /* reclaim */ 103 { &vop_lock_desc, dead_lock }, /* lock */ 104 { &vop_unlock_desc, dead_unlock }, /* unlock */ 105 { &vop_bmap_desc, dead_bmap }, /* bmap */ 106 { &vop_strategy_desc, dead_strategy }, /* strategy */ 107 { &vop_print_desc, dead_print }, /* print */ 108 { &vop_islocked_desc, dead_islocked }, /* islocked */ 109 { &vop_revoke_desc, dead_revoke }, /* revoke */ 110 { &vop_getpages_desc, dead_getpages }, /* getpages */ 111 { &vop_putpages_desc, dead_putpages }, /* putpages */ 112 { NULL, NULL } 113 }; 114 const struct vnodeopv_desc dead_vnodeop_opv_desc = 115 { &dead_vnodeop_p, dead_vnodeop_entries }; 116 117 /* ARGSUSED */ 118 int 119 dead_default_error(void *v) 120 { 121 122 return EBADF; 123 } 124 125 /* ARGSUSED */ 126 int 127 dead_bmap(void *v) 128 { 129 /* struct vop_bmap_args { 130 struct vnode *a_vp; 131 daddr_t a_bn; 132 struct vnode **a_vpp; 133 daddr_t *a_bnp; 134 int *a_runp; 135 } *ap = v; */ 136 137 return (EIO); 138 } 139 140 int 141 dead_lookup(void *v) 142 { 143 struct vop_lookup_v2_args /* { 144 struct vnode *a_dvp; 145 struct vnode **a_vpp; 146 struct componentname *a_cnp; 147 } */ *ap = v; 148 149 *(ap->a_vpp) = NULL; 150 151 return ENOENT; 152 } 153 154 /* ARGSUSED */ 155 int 156 dead_open(void *v) 157 { 158 /* struct vop_open_args { 159 struct vnode *a_vp; 160 int a_mode; 161 kauth_cred_t a_cred; 162 } *ap = v; */ 163 164 return (ENXIO); 165 } 166 167 int 168 dead_read(void *v) 169 { 170 struct vop_read_args /* { 171 struct vnode *a_vp; 172 struct uio *a_uio; 173 int a_ioflag; 174 kauth_cred_t a_cred; 175 } */ *ap = v; 176 177 /* 178 * Return EOF for tty devices, EIO for others 179 */ 180 if ((ap->a_vp->v_vflag & VV_ISTTY) == 0) 181 return (EIO); 182 return (0); 183 } 184 185 /* ARGSUSED */ 186 int 187 dead_write(void *v) 188 { 189 /* struct vop_write_args { 190 struct vnode *a_vp; 191 struct uio *a_uio; 192 int a_ioflag; 193 kauth_cred_t a_cred; 194 } *ap = v; */ 195 196 return (EIO); 197 } 198 199 /* ARGSUSED */ 200 int 201 dead_ioctl(void *v) 202 { 203 /* struct vop_ioctl_args { 204 struct vnode *a_vp; 205 u_long a_command; 206 void *a_data; 207 int a_fflag; 208 kauth_cred_t a_cred; 209 struct lwp *a_l; 210 } *ap = v; */ 211 212 return (EBADF); 213 } 214 215 int 216 dead_poll(void *v) 217 { 218 struct vop_poll_args /* { 219 struct vnode *a_vp; 220 int a_events; 221 struct lwp *a_l; 222 } */ *ap = v; 223 224 /* 225 * Let the user find out that the descriptor is gone. 226 */ 227 return (ap->a_events); 228 } 229 230 int 231 dead_remove(void *v) 232 { 233 struct vop_remove_args /* { 234 struct vnode *a_dvp; 235 struct vnode *a_vp; 236 struct componentname *a_cnp; 237 } */ *ap = v; 238 239 vput(ap->a_dvp); 240 vput(ap->a_vp); 241 242 return EIO; 243 } 244 245 int 246 dead_link(void *v) 247 { 248 struct vop_link_args /* { 249 struct vnode *a_dvp; 250 struct vnode *a_vp; 251 struct componentname *a_cnp; 252 } */ *ap = v; 253 254 vput(ap->a_dvp); 255 256 return EIO; 257 } 258 259 int 260 dead_rename(void *v) 261 { 262 struct vop_rename_args /* { 263 struct vnode *a_fdvp; 264 struct vnode *a_fvp; 265 struct componentname *a_fcnp; 266 struct vnode *a_tdvp; 267 struct vnode *a_tvp; 268 struct componentname *a_tcnp; 269 } */ *ap = v; 270 271 vrele(ap->a_fdvp); 272 vrele(ap->a_fvp); 273 if (ap->a_tvp != NULL && ap->a_tvp != ap->a_tdvp) 274 VOP_UNLOCK(ap->a_tvp); 275 vput(ap->a_tdvp); 276 if (ap->a_tvp != NULL) 277 vrele(ap->a_tvp); 278 279 return EIO; 280 } 281 282 int 283 dead_rmdir(void *v) 284 { 285 struct vop_rmdir_args /* { 286 struct vnode *a_dvp; 287 struct vnode *a_vp; 288 struct componentname *a_cnp; 289 } */ *ap = v; 290 291 vput(ap->a_dvp); 292 vput(ap->a_vp); 293 294 return EIO; 295 } 296 297 int 298 dead_inactive(void *v) 299 { 300 struct vop_inactive_args /* { 301 struct vnode *a_vp; 302 bool *a_recycle; 303 } */ *ap = v; 304 305 *ap->a_recycle = false; 306 VOP_UNLOCK(ap->a_vp); 307 308 return 0; 309 } 310 311 int 312 dead_strategy(void *v) 313 { 314 struct vop_strategy_args /* { 315 struct vnode *a_vp; 316 struct buf *a_bp; 317 } */ *ap = v; 318 struct buf *bp; 319 320 bp = ap->a_bp; 321 bp->b_error = EIO; 322 bp->b_resid = bp->b_bcount; 323 biodone(ap->a_bp); 324 return (EIO); 325 } 326 327 /* ARGSUSED */ 328 int 329 dead_print(void *v) 330 { 331 printf("tag VT_NON, dead vnode\n"); 332 return 0; 333 } 334 335 int 336 dead_getpages(void *v) 337 { 338 struct vop_getpages_args /* { 339 struct vnode *a_vp; 340 voff_t a_offset; 341 struct vm_page **a_m; 342 int *a_count; 343 int a_centeridx; 344 vm_prot_t a_access_type; 345 int a_advice; 346 int a_flags; 347 } */ *ap = v; 348 349 if ((ap->a_flags & PGO_LOCKED) == 0) 350 mutex_exit(ap->a_vp->v_interlock); 351 352 return (EFAULT); 353 } 354 355 int 356 dead_putpages(void *v) 357 { 358 struct vop_putpages_args /* { 359 struct vnode *a_vp; 360 voff_t a_offlo; 361 voff_t a_offhi; 362 int a_flags; 363 } */ *ap = v; 364 365 mutex_exit(ap->a_vp->v_interlock); 366 return (EFAULT); 367 } 368