148347Sbostic /*-
261855Sbostic * Copyright (c) 1983, 1993
361855Sbostic * The Regents of the University of California. All rights reserved.
448347Sbostic *
548347Sbostic * %sccs.include.proprietary.c%
621155Sdist */
721155Sdist
814556Ssam #ifndef lint
961855Sbostic static char copyright[] =
1061855Sbostic "@(#) Copyright (c) 1983, 1993\n\
1161855Sbostic The Regents of the University of California. All rights reserved.\n";
1248347Sbostic #endif /* not lint */
138142Smckusick
1421155Sdist #ifndef lint
15*69265Smckusick static char sccsid[] = "@(#)mkproto.c 8.3 (Berkeley) 05/04/95";
1648347Sbostic #endif /* not lint */
1721155Sdist
188142Smckusick /*
198142Smckusick * Make a file system prototype.
208142Smckusick * usage: mkproto filsys proto
218142Smckusick */
228142Smckusick #include <sys/param.h>
2354059Sbostic #include <sys/time.h>
248142Smckusick #include <sys/dir.h>
2564640Sbostic
2652871Sbostic #include <ufs/ufs/dinode.h>
2752871Sbostic #include <ufs/ffs/fs.h>
2864640Sbostic
2938517Sbostic #include <stdio.h>
308142Smckusick
318142Smckusick union {
328142Smckusick struct fs fs;
338142Smckusick char fsx[SBSIZE];
348142Smckusick } ufs;
358142Smckusick #define sblock ufs.fs
368142Smckusick union {
378142Smckusick struct cg cg;
388142Smckusick char cgx[MAXBSIZE];
398142Smckusick } ucg;
408142Smckusick #define acg ucg.cg
418142Smckusick struct fs *fs;
428142Smckusick struct csum *fscs;
438142Smckusick int fso, fsi;
448142Smckusick FILE *proto;
458142Smckusick char token[BUFSIZ];
468142Smckusick int errs;
4730558Smckusick long dev_bsize = 1;
488142Smckusick int ino = 10;
498142Smckusick long getnum();
508142Smckusick char *strcpy();
5139474Smckusick ino_t ialloc();
528142Smckusick
main(argc,argv)538142Smckusick main(argc, argv)
548142Smckusick int argc;
558142Smckusick char *argv[];
568142Smckusick {
578142Smckusick int i;
5833139Sbostic char *calloc();
598142Smckusick
608142Smckusick if (argc != 3) {
618142Smckusick fprintf(stderr, "usage: mkproto filsys proto\n");
628142Smckusick exit(1);
638142Smckusick }
648142Smckusick fso = open(argv[1], 1);
658142Smckusick fsi = open(argv[1], 0);
668142Smckusick if (fso < 0 || fsi < 0) {
678142Smckusick perror(argv[1]);
688142Smckusick exit(1);
698142Smckusick }
708142Smckusick fs = &sblock;
7130558Smckusick rdfs(SBOFF, SBSIZE, (char *)fs);
7230558Smckusick dev_bsize = fs->fs_fsize / fsbtodb(fs, 1);
7333139Sbostic fscs = (struct csum *)calloc(1, (u_int)fs->fs_cssize);
748142Smckusick for (i = 0; i < fs->fs_cssize; i += fs->fs_bsize)
758142Smckusick rdfs(fsbtodb(fs, fs->fs_csaddr + numfrags(fs, i)),
768142Smckusick (int)(fs->fs_cssize - i < fs->fs_bsize ?
778142Smckusick fs->fs_cssize - i : fs->fs_bsize),
788142Smckusick ((char *)fscs) + i);
798142Smckusick proto = fopen(argv[2], "r");
8039474Smckusick descend((struct dinode *)0, ROOTINO);
8130558Smckusick wtfs(SBOFF / dev_bsize, SBSIZE, (char *)fs);
828142Smckusick for (i = 0; i < fs->fs_cssize; i += fs->fs_bsize)
838142Smckusick wtfs(fsbtodb(&sblock, fs->fs_csaddr + numfrags(&sblock, i)),
848142Smckusick (int)(fs->fs_cssize - i < fs->fs_bsize ?
858142Smckusick fs->fs_cssize - i : fs->fs_bsize),
868142Smckusick ((char *)fscs) + i);
878142Smckusick exit(errs);
888142Smckusick }
898142Smckusick
9039474Smckusick descend(par, parinum)
9139474Smckusick struct dinode *par;
9239474Smckusick ino_t parinum;
938142Smckusick {
9439474Smckusick struct dinode in;
9539474Smckusick ino_t inum;
968142Smckusick int ibc = 0;
978142Smckusick int i, f, c;
988142Smckusick struct dinode *dip, inos[MAXBSIZE / sizeof (struct dinode)];
998142Smckusick daddr_t ib[MAXBSIZE / sizeof (daddr_t)];
1008142Smckusick char buf[MAXBSIZE];
1018142Smckusick
1028142Smckusick getstr();
10339474Smckusick in.di_mode = gmode(token[0], "-bcd", IFREG, IFBLK, IFCHR, IFDIR);
10439474Smckusick in.di_mode |= gmode(token[1], "-u", 0, ISUID, 0, 0);
10539474Smckusick in.di_mode |= gmode(token[2], "-g", 0, ISGID, 0, 0);
1068142Smckusick for (i = 3; i < 6; i++) {
1078142Smckusick c = token[i];
1088142Smckusick if (c < '0' || c > '7') {
1098142Smckusick printf("%c/%s: bad octal mode digit\n", c, token);
1108142Smckusick errs++;
1118142Smckusick c = 0;
1128142Smckusick }
11339474Smckusick in.di_mode |= (c-'0')<<(15-3*i);
1148142Smckusick }
11539474Smckusick in.di_uid = getnum(); in.di_gid = getnum();
1168142Smckusick for (i = 0; i < fs->fs_bsize; i++)
1178142Smckusick buf[i] = 0;
1188142Smckusick for (i = 0; i < NINDIR(fs); i++)
1198142Smckusick ib[i] = (daddr_t)0;
12039474Smckusick in.di_nlink = 1;
12139474Smckusick in.di_size = 0;
1228142Smckusick for (i = 0; i < NDADDR; i++)
12339474Smckusick in.di_db[i] = (daddr_t)0;
1248142Smckusick for (i = 0; i < NIADDR; i++)
12539474Smckusick in.di_ib[i] = (daddr_t)0;
12639474Smckusick if (par != (struct dinode *)0) {
12739474Smckusick inum = ialloc(&in);
1288142Smckusick } else {
1298142Smckusick par = ∈
13064640Sbostic i = ino_to_fsba(fs, ROOTINO);
1318142Smckusick rdfs(fsbtodb(fs, i), fs->fs_bsize, (char *)inos);
1328142Smckusick dip = &inos[ROOTINO % INOPB(fs)];
13339474Smckusick inum = ROOTINO;
13439474Smckusick in.di_nlink = dip->di_nlink;
13539474Smckusick in.di_size = dip->di_size;
13639474Smckusick in.di_db[0] = dip->di_db[0];
13739474Smckusick rdfs(fsbtodb(fs, in.di_db[0]), fs->fs_bsize, buf);
1388142Smckusick }
1398142Smckusick
14039474Smckusick switch (in.di_mode&IFMT) {
1418142Smckusick
1428142Smckusick case IFREG:
1438142Smckusick getstr();
1448142Smckusick f = open(token, 0);
1458142Smckusick if (f < 0) {
1468142Smckusick printf("%s: cannot open\n", token);
1478142Smckusick errs++;
1488142Smckusick break;
1498142Smckusick }
1508142Smckusick while ((i = read(f, buf, (int)fs->fs_bsize)) > 0) {
15139474Smckusick in.di_size += i;
15239474Smckusick newblk(buf, &ibc, ib, (int)dblksize(fs, &in, ibc));
1538142Smckusick }
1548142Smckusick close(f);
1558142Smckusick break;
1568142Smckusick
1578142Smckusick case IFBLK:
1588142Smckusick case IFCHR:
1598142Smckusick /*
1608142Smckusick * special file
1618142Smckusick * content is maj/min types
1628142Smckusick */
1638142Smckusick
1648142Smckusick i = getnum() & 0377;
1658142Smckusick f = getnum() & 0377;
16639474Smckusick in.di_rdev = (i << 8) | f;
1678142Smckusick break;
1688142Smckusick
1698142Smckusick case IFDIR:
1708142Smckusick /*
1718142Smckusick * directory
1728142Smckusick * put in extra links
1738142Smckusick * call recursively until
1748142Smckusick * name of "$" found
1758142Smckusick */
1768142Smckusick
17739474Smckusick if (inum != ROOTINO) {
17839474Smckusick par->di_nlink++;
17939474Smckusick in.di_nlink++;
18039474Smckusick entry(&in, inum, ".", buf);
18139474Smckusick entry(&in, parinum, "..", buf);
1828142Smckusick }
1838142Smckusick for (;;) {
1848142Smckusick getstr();
1858142Smckusick if (token[0]=='$' && token[1]=='\0')
1868142Smckusick break;
1878142Smckusick entry(&in, (ino_t)(ino+1), token, buf);
18839474Smckusick descend(&in, inum);
1898142Smckusick }
19039474Smckusick if (inum != ROOTINO)
19139474Smckusick newblk(buf, &ibc, ib, (int)dblksize(fs, &in, 0));
1928142Smckusick else
19339474Smckusick wtfs(fsbtodb(fs, in.di_db[0]), (int)fs->fs_bsize, buf);
1948142Smckusick break;
1958142Smckusick }
19639474Smckusick iput(&in, &ibc, ib, inum);
1978142Smckusick }
1988142Smckusick
1998142Smckusick /*ARGSUSED*/
gmode(c,s,m0,m1,m2,m3)2008142Smckusick gmode(c, s, m0, m1, m2, m3)
2018142Smckusick char c, *s;
2028142Smckusick {
2038142Smckusick int i;
2048142Smckusick
2058142Smckusick for (i = 0; s[i]; i++)
2068142Smckusick if (c == s[i])
2078142Smckusick return((&m0)[i]);
2088142Smckusick printf("%c/%s: bad mode\n", c, token);
2098142Smckusick errs++;
2108142Smckusick return(0);
2118142Smckusick }
2128142Smckusick
2138142Smckusick long
getnum()2148142Smckusick getnum()
2158142Smckusick {
2168142Smckusick int i, c;
2178142Smckusick long n;
2188142Smckusick
2198142Smckusick getstr();
2208142Smckusick n = 0;
2218142Smckusick i = 0;
2228142Smckusick for (i = 0; c=token[i]; i++) {
2238142Smckusick if (c<'0' || c>'9') {
2248142Smckusick printf("%s: bad number\n", token);
2258142Smckusick errs++;
2268142Smckusick return((long)0);
2278142Smckusick }
2288142Smckusick n = n*10 + (c-'0');
2298142Smckusick }
2308142Smckusick return(n);
2318142Smckusick }
2328142Smckusick
getstr()2338142Smckusick getstr()
2348142Smckusick {
2358142Smckusick int i, c;
2368142Smckusick
2378142Smckusick loop:
2388142Smckusick switch (c = getc(proto)) {
2398142Smckusick
2408142Smckusick case ' ':
2418142Smckusick case '\t':
2428142Smckusick case '\n':
2438142Smckusick goto loop;
2448142Smckusick
2458142Smckusick case EOF:
2468142Smckusick printf("Unexpected EOF\n");
2478142Smckusick exit(1);
2488142Smckusick
2498142Smckusick case ':':
2508142Smckusick while (getc(proto) != '\n')
2518142Smckusick ;
2528142Smckusick goto loop;
2538142Smckusick
2548142Smckusick }
2558142Smckusick i = 0;
2568142Smckusick do {
2578142Smckusick token[i++] = c;
2588142Smckusick c = getc(proto);
2598142Smckusick } while (c != ' ' && c != '\t' && c != '\n' && c != '\0');
2608142Smckusick token[i] = 0;
2618142Smckusick }
2628142Smckusick
2638142Smckusick entry(ip, inum, str, buf)
26439474Smckusick struct dinode *ip;
2658142Smckusick ino_t inum;
2668142Smckusick char *str;
2678142Smckusick char *buf;
2688142Smckusick {
2698142Smckusick register struct direct *dp, *odp;
27012214Ssam int oldsize, newsize, spacefree;
2718142Smckusick
2728142Smckusick odp = dp = (struct direct *)buf;
27339474Smckusick while ((int)dp - (int)buf < ip->di_size) {
2748142Smckusick odp = dp;
2758142Smckusick dp = (struct direct *)((int)dp + dp->d_reclen);
2768142Smckusick }
2778142Smckusick if (odp != dp)
2788142Smckusick oldsize = DIRSIZ(odp);
2798142Smckusick else
2808142Smckusick oldsize = 0;
28112214Ssam spacefree = odp->d_reclen - oldsize;
2828142Smckusick dp = (struct direct *)((int)odp + oldsize);
2838142Smckusick dp->d_ino = inum;
2848142Smckusick dp->d_namlen = strlen(str);
2858142Smckusick newsize = DIRSIZ(dp);
28612214Ssam if (spacefree >= newsize) {
2878142Smckusick odp->d_reclen = oldsize;
28812214Ssam dp->d_reclen = spacefree;
2898142Smckusick } else {
2908142Smckusick dp = (struct direct *)((int)odp + odp->d_reclen);
2918142Smckusick if ((int)dp - (int)buf >= fs->fs_bsize) {
2928142Smckusick printf("directory too large\n");
2938142Smckusick exit(1);
2948142Smckusick }
2958142Smckusick dp->d_ino = inum;
2968142Smckusick dp->d_namlen = strlen(str);
2978142Smckusick dp->d_reclen = DIRBLKSIZ;
2988142Smckusick }
2998142Smckusick strcpy(dp->d_name, str);
30039474Smckusick ip->di_size = (int)dp - (int)buf + newsize;
3018142Smckusick }
3028142Smckusick
newblk(buf,aibc,ib,size)3038142Smckusick newblk(buf, aibc, ib, size)
3048142Smckusick int *aibc;
3058142Smckusick char *buf;
3068142Smckusick daddr_t *ib;
3078142Smckusick int size;
3088142Smckusick {
3098142Smckusick int i;
31033139Sbostic daddr_t bno, alloc();
3118142Smckusick
3128142Smckusick bno = alloc(size);
3138142Smckusick wtfs(fsbtodb(fs, bno), (int)fs->fs_bsize, buf);
3148142Smckusick for (i = 0; i < fs->fs_bsize; i++)
3158142Smckusick buf[i] = 0;
3168142Smckusick ib[(*aibc)++] = bno;
3178142Smckusick if (*aibc >= NINDIR(fs)) {
3188142Smckusick printf("indirect block full\n");
3198142Smckusick errs++;
3208142Smckusick *aibc = 0;
3218142Smckusick }
3228142Smckusick }
3238142Smckusick
32439474Smckusick iput(ip, aibc, ib, inum)
32539474Smckusick struct dinode *ip;
3268142Smckusick int *aibc;
3278142Smckusick daddr_t *ib;
32839474Smckusick ino_t inum;
3298142Smckusick {
33054065Sbostic struct dinode buf[MAXBSIZE / sizeof (struct dinode)];
33133139Sbostic daddr_t d, alloc();
3328142Smckusick int i;
33354065Sbostic struct timeval t;
3348142Smckusick
33554065Sbostic (void)gettimeofday(&t, NULL);
336*69265Smckusick ip->di_atime = t.tv_sec;
337*69265Smckusick ip->di_atimensec = 0;
33854059Sbostic ip->di_mtime = ip->di_ctime = ip->di_atime;
33939474Smckusick switch (ip->di_mode&IFMT) {
3408142Smckusick
3418142Smckusick case IFDIR:
3428142Smckusick case IFREG:
3438142Smckusick for (i = 0; i < *aibc; i++) {
3448142Smckusick if (i >= NDADDR)
3458142Smckusick break;
34639474Smckusick ip->di_db[i] = ib[i];
3478142Smckusick }
3488142Smckusick if (*aibc > NDADDR) {
34939474Smckusick ip->di_ib[0] = alloc((int)fs->fs_bsize);
3508142Smckusick for (i = 0; i < NINDIR(fs) - NDADDR; i++) {
3518142Smckusick ib[i] = ib[i+NDADDR];
3528142Smckusick ib[i+NDADDR] = (daddr_t)0;
3538142Smckusick }
35439474Smckusick wtfs(fsbtodb(fs, ip->di_ib[0]),
3558142Smckusick (int)fs->fs_bsize, (char *)ib);
3568142Smckusick }
3578142Smckusick break;
3588142Smckusick
3598142Smckusick case IFBLK:
3608142Smckusick case IFCHR:
3618142Smckusick break;
3628142Smckusick
3638142Smckusick default:
36439474Smckusick printf("bad mode %o\n", ip->di_mode);
3658142Smckusick exit(1);
3668142Smckusick }
36764640Sbostic d = fsbtodb(fs, ino_to_fsba(fs, inum));
3688142Smckusick rdfs(d, (int)fs->fs_bsize, (char *)buf);
36964640Sbostic buf[ino_to_fsbo(fs, inum)] = *ip;
3708142Smckusick wtfs(d, (int)fs->fs_bsize, (char *)buf);
3718142Smckusick }
3728142Smckusick
3738142Smckusick daddr_t
alloc(size)3748142Smckusick alloc(size)
3758142Smckusick int size;
3768142Smckusick {
3778142Smckusick int i, frag;
3788142Smckusick daddr_t d;
3798142Smckusick static int cg = 0;
3808142Smckusick
3818142Smckusick again:
3828142Smckusick rdfs(fsbtodb(&sblock, cgtod(&sblock, cg)), (int)sblock.fs_cgsize,
3838142Smckusick (char *)&acg);
38434575Smckusick if (!cg_chkmagic(&acg)) {
3858142Smckusick printf("cg %d: bad magic number\n", cg);
3868142Smckusick return (0);
3878142Smckusick }
3888142Smckusick if (acg.cg_cs.cs_nbfree == 0) {
3898142Smckusick cg++;
3908142Smckusick if (cg >= fs->fs_ncg) {
3918142Smckusick printf("ran out of space\n");
3928142Smckusick return (0);
3938142Smckusick }
3948142Smckusick goto again;
3958142Smckusick }
3968142Smckusick for (d = 0; d < acg.cg_ndblk; d += sblock.fs_frag)
39734575Smckusick if (isblock(&sblock, (u_char *)cg_blksfree(&acg),
39834575Smckusick d / sblock.fs_frag))
3998142Smckusick goto goth;
4008142Smckusick printf("internal error: can't find block in cyl %d\n", cg);
4018142Smckusick return (0);
4028142Smckusick goth:
40334575Smckusick clrblock(&sblock, (u_char *)cg_blksfree(&acg), d / sblock.fs_frag);
4048142Smckusick acg.cg_cs.cs_nbfree--;
4058142Smckusick sblock.fs_cstotal.cs_nbfree--;
4068142Smckusick fscs[cg].cs_nbfree--;
40734575Smckusick cg_blktot(&acg)[cbtocylno(&sblock, d)]--;
40834575Smckusick cg_blks(&sblock, &acg, cbtocylno(&sblock, d))[cbtorpos(&sblock, d)]--;
4098142Smckusick if (size != sblock.fs_bsize) {
4108142Smckusick frag = howmany(size, sblock.fs_fsize);
4118142Smckusick fscs[cg].cs_nffree += sblock.fs_frag - frag;
4128142Smckusick sblock.fs_cstotal.cs_nffree += sblock.fs_frag - frag;
4138142Smckusick acg.cg_cs.cs_nffree += sblock.fs_frag - frag;
4148142Smckusick acg.cg_frsum[sblock.fs_frag - frag]++;
4158142Smckusick for (i = frag; i < sblock.fs_frag; i++)
41634575Smckusick setbit(cg_blksfree(&acg), d + i);
4178142Smckusick }
4188142Smckusick wtfs(fsbtodb(&sblock, cgtod(&sblock, cg)), (int)sblock.fs_cgsize,
4198142Smckusick (char *)&acg);
4208142Smckusick return (acg.cg_cgx * fs->fs_fpg + d);
4218142Smckusick }
4228142Smckusick
4238142Smckusick /*
4248142Smckusick * Allocate an inode on the disk
4258142Smckusick */
42639474Smckusick ino_t
ialloc(ip)4278142Smckusick ialloc(ip)
42839474Smckusick register struct dinode *ip;
4298142Smckusick {
43039474Smckusick ino_t inum;
4318142Smckusick int c;
4328142Smckusick
43339474Smckusick inum = ++ino;
43464640Sbostic c = ino_to_cg(&sblock, inum);
4358142Smckusick rdfs(fsbtodb(&sblock, cgtod(&sblock, c)), (int)sblock.fs_cgsize,
4368142Smckusick (char *)&acg);
43734575Smckusick if (!cg_chkmagic(&acg)) {
4388142Smckusick printf("cg %d: bad magic number\n", c);
4398142Smckusick exit(1);
4408142Smckusick }
44139474Smckusick if (ip->di_mode & IFDIR) {
4428142Smckusick acg.cg_cs.cs_ndir++;
4438142Smckusick sblock.fs_cstotal.cs_ndir++;
4448142Smckusick fscs[c].cs_ndir++;
4458142Smckusick }
4468142Smckusick acg.cg_cs.cs_nifree--;
44739474Smckusick setbit(cg_inosused(&acg), inum);
4488142Smckusick wtfs(fsbtodb(&sblock, cgtod(&sblock, c)), (int)sblock.fs_cgsize,
4498142Smckusick (char *)&acg);
4508142Smckusick sblock.fs_cstotal.cs_nifree--;
4518142Smckusick fscs[c].cs_nifree--;
45239474Smckusick if(inum >= sblock.fs_ipg * sblock.fs_ncg) {
45339474Smckusick printf("fsinit: inode value out of range (%lu).\n", inum);
4548142Smckusick exit(1);
4558142Smckusick }
45639474Smckusick return (inum);
4578142Smckusick }
4588142Smckusick
4598142Smckusick /*
4608142Smckusick * read a block from the file system
4618142Smckusick */
rdfs(bno,size,bf)4628142Smckusick rdfs(bno, size, bf)
4638142Smckusick int bno, size;
4648142Smckusick char *bf;
4658142Smckusick {
4668142Smckusick int n;
46733139Sbostic off_t lseek();
4688142Smckusick
46930558Smckusick if (lseek(fsi, bno * dev_bsize, 0) < 0) {
47033139Sbostic printf("seek error: %d\n", bno);
4718142Smckusick perror("rdfs");
4728142Smckusick exit(1);
4738142Smckusick }
4748142Smckusick n = read(fsi, bf, size);
4758142Smckusick if(n != size) {
47633139Sbostic printf("read error: %d\n", bno);
4778142Smckusick perror("rdfs");
4788142Smckusick exit(1);
4798142Smckusick }
4808142Smckusick }
4818142Smckusick
4828142Smckusick /*
4838142Smckusick * write a block to the file system
4848142Smckusick */
wtfs(bno,size,bf)4858142Smckusick wtfs(bno, size, bf)
4868142Smckusick int bno, size;
4878142Smckusick char *bf;
4888142Smckusick {
4898142Smckusick int n;
49033139Sbostic off_t lseek();
4918142Smckusick
49230558Smckusick if (lseek(fso, bno * dev_bsize, 0) < 0) {
49333139Sbostic printf("seek error: %d\n", bno);
4948142Smckusick perror("wtfs");
4958142Smckusick exit(1);
4968142Smckusick }
4978142Smckusick n = write(fso, bf, size);
4988142Smckusick if(n != size) {
49933139Sbostic printf("write error: %d\n", bno);
5008142Smckusick perror("wtfs");
5018142Smckusick exit(1);
5028142Smckusick }
5038142Smckusick }
5048142Smckusick /*
5058142Smckusick * check if a block is available
5068142Smckusick */
5078142Smckusick isblock(fs, cp, h)
5088142Smckusick struct fs *fs;
5098142Smckusick unsigned char *cp;
5108142Smckusick int h;
5118142Smckusick {
5128142Smckusick unsigned char mask;
5138142Smckusick
5148142Smckusick switch (fs->fs_frag) {
5158142Smckusick case 8:
5168142Smckusick return (cp[h] == 0xff);
5178142Smckusick case 4:
5188142Smckusick mask = 0x0f << ((h & 0x1) << 2);
5198142Smckusick return ((cp[h >> 1] & mask) == mask);
5208142Smckusick case 2:
5218142Smckusick mask = 0x03 << ((h & 0x3) << 1);
5228142Smckusick return ((cp[h >> 2] & mask) == mask);
5238142Smckusick case 1:
5248142Smckusick mask = 0x01 << (h & 0x7);
5258142Smckusick return ((cp[h >> 3] & mask) == mask);
5268142Smckusick default:
52733139Sbostic fprintf(stderr, "isblock bad fs_frag %ld\n", fs->fs_frag);
5288142Smckusick return (0);
5298142Smckusick }
5308142Smckusick /*NOTREACHED*/
5318142Smckusick }
5328142Smckusick
5338142Smckusick /*
5348142Smckusick * take a block out of the map
5358142Smckusick */
5368142Smckusick clrblock(fs, cp, h)
5378142Smckusick struct fs *fs;
5388142Smckusick unsigned char *cp;
5398142Smckusick int h;
5408142Smckusick {
5418142Smckusick switch ((fs)->fs_frag) {
5428142Smckusick case 8:
5438142Smckusick cp[h] = 0;
5448142Smckusick return;
5458142Smckusick case 4:
5468142Smckusick cp[h >> 1] &= ~(0x0f << ((h & 0x1) << 2));
5478142Smckusick return;
5488142Smckusick case 2:
5498142Smckusick cp[h >> 2] &= ~(0x03 << ((h & 0x3) << 1));
5508142Smckusick return;
5518142Smckusick case 1:
5528142Smckusick cp[h >> 3] &= ~(0x01 << (h & 0x7));
5538142Smckusick return;
5548142Smckusick default:
55533139Sbostic fprintf(stderr, "clrblock bad fs_frag %ld\n", fs->fs_frag);
5568142Smckusick return;
5578142Smckusick }
5588142Smckusick }
5598142Smckusick
560