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