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*64640Sbostic static char sccsid[] = "@(#)mkproto.c 8.2 (Berkeley) 09/23/93"; 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> 25*64640Sbostic 2652871Sbostic #include <ufs/ufs/dinode.h> 2752871Sbostic #include <ufs/ffs/fs.h> 28*64640Sbostic 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 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 = ∈ 130*64640Sbostic 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*/ 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 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 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 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); 33654065Sbostic ip->di_atime.ts_sec = t.tv_sec; 33754065Sbostic ip->di_atime.ts_nsec = 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 } 367*64640Sbostic d = fsbtodb(fs, ino_to_fsba(fs, inum)); 3688142Smckusick rdfs(d, (int)fs->fs_bsize, (char *)buf); 369*64640Sbostic buf[ino_to_fsbo(fs, inum)] = *ip; 3708142Smckusick wtfs(d, (int)fs->fs_bsize, (char *)buf); 3718142Smckusick } 3728142Smckusick 3738142Smckusick daddr_t 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 4278142Smckusick ialloc(ip) 42839474Smckusick register struct dinode *ip; 4298142Smckusick { 43039474Smckusick ino_t inum; 4318142Smckusick int c; 4328142Smckusick 43339474Smckusick inum = ++ino; 434*64640Sbostic 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 */ 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 */ 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