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