xref: /original-bsd/sys/ufs/ffs/ffs_subr.c (revision e25934f4)
1c8bc2536Smckusick /*
2065083aeSmckusick  * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
3065083aeSmckusick  * All rights reserved.
4c8bc2536Smckusick  *
5065083aeSmckusick  * Redistribution and use in source and binary forms are permitted
6065083aeSmckusick  * provided that the above copyright notice and this paragraph are
7065083aeSmckusick  * duplicated in all such forms and that any documentation,
8065083aeSmckusick  * advertising materials, and other materials related to such
9065083aeSmckusick  * distribution and use acknowledge that the software was developed
10065083aeSmckusick  * by the University of California, Berkeley.  The name of the
11065083aeSmckusick  * University may not be used to endorse or promote products derived
12065083aeSmckusick  * from this software without specific prior written permission.
13065083aeSmckusick  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14065083aeSmckusick  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15065083aeSmckusick  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16065083aeSmckusick  *
17*e25934f4Smckusick  *	@(#)ffs_subr.c	7.12 (Berkeley) 05/10/90
18c8bc2536Smckusick  */
192fd425aeSroot 
202fd425aeSroot #ifdef KERNEL
21f991b3b1Sbloom #include "param.h"
22065083aeSmckusick #include "../ufs/fs.h"
232fd425aeSroot #else
242fd425aeSroot #include <sys/param.h>
25065083aeSmckusick #include <ufs/fs.h>
260c465d6dSsam #endif
270c465d6dSsam 
282fd425aeSroot extern	int around[9];
292fd425aeSroot extern	int inside[9];
302fd425aeSroot extern	u_char *fragtbl[];
312fd425aeSroot 
322fd425aeSroot /*
332fd425aeSroot  * Update the frsum fields to reflect addition or deletion
342fd425aeSroot  * of some frags.
352fd425aeSroot  */
362fd425aeSroot fragacct(fs, fragmap, fraglist, cnt)
372fd425aeSroot 	struct fs *fs;
382fd425aeSroot 	int fragmap;
392fd425aeSroot 	long fraglist[];
402fd425aeSroot 	int cnt;
412fd425aeSroot {
422fd425aeSroot 	int inblk;
432fd425aeSroot 	register int field, subfield;
442fd425aeSroot 	register int siz, pos;
452fd425aeSroot 
462fd425aeSroot 	inblk = (int)(fragtbl[fs->fs_frag][fragmap]) << 1;
472fd425aeSroot 	fragmap <<= 1;
482fd425aeSroot 	for (siz = 1; siz < fs->fs_frag; siz++) {
492fd425aeSroot 		if ((inblk & (1 << (siz + (fs->fs_frag % NBBY)))) == 0)
502fd425aeSroot 			continue;
512fd425aeSroot 		field = around[siz];
522fd425aeSroot 		subfield = inside[siz];
532fd425aeSroot 		for (pos = siz; pos <= fs->fs_frag; pos++) {
542fd425aeSroot 			if ((fragmap & field) == subfield) {
552fd425aeSroot 				fraglist[siz] += cnt;
562fd425aeSroot 				pos += siz;
572fd425aeSroot 				field <<= siz;
582fd425aeSroot 				subfield <<= siz;
592fd425aeSroot 			}
602fd425aeSroot 			field <<= 1;
612fd425aeSroot 			subfield <<= 1;
622fd425aeSroot 		}
632fd425aeSroot 	}
642fd425aeSroot }
652fd425aeSroot 
662fd425aeSroot /*
672fd425aeSroot  * block operations
682fd425aeSroot  *
692fd425aeSroot  * check if a block is available
702fd425aeSroot  */
712fd425aeSroot isblock(fs, cp, h)
722fd425aeSroot 	struct fs *fs;
732fd425aeSroot 	unsigned char *cp;
742fd425aeSroot 	daddr_t h;
752fd425aeSroot {
762fd425aeSroot 	unsigned char mask;
772fd425aeSroot 
78c6f9bf5fSkarels 	switch ((int)fs->fs_frag) {
792fd425aeSroot 	case 8:
802fd425aeSroot 		return (cp[h] == 0xff);
812fd425aeSroot 	case 4:
822fd425aeSroot 		mask = 0x0f << ((h & 0x1) << 2);
832fd425aeSroot 		return ((cp[h >> 1] & mask) == mask);
842fd425aeSroot 	case 2:
852fd425aeSroot 		mask = 0x03 << ((h & 0x3) << 1);
862fd425aeSroot 		return ((cp[h >> 2] & mask) == mask);
872fd425aeSroot 	case 1:
882fd425aeSroot 		mask = 0x01 << (h & 0x7);
892fd425aeSroot 		return ((cp[h >> 3] & mask) == mask);
902fd425aeSroot 	default:
912fd425aeSroot 		panic("isblock");
922fd425aeSroot 		return (NULL);
932fd425aeSroot 	}
942fd425aeSroot }
952fd425aeSroot 
962fd425aeSroot /*
972fd425aeSroot  * take a block out of the map
982fd425aeSroot  */
992fd425aeSroot clrblock(fs, cp, h)
1002fd425aeSroot 	struct fs *fs;
10191257f00Sroot 	u_char *cp;
1022fd425aeSroot 	daddr_t h;
1032fd425aeSroot {
1042fd425aeSroot 
105c6f9bf5fSkarels 	switch ((int)fs->fs_frag) {
1062fd425aeSroot 	case 8:
1072fd425aeSroot 		cp[h] = 0;
1082fd425aeSroot 		return;
1092fd425aeSroot 	case 4:
1102fd425aeSroot 		cp[h >> 1] &= ~(0x0f << ((h & 0x1) << 2));
1112fd425aeSroot 		return;
1122fd425aeSroot 	case 2:
1132fd425aeSroot 		cp[h >> 2] &= ~(0x03 << ((h & 0x3) << 1));
1142fd425aeSroot 		return;
1152fd425aeSroot 	case 1:
1162fd425aeSroot 		cp[h >> 3] &= ~(0x01 << (h & 0x7));
1172fd425aeSroot 		return;
1182fd425aeSroot 	default:
1192fd425aeSroot 		panic("clrblock");
1202fd425aeSroot 	}
1212fd425aeSroot }
1222fd425aeSroot 
1232fd425aeSroot /*
1242fd425aeSroot  * put a block into the map
1252fd425aeSroot  */
1262fd425aeSroot setblock(fs, cp, h)
1272fd425aeSroot 	struct fs *fs;
1282fd425aeSroot 	unsigned char *cp;
1292fd425aeSroot 	daddr_t h;
1302fd425aeSroot {
1312fd425aeSroot 
132c6f9bf5fSkarels 	switch ((int)fs->fs_frag) {
1332fd425aeSroot 
1342fd425aeSroot 	case 8:
1352fd425aeSroot 		cp[h] = 0xff;
1362fd425aeSroot 		return;
1372fd425aeSroot 	case 4:
1382fd425aeSroot 		cp[h >> 1] |= (0x0f << ((h & 0x1) << 2));
1392fd425aeSroot 		return;
1402fd425aeSroot 	case 2:
1412fd425aeSroot 		cp[h >> 2] |= (0x03 << ((h & 0x3) << 1));
1422fd425aeSroot 		return;
1432fd425aeSroot 	case 1:
1442fd425aeSroot 		cp[h >> 3] |= (0x01 << (h & 0x7));
1452fd425aeSroot 		return;
1462fd425aeSroot 	default:
1472fd425aeSroot 		panic("setblock");
1482fd425aeSroot 	}
1492fd425aeSroot }
1500c465d6dSsam 
151*e25934f4Smckusick #if (!defined(vax) && !defined(tahoe) && !defined(hp300)) \
152*e25934f4Smckusick 	|| defined(VAX630) || defined(VAX650)
153aa9e473eSmckusick /*
1544767510aSkarels  * C definitions of special instructions.
1554767510aSkarels  * Normally expanded with inline.
156aa9e473eSmckusick  */
157aa9e473eSmckusick scanc(size, cp, table, mask)
158aa9e473eSmckusick 	u_int size;
159aa9e473eSmckusick 	register u_char *cp, table[];
160aa9e473eSmckusick 	register u_char mask;
161aa9e473eSmckusick {
162aa9e473eSmckusick 	register u_char *end = &cp[size];
163aa9e473eSmckusick 
164aa9e473eSmckusick 	while (cp < end && (table[*cp] & mask) == 0)
165aa9e473eSmckusick 		cp++;
166aa9e473eSmckusick 	return (end - cp);
167aa9e473eSmckusick }
1687381b39dSkridle #endif
1697381b39dSkridle 
170*e25934f4Smckusick #if !defined(vax) && !defined(tahoe) && !defined(hp300)
171aa9e473eSmckusick skpc(mask, size, cp)
172aa9e473eSmckusick 	register u_char mask;
173aa9e473eSmckusick 	u_int size;
174aa9e473eSmckusick 	register u_char *cp;
175aa9e473eSmckusick {
176aa9e473eSmckusick 	register u_char *end = &cp[size];
177aa9e473eSmckusick 
178aa9e473eSmckusick 	while (cp < end && *cp == mask)
179aa9e473eSmckusick 		cp++;
180aa9e473eSmckusick 	return (end - cp);
181aa9e473eSmckusick }
182aa9e473eSmckusick 
183aa9e473eSmckusick locc(mask, size, cp)
184aa9e473eSmckusick 	register u_char mask;
185aa9e473eSmckusick 	u_int size;
186aa9e473eSmckusick 	register u_char *cp;
187aa9e473eSmckusick {
188aa9e473eSmckusick 	register u_char *end = &cp[size];
189aa9e473eSmckusick 
190aa9e473eSmckusick 	while (cp < end && *cp != mask)
191aa9e473eSmckusick 		cp++;
192aa9e473eSmckusick 	return (end - cp);
193aa9e473eSmckusick }
1944767510aSkarels #endif
195