1 /* 2 * Copyright (c) 1989 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 * 7 * @(#)dead_vnops.c 7.15 (Berkeley) 02/03/92 8 */ 9 10 #include "param.h" 11 #include "systm.h" 12 #include "time.h" 13 #include "vnode.h" 14 #include "errno.h" 15 #include "namei.h" 16 #include "buf.h" 17 18 /* 19 * Prototypes for dead operations on vnodes. 20 */ 21 int dead_badop(), 22 dead_ebadf(); 23 int dead_lookup __P(( 24 struct vnode *dvp, 25 struct vnode **vpp, 26 struct componentname *cnp)); 27 #define dead_create ((int (*) __P(( \ 28 struct vnode *dvp, \ 29 struct vnode **vpp, \ 30 struct componentname *cnp, \ 31 struct vattr *vap))) dead_badop) 32 #define dead_mknod ((int (*) __P(( \ 33 struct vnode *dvp, \ 34 struct vnode **vpp, \ 35 struct componentname *cnp, \ 36 struct vattr *vap))) dead_badop) 37 int dead_open __P(( 38 struct vnode *vp, 39 int mode, 40 struct ucred *cred, 41 struct proc *p)); 42 #define dead_close ((int (*) __P(( \ 43 struct vnode *vp, \ 44 int fflag, \ 45 struct ucred *cred, \ 46 struct proc *p))) nullop) 47 #define dead_access ((int (*) __P(( \ 48 struct vnode *vp, \ 49 int mode, \ 50 struct ucred *cred, \ 51 struct proc *p))) dead_ebadf) 52 #define dead_getattr ((int (*) __P(( \ 53 struct vnode *vp, \ 54 struct vattr *vap, \ 55 struct ucred *cred, \ 56 struct proc *p))) dead_ebadf) 57 #define dead_setattr ((int (*) __P(( \ 58 struct vnode *vp, \ 59 struct vattr *vap, \ 60 struct ucred *cred, \ 61 struct proc *p))) dead_ebadf) 62 int dead_read __P(( 63 struct vnode *vp, 64 struct uio *uio, 65 int ioflag, 66 struct ucred *cred)); 67 int dead_write __P(( 68 struct vnode *vp, 69 struct uio *uio, 70 int ioflag, 71 struct ucred *cred)); 72 int dead_ioctl __P(( 73 struct vnode *vp, 74 int command, 75 caddr_t data, 76 int fflag, 77 struct ucred *cred, 78 struct proc *p)); 79 int dead_select __P(( 80 struct vnode *vp, 81 int which, 82 int fflags, 83 struct ucred *cred, 84 struct proc *p)); 85 #define dead_mmap ((int (*) __P(( \ 86 struct vnode *vp, \ 87 int fflags, \ 88 struct ucred *cred, \ 89 struct proc *p))) dead_badop) 90 #define dead_fsync ((int (*) __P(( \ 91 struct vnode *vp, \ 92 int fflags, \ 93 struct ucred *cred, \ 94 int waitfor, \ 95 struct proc *p))) nullop) 96 #define dead_seek ((int (*) __P(( \ 97 struct vnode *vp, \ 98 off_t oldoff, \ 99 off_t newoff, \ 100 struct ucred *cred))) nullop) 101 #define dead_remove ((int (*) __P(( \ 102 struct vnode *dvp, \ 103 struct vnode *vp, \ 104 struct componentname *cnp))) dead_badop) 105 #define dead_link ((int (*) __P(( \ 106 register struct vnode *vp, \ 107 struct vnode *tdvp, \ 108 struct componentname *cnp))) dead_badop) 109 #define dead_rename ((int (*) __P(( \ 110 struct vnode *fdvp, \ 111 struct vnode *fvp, \ 112 struct componentname *fcnp, \ 113 struct vnode *tdvp, \ 114 struct vnode *tvp, \ 115 struct componentname *tcnp))) dead_badop) 116 #define dead_mkdir ((int (*) __P(( \ 117 struct vnode *dvp, \ 118 struct vnode **vpp, \ 119 struct componentname *cnp, \ 120 struct vattr *vap))) dead_badop) 121 #define dead_rmdir ((int (*) __P(( \ 122 struct vnode *dvp, \ 123 struct vnode *vp, \ 124 struct componentname *cnp))) dead_badop) 125 #define dead_symlink ((int (*) __P(( \ 126 struct vnode *dvp, \ 127 struct vnode **vpp, \ 128 struct componentname *cnp, \ 129 struct vattr *vap, \ 130 char *target))) dead_badop) 131 #define dead_readdir ((int (*) __P(( \ 132 struct vnode *vp, \ 133 struct uio *uio, \ 134 struct ucred *cred, \ 135 int *eofflagp))) dead_ebadf) 136 #define dead_readlink ((int (*) __P(( \ 137 struct vnode *vp, \ 138 struct uio *uio, \ 139 struct ucred *cred))) dead_ebadf) 140 #define dead_abortop ((int (*) __P(( \ 141 struct vnode *dvp, \ 142 struct componentname *cnp))) dead_badop) 143 #define dead_inactive ((int (*) __P(( \ 144 struct vnode *vp, \ 145 struct proc *p))) nullop) 146 #define dead_reclaim ((int (*) __P(( \ 147 struct vnode *vp))) nullop) 148 int dead_lock __P(( 149 struct vnode *vp)); 150 #define dead_unlock ((int (*) __P(( \ 151 struct vnode *vp))) nullop) 152 int dead_bmap __P(( 153 struct vnode *vp, 154 daddr_t bn, 155 struct vnode **vpp, 156 daddr_t *bnp)); 157 int dead_strategy __P(( 158 struct buf *bp)); 159 int dead_print __P(( 160 struct vnode *vp)); 161 #define dead_islocked ((int (*) __P(( \ 162 struct vnode *vp))) nullop) 163 #define dead_advlock ((int (*) __P(( \ 164 struct vnode *vp, \ 165 caddr_t id, \ 166 int op, \ 167 struct flock *fl, \ 168 int flags))) dead_ebadf) 169 #define dead_blkatoff ((int (*) __P(( \ 170 struct vnode *vp, \ 171 off_t offset, \ 172 char **res, \ 173 struct buf **bpp))) dead_badop) 174 #define dead_vget ((int (*) __P(( \ 175 struct mount *mp, \ 176 ino_t ino, \ 177 struct vnode **vpp))) dead_badop) 178 #define dead_valloc ((int (*) __P(( \ 179 struct vnode *pvp, \ 180 int mode, \ 181 struct ucred *cred, \ 182 struct vnode **vpp))) dead_badop) 183 #define dead_vfree ((void (*) __P(( \ 184 struct vnode *pvp, \ 185 ino_t ino, \ 186 int mode))) dead_badop) 187 #define dead_truncate ((int (*) __P(( \ 188 struct vnode *vp, \ 189 u_long length, \ 190 int flags))) nullop) 191 #define dead_update ((int (*) __P(( \ 192 struct vnode *vp, \ 193 struct timeval *ta, \ 194 struct timeval *tm, \ 195 int waitfor))) nullop) 196 #define dead_bwrite ((int (*) __P(( \ 197 struct buf *bp))) nullop) 198 199 struct vnodeops dead_vnodeops = { 200 dead_lookup, /* lookup */ 201 dead_create, /* create */ 202 dead_mknod, /* mknod */ 203 dead_open, /* open */ 204 dead_close, /* close */ 205 dead_access, /* access */ 206 dead_getattr, /* getattr */ 207 dead_setattr, /* setattr */ 208 dead_read, /* read */ 209 dead_write, /* write */ 210 dead_ioctl, /* ioctl */ 211 dead_select, /* select */ 212 dead_mmap, /* mmap */ 213 dead_fsync, /* fsync */ 214 dead_seek, /* seek */ 215 dead_remove, /* remove */ 216 dead_link, /* link */ 217 dead_rename, /* rename */ 218 dead_mkdir, /* mkdir */ 219 dead_rmdir, /* rmdir */ 220 dead_symlink, /* symlink */ 221 dead_readdir, /* readdir */ 222 dead_readlink, /* readlink */ 223 dead_abortop, /* abortop */ 224 dead_inactive, /* inactive */ 225 dead_reclaim, /* reclaim */ 226 dead_lock, /* lock */ 227 dead_unlock, /* unlock */ 228 dead_bmap, /* bmap */ 229 dead_strategy, /* strategy */ 230 dead_print, /* print */ 231 dead_islocked, /* islocked */ 232 dead_advlock, /* advlock */ 233 dead_blkatoff, /* blkatoff */ 234 dead_vget, /* vget */ 235 dead_valloc, /* valloc */ 236 dead_vfree, /* vfree */ 237 dead_truncate, /* truncate */ 238 dead_update, /* update */ 239 dead_bwrite, /* bwrite */ 240 }; 241 242 /* 243 * Trivial lookup routine that always fails. 244 */ 245 /* ARGSUSED */ 246 int 247 dead_lookup(dvp, vpp, cnp) 248 struct vnode *dvp; 249 struct vnode **vpp; 250 struct componentname *cnp; 251 { 252 253 *vpp = NULL; 254 return (ENOTDIR); 255 } 256 257 /* 258 * Open always fails as if device did not exist. 259 */ 260 /* ARGSUSED */ 261 dead_open(vp, mode, cred, p) 262 struct vnode *vp; 263 int mode; 264 struct ucred *cred; 265 struct proc *p; 266 { 267 268 return (ENXIO); 269 } 270 271 /* 272 * Vnode op for read 273 */ 274 /* ARGSUSED */ 275 dead_read(vp, uio, ioflag, cred) 276 struct vnode *vp; 277 struct uio *uio; 278 int ioflag; 279 struct ucred *cred; 280 { 281 282 if (chkvnlock(vp)) 283 panic("dead_read: lock"); 284 /* 285 * Return EOF for character devices, EIO for others 286 */ 287 if (vp->v_type != VCHR) 288 return (EIO); 289 return (0); 290 } 291 292 /* 293 * Vnode op for write 294 */ 295 /* ARGSUSED */ 296 dead_write(vp, uio, ioflag, cred) 297 register struct vnode *vp; 298 struct uio *uio; 299 int ioflag; 300 struct ucred *cred; 301 { 302 303 if (chkvnlock(vp)) 304 panic("dead_write: lock"); 305 return (EIO); 306 } 307 308 /* 309 * Device ioctl operation. 310 */ 311 /* ARGSUSED */ 312 dead_ioctl(vp, com, data, fflag, cred, p) 313 struct vnode *vp; 314 register int com; 315 caddr_t data; 316 int fflag; 317 struct ucred *cred; 318 struct proc *p; 319 { 320 321 if (!chkvnlock(vp)) 322 return (EBADF); 323 return (VOP_IOCTL(vp, com, data, fflag, cred, p)); 324 } 325 326 /* ARGSUSED */ 327 dead_select(vp, which, fflags, cred, p) 328 struct vnode *vp; 329 int which, fflags; 330 struct ucred *cred; 331 struct proc *p; 332 { 333 334 /* 335 * Let the user find out that the descriptor is gone. 336 */ 337 return (1); 338 } 339 340 /* 341 * Just call the device strategy routine 342 */ 343 dead_strategy(bp) 344 register struct buf *bp; 345 { 346 347 if (bp->b_vp == NULL || !chkvnlock(bp->b_vp)) { 348 bp->b_flags |= B_ERROR; 349 biodone(bp); 350 return (EIO); 351 } 352 return (VOP_STRATEGY(bp)); 353 } 354 355 /* 356 * Wait until the vnode has finished changing state. 357 */ 358 dead_lock(vp) 359 struct vnode *vp; 360 { 361 362 if (!chkvnlock(vp)) 363 return (0); 364 return (VOP_LOCK(vp)); 365 } 366 367 /* 368 * Wait until the vnode has finished changing state. 369 */ 370 dead_bmap(vp, bn, vpp, bnp) 371 struct vnode *vp; 372 daddr_t bn; 373 struct vnode **vpp; 374 daddr_t *bnp; 375 { 376 377 if (!chkvnlock(vp)) 378 return (EIO); 379 return (VOP_BMAP(vp, bn, vpp, bnp)); 380 } 381 382 /* 383 * Print out the contents of a dead vnode. 384 */ 385 /* ARGSUSED */ 386 dead_print(vp) 387 struct vnode *vp; 388 { 389 390 printf("tag VT_NON, dead vnode\n"); 391 } 392 393 /* 394 * Empty vnode failed operation 395 */ 396 dead_ebadf() 397 { 398 399 return (EBADF); 400 } 401 402 /* 403 * Empty vnode bad operation 404 */ 405 dead_badop() 406 { 407 408 panic("dead_badop called"); 409 /* NOTREACHED */ 410 } 411 412 /* 413 * Empty vnode null operation 414 */ 415 dead_nullop() 416 { 417 418 return (0); 419 } 420 421 /* 422 * We have to wait during times when the vnode is 423 * in a state of change. 424 */ 425 chkvnlock(vp) 426 register struct vnode *vp; 427 { 428 int locked = 0; 429 430 while (vp->v_flag & VXLOCK) { 431 vp->v_flag |= VXWANT; 432 sleep((caddr_t)vp, PINOD); 433 locked = 1; 434 } 435 return (locked); 436 } 437