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

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:  *
1.1.1.2 ! root       33:  *     from: @(#)ufs_subr.c    7.13 (Berkeley) 6/28/90
        !            34:  *     ufs_subr.c,v 1.3 1993/06/27 07:00:11 andrew Exp
1.1       root       35:  */
                     36: 
                     37: #ifdef KERNEL
                     38: #include "param.h"
                     39: #include "../ufs/fs.h"
                     40: #else
                     41: #include <sys/param.h>
                     42: #include <ufs/fs.h>
                     43: #endif
                     44: 
                     45: extern int around[9];
                     46: extern int inside[9];
                     47: extern u_char *fragtbl[];
                     48: 
                     49: /*
                     50:  * Update the frsum fields to reflect addition or deletion 
                     51:  * of some frags.
                     52:  */
                     53: fragacct(fs, fragmap, fraglist, cnt)
                     54:        struct fs *fs;
                     55:        int fragmap;
                     56:        long fraglist[];
                     57:        int cnt;
                     58: {
                     59:        int inblk;
                     60:        register int field, subfield;
                     61:        register int siz, pos;
                     62: 
                     63:        inblk = (int)(fragtbl[fs->fs_frag][fragmap]) << 1;
                     64:        fragmap <<= 1;
                     65:        for (siz = 1; siz < fs->fs_frag; siz++) {
                     66:                if ((inblk & (1 << (siz + (fs->fs_frag % NBBY)))) == 0)
                     67:                        continue;
                     68:                field = around[siz];
                     69:                subfield = inside[siz];
                     70:                for (pos = siz; pos <= fs->fs_frag; pos++) {
                     71:                        if ((fragmap & field) == subfield) {
                     72:                                fraglist[siz] += cnt;
                     73:                                pos += siz;
                     74:                                field <<= siz;
                     75:                                subfield <<= siz;
                     76:                        }
                     77:                        field <<= 1;
                     78:                        subfield <<= 1;
                     79:                }
                     80:        }
                     81: }
                     82: 
                     83: /*
                     84:  * block operations
                     85:  *
                     86:  * check if a block is available
                     87:  */
                     88: isblock(fs, cp, h)
                     89:        struct fs *fs;
                     90:        unsigned char *cp;
                     91:        daddr_t h;
                     92: {
                     93:        unsigned char mask;
                     94: 
                     95:        switch ((int)fs->fs_frag) {
                     96:        case 8:
                     97:                return (cp[h] == 0xff);
                     98:        case 4:
                     99:                mask = 0x0f << ((h & 0x1) << 2);
                    100:                return ((cp[h >> 1] & mask) == mask);
                    101:        case 2:
                    102:                mask = 0x03 << ((h & 0x3) << 1);
                    103:                return ((cp[h >> 2] & mask) == mask);
                    104:        case 1:
                    105:                mask = 0x01 << (h & 0x7);
                    106:                return ((cp[h >> 3] & mask) == mask);
                    107:        default:
                    108:                panic("isblock");
                    109:                return (NULL);
                    110:        }
                    111: }
                    112: 
                    113: /*
                    114:  * take a block out of the map
                    115:  */
                    116: clrblock(fs, cp, h)
                    117:        struct fs *fs;
                    118:        u_char *cp;
                    119:        daddr_t h;
                    120: {
                    121: 
                    122:        switch ((int)fs->fs_frag) {
                    123:        case 8:
                    124:                cp[h] = 0;
                    125:                return;
                    126:        case 4:
                    127:                cp[h >> 1] &= ~(0x0f << ((h & 0x1) << 2));
                    128:                return;
                    129:        case 2:
                    130:                cp[h >> 2] &= ~(0x03 << ((h & 0x3) << 1));
                    131:                return;
                    132:        case 1:
                    133:                cp[h >> 3] &= ~(0x01 << (h & 0x7));
                    134:                return;
                    135:        default:
                    136:                panic("clrblock");
                    137:        }
                    138: }
                    139: 
                    140: /*
                    141:  * put a block into the map
                    142:  */
                    143: setblock(fs, cp, h)
                    144:        struct fs *fs;
                    145:        unsigned char *cp;
                    146:        daddr_t h;
                    147: {
                    148: 
                    149:        switch ((int)fs->fs_frag) {
                    150: 
                    151:        case 8:
                    152:                cp[h] = 0xff;
                    153:                return;
                    154:        case 4:
                    155:                cp[h >> 1] |= (0x0f << ((h & 0x1) << 2));
                    156:                return;
                    157:        case 2:
                    158:                cp[h >> 2] |= (0x03 << ((h & 0x3) << 1));
                    159:                return;
                    160:        case 1:
                    161:                cp[h >> 3] |= (0x01 << (h & 0x7));
                    162:                return;
                    163:        default:
                    164:                panic("setblock");
                    165:        }
                    166: }
                    167: 
                    168: #if (!defined(vax) && !defined(tahoe) && !defined(hp300)) \
                    169:        || defined(VAX630) || defined(VAX650)
                    170: /*
                    171:  * C definitions of special instructions.
                    172:  * Normally expanded with inline.
                    173:  */
1.1.1.2 ! root      174: int
1.1       root      175: scanc(size, cp, table, mask)
                    176:        u_int size;
                    177:        register u_char *cp, table[];
                    178:        register u_char mask;
                    179: {
                    180:        register u_char *end = &cp[size];
                    181: 
                    182:        while (cp < end && (table[*cp] & mask) == 0)
                    183:                cp++;
                    184:        return (end - cp);
                    185: }
                    186: #endif
                    187: 
                    188: #if !defined(vax) && !defined(tahoe) && !defined(hp300)
1.1.1.2 ! root      189: int
1.1       root      190: skpc(mask, size, cp)
1.1.1.2 ! root      191:        register int mask;
1.1       root      192:        u_int size;
                    193:        register u_char *cp;
                    194: {
                    195:        register u_char *end = &cp[size];
                    196: 
                    197:        while (cp < end && *cp == mask)
                    198:                cp++;
                    199:        return (end - cp);
                    200: }
                    201: 
1.1.1.2 ! root      202: int
1.1       root      203: locc(mask, size, cp)
1.1.1.2 ! root      204:        register int mask;
1.1       root      205:        u_int size;
                    206:        register u_char *cp;
                    207: {
                    208:        register u_char *end = &cp[size];
                    209: 
                    210:        while (cp < end && *cp != mask)
                    211:                cp++;
                    212:        return (end - cp);
                    213: }
                    214: #endif

unix.superglobalmegacorp.com

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