1*48347Sbostic /*- 2*48347Sbostic * Copyright (c) 1983 The Regents of the University of California. 3*48347Sbostic * All rights reserved. 4*48347Sbostic * 5*48347Sbostic * %sccs.include.proprietary.c% 621155Sdist */ 721155Sdist 814556Ssam #ifndef lint 921155Sdist char copyright[] = 10*48347Sbostic "@(#) Copyright (c) 1983 The Regents of the University of California.\n\ 1121155Sdist All rights reserved.\n"; 12*48347Sbostic #endif /* not lint */ 138142Smckusick 1421155Sdist #ifndef lint 15*48347Sbostic static char sccsid[] = "@(#)mkproto.c 5.7 (Berkeley) 04/19/91"; 16*48347Sbostic #endif /* not lint */ 1721155Sdist 188142Smckusick /* 198142Smckusick * Make a file system prototype. 208142Smckusick * usage: mkproto filsys proto 218142Smckusick */ 228142Smckusick #include <sys/param.h> 238142Smckusick #include <sys/dir.h> 2439474Smckusick #include <ufs/dinode.h> 2538517Sbostic #include <ufs/fs.h> 2638517Sbostic #include <stdio.h> 278142Smckusick 288142Smckusick union { 298142Smckusick struct fs fs; 308142Smckusick char fsx[SBSIZE]; 318142Smckusick } ufs; 328142Smckusick #define sblock ufs.fs 338142Smckusick union { 348142Smckusick struct cg cg; 358142Smckusick char cgx[MAXBSIZE]; 368142Smckusick } ucg; 378142Smckusick #define acg ucg.cg 388142Smckusick struct fs *fs; 398142Smckusick struct csum *fscs; 408142Smckusick int fso, fsi; 418142Smckusick FILE *proto; 428142Smckusick char token[BUFSIZ]; 438142Smckusick int errs; 4430558Smckusick long dev_bsize = 1; 458142Smckusick int ino = 10; 468142Smckusick long getnum(); 478142Smckusick char *strcpy(); 4839474Smckusick ino_t ialloc(); 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"); 7739474Smckusick descend((struct dinode *)0, ROOTINO); 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 8739474Smckusick descend(par, parinum) 8839474Smckusick struct dinode *par; 8939474Smckusick ino_t parinum; 908142Smckusick { 9139474Smckusick struct dinode in; 9239474Smckusick ino_t inum; 938142Smckusick int ibc = 0; 948142Smckusick int i, f, c; 958142Smckusick struct dinode *dip, inos[MAXBSIZE / sizeof (struct dinode)]; 968142Smckusick daddr_t ib[MAXBSIZE / sizeof (daddr_t)]; 978142Smckusick char buf[MAXBSIZE]; 988142Smckusick 998142Smckusick getstr(); 10039474Smckusick in.di_mode = gmode(token[0], "-bcd", IFREG, IFBLK, IFCHR, IFDIR); 10139474Smckusick in.di_mode |= gmode(token[1], "-u", 0, ISUID, 0, 0); 10239474Smckusick in.di_mode |= gmode(token[2], "-g", 0, ISGID, 0, 0); 1038142Smckusick for (i = 3; i < 6; i++) { 1048142Smckusick c = token[i]; 1058142Smckusick if (c < '0' || c > '7') { 1068142Smckusick printf("%c/%s: bad octal mode digit\n", c, token); 1078142Smckusick errs++; 1088142Smckusick c = 0; 1098142Smckusick } 11039474Smckusick in.di_mode |= (c-'0')<<(15-3*i); 1118142Smckusick } 11239474Smckusick in.di_uid = getnum(); in.di_gid = getnum(); 1138142Smckusick for (i = 0; i < fs->fs_bsize; i++) 1148142Smckusick buf[i] = 0; 1158142Smckusick for (i = 0; i < NINDIR(fs); i++) 1168142Smckusick ib[i] = (daddr_t)0; 11739474Smckusick in.di_nlink = 1; 11839474Smckusick in.di_size = 0; 1198142Smckusick for (i = 0; i < NDADDR; i++) 12039474Smckusick in.di_db[i] = (daddr_t)0; 1218142Smckusick for (i = 0; i < NIADDR; i++) 12239474Smckusick in.di_ib[i] = (daddr_t)0; 12339474Smckusick if (par != (struct dinode *)0) { 12439474Smckusick inum = ialloc(&in); 1258142Smckusick } else { 1268142Smckusick par = ∈ 1278142Smckusick i = itod(fs, ROOTINO); 1288142Smckusick rdfs(fsbtodb(fs, i), fs->fs_bsize, (char *)inos); 1298142Smckusick dip = &inos[ROOTINO % INOPB(fs)]; 13039474Smckusick inum = ROOTINO; 13139474Smckusick in.di_nlink = dip->di_nlink; 13239474Smckusick in.di_size = dip->di_size; 13339474Smckusick in.di_db[0] = dip->di_db[0]; 13439474Smckusick rdfs(fsbtodb(fs, in.di_db[0]), fs->fs_bsize, buf); 1358142Smckusick } 1368142Smckusick 13739474Smckusick switch (in.di_mode&IFMT) { 1388142Smckusick 1398142Smckusick case IFREG: 1408142Smckusick getstr(); 1418142Smckusick f = open(token, 0); 1428142Smckusick if (f < 0) { 1438142Smckusick printf("%s: cannot open\n", token); 1448142Smckusick errs++; 1458142Smckusick break; 1468142Smckusick } 1478142Smckusick while ((i = read(f, buf, (int)fs->fs_bsize)) > 0) { 14839474Smckusick in.di_size += i; 14939474Smckusick newblk(buf, &ibc, ib, (int)dblksize(fs, &in, ibc)); 1508142Smckusick } 1518142Smckusick close(f); 1528142Smckusick break; 1538142Smckusick 1548142Smckusick case IFBLK: 1558142Smckusick case IFCHR: 1568142Smckusick /* 1578142Smckusick * special file 1588142Smckusick * content is maj/min types 1598142Smckusick */ 1608142Smckusick 1618142Smckusick i = getnum() & 0377; 1628142Smckusick f = getnum() & 0377; 16339474Smckusick in.di_rdev = (i << 8) | f; 1648142Smckusick break; 1658142Smckusick 1668142Smckusick case IFDIR: 1678142Smckusick /* 1688142Smckusick * directory 1698142Smckusick * put in extra links 1708142Smckusick * call recursively until 1718142Smckusick * name of "$" found 1728142Smckusick */ 1738142Smckusick 17439474Smckusick if (inum != ROOTINO) { 17539474Smckusick par->di_nlink++; 17639474Smckusick in.di_nlink++; 17739474Smckusick entry(&in, inum, ".", buf); 17839474Smckusick entry(&in, parinum, "..", buf); 1798142Smckusick } 1808142Smckusick for (;;) { 1818142Smckusick getstr(); 1828142Smckusick if (token[0]=='$' && token[1]=='\0') 1838142Smckusick break; 1848142Smckusick entry(&in, (ino_t)(ino+1), token, buf); 18539474Smckusick descend(&in, inum); 1868142Smckusick } 18739474Smckusick if (inum != ROOTINO) 18839474Smckusick newblk(buf, &ibc, ib, (int)dblksize(fs, &in, 0)); 1898142Smckusick else 19039474Smckusick wtfs(fsbtodb(fs, in.di_db[0]), (int)fs->fs_bsize, buf); 1918142Smckusick break; 1928142Smckusick } 19339474Smckusick iput(&in, &ibc, ib, inum); 1948142Smckusick } 1958142Smckusick 1968142Smckusick /*ARGSUSED*/ 1978142Smckusick gmode(c, s, m0, m1, m2, m3) 1988142Smckusick char c, *s; 1998142Smckusick { 2008142Smckusick int i; 2018142Smckusick 2028142Smckusick for (i = 0; s[i]; i++) 2038142Smckusick if (c == s[i]) 2048142Smckusick return((&m0)[i]); 2058142Smckusick printf("%c/%s: bad mode\n", c, token); 2068142Smckusick errs++; 2078142Smckusick return(0); 2088142Smckusick } 2098142Smckusick 2108142Smckusick long 2118142Smckusick getnum() 2128142Smckusick { 2138142Smckusick int i, c; 2148142Smckusick long n; 2158142Smckusick 2168142Smckusick getstr(); 2178142Smckusick n = 0; 2188142Smckusick i = 0; 2198142Smckusick for (i = 0; c=token[i]; i++) { 2208142Smckusick if (c<'0' || c>'9') { 2218142Smckusick printf("%s: bad number\n", token); 2228142Smckusick errs++; 2238142Smckusick return((long)0); 2248142Smckusick } 2258142Smckusick n = n*10 + (c-'0'); 2268142Smckusick } 2278142Smckusick return(n); 2288142Smckusick } 2298142Smckusick 2308142Smckusick getstr() 2318142Smckusick { 2328142Smckusick int i, c; 2338142Smckusick 2348142Smckusick loop: 2358142Smckusick switch (c = getc(proto)) { 2368142Smckusick 2378142Smckusick case ' ': 2388142Smckusick case '\t': 2398142Smckusick case '\n': 2408142Smckusick goto loop; 2418142Smckusick 2428142Smckusick case EOF: 2438142Smckusick printf("Unexpected EOF\n"); 2448142Smckusick exit(1); 2458142Smckusick 2468142Smckusick case ':': 2478142Smckusick while (getc(proto) != '\n') 2488142Smckusick ; 2498142Smckusick goto loop; 2508142Smckusick 2518142Smckusick } 2528142Smckusick i = 0; 2538142Smckusick do { 2548142Smckusick token[i++] = c; 2558142Smckusick c = getc(proto); 2568142Smckusick } while (c != ' ' && c != '\t' && c != '\n' && c != '\0'); 2578142Smckusick token[i] = 0; 2588142Smckusick } 2598142Smckusick 2608142Smckusick entry(ip, inum, str, buf) 26139474Smckusick struct dinode *ip; 2628142Smckusick ino_t inum; 2638142Smckusick char *str; 2648142Smckusick char *buf; 2658142Smckusick { 2668142Smckusick register struct direct *dp, *odp; 26712214Ssam int oldsize, newsize, spacefree; 2688142Smckusick 2698142Smckusick odp = dp = (struct direct *)buf; 27039474Smckusick while ((int)dp - (int)buf < ip->di_size) { 2718142Smckusick odp = dp; 2728142Smckusick dp = (struct direct *)((int)dp + dp->d_reclen); 2738142Smckusick } 2748142Smckusick if (odp != dp) 2758142Smckusick oldsize = DIRSIZ(odp); 2768142Smckusick else 2778142Smckusick oldsize = 0; 27812214Ssam spacefree = odp->d_reclen - oldsize; 2798142Smckusick dp = (struct direct *)((int)odp + oldsize); 2808142Smckusick dp->d_ino = inum; 2818142Smckusick dp->d_namlen = strlen(str); 2828142Smckusick newsize = DIRSIZ(dp); 28312214Ssam if (spacefree >= newsize) { 2848142Smckusick odp->d_reclen = oldsize; 28512214Ssam dp->d_reclen = spacefree; 2868142Smckusick } else { 2878142Smckusick dp = (struct direct *)((int)odp + odp->d_reclen); 2888142Smckusick if ((int)dp - (int)buf >= fs->fs_bsize) { 2898142Smckusick printf("directory too large\n"); 2908142Smckusick exit(1); 2918142Smckusick } 2928142Smckusick dp->d_ino = inum; 2938142Smckusick dp->d_namlen = strlen(str); 2948142Smckusick dp->d_reclen = DIRBLKSIZ; 2958142Smckusick } 2968142Smckusick strcpy(dp->d_name, str); 29739474Smckusick ip->di_size = (int)dp - (int)buf + newsize; 2988142Smckusick } 2998142Smckusick 3008142Smckusick newblk(buf, aibc, ib, size) 3018142Smckusick int *aibc; 3028142Smckusick char *buf; 3038142Smckusick daddr_t *ib; 3048142Smckusick int size; 3058142Smckusick { 3068142Smckusick int i; 30733139Sbostic daddr_t bno, alloc(); 3088142Smckusick 3098142Smckusick bno = alloc(size); 3108142Smckusick wtfs(fsbtodb(fs, bno), (int)fs->fs_bsize, buf); 3118142Smckusick for (i = 0; i < fs->fs_bsize; i++) 3128142Smckusick buf[i] = 0; 3138142Smckusick ib[(*aibc)++] = bno; 3148142Smckusick if (*aibc >= NINDIR(fs)) { 3158142Smckusick printf("indirect block full\n"); 3168142Smckusick errs++; 3178142Smckusick *aibc = 0; 3188142Smckusick } 3198142Smckusick } 3208142Smckusick 32139474Smckusick iput(ip, aibc, ib, inum) 32239474Smckusick struct dinode *ip; 3238142Smckusick int *aibc; 3248142Smckusick daddr_t *ib; 32539474Smckusick ino_t inum; 3268142Smckusick { 32733139Sbostic daddr_t d, alloc(); 3288142Smckusick int i; 3298142Smckusick struct dinode buf[MAXBSIZE / sizeof (struct dinode)]; 33033139Sbostic time_t time(); 3318142Smckusick 33239474Smckusick ip->di_atime = ip->di_mtime = ip->di_ctime = time((time_t *)NULL); 33339474Smckusick switch (ip->di_mode&IFMT) { 3348142Smckusick 3358142Smckusick case IFDIR: 3368142Smckusick case IFREG: 3378142Smckusick for (i = 0; i < *aibc; i++) { 3388142Smckusick if (i >= NDADDR) 3398142Smckusick break; 34039474Smckusick ip->di_db[i] = ib[i]; 3418142Smckusick } 3428142Smckusick if (*aibc > NDADDR) { 34339474Smckusick ip->di_ib[0] = alloc((int)fs->fs_bsize); 3448142Smckusick for (i = 0; i < NINDIR(fs) - NDADDR; i++) { 3458142Smckusick ib[i] = ib[i+NDADDR]; 3468142Smckusick ib[i+NDADDR] = (daddr_t)0; 3478142Smckusick } 34839474Smckusick wtfs(fsbtodb(fs, ip->di_ib[0]), 3498142Smckusick (int)fs->fs_bsize, (char *)ib); 3508142Smckusick } 3518142Smckusick break; 3528142Smckusick 3538142Smckusick case IFBLK: 3548142Smckusick case IFCHR: 3558142Smckusick break; 3568142Smckusick 3578142Smckusick default: 35839474Smckusick printf("bad mode %o\n", ip->di_mode); 3598142Smckusick exit(1); 3608142Smckusick } 36139474Smckusick d = fsbtodb(fs, itod(fs, inum)); 3628142Smckusick rdfs(d, (int)fs->fs_bsize, (char *)buf); 36339474Smckusick buf[itoo(fs, inum)] = *ip; 3648142Smckusick wtfs(d, (int)fs->fs_bsize, (char *)buf); 3658142Smckusick } 3668142Smckusick 3678142Smckusick daddr_t 3688142Smckusick alloc(size) 3698142Smckusick int size; 3708142Smckusick { 3718142Smckusick int i, frag; 3728142Smckusick daddr_t d; 3738142Smckusick static int cg = 0; 3748142Smckusick 3758142Smckusick again: 3768142Smckusick rdfs(fsbtodb(&sblock, cgtod(&sblock, cg)), (int)sblock.fs_cgsize, 3778142Smckusick (char *)&acg); 37834575Smckusick if (!cg_chkmagic(&acg)) { 3798142Smckusick printf("cg %d: bad magic number\n", cg); 3808142Smckusick return (0); 3818142Smckusick } 3828142Smckusick if (acg.cg_cs.cs_nbfree == 0) { 3838142Smckusick cg++; 3848142Smckusick if (cg >= fs->fs_ncg) { 3858142Smckusick printf("ran out of space\n"); 3868142Smckusick return (0); 3878142Smckusick } 3888142Smckusick goto again; 3898142Smckusick } 3908142Smckusick for (d = 0; d < acg.cg_ndblk; d += sblock.fs_frag) 39134575Smckusick if (isblock(&sblock, (u_char *)cg_blksfree(&acg), 39234575Smckusick d / sblock.fs_frag)) 3938142Smckusick goto goth; 3948142Smckusick printf("internal error: can't find block in cyl %d\n", cg); 3958142Smckusick return (0); 3968142Smckusick goth: 39734575Smckusick clrblock(&sblock, (u_char *)cg_blksfree(&acg), d / sblock.fs_frag); 3988142Smckusick acg.cg_cs.cs_nbfree--; 3998142Smckusick sblock.fs_cstotal.cs_nbfree--; 4008142Smckusick fscs[cg].cs_nbfree--; 40134575Smckusick cg_blktot(&acg)[cbtocylno(&sblock, d)]--; 40234575Smckusick cg_blks(&sblock, &acg, cbtocylno(&sblock, d))[cbtorpos(&sblock, d)]--; 4038142Smckusick if (size != sblock.fs_bsize) { 4048142Smckusick frag = howmany(size, sblock.fs_fsize); 4058142Smckusick fscs[cg].cs_nffree += sblock.fs_frag - frag; 4068142Smckusick sblock.fs_cstotal.cs_nffree += sblock.fs_frag - frag; 4078142Smckusick acg.cg_cs.cs_nffree += sblock.fs_frag - frag; 4088142Smckusick acg.cg_frsum[sblock.fs_frag - frag]++; 4098142Smckusick for (i = frag; i < sblock.fs_frag; i++) 41034575Smckusick setbit(cg_blksfree(&acg), d + i); 4118142Smckusick } 4128142Smckusick wtfs(fsbtodb(&sblock, cgtod(&sblock, cg)), (int)sblock.fs_cgsize, 4138142Smckusick (char *)&acg); 4148142Smckusick return (acg.cg_cgx * fs->fs_fpg + d); 4158142Smckusick } 4168142Smckusick 4178142Smckusick /* 4188142Smckusick * Allocate an inode on the disk 4198142Smckusick */ 42039474Smckusick ino_t 4218142Smckusick ialloc(ip) 42239474Smckusick register struct dinode *ip; 4238142Smckusick { 42439474Smckusick ino_t inum; 4258142Smckusick int c; 4268142Smckusick 42739474Smckusick inum = ++ino; 42839474Smckusick c = itog(&sblock, inum); 4298142Smckusick rdfs(fsbtodb(&sblock, cgtod(&sblock, c)), (int)sblock.fs_cgsize, 4308142Smckusick (char *)&acg); 43134575Smckusick if (!cg_chkmagic(&acg)) { 4328142Smckusick printf("cg %d: bad magic number\n", c); 4338142Smckusick exit(1); 4348142Smckusick } 43539474Smckusick if (ip->di_mode & IFDIR) { 4368142Smckusick acg.cg_cs.cs_ndir++; 4378142Smckusick sblock.fs_cstotal.cs_ndir++; 4388142Smckusick fscs[c].cs_ndir++; 4398142Smckusick } 4408142Smckusick acg.cg_cs.cs_nifree--; 44139474Smckusick setbit(cg_inosused(&acg), inum); 4428142Smckusick wtfs(fsbtodb(&sblock, cgtod(&sblock, c)), (int)sblock.fs_cgsize, 4438142Smckusick (char *)&acg); 4448142Smckusick sblock.fs_cstotal.cs_nifree--; 4458142Smckusick fscs[c].cs_nifree--; 44639474Smckusick if(inum >= sblock.fs_ipg * sblock.fs_ncg) { 44739474Smckusick printf("fsinit: inode value out of range (%lu).\n", inum); 4488142Smckusick exit(1); 4498142Smckusick } 45039474Smckusick return (inum); 4518142Smckusick } 4528142Smckusick 4538142Smckusick /* 4548142Smckusick * read a block from the file system 4558142Smckusick */ 4568142Smckusick rdfs(bno, size, bf) 4578142Smckusick int bno, size; 4588142Smckusick char *bf; 4598142Smckusick { 4608142Smckusick int n; 46133139Sbostic off_t lseek(); 4628142Smckusick 46330558Smckusick if (lseek(fsi, bno * dev_bsize, 0) < 0) { 46433139Sbostic printf("seek error: %d\n", bno); 4658142Smckusick perror("rdfs"); 4668142Smckusick exit(1); 4678142Smckusick } 4688142Smckusick n = read(fsi, bf, size); 4698142Smckusick if(n != size) { 47033139Sbostic printf("read error: %d\n", bno); 4718142Smckusick perror("rdfs"); 4728142Smckusick exit(1); 4738142Smckusick } 4748142Smckusick } 4758142Smckusick 4768142Smckusick /* 4778142Smckusick * write a block to the file system 4788142Smckusick */ 4798142Smckusick wtfs(bno, size, bf) 4808142Smckusick int bno, size; 4818142Smckusick char *bf; 4828142Smckusick { 4838142Smckusick int n; 48433139Sbostic off_t lseek(); 4858142Smckusick 48630558Smckusick if (lseek(fso, bno * dev_bsize, 0) < 0) { 48733139Sbostic printf("seek error: %d\n", bno); 4888142Smckusick perror("wtfs"); 4898142Smckusick exit(1); 4908142Smckusick } 4918142Smckusick n = write(fso, bf, size); 4928142Smckusick if(n != size) { 49333139Sbostic printf("write error: %d\n", bno); 4948142Smckusick perror("wtfs"); 4958142Smckusick exit(1); 4968142Smckusick } 4978142Smckusick } 4988142Smckusick /* 4998142Smckusick * check if a block is available 5008142Smckusick */ 5018142Smckusick isblock(fs, cp, h) 5028142Smckusick struct fs *fs; 5038142Smckusick unsigned char *cp; 5048142Smckusick int h; 5058142Smckusick { 5068142Smckusick unsigned char mask; 5078142Smckusick 5088142Smckusick switch (fs->fs_frag) { 5098142Smckusick case 8: 5108142Smckusick return (cp[h] == 0xff); 5118142Smckusick case 4: 5128142Smckusick mask = 0x0f << ((h & 0x1) << 2); 5138142Smckusick return ((cp[h >> 1] & mask) == mask); 5148142Smckusick case 2: 5158142Smckusick mask = 0x03 << ((h & 0x3) << 1); 5168142Smckusick return ((cp[h >> 2] & mask) == mask); 5178142Smckusick case 1: 5188142Smckusick mask = 0x01 << (h & 0x7); 5198142Smckusick return ((cp[h >> 3] & mask) == mask); 5208142Smckusick default: 52133139Sbostic fprintf(stderr, "isblock bad fs_frag %ld\n", fs->fs_frag); 5228142Smckusick return (0); 5238142Smckusick } 5248142Smckusick /*NOTREACHED*/ 5258142Smckusick } 5268142Smckusick 5278142Smckusick /* 5288142Smckusick * take a block out of the map 5298142Smckusick */ 5308142Smckusick clrblock(fs, cp, h) 5318142Smckusick struct fs *fs; 5328142Smckusick unsigned char *cp; 5338142Smckusick int h; 5348142Smckusick { 5358142Smckusick switch ((fs)->fs_frag) { 5368142Smckusick case 8: 5378142Smckusick cp[h] = 0; 5388142Smckusick return; 5398142Smckusick case 4: 5408142Smckusick cp[h >> 1] &= ~(0x0f << ((h & 0x1) << 2)); 5418142Smckusick return; 5428142Smckusick case 2: 5438142Smckusick cp[h >> 2] &= ~(0x03 << ((h & 0x3) << 1)); 5448142Smckusick return; 5458142Smckusick case 1: 5468142Smckusick cp[h >> 3] &= ~(0x01 << (h & 0x7)); 5478142Smckusick return; 5488142Smckusick default: 54933139Sbostic fprintf(stderr, "clrblock bad fs_frag %ld\n", fs->fs_frag); 5508142Smckusick return; 5518142Smckusick } 5528142Smckusick } 5538142Smckusick 554