|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986, 1989 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: * @(#)ufs_subr.c 7.13 (Berkeley) 6/28/90
21: */
22:
23: #ifdef KERNEL
24: #include "param.h"
25: #include "../ufs/fs.h"
26: #else
27: #include <sys/param.h>
28: #include <ufs/fs.h>
29: #endif
30:
31: extern int around[9];
32: extern int inside[9];
33: extern u_char *fragtbl[];
34:
35: /*
36: * Update the frsum fields to reflect addition or deletion
37: * of some frags.
38: */
39: fragacct(fs, fragmap, fraglist, cnt)
40: struct fs *fs;
41: int fragmap;
42: long fraglist[];
43: int cnt;
44: {
45: int inblk;
46: register int field, subfield;
47: register int siz, pos;
48:
49: inblk = (int)(fragtbl[fs->fs_frag][fragmap]) << 1;
50: fragmap <<= 1;
51: for (siz = 1; siz < fs->fs_frag; siz++) {
52: if ((inblk & (1 << (siz + (fs->fs_frag % NBBY)))) == 0)
53: continue;
54: field = around[siz];
55: subfield = inside[siz];
56: for (pos = siz; pos <= fs->fs_frag; pos++) {
57: if ((fragmap & field) == subfield) {
58: fraglist[siz] += cnt;
59: pos += siz;
60: field <<= siz;
61: subfield <<= siz;
62: }
63: field <<= 1;
64: subfield <<= 1;
65: }
66: }
67: }
68:
69: /*
70: * block operations
71: *
72: * check if a block is available
73: */
74: isblock(fs, cp, h)
75: struct fs *fs;
76: unsigned char *cp;
77: daddr_t h;
78: {
79: unsigned char mask;
80:
81: switch ((int)fs->fs_frag) {
82: case 8:
83: return (cp[h] == 0xff);
84: case 4:
85: mask = 0x0f << ((h & 0x1) << 2);
86: return ((cp[h >> 1] & mask) == mask);
87: case 2:
88: mask = 0x03 << ((h & 0x3) << 1);
89: return ((cp[h >> 2] & mask) == mask);
90: case 1:
91: mask = 0x01 << (h & 0x7);
92: return ((cp[h >> 3] & mask) == mask);
93: default:
94: panic("isblock");
95: return (NULL);
96: }
97: }
98:
99: /*
100: * take a block out of the map
101: */
102: clrblock(fs, cp, h)
103: struct fs *fs;
104: u_char *cp;
105: daddr_t h;
106: {
107:
108: switch ((int)fs->fs_frag) {
109: case 8:
110: cp[h] = 0;
111: return;
112: case 4:
113: cp[h >> 1] &= ~(0x0f << ((h & 0x1) << 2));
114: return;
115: case 2:
116: cp[h >> 2] &= ~(0x03 << ((h & 0x3) << 1));
117: return;
118: case 1:
119: cp[h >> 3] &= ~(0x01 << (h & 0x7));
120: return;
121: default:
122: panic("clrblock");
123: }
124: }
125:
126: /*
127: * put a block into the map
128: */
129: setblock(fs, cp, h)
130: struct fs *fs;
131: unsigned char *cp;
132: daddr_t h;
133: {
134:
135: switch ((int)fs->fs_frag) {
136:
137: case 8:
138: cp[h] = 0xff;
139: return;
140: case 4:
141: cp[h >> 1] |= (0x0f << ((h & 0x1) << 2));
142: return;
143: case 2:
144: cp[h >> 2] |= (0x03 << ((h & 0x3) << 1));
145: return;
146: case 1:
147: cp[h >> 3] |= (0x01 << (h & 0x7));
148: return;
149: default:
150: panic("setblock");
151: }
152: }
153:
154: #if (!defined(vax) && !defined(tahoe) && !defined(hp300)) \
155: || defined(VAX630) || defined(VAX650)
156: /*
157: * C definitions of special instructions.
158: * Normally expanded with inline.
159: */
160: scanc(size, cp, table, mask)
161: u_int size;
162: register u_char *cp, table[];
163: register u_char mask;
164: {
165: register u_char *end = &cp[size];
166:
167: while (cp < end && (table[*cp] & mask) == 0)
168: cp++;
169: return (end - cp);
170: }
171: #endif
172:
173: #if !defined(vax) && !defined(tahoe) && !defined(hp300)
174: skpc(mask, size, cp)
175: register u_char mask;
176: u_int size;
177: register u_char *cp;
178: {
179: register u_char *end = &cp[size];
180:
181: while (cp < end && *cp == mask)
182: cp++;
183: return (end - cp);
184: }
185:
186: locc(mask, size, cp)
187: register u_char mask;
188: u_int size;
189: register u_char *cp;
190: {
191: register u_char *end = &cp[size];
192:
193: while (cp < end && *cp != mask)
194: cp++;
195: return (end - cp);
196: }
197: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.