Annotation of 40BSD/sys/dev/sw.c, revision 1.1

1.1     ! root        1: /*     sw.c    4.2     11/9/80 */
        !             2: 
        !             3: #include "../h/param.h"
        !             4: #include "../h/systm.h"
        !             5: #include "../h/buf.h"
        !             6: #include "../h/conf.h"
        !             7: #include "../h/dir.h"
        !             8: #include "../h/user.h"
        !             9: #include "../h/inode.h"
        !            10: #include "../h/map.h"
        !            11: 
        !            12: struct buf rswbuf;
        !            13: /*
        !            14:  * Indirect driver for multi-controller paging.
        !            15:  */
        !            16: swstrategy(bp)
        !            17:        register struct buf *bp;
        !            18: {
        !            19:        int sz, off, seg;
        !            20:        dev_t dev;
        !            21: 
        !            22:        sz = (bp->b_bcount+511)/512;
        !            23:        off = bp->b_blkno % DMMAX;
        !            24:        if (bp->b_blkno+sz > nswap || off+sz > DMMAX) {
        !            25:                bp->b_flags |= B_ERROR;
        !            26:                iodone(bp);
        !            27:                return;
        !            28:        }
        !            29:        seg = bp->b_blkno / DMMAX;
        !            30:        dev = swdevt[seg % nswdev].sw_dev;
        !            31:        seg /= nswdev;
        !            32:        bp->b_blkno = seg*DMMAX + off;
        !            33:        bp->b_dev = dev;
        !            34:        if (dev == 0)
        !            35:                panic("swstrategy");
        !            36:        (*bdevsw[major(dev)].d_strategy)(bp);
        !            37: }
        !            38: 
        !            39: swread(dev)
        !            40: {
        !            41: 
        !            42:        physio(swstrategy, &rswbuf, dev, B_READ, minphys);
        !            43: }
        !            44: 
        !            45: swwrite(dev)
        !            46: {
        !            47: 
        !            48:        physio(swstrategy, &rswbuf, dev, B_WRITE, minphys);
        !            49: }
        !            50: 
        !            51: /*
        !            52:  * System call swapon(name) enables swapping on device name,
        !            53:  * which must be in the swdevsw.  Return EBUSY
        !            54:  * if already swapping on this device.
        !            55:  */
        !            56: vswapon()
        !            57: {
        !            58:        register struct inode *ip;
        !            59:        dev_t dev;
        !            60:        register struct swdevt *sp;
        !            61: 
        !            62:        ip = namei(uchar, 0);
        !            63:        if (ip == NULL)
        !            64:                return;
        !            65:        if ((ip->i_mode&IFMT) != IFBLK) {
        !            66:                u.u_error = ENOTBLK;
        !            67:                iput(ip);
        !            68:                return;
        !            69:        }
        !            70:        dev = (dev_t)ip->i_un.i_rdev;
        !            71:        iput(ip);
        !            72:        if (major(dev) >= nblkdev) {
        !            73:                u.u_error = ENXIO;
        !            74:                return;
        !            75:        }
        !            76:        /*
        !            77:         * Search starting at second table entry,
        !            78:         * since first (primary swap area) is freed at boot.
        !            79:         */
        !            80:        for (sp = &swdevt[1]; sp->sw_dev; sp++)
        !            81:                if (sp->sw_dev == dev) {
        !            82:                        if (sp->sw_freed) {
        !            83:                                u.u_error = EBUSY;
        !            84:                                return;
        !            85:                        }
        !            86:                        swfree(sp - swdevt);
        !            87:                        return;
        !            88:                }
        !            89:        u.u_error = ENODEV;
        !            90: }
        !            91: 
        !            92: /*
        !            93:  * Swfree(index) frees the index'th portion of the swap map.
        !            94:  * Each of the nswdev devices provides 1/nswdev'th of the swap
        !            95:  * space, which is laid out with blocks of DMMAX pages circularly
        !            96:  * among the devices.
        !            97:  */
        !            98: swfree(index)
        !            99:        int index;
        !           100: {
        !           101:        register swblk_t vsbase;
        !           102:        register int blk;
        !           103: 
        !           104:        swdevt[index].sw_freed = 1;
        !           105:        for (vsbase = index*DMMAX; vsbase < nswap; vsbase += nswdev*DMMAX) {
        !           106:                blk = nswap - vsbase;
        !           107:                if (blk > DMMAX)
        !           108:                        blk = DMMAX;
        !           109:                if (vsbase == 0) {
        !           110:                        /*
        !           111:                         * Can't free a block starting at 0 in the swapmap
        !           112:                         * but need some space for argmap so use this
        !           113:                         * hunk which needs special treatment anyways.
        !           114:                         */
        !           115:                        argdev = swdevt[0].sw_dev;
        !           116:                        mfree(argmap, blk-CLSIZE, vsbase+CLSIZE);
        !           117:                } else
        !           118:                        mfree(swapmap, blk, vsbase);
        !           119:        }
        !           120: }

unix.superglobalmegacorp.com

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