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