1*21155Sdist /* 2*21155Sdist * Copyright (c) 1983 Regents of the University of California. 3*21155Sdist * All rights reserved. The Berkeley software License Agreement 4*21155Sdist * specifies the terms and conditions for redistribution. 5*21155Sdist */ 6*21155Sdist 714556Ssam #ifndef lint 8*21155Sdist char copyright[] = 9*21155Sdist "@(#) Copyright (c) 1980 Regents of the University of California.\n\ 10*21155Sdist All rights reserved.\n"; 11*21155Sdist #endif not lint 128142Smckusick 13*21155Sdist #ifndef lint 14*21155Sdist static char sccsid[] = "@(#)mkproto.c 5.1 (Berkeley) 05/28/85"; 15*21155Sdist #endif not lint 16*21155Sdist 178142Smckusick /* 188142Smckusick * Make a file system prototype. 198142Smckusick * usage: mkproto filsys proto 208142Smckusick */ 218142Smckusick #include <stdio.h> 228142Smckusick #include <sys/param.h> 238142Smckusick #include <sys/inode.h> 248142Smckusick #include <sys/fs.h> 258142Smckusick #include <sys/dir.h> 268142Smckusick 278142Smckusick union { 288142Smckusick struct fs fs; 298142Smckusick char fsx[SBSIZE]; 308142Smckusick } ufs; 318142Smckusick #define sblock ufs.fs 328142Smckusick union { 338142Smckusick struct cg cg; 348142Smckusick char cgx[MAXBSIZE]; 358142Smckusick } ucg; 368142Smckusick #define acg ucg.cg 378142Smckusick struct fs *fs; 388142Smckusick struct csum *fscs; 398142Smckusick int fso, fsi; 408142Smckusick FILE *proto; 418142Smckusick char token[BUFSIZ]; 428142Smckusick int errs; 438142Smckusick int ino = 10; 448142Smckusick long getnum(); 458142Smckusick char *strcpy(); 468142Smckusick 478142Smckusick main(argc, argv) 488142Smckusick int argc; 498142Smckusick char *argv[]; 508142Smckusick { 518142Smckusick int i; 528142Smckusick 538142Smckusick if (argc != 3) { 548142Smckusick fprintf(stderr, "usage: mkproto filsys proto\n"); 558142Smckusick exit(1); 568142Smckusick } 578142Smckusick fso = open(argv[1], 1); 588142Smckusick fsi = open(argv[1], 0); 598142Smckusick if (fso < 0 || fsi < 0) { 608142Smckusick perror(argv[1]); 618142Smckusick exit(1); 628142Smckusick } 638142Smckusick fs = &sblock; 648142Smckusick rdfs(SBLOCK, SBSIZE, (char *)fs); 658142Smckusick fscs = (struct csum *)calloc(1, fs->fs_cssize); 668142Smckusick for (i = 0; i < fs->fs_cssize; i += fs->fs_bsize) 678142Smckusick rdfs(fsbtodb(fs, fs->fs_csaddr + numfrags(fs, i)), 688142Smckusick (int)(fs->fs_cssize - i < fs->fs_bsize ? 698142Smckusick fs->fs_cssize - i : fs->fs_bsize), 708142Smckusick ((char *)fscs) + i); 718142Smckusick proto = fopen(argv[2], "r"); 728142Smckusick descend((struct inode *)0); 738142Smckusick wtfs(SBLOCK, SBSIZE, (char *)fs); 748142Smckusick for (i = 0; i < fs->fs_cssize; i += fs->fs_bsize) 758142Smckusick wtfs(fsbtodb(&sblock, fs->fs_csaddr + numfrags(&sblock, i)), 768142Smckusick (int)(fs->fs_cssize - i < fs->fs_bsize ? 778142Smckusick fs->fs_cssize - i : fs->fs_bsize), 788142Smckusick ((char *)fscs) + i); 798142Smckusick exit(errs); 808142Smckusick } 818142Smckusick 828142Smckusick descend(par) 838142Smckusick struct inode *par; 848142Smckusick { 858142Smckusick struct inode in; 868142Smckusick int ibc = 0; 878142Smckusick int i, f, c; 888142Smckusick struct dinode *dip, inos[MAXBSIZE / sizeof (struct dinode)]; 898142Smckusick daddr_t ib[MAXBSIZE / sizeof (daddr_t)]; 908142Smckusick char buf[MAXBSIZE]; 918142Smckusick 928142Smckusick getstr(); 938142Smckusick in.i_mode = gmode(token[0], "-bcd", IFREG, IFBLK, IFCHR, IFDIR); 948142Smckusick in.i_mode |= gmode(token[1], "-u", 0, ISUID, 0, 0); 958142Smckusick in.i_mode |= gmode(token[2], "-g", 0, ISGID, 0, 0); 968142Smckusick for (i = 3; i < 6; i++) { 978142Smckusick c = token[i]; 988142Smckusick if (c < '0' || c > '7') { 998142Smckusick printf("%c/%s: bad octal mode digit\n", c, token); 1008142Smckusick errs++; 1018142Smckusick c = 0; 1028142Smckusick } 1038142Smckusick in.i_mode |= (c-'0')<<(15-3*i); 1048142Smckusick } 1058142Smckusick in.i_uid = getnum(); in.i_gid = getnum(); 1068142Smckusick for (i = 0; i < fs->fs_bsize; i++) 1078142Smckusick buf[i] = 0; 1088142Smckusick for (i = 0; i < NINDIR(fs); i++) 1098142Smckusick ib[i] = (daddr_t)0; 1108142Smckusick in.i_nlink = 1; 1118142Smckusick in.i_size = 0; 1128142Smckusick for (i = 0; i < NDADDR; i++) 1138142Smckusick in.i_db[i] = (daddr_t)0; 1148142Smckusick for (i = 0; i < NIADDR; i++) 1158142Smckusick in.i_ib[i] = (daddr_t)0; 1168142Smckusick if (par != (struct inode *)0) { 1178142Smckusick ialloc(&in); 1188142Smckusick } else { 1198142Smckusick par = ∈ 1208142Smckusick i = itod(fs, ROOTINO); 1218142Smckusick rdfs(fsbtodb(fs, i), fs->fs_bsize, (char *)inos); 1228142Smckusick dip = &inos[ROOTINO % INOPB(fs)]; 1238142Smckusick in.i_number = ROOTINO; 1248142Smckusick in.i_nlink = dip->di_nlink; 1258142Smckusick in.i_size = dip->di_size; 1268142Smckusick in.i_db[0] = dip->di_db[0]; 1278142Smckusick rdfs(fsbtodb(fs, in.i_db[0]), fs->fs_bsize, buf); 1288142Smckusick } 1298142Smckusick 1308142Smckusick switch (in.i_mode&IFMT) { 1318142Smckusick 1328142Smckusick case IFREG: 1338142Smckusick getstr(); 1348142Smckusick f = open(token, 0); 1358142Smckusick if (f < 0) { 1368142Smckusick printf("%s: cannot open\n", token); 1378142Smckusick errs++; 1388142Smckusick break; 1398142Smckusick } 1408142Smckusick while ((i = read(f, buf, (int)fs->fs_bsize)) > 0) { 1418142Smckusick in.i_size += i; 1428142Smckusick newblk(buf, &ibc, ib, (int)blksize(fs, &in, ibc)); 1438142Smckusick } 1448142Smckusick close(f); 1458142Smckusick break; 1468142Smckusick 1478142Smckusick case IFBLK: 1488142Smckusick case IFCHR: 1498142Smckusick /* 1508142Smckusick * special file 1518142Smckusick * content is maj/min types 1528142Smckusick */ 1538142Smckusick 1548142Smckusick i = getnum() & 0377; 1558142Smckusick f = getnum() & 0377; 1568511Smckusick in.i_rdev = (i << 8) | f; 1578142Smckusick break; 1588142Smckusick 1598142Smckusick case IFDIR: 1608142Smckusick /* 1618142Smckusick * directory 1628142Smckusick * put in extra links 1638142Smckusick * call recursively until 1648142Smckusick * name of "$" found 1658142Smckusick */ 1668142Smckusick 1678142Smckusick if (in.i_number != ROOTINO) { 1688142Smckusick par->i_nlink++; 1698142Smckusick in.i_nlink++; 1708142Smckusick entry(&in, in.i_number, ".", buf); 1718142Smckusick entry(&in, par->i_number, "..", buf); 1728142Smckusick } 1738142Smckusick for (;;) { 1748142Smckusick getstr(); 1758142Smckusick if (token[0]=='$' && token[1]=='\0') 1768142Smckusick break; 1778142Smckusick entry(&in, (ino_t)(ino+1), token, buf); 1788142Smckusick descend(&in); 1798142Smckusick } 1808142Smckusick if (in.i_number != ROOTINO) 1818142Smckusick newblk(buf, &ibc, ib, (int)blksize(fs, &in, 0)); 1828142Smckusick else 1838142Smckusick wtfs(fsbtodb(fs, in.i_db[0]), (int)fs->fs_bsize, buf); 1848142Smckusick break; 1858142Smckusick } 1868142Smckusick iput(&in, &ibc, ib); 1878142Smckusick } 1888142Smckusick 1898142Smckusick /*ARGSUSED*/ 1908142Smckusick gmode(c, s, m0, m1, m2, m3) 1918142Smckusick char c, *s; 1928142Smckusick { 1938142Smckusick int i; 1948142Smckusick 1958142Smckusick for (i = 0; s[i]; i++) 1968142Smckusick if (c == s[i]) 1978142Smckusick return((&m0)[i]); 1988142Smckusick printf("%c/%s: bad mode\n", c, token); 1998142Smckusick errs++; 2008142Smckusick return(0); 2018142Smckusick } 2028142Smckusick 2038142Smckusick long 2048142Smckusick getnum() 2058142Smckusick { 2068142Smckusick int i, c; 2078142Smckusick long n; 2088142Smckusick 2098142Smckusick getstr(); 2108142Smckusick n = 0; 2118142Smckusick i = 0; 2128142Smckusick for (i = 0; c=token[i]; i++) { 2138142Smckusick if (c<'0' || c>'9') { 2148142Smckusick printf("%s: bad number\n", token); 2158142Smckusick errs++; 2168142Smckusick return((long)0); 2178142Smckusick } 2188142Smckusick n = n*10 + (c-'0'); 2198142Smckusick } 2208142Smckusick return(n); 2218142Smckusick } 2228142Smckusick 2238142Smckusick getstr() 2248142Smckusick { 2258142Smckusick int i, c; 2268142Smckusick 2278142Smckusick loop: 2288142Smckusick switch (c = getc(proto)) { 2298142Smckusick 2308142Smckusick case ' ': 2318142Smckusick case '\t': 2328142Smckusick case '\n': 2338142Smckusick goto loop; 2348142Smckusick 2358142Smckusick case EOF: 2368142Smckusick printf("Unexpected EOF\n"); 2378142Smckusick exit(1); 2388142Smckusick 2398142Smckusick case ':': 2408142Smckusick while (getc(proto) != '\n') 2418142Smckusick ; 2428142Smckusick goto loop; 2438142Smckusick 2448142Smckusick } 2458142Smckusick i = 0; 2468142Smckusick do { 2478142Smckusick token[i++] = c; 2488142Smckusick c = getc(proto); 2498142Smckusick } while (c != ' ' && c != '\t' && c != '\n' && c != '\0'); 2508142Smckusick token[i] = 0; 2518142Smckusick } 2528142Smckusick 2538142Smckusick entry(ip, inum, str, buf) 2548142Smckusick struct inode *ip; 2558142Smckusick ino_t inum; 2568142Smckusick char *str; 2578142Smckusick char *buf; 2588142Smckusick { 2598142Smckusick register struct direct *dp, *odp; 26012214Ssam int oldsize, newsize, spacefree; 2618142Smckusick 2628142Smckusick odp = dp = (struct direct *)buf; 2638142Smckusick while ((int)dp - (int)buf < ip->i_size) { 2648142Smckusick odp = dp; 2658142Smckusick dp = (struct direct *)((int)dp + dp->d_reclen); 2668142Smckusick } 2678142Smckusick if (odp != dp) 2688142Smckusick oldsize = DIRSIZ(odp); 2698142Smckusick else 2708142Smckusick oldsize = 0; 27112214Ssam spacefree = odp->d_reclen - oldsize; 2728142Smckusick dp = (struct direct *)((int)odp + oldsize); 2738142Smckusick dp->d_ino = inum; 2748142Smckusick dp->d_namlen = strlen(str); 2758142Smckusick newsize = DIRSIZ(dp); 27612214Ssam if (spacefree >= newsize) { 2778142Smckusick odp->d_reclen = oldsize; 27812214Ssam dp->d_reclen = spacefree; 2798142Smckusick } else { 2808142Smckusick dp = (struct direct *)((int)odp + odp->d_reclen); 2818142Smckusick if ((int)dp - (int)buf >= fs->fs_bsize) { 2828142Smckusick printf("directory too large\n"); 2838142Smckusick exit(1); 2848142Smckusick } 2858142Smckusick dp->d_ino = inum; 2868142Smckusick dp->d_namlen = strlen(str); 2878142Smckusick dp->d_reclen = DIRBLKSIZ; 2888142Smckusick } 2898142Smckusick strcpy(dp->d_name, str); 2908142Smckusick ip->i_size = (int)dp - (int)buf + newsize; 2918142Smckusick } 2928142Smckusick 2938142Smckusick newblk(buf, aibc, ib, size) 2948142Smckusick int *aibc; 2958142Smckusick char *buf; 2968142Smckusick daddr_t *ib; 2978142Smckusick int size; 2988142Smckusick { 2998142Smckusick int i; 3008142Smckusick daddr_t bno; 3018142Smckusick 3028142Smckusick bno = alloc(size); 3038142Smckusick wtfs(fsbtodb(fs, bno), (int)fs->fs_bsize, buf); 3048142Smckusick for (i = 0; i < fs->fs_bsize; i++) 3058142Smckusick buf[i] = 0; 3068142Smckusick ib[(*aibc)++] = bno; 3078142Smckusick if (*aibc >= NINDIR(fs)) { 3088142Smckusick printf("indirect block full\n"); 3098142Smckusick errs++; 3108142Smckusick *aibc = 0; 3118142Smckusick } 3128142Smckusick } 3138142Smckusick 3148142Smckusick iput(ip, aibc, ib) 3158142Smckusick struct inode *ip; 3168142Smckusick int *aibc; 3178142Smckusick daddr_t *ib; 3188142Smckusick { 3198142Smckusick daddr_t d; 3208142Smckusick int i; 3218142Smckusick struct dinode buf[MAXBSIZE / sizeof (struct dinode)]; 3228142Smckusick 3238142Smckusick ip->i_atime = ip->i_mtime = ip->i_ctime = time((long *)0); 3248142Smckusick switch (ip->i_mode&IFMT) { 3258142Smckusick 3268142Smckusick case IFDIR: 3278142Smckusick case IFREG: 3288142Smckusick for (i = 0; i < *aibc; i++) { 3298142Smckusick if (i >= NDADDR) 3308142Smckusick break; 3318142Smckusick ip->i_db[i] = ib[i]; 3328142Smckusick } 3338142Smckusick if (*aibc > NDADDR) { 3348142Smckusick ip->i_ib[0] = alloc((int)fs->fs_bsize); 3358142Smckusick for (i = 0; i < NINDIR(fs) - NDADDR; i++) { 3368142Smckusick ib[i] = ib[i+NDADDR]; 3378142Smckusick ib[i+NDADDR] = (daddr_t)0; 3388142Smckusick } 3398142Smckusick wtfs(fsbtodb(fs, ip->i_ib[0]), 3408142Smckusick (int)fs->fs_bsize, (char *)ib); 3418142Smckusick } 3428142Smckusick break; 3438142Smckusick 3448142Smckusick case IFBLK: 3458142Smckusick case IFCHR: 3468142Smckusick break; 3478142Smckusick 3488142Smckusick default: 3498142Smckusick printf("bad mode %o\n", ip->i_mode); 3508142Smckusick exit(1); 3518142Smckusick } 3528142Smckusick d = fsbtodb(fs, itod(fs, ip->i_number)); 3538142Smckusick rdfs(d, (int)fs->fs_bsize, (char *)buf); 3548142Smckusick buf[itoo(fs, ip->i_number)].di_ic = ip->i_ic; 3558142Smckusick wtfs(d, (int)fs->fs_bsize, (char *)buf); 3568142Smckusick } 3578142Smckusick 3588142Smckusick daddr_t 3598142Smckusick alloc(size) 3608142Smckusick int size; 3618142Smckusick { 3628142Smckusick int i, frag; 3638142Smckusick daddr_t d; 3648142Smckusick static int cg = 0; 3658142Smckusick 3668142Smckusick again: 3678142Smckusick rdfs(fsbtodb(&sblock, cgtod(&sblock, cg)), (int)sblock.fs_cgsize, 3688142Smckusick (char *)&acg); 3698142Smckusick if (acg.cg_magic != CG_MAGIC) { 3708142Smckusick printf("cg %d: bad magic number\n", cg); 3718142Smckusick return (0); 3728142Smckusick } 3738142Smckusick if (acg.cg_cs.cs_nbfree == 0) { 3748142Smckusick cg++; 3758142Smckusick if (cg >= fs->fs_ncg) { 3768142Smckusick printf("ran out of space\n"); 3778142Smckusick return (0); 3788142Smckusick } 3798142Smckusick goto again; 3808142Smckusick } 3818142Smckusick for (d = 0; d < acg.cg_ndblk; d += sblock.fs_frag) 3828142Smckusick if (isblock(&sblock, (u_char *)acg.cg_free, d / sblock.fs_frag)) 3838142Smckusick goto goth; 3848142Smckusick printf("internal error: can't find block in cyl %d\n", cg); 3858142Smckusick return (0); 3868142Smckusick goth: 3878142Smckusick clrblock(&sblock, (u_char *)acg.cg_free, d / sblock.fs_frag); 3888142Smckusick acg.cg_cs.cs_nbfree--; 3898142Smckusick sblock.fs_cstotal.cs_nbfree--; 3908142Smckusick fscs[cg].cs_nbfree--; 3918142Smckusick acg.cg_btot[cbtocylno(&sblock, d)]--; 3928142Smckusick acg.cg_b[cbtocylno(&sblock, d)][cbtorpos(&sblock, d)]--; 3938142Smckusick if (size != sblock.fs_bsize) { 3948142Smckusick frag = howmany(size, sblock.fs_fsize); 3958142Smckusick fscs[cg].cs_nffree += sblock.fs_frag - frag; 3968142Smckusick sblock.fs_cstotal.cs_nffree += sblock.fs_frag - frag; 3978142Smckusick acg.cg_cs.cs_nffree += sblock.fs_frag - frag; 3988142Smckusick acg.cg_frsum[sblock.fs_frag - frag]++; 3998142Smckusick for (i = frag; i < sblock.fs_frag; i++) 4008142Smckusick setbit(acg.cg_free, d + i); 4018142Smckusick } 4028142Smckusick wtfs(fsbtodb(&sblock, cgtod(&sblock, cg)), (int)sblock.fs_cgsize, 4038142Smckusick (char *)&acg); 4048142Smckusick return (acg.cg_cgx * fs->fs_fpg + d); 4058142Smckusick } 4068142Smckusick 4078142Smckusick /* 4088142Smckusick * Allocate an inode on the disk 4098142Smckusick */ 4108142Smckusick ialloc(ip) 4118142Smckusick register struct inode *ip; 4128142Smckusick { 4138142Smckusick struct dinode buf[MAXBSIZE / sizeof (struct dinode)]; 4148142Smckusick daddr_t d; 4158142Smckusick int c; 4168142Smckusick 4178142Smckusick ip->i_number = ++ino; 4188142Smckusick c = itog(&sblock, ip->i_number); 4198142Smckusick rdfs(fsbtodb(&sblock, cgtod(&sblock, c)), (int)sblock.fs_cgsize, 4208142Smckusick (char *)&acg); 4218142Smckusick if (acg.cg_magic != CG_MAGIC) { 4228142Smckusick printf("cg %d: bad magic number\n", c); 4238142Smckusick exit(1); 4248142Smckusick } 4258142Smckusick if (ip->i_mode & IFDIR) { 4268142Smckusick acg.cg_cs.cs_ndir++; 4278142Smckusick sblock.fs_cstotal.cs_ndir++; 4288142Smckusick fscs[c].cs_ndir++; 4298142Smckusick } 4308142Smckusick acg.cg_cs.cs_nifree--; 4318142Smckusick setbit(acg.cg_iused, ip->i_number); 4328142Smckusick wtfs(fsbtodb(&sblock, cgtod(&sblock, c)), (int)sblock.fs_cgsize, 4338142Smckusick (char *)&acg); 4348142Smckusick sblock.fs_cstotal.cs_nifree--; 4358142Smckusick fscs[c].cs_nifree--; 4368142Smckusick if(ip->i_number >= sblock.fs_ipg * sblock.fs_ncg) { 4378142Smckusick printf("fsinit: inode value out of range (%d).\n", 4388142Smckusick ip->i_number); 4398142Smckusick exit(1); 4408142Smckusick } 4418142Smckusick return (ip->i_number); 4428142Smckusick } 4438142Smckusick 4448142Smckusick /* 4458142Smckusick * read a block from the file system 4468142Smckusick */ 4478142Smckusick rdfs(bno, size, bf) 4488142Smckusick int bno, size; 4498142Smckusick char *bf; 4508142Smckusick { 4518142Smckusick int n; 4528142Smckusick 4538142Smckusick if (lseek(fsi, bno * DEV_BSIZE, 0) < 0) { 4548142Smckusick printf("seek error: %ld\n", bno); 4558142Smckusick perror("rdfs"); 4568142Smckusick exit(1); 4578142Smckusick } 4588142Smckusick n = read(fsi, bf, size); 4598142Smckusick if(n != size) { 4608142Smckusick printf("read error: %ld\n", bno); 4618142Smckusick perror("rdfs"); 4628142Smckusick exit(1); 4638142Smckusick } 4648142Smckusick } 4658142Smckusick 4668142Smckusick /* 4678142Smckusick * write a block to the file system 4688142Smckusick */ 4698142Smckusick wtfs(bno, size, bf) 4708142Smckusick int bno, size; 4718142Smckusick char *bf; 4728142Smckusick { 4738142Smckusick int n; 4748142Smckusick 4758142Smckusick lseek(fso, bno * DEV_BSIZE, 0); 4768142Smckusick if (lseek(fso, bno * DEV_BSIZE, 0) < 0) { 4778142Smckusick printf("seek error: %ld\n", bno); 4788142Smckusick perror("wtfs"); 4798142Smckusick exit(1); 4808142Smckusick } 4818142Smckusick n = write(fso, bf, size); 4828142Smckusick if(n != size) { 4838142Smckusick printf("write error: %D\n", bno); 4848142Smckusick perror("wtfs"); 4858142Smckusick exit(1); 4868142Smckusick } 4878142Smckusick } 4888142Smckusick /* 4898142Smckusick * check if a block is available 4908142Smckusick */ 4918142Smckusick isblock(fs, cp, h) 4928142Smckusick struct fs *fs; 4938142Smckusick unsigned char *cp; 4948142Smckusick int h; 4958142Smckusick { 4968142Smckusick unsigned char mask; 4978142Smckusick 4988142Smckusick switch (fs->fs_frag) { 4998142Smckusick case 8: 5008142Smckusick return (cp[h] == 0xff); 5018142Smckusick case 4: 5028142Smckusick mask = 0x0f << ((h & 0x1) << 2); 5038142Smckusick return ((cp[h >> 1] & mask) == mask); 5048142Smckusick case 2: 5058142Smckusick mask = 0x03 << ((h & 0x3) << 1); 5068142Smckusick return ((cp[h >> 2] & mask) == mask); 5078142Smckusick case 1: 5088142Smckusick mask = 0x01 << (h & 0x7); 5098142Smckusick return ((cp[h >> 3] & mask) == mask); 5108142Smckusick default: 5118142Smckusick fprintf(stderr, "isblock bad fs_frag %d\n", fs->fs_frag); 5128142Smckusick return (0); 5138142Smckusick } 5148142Smckusick /*NOTREACHED*/ 5158142Smckusick } 5168142Smckusick 5178142Smckusick /* 5188142Smckusick * take a block out of the map 5198142Smckusick */ 5208142Smckusick clrblock(fs, cp, h) 5218142Smckusick struct fs *fs; 5228142Smckusick unsigned char *cp; 5238142Smckusick int h; 5248142Smckusick { 5258142Smckusick switch ((fs)->fs_frag) { 5268142Smckusick case 8: 5278142Smckusick cp[h] = 0; 5288142Smckusick return; 5298142Smckusick case 4: 5308142Smckusick cp[h >> 1] &= ~(0x0f << ((h & 0x1) << 2)); 5318142Smckusick return; 5328142Smckusick case 2: 5338142Smckusick cp[h >> 2] &= ~(0x03 << ((h & 0x3) << 1)); 5348142Smckusick return; 5358142Smckusick case 1: 5368142Smckusick cp[h >> 3] &= ~(0x01 << (h & 0x7)); 5378142Smckusick return; 5388142Smckusick default: 5398142Smckusick fprintf(stderr, "clrblock bad fs_frag %d\n", fs->fs_frag); 5408142Smckusick return; 5418142Smckusick } 5428142Smckusick } 5438142Smckusick 544