Annotation of Net2/ufs/ufs_subr.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms, with or without
                      6:  * modification, are permitted provided that the following conditions
                      7:  * are met:
                      8:  * 1. Redistributions of source code must retain the above copyright
                      9:  *    notice, this list of conditions and the following disclaimer.
                     10:  * 2. Redistributions in binary form must reproduce the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer in the
                     12:  *    documentation and/or other materials provided with the distribution.
                     13:  * 3. All advertising materials mentioning features or use of this software
                     14:  *    must display the following acknowledgement:
                     15:  *     This product includes software developed by the University of
                     16:  *     California, Berkeley and its contributors.
                     17:  * 4. Neither the name of the University nor the names of its contributors
                     18:  *    may be used to endorse or promote products derived from this software
                     19:  *    without specific prior written permission.
                     20:  *
                     21:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     22:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     23:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     24:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     25:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     26:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     27:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     28:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     29:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     30:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     31:  * SUCH DAMAGE.
                     32:  *
                     33:  *     @(#)ufs_subr.c  7.13 (Berkeley) 6/28/90
                     34:  */
                     35: 
                     36: #ifdef KERNEL
                     37: #include "param.h"
                     38: #include "../ufs/fs.h"
                     39: #else
                     40: #include <sys/param.h>
                     41: #include <ufs/fs.h>
                     42: #endif
                     43: 
                     44: extern int around[9];
                     45: extern int inside[9];
                     46: extern u_char *fragtbl[];
                     47: 
                     48: /*
                     49:  * Update the frsum fields to reflect addition or deletion 
                     50:  * of some frags.
                     51:  */
                     52: fragacct(fs, fragmap, fraglist, cnt)
                     53:        struct fs *fs;
                     54:        int fragmap;
                     55:        long fraglist[];
                     56:        int cnt;
                     57: {
                     58:        int inblk;
                     59:        register int field, subfield;
                     60:        register int siz, pos;
                     61: 
                     62:        inblk = (int)(fragtbl[fs->fs_frag][fragmap]) << 1;
                     63:        fragmap <<= 1;
                     64:        for (siz = 1; siz < fs->fs_frag; siz++) {
                     65:                if ((inblk & (1 << (siz + (fs->fs_frag % NBBY)))) == 0)
                     66:                        continue;
                     67:                field = around[siz];
                     68:                subfield = inside[siz];
                     69:                for (pos = siz; pos <= fs->fs_frag; pos++) {
                     70:                        if ((fragmap & field) == subfield) {
                     71:                                fraglist[siz] += cnt;
                     72:                                pos += siz;
                     73:                                field <<= siz;
                     74:                                subfield <<= siz;
                     75:                        }
                     76:                        field <<= 1;
                     77:                        subfield <<= 1;
                     78:                }
                     79:        }
                     80: }
                     81: 
                     82: /*
                     83:  * block operations
                     84:  *
                     85:  * check if a block is available
                     86:  */
                     87: isblock(fs, cp, h)
                     88:        struct fs *fs;
                     89:        unsigned char *cp;
                     90:        daddr_t h;
                     91: {
                     92:        unsigned char mask;
                     93: 
                     94:        switch ((int)fs->fs_frag) {
                     95:        case 8:
                     96:                return (cp[h] == 0xff);
                     97:        case 4:
                     98:                mask = 0x0f << ((h & 0x1) << 2);
                     99:                return ((cp[h >> 1] & mask) == mask);
                    100:        case 2:
                    101:                mask = 0x03 << ((h & 0x3) << 1);
                    102:                return ((cp[h >> 2] & mask) == mask);
                    103:        case 1:
                    104:                mask = 0x01 << (h & 0x7);
                    105:                return ((cp[h >> 3] & mask) == mask);
                    106:        default:
                    107:                panic("isblock");
                    108:                return (NULL);
                    109:        }
                    110: }
                    111: 
                    112: /*
                    113:  * take a block out of the map
                    114:  */
                    115: clrblock(fs, cp, h)
                    116:        struct fs *fs;
                    117:        u_char *cp;
                    118:        daddr_t h;
                    119: {
                    120: 
                    121:        switch ((int)fs->fs_frag) {
                    122:        case 8:
                    123:                cp[h] = 0;
                    124:                return;
                    125:        case 4:
                    126:                cp[h >> 1] &= ~(0x0f << ((h & 0x1) << 2));
                    127:                return;
                    128:        case 2:
                    129:                cp[h >> 2] &= ~(0x03 << ((h & 0x3) << 1));
                    130:                return;
                    131:        case 1:
                    132:                cp[h >> 3] &= ~(0x01 << (h & 0x7));
                    133:                return;
                    134:        default:
                    135:                panic("clrblock");
                    136:        }
                    137: }
                    138: 
                    139: /*
                    140:  * put a block into the map
                    141:  */
                    142: setblock(fs, cp, h)
                    143:        struct fs *fs;
                    144:        unsigned char *cp;
                    145:        daddr_t h;
                    146: {
                    147: 
                    148:        switch ((int)fs->fs_frag) {
                    149: 
                    150:        case 8:
                    151:                cp[h] = 0xff;
                    152:                return;
                    153:        case 4:
                    154:                cp[h >> 1] |= (0x0f << ((h & 0x1) << 2));
                    155:                return;
                    156:        case 2:
                    157:                cp[h >> 2] |= (0x03 << ((h & 0x3) << 1));
                    158:                return;
                    159:        case 1:
                    160:                cp[h >> 3] |= (0x01 << (h & 0x7));
                    161:                return;
                    162:        default:
                    163:                panic("setblock");
                    164:        }
                    165: }
                    166: 
                    167: #if (!defined(vax) && !defined(tahoe) && !defined(hp300)) \
                    168:        || defined(VAX630) || defined(VAX650)
                    169: /*
                    170:  * C definitions of special instructions.
                    171:  * Normally expanded with inline.
                    172:  */
                    173: scanc(size, cp, table, mask)
                    174:        u_int size;
                    175:        register u_char *cp, table[];
                    176:        register u_char mask;
                    177: {
                    178:        register u_char *end = &cp[size];
                    179: 
                    180:        while (cp < end && (table[*cp] & mask) == 0)
                    181:                cp++;
                    182:        return (end - cp);
                    183: }
                    184: #endif
                    185: 
                    186: #if !defined(vax) && !defined(tahoe) && !defined(hp300)
                    187: skpc(mask, size, cp)
                    188:        register u_char mask;
                    189:        u_int size;
                    190:        register u_char *cp;
                    191: {
                    192:        register u_char *end = &cp[size];
                    193: 
                    194:        while (cp < end && *cp == mask)
                    195:                cp++;
                    196:        return (end - cp);
                    197: }
                    198: 
                    199: locc(mask, size, cp)
                    200:        register u_char mask;
                    201:        u_int size;
                    202:        register u_char *cp;
                    203: {
                    204:        register u_char *end = &cp[size];
                    205: 
                    206:        while (cp < end && *cp != mask)
                    207:                cp++;
                    208:        return (end - cp);
                    209: }
                    210: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.