1*39483Smckusick /* 2*39483Smckusick * Copyright (c) 1989 The Regents of the University of California. 3*39483Smckusick * All rights reserved. 4*39483Smckusick * 5*39483Smckusick * Redistribution and use in source and binary forms are permitted 6*39483Smckusick * provided that the above copyright notice and this paragraph are 7*39483Smckusick * duplicated in all such forms and that any documentation, 8*39483Smckusick * advertising materials, and other materials related to such 9*39483Smckusick * distribution and use acknowledge that the software was developed 10*39483Smckusick * by the University of California, Berkeley. The name of the 11*39483Smckusick * University may not be used to endorse or promote products derived 12*39483Smckusick * from this software without specific prior written permission. 13*39483Smckusick * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14*39483Smckusick * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15*39483Smckusick * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16*39483Smckusick * 17*39483Smckusick * @(#)dead_vnops.c 7.1 (Berkeley) 11/02/89 18*39483Smckusick */ 19*39483Smckusick 20*39483Smckusick #include "param.h" 21*39483Smckusick #include "time.h" 22*39483Smckusick #include "vnode.h" 23*39483Smckusick #include "errno.h" 24*39483Smckusick #include "namei.h" 25*39483Smckusick #include "buf.h" 26*39483Smckusick 27*39483Smckusick int dead_lookup(), 28*39483Smckusick dead_open(), 29*39483Smckusick dead_read(), 30*39483Smckusick dead_write(), 31*39483Smckusick dead_strategy(), 32*39483Smckusick dead_ioctl(), 33*39483Smckusick dead_select(), 34*39483Smckusick dead_lock(), 35*39483Smckusick dead_badop(), 36*39483Smckusick dead_nullop(); 37*39483Smckusick 38*39483Smckusick struct vnodeops dead_vnodeops = { 39*39483Smckusick dead_lookup, /* lookup */ 40*39483Smckusick dead_badop, /* create */ 41*39483Smckusick dead_badop, /* mknod */ 42*39483Smckusick dead_open, /* open */ 43*39483Smckusick dead_nullop, /* close */ 44*39483Smckusick dead_badop, /* access */ 45*39483Smckusick dead_badop, /* getattr */ 46*39483Smckusick dead_badop, /* setattr */ 47*39483Smckusick dead_read, /* read */ 48*39483Smckusick dead_write, /* write */ 49*39483Smckusick dead_ioctl, /* ioctl */ 50*39483Smckusick dead_select, /* select */ 51*39483Smckusick dead_badop, /* mmap */ 52*39483Smckusick dead_nullop, /* fsync */ 53*39483Smckusick dead_nullop, /* seek */ 54*39483Smckusick dead_badop, /* remove */ 55*39483Smckusick dead_badop, /* link */ 56*39483Smckusick dead_badop, /* rename */ 57*39483Smckusick dead_badop, /* mkdir */ 58*39483Smckusick dead_badop, /* rmdir */ 59*39483Smckusick dead_badop, /* symlink */ 60*39483Smckusick dead_badop, /* readdir */ 61*39483Smckusick dead_badop, /* readlink */ 62*39483Smckusick dead_badop, /* abortop */ 63*39483Smckusick dead_nullop, /* inactive */ 64*39483Smckusick dead_nullop, /* reclaim */ 65*39483Smckusick dead_lock, /* lock */ 66*39483Smckusick dead_nullop, /* unlock */ 67*39483Smckusick dead_badop, /* bmap */ 68*39483Smckusick dead_strategy, /* strategy */ 69*39483Smckusick }; 70*39483Smckusick 71*39483Smckusick /* 72*39483Smckusick * Trivial lookup routine that always fails. 73*39483Smckusick */ 74*39483Smckusick dead_lookup(vp, ndp) 75*39483Smckusick struct vnode *vp; 76*39483Smckusick struct nameidata *ndp; 77*39483Smckusick { 78*39483Smckusick 79*39483Smckusick ndp->ni_dvp = vp; 80*39483Smckusick ndp->ni_vp = NULL; 81*39483Smckusick return (ENOTDIR); 82*39483Smckusick } 83*39483Smckusick 84*39483Smckusick /* 85*39483Smckusick * Open always fails as if device did not exist. 86*39483Smckusick */ 87*39483Smckusick /* ARGSUSED */ 88*39483Smckusick dead_open(vp, mode, cred) 89*39483Smckusick struct vnode *vp; 90*39483Smckusick int mode; 91*39483Smckusick struct ucred *cred; 92*39483Smckusick { 93*39483Smckusick 94*39483Smckusick return (ENXIO); 95*39483Smckusick } 96*39483Smckusick 97*39483Smckusick /* 98*39483Smckusick * Vnode op for read 99*39483Smckusick */ 100*39483Smckusick dead_read(vp, uio, offp, ioflag, cred) 101*39483Smckusick struct vnode *vp; 102*39483Smckusick struct uio *uio; 103*39483Smckusick off_t *offp; 104*39483Smckusick int ioflag; 105*39483Smckusick struct ucred *cred; 106*39483Smckusick { 107*39483Smckusick int locked = 0; 108*39483Smckusick 109*39483Smckusick /* 110*39483Smckusick * We have to wait during times when the vnode is 111*39483Smckusick * in a state of change. 112*39483Smckusick */ 113*39483Smckusick while (vp->v_flag & VXLOCK) { 114*39483Smckusick vp->v_flag |= VXWANT; 115*39483Smckusick sleep((caddr_t)vp, PINOD); 116*39483Smckusick locked = 1; 117*39483Smckusick } 118*39483Smckusick if (!locked) 119*39483Smckusick return (EIO); 120*39483Smckusick return (VOP_READ(vp, uio, offp, ioflag, cred)); 121*39483Smckusick } 122*39483Smckusick 123*39483Smckusick /* 124*39483Smckusick * Vnode op for write 125*39483Smckusick */ 126*39483Smckusick dead_write(vp, uio, offp, ioflag, cred) 127*39483Smckusick register struct vnode *vp; 128*39483Smckusick struct uio *uio; 129*39483Smckusick off_t *offp; 130*39483Smckusick int ioflag; 131*39483Smckusick struct ucred *cred; 132*39483Smckusick { 133*39483Smckusick int locked = 0; 134*39483Smckusick 135*39483Smckusick /* 136*39483Smckusick * We have to wait during times when the vnode is 137*39483Smckusick * in a state of change. 138*39483Smckusick */ 139*39483Smckusick while (vp->v_flag & VXLOCK) { 140*39483Smckusick vp->v_flag |= VXWANT; 141*39483Smckusick sleep((caddr_t)vp, PINOD); 142*39483Smckusick locked = 1; 143*39483Smckusick } 144*39483Smckusick if (!locked) 145*39483Smckusick return (EIO); 146*39483Smckusick return (VOP_WRITE(vp, uio, offp, ioflag, cred)); 147*39483Smckusick } 148*39483Smckusick 149*39483Smckusick /* 150*39483Smckusick * Device ioctl operation. 151*39483Smckusick */ 152*39483Smckusick /* ARGSUSED */ 153*39483Smckusick dead_ioctl(vp, com, data, fflag, cred) 154*39483Smckusick struct vnode *vp; 155*39483Smckusick register int com; 156*39483Smckusick caddr_t data; 157*39483Smckusick int fflag; 158*39483Smckusick struct ucred *cred; 159*39483Smckusick { 160*39483Smckusick int locked = 0; 161*39483Smckusick 162*39483Smckusick /* 163*39483Smckusick * We have to wait during times when the vnode is 164*39483Smckusick * in a state of change. 165*39483Smckusick */ 166*39483Smckusick while (vp->v_flag & VXLOCK) { 167*39483Smckusick vp->v_flag |= VXWANT; 168*39483Smckusick sleep((caddr_t)vp, PINOD); 169*39483Smckusick locked = 1; 170*39483Smckusick } 171*39483Smckusick if (!locked) 172*39483Smckusick return (EBADF); 173*39483Smckusick return (VOP_IOCTL(vp, com, data, fflag, cred)); 174*39483Smckusick } 175*39483Smckusick 176*39483Smckusick /* ARGSUSED */ 177*39483Smckusick dead_select(vp, which, cred) 178*39483Smckusick struct vnode *vp; 179*39483Smckusick int which; 180*39483Smckusick struct ucred *cred; 181*39483Smckusick { 182*39483Smckusick 183*39483Smckusick /* 184*39483Smckusick * Let the user find out that the descriptor is gone. 185*39483Smckusick */ 186*39483Smckusick return (1); 187*39483Smckusick } 188*39483Smckusick 189*39483Smckusick /* 190*39483Smckusick * Just call the device strategy routine 191*39483Smckusick */ 192*39483Smckusick dead_strategy(bp) 193*39483Smckusick register struct buf *bp; 194*39483Smckusick { 195*39483Smckusick int locked = 0; 196*39483Smckusick 197*39483Smckusick /* 198*39483Smckusick * We have to wait during times when the vnode is 199*39483Smckusick * in a state of change. 200*39483Smckusick */ 201*39483Smckusick while (bp->b_vp->v_flag & VXLOCK) { 202*39483Smckusick bp->b_vp->v_flag |= VXWANT; 203*39483Smckusick sleep((caddr_t)bp->b_vp, PINOD); 204*39483Smckusick locked = 1; 205*39483Smckusick } 206*39483Smckusick if (!locked) 207*39483Smckusick return (EIO); 208*39483Smckusick return (VOP_STRATEGY(bp)); 209*39483Smckusick } 210*39483Smckusick 211*39483Smckusick /* 212*39483Smckusick * Wait until the vnode has finished changing state. 213*39483Smckusick */ 214*39483Smckusick dead_lock(vp) 215*39483Smckusick struct vnode *vp; 216*39483Smckusick { 217*39483Smckusick int locked = 0; 218*39483Smckusick 219*39483Smckusick /* 220*39483Smckusick * We have to wait during times when the vnode is 221*39483Smckusick * in a state of change. 222*39483Smckusick */ 223*39483Smckusick while (vp->v_flag & VXLOCK) { 224*39483Smckusick vp->v_flag |= VXWANT; 225*39483Smckusick sleep((caddr_t)vp, PINOD); 226*39483Smckusick locked = 1; 227*39483Smckusick } 228*39483Smckusick if (!locked) 229*39483Smckusick return (0); 230*39483Smckusick return (VOP_LOCK(vp)); 231*39483Smckusick } 232*39483Smckusick 233*39483Smckusick /* 234*39483Smckusick * Empty vnode bad operation 235*39483Smckusick */ 236*39483Smckusick dead_badop() 237*39483Smckusick { 238*39483Smckusick 239*39483Smckusick panic("dead_badop called"); 240*39483Smckusick /* NOTREACHED */ 241*39483Smckusick } 242*39483Smckusick 243*39483Smckusick /* 244*39483Smckusick * Empty vnode null operation 245*39483Smckusick */ 246*39483Smckusick dead_nullop() 247*39483Smckusick { 248*39483Smckusick 249*39483Smckusick return (0); 250*39483Smckusick } 251