Annotation of 43BSDReno/sys/kern/dead_vnops.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.