139483Smckusick /* 239483Smckusick * Copyright (c) 1989 The Regents of the University of California. 339483Smckusick * All rights reserved. 439483Smckusick * 539483Smckusick * Redistribution and use in source and binary forms are permitted 639483Smckusick * provided that the above copyright notice and this paragraph are 739483Smckusick * duplicated in all such forms and that any documentation, 839483Smckusick * advertising materials, and other materials related to such 939483Smckusick * distribution and use acknowledge that the software was developed 1039483Smckusick * by the University of California, Berkeley. The name of the 1139483Smckusick * University may not be used to endorse or promote products derived 1239483Smckusick * from this software without specific prior written permission. 1339483Smckusick * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 1439483Smckusick * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 1539483Smckusick * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1639483Smckusick * 17*39486Smckusick * @(#)dead_vnops.c 7.2 (Berkeley) 11/03/89 1839483Smckusick */ 1939483Smckusick 2039483Smckusick #include "param.h" 2139483Smckusick #include "time.h" 2239483Smckusick #include "vnode.h" 2339483Smckusick #include "errno.h" 2439483Smckusick #include "namei.h" 2539483Smckusick #include "buf.h" 2639483Smckusick 2739483Smckusick int dead_lookup(), 2839483Smckusick dead_open(), 2939483Smckusick dead_read(), 3039483Smckusick dead_write(), 3139483Smckusick dead_strategy(), 3239483Smckusick dead_ioctl(), 3339483Smckusick dead_select(), 3439483Smckusick dead_lock(), 35*39486Smckusick dead_ebadf(), 3639483Smckusick dead_badop(), 3739483Smckusick dead_nullop(); 3839483Smckusick 3939483Smckusick struct vnodeops dead_vnodeops = { 4039483Smckusick dead_lookup, /* lookup */ 4139483Smckusick dead_badop, /* create */ 4239483Smckusick dead_badop, /* mknod */ 4339483Smckusick dead_open, /* open */ 4439483Smckusick dead_nullop, /* close */ 45*39486Smckusick dead_ebadf, /* access */ 46*39486Smckusick dead_ebadf, /* getattr */ 47*39486Smckusick dead_ebadf, /* setattr */ 4839483Smckusick dead_read, /* read */ 4939483Smckusick dead_write, /* write */ 5039483Smckusick dead_ioctl, /* ioctl */ 5139483Smckusick dead_select, /* select */ 5239483Smckusick dead_badop, /* mmap */ 5339483Smckusick dead_nullop, /* fsync */ 5439483Smckusick dead_nullop, /* seek */ 5539483Smckusick dead_badop, /* remove */ 5639483Smckusick dead_badop, /* link */ 5739483Smckusick dead_badop, /* rename */ 5839483Smckusick dead_badop, /* mkdir */ 5939483Smckusick dead_badop, /* rmdir */ 6039483Smckusick dead_badop, /* symlink */ 61*39486Smckusick dead_ebadf, /* readdir */ 62*39486Smckusick dead_ebadf, /* readlink */ 6339483Smckusick dead_badop, /* abortop */ 6439483Smckusick dead_nullop, /* inactive */ 6539483Smckusick dead_nullop, /* reclaim */ 6639483Smckusick dead_lock, /* lock */ 6739483Smckusick dead_nullop, /* unlock */ 6839483Smckusick dead_badop, /* bmap */ 6939483Smckusick dead_strategy, /* strategy */ 7039483Smckusick }; 7139483Smckusick 7239483Smckusick /* 7339483Smckusick * Trivial lookup routine that always fails. 7439483Smckusick */ 7539483Smckusick dead_lookup(vp, ndp) 7639483Smckusick struct vnode *vp; 7739483Smckusick struct nameidata *ndp; 7839483Smckusick { 7939483Smckusick 8039483Smckusick ndp->ni_dvp = vp; 8139483Smckusick ndp->ni_vp = NULL; 8239483Smckusick return (ENOTDIR); 8339483Smckusick } 8439483Smckusick 8539483Smckusick /* 8639483Smckusick * Open always fails as if device did not exist. 8739483Smckusick */ 8839483Smckusick /* ARGSUSED */ 8939483Smckusick dead_open(vp, mode, cred) 9039483Smckusick struct vnode *vp; 9139483Smckusick int mode; 9239483Smckusick struct ucred *cred; 9339483Smckusick { 9439483Smckusick 9539483Smckusick return (ENXIO); 9639483Smckusick } 9739483Smckusick 9839483Smckusick /* 9939483Smckusick * Vnode op for read 10039483Smckusick */ 10139483Smckusick dead_read(vp, uio, offp, ioflag, cred) 10239483Smckusick struct vnode *vp; 10339483Smckusick struct uio *uio; 10439483Smckusick off_t *offp; 10539483Smckusick int ioflag; 10639483Smckusick struct ucred *cred; 10739483Smckusick { 10839483Smckusick int locked = 0; 10939483Smckusick 11039483Smckusick /* 11139483Smckusick * We have to wait during times when the vnode is 11239483Smckusick * in a state of change. 11339483Smckusick */ 11439483Smckusick while (vp->v_flag & VXLOCK) { 11539483Smckusick vp->v_flag |= VXWANT; 11639483Smckusick sleep((caddr_t)vp, PINOD); 11739483Smckusick locked = 1; 11839483Smckusick } 11939483Smckusick if (!locked) 12039483Smckusick return (EIO); 12139483Smckusick return (VOP_READ(vp, uio, offp, ioflag, cred)); 12239483Smckusick } 12339483Smckusick 12439483Smckusick /* 12539483Smckusick * Vnode op for write 12639483Smckusick */ 12739483Smckusick dead_write(vp, uio, offp, ioflag, cred) 12839483Smckusick register struct vnode *vp; 12939483Smckusick struct uio *uio; 13039483Smckusick off_t *offp; 13139483Smckusick int ioflag; 13239483Smckusick struct ucred *cred; 13339483Smckusick { 13439483Smckusick int locked = 0; 13539483Smckusick 13639483Smckusick /* 13739483Smckusick * We have to wait during times when the vnode is 13839483Smckusick * in a state of change. 13939483Smckusick */ 14039483Smckusick while (vp->v_flag & VXLOCK) { 14139483Smckusick vp->v_flag |= VXWANT; 14239483Smckusick sleep((caddr_t)vp, PINOD); 14339483Smckusick locked = 1; 14439483Smckusick } 14539483Smckusick if (!locked) 14639483Smckusick return (EIO); 14739483Smckusick return (VOP_WRITE(vp, uio, offp, ioflag, cred)); 14839483Smckusick } 14939483Smckusick 15039483Smckusick /* 15139483Smckusick * Device ioctl operation. 15239483Smckusick */ 15339483Smckusick /* ARGSUSED */ 15439483Smckusick dead_ioctl(vp, com, data, fflag, cred) 15539483Smckusick struct vnode *vp; 15639483Smckusick register int com; 15739483Smckusick caddr_t data; 15839483Smckusick int fflag; 15939483Smckusick struct ucred *cred; 16039483Smckusick { 16139483Smckusick int locked = 0; 16239483Smckusick 16339483Smckusick /* 16439483Smckusick * We have to wait during times when the vnode is 16539483Smckusick * in a state of change. 16639483Smckusick */ 16739483Smckusick while (vp->v_flag & VXLOCK) { 16839483Smckusick vp->v_flag |= VXWANT; 16939483Smckusick sleep((caddr_t)vp, PINOD); 17039483Smckusick locked = 1; 17139483Smckusick } 17239483Smckusick if (!locked) 17339483Smckusick return (EBADF); 17439483Smckusick return (VOP_IOCTL(vp, com, data, fflag, cred)); 17539483Smckusick } 17639483Smckusick 17739483Smckusick /* ARGSUSED */ 17839483Smckusick dead_select(vp, which, cred) 17939483Smckusick struct vnode *vp; 18039483Smckusick int which; 18139483Smckusick struct ucred *cred; 18239483Smckusick { 18339483Smckusick 18439483Smckusick /* 18539483Smckusick * Let the user find out that the descriptor is gone. 18639483Smckusick */ 18739483Smckusick return (1); 18839483Smckusick } 18939483Smckusick 19039483Smckusick /* 19139483Smckusick * Just call the device strategy routine 19239483Smckusick */ 19339483Smckusick dead_strategy(bp) 19439483Smckusick register struct buf *bp; 19539483Smckusick { 19639483Smckusick int locked = 0; 19739483Smckusick 19839483Smckusick /* 19939483Smckusick * We have to wait during times when the vnode is 20039483Smckusick * in a state of change. 20139483Smckusick */ 20239483Smckusick while (bp->b_vp->v_flag & VXLOCK) { 20339483Smckusick bp->b_vp->v_flag |= VXWANT; 20439483Smckusick sleep((caddr_t)bp->b_vp, PINOD); 20539483Smckusick locked = 1; 20639483Smckusick } 20739483Smckusick if (!locked) 20839483Smckusick return (EIO); 20939483Smckusick return (VOP_STRATEGY(bp)); 21039483Smckusick } 21139483Smckusick 21239483Smckusick /* 21339483Smckusick * Wait until the vnode has finished changing state. 21439483Smckusick */ 21539483Smckusick dead_lock(vp) 21639483Smckusick struct vnode *vp; 21739483Smckusick { 21839483Smckusick int locked = 0; 21939483Smckusick 22039483Smckusick /* 22139483Smckusick * We have to wait during times when the vnode is 22239483Smckusick * in a state of change. 22339483Smckusick */ 22439483Smckusick while (vp->v_flag & VXLOCK) { 22539483Smckusick vp->v_flag |= VXWANT; 22639483Smckusick sleep((caddr_t)vp, PINOD); 22739483Smckusick locked = 1; 22839483Smckusick } 22939483Smckusick if (!locked) 23039483Smckusick return (0); 23139483Smckusick return (VOP_LOCK(vp)); 23239483Smckusick } 23339483Smckusick 23439483Smckusick /* 235*39486Smckusick * Empty vnode failed operation 236*39486Smckusick */ 237*39486Smckusick dead_ebadf() 238*39486Smckusick { 239*39486Smckusick 240*39486Smckusick return (EBADF); 241*39486Smckusick } 242*39486Smckusick 243*39486Smckusick /* 24439483Smckusick * Empty vnode bad operation 24539483Smckusick */ 24639483Smckusick dead_badop() 24739483Smckusick { 24839483Smckusick 24939483Smckusick panic("dead_badop called"); 25039483Smckusick /* NOTREACHED */ 25139483Smckusick } 25239483Smckusick 25339483Smckusick /* 25439483Smckusick * Empty vnode null operation 25539483Smckusick */ 25639483Smckusick dead_nullop() 25739483Smckusick { 25839483Smckusick 25939483Smckusick return (0); 26039483Smckusick } 261