|
|
1.1 root 1: /* sw.c 4.4 81/03/08 */
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 1/2 this
113: * hunk which needs special treatment anyways.
114: */
115: argdev = swdevt[0].sw_dev;
116: rminit(argmap, blk/2-CLSIZE, CLSIZE,
117: "argmap", ARGMAPSIZE);
118: /*
119: * First of all chunks... initialize the swapmap
120: * the second half of the hunk.
121: */
122: rminit(swapmap, blk/2, blk/2, "swap", nswapmap);
123: } else
124: rmfree(swapmap, blk, vsbase);
125: }
126: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.