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