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*39474Smckusick static char sccsid[] = "@(#)mkproto.c 5.6 (Berkeley) 11/01/89"; 1521155Sdist #endif not lint 1621155Sdist 178142Smckusick /* 188142Smckusick * Make a file system prototype. 198142Smckusick * usage: mkproto filsys proto 208142Smckusick */ 218142Smckusick #include <sys/param.h> 228142Smckusick #include <sys/dir.h> 23*39474Smckusick #include <ufs/dinode.h> 2438517Sbostic #include <ufs/fs.h> 2538517Sbostic #include <stdio.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; 4330558Smckusick long dev_bsize = 1; 448142Smckusick int ino = 10; 458142Smckusick long getnum(); 468142Smckusick char *strcpy(); 47*39474Smckusick ino_t ialloc(); 488142Smckusick 498142Smckusick main(argc, argv) 508142Smckusick int argc; 518142Smckusick char *argv[]; 528142Smckusick { 538142Smckusick int i; 5433139Sbostic char *calloc(); 558142Smckusick 568142Smckusick if (argc != 3) { 578142Smckusick fprintf(stderr, "usage: mkproto filsys proto\n"); 588142Smckusick exit(1); 598142Smckusick } 608142Smckusick fso = open(argv[1], 1); 618142Smckusick fsi = open(argv[1], 0); 628142Smckusick if (fso < 0 || fsi < 0) { 638142Smckusick perror(argv[1]); 648142Smckusick exit(1); 658142Smckusick } 668142Smckusick fs = &sblock; 6730558Smckusick rdfs(SBOFF, SBSIZE, (char *)fs); 6830558Smckusick dev_bsize = fs->fs_fsize / fsbtodb(fs, 1); 6933139Sbostic fscs = (struct csum *)calloc(1, (u_int)fs->fs_cssize); 708142Smckusick for (i = 0; i < fs->fs_cssize; i += fs->fs_bsize) 718142Smckusick rdfs(fsbtodb(fs, fs->fs_csaddr + numfrags(fs, i)), 728142Smckusick (int)(fs->fs_cssize - i < fs->fs_bsize ? 738142Smckusick fs->fs_cssize - i : fs->fs_bsize), 748142Smckusick ((char *)fscs) + i); 758142Smckusick proto = fopen(argv[2], "r"); 76*39474Smckusick descend((struct dinode *)0, ROOTINO); 7730558Smckusick wtfs(SBOFF / dev_bsize, SBSIZE, (char *)fs); 788142Smckusick for (i = 0; i < fs->fs_cssize; i += fs->fs_bsize) 798142Smckusick wtfs(fsbtodb(&sblock, fs->fs_csaddr + numfrags(&sblock, i)), 808142Smckusick (int)(fs->fs_cssize - i < fs->fs_bsize ? 818142Smckusick fs->fs_cssize - i : fs->fs_bsize), 828142Smckusick ((char *)fscs) + i); 838142Smckusick exit(errs); 848142Smckusick } 858142Smckusick 86*39474Smckusick descend(par, parinum) 87*39474Smckusick struct dinode *par; 88*39474Smckusick ino_t parinum; 898142Smckusick { 90*39474Smckusick struct dinode in; 91*39474Smckusick ino_t inum; 928142Smckusick int ibc = 0; 938142Smckusick int i, f, c; 948142Smckusick struct dinode *dip, inos[MAXBSIZE / sizeof (struct dinode)]; 958142Smckusick daddr_t ib[MAXBSIZE / sizeof (daddr_t)]; 968142Smckusick char buf[MAXBSIZE]; 978142Smckusick 988142Smckusick getstr(); 99*39474Smckusick in.di_mode = gmode(token[0], "-bcd", IFREG, IFBLK, IFCHR, IFDIR); 100*39474Smckusick in.di_mode |= gmode(token[1], "-u", 0, ISUID, 0, 0); 101*39474Smckusick in.di_mode |= gmode(token[2], "-g", 0, ISGID, 0, 0); 1028142Smckusick for (i = 3; i < 6; i++) { 1038142Smckusick c = token[i]; 1048142Smckusick if (c < '0' || c > '7') { 1058142Smckusick printf("%c/%s: bad octal mode digit\n", c, token); 1068142Smckusick errs++; 1078142Smckusick c = 0; 1088142Smckusick } 109*39474Smckusick in.di_mode |= (c-'0')<<(15-3*i); 1108142Smckusick } 111*39474Smckusick in.di_uid = getnum(); in.di_gid = getnum(); 1128142Smckusick for (i = 0; i < fs->fs_bsize; i++) 1138142Smckusick buf[i] = 0; 1148142Smckusick for (i = 0; i < NINDIR(fs); i++) 1158142Smckusick ib[i] = (daddr_t)0; 116*39474Smckusick in.di_nlink = 1; 117*39474Smckusick in.di_size = 0; 1188142Smckusick for (i = 0; i < NDADDR; i++) 119*39474Smckusick in.di_db[i] = (daddr_t)0; 1208142Smckusick for (i = 0; i < NIADDR; i++) 121*39474Smckusick in.di_ib[i] = (daddr_t)0; 122*39474Smckusick if (par != (struct dinode *)0) { 123*39474Smckusick inum = ialloc(&in); 1248142Smckusick } else { 1258142Smckusick par = ∈ 1268142Smckusick i = itod(fs, ROOTINO); 1278142Smckusick rdfs(fsbtodb(fs, i), fs->fs_bsize, (char *)inos); 1288142Smckusick dip = &inos[ROOTINO % INOPB(fs)]; 129*39474Smckusick inum = ROOTINO; 130*39474Smckusick in.di_nlink = dip->di_nlink; 131*39474Smckusick in.di_size = dip->di_size; 132*39474Smckusick in.di_db[0] = dip->di_db[0]; 133*39474Smckusick rdfs(fsbtodb(fs, in.di_db[0]), fs->fs_bsize, buf); 1348142Smckusick } 1358142Smckusick 136*39474Smckusick switch (in.di_mode&IFMT) { 1378142Smckusick 1388142Smckusick case IFREG: 1398142Smckusick getstr(); 1408142Smckusick f = open(token, 0); 1418142Smckusick if (f < 0) { 1428142Smckusick printf("%s: cannot open\n", token); 1438142Smckusick errs++; 1448142Smckusick break; 1458142Smckusick } 1468142Smckusick while ((i = read(f, buf, (int)fs->fs_bsize)) > 0) { 147*39474Smckusick in.di_size += i; 148*39474Smckusick newblk(buf, &ibc, ib, (int)dblksize(fs, &in, ibc)); 1498142Smckusick } 1508142Smckusick close(f); 1518142Smckusick break; 1528142Smckusick 1538142Smckusick case IFBLK: 1548142Smckusick case IFCHR: 1558142Smckusick /* 1568142Smckusick * special file 1578142Smckusick * content is maj/min types 1588142Smckusick */ 1598142Smckusick 1608142Smckusick i = getnum() & 0377; 1618142Smckusick f = getnum() & 0377; 162*39474Smckusick in.di_rdev = (i << 8) | f; 1638142Smckusick break; 1648142Smckusick 1658142Smckusick case IFDIR: 1668142Smckusick /* 1678142Smckusick * directory 1688142Smckusick * put in extra links 1698142Smckusick * call recursively until 1708142Smckusick * name of "$" found 1718142Smckusick */ 1728142Smckusick 173*39474Smckusick if (inum != ROOTINO) { 174*39474Smckusick par->di_nlink++; 175*39474Smckusick in.di_nlink++; 176*39474Smckusick entry(&in, inum, ".", buf); 177*39474Smckusick entry(&in, parinum, "..", buf); 1788142Smckusick } 1798142Smckusick for (;;) { 1808142Smckusick getstr(); 1818142Smckusick if (token[0]=='$' && token[1]=='\0') 1828142Smckusick break; 1838142Smckusick entry(&in, (ino_t)(ino+1), token, buf); 184*39474Smckusick descend(&in, inum); 1858142Smckusick } 186*39474Smckusick if (inum != ROOTINO) 187*39474Smckusick newblk(buf, &ibc, ib, (int)dblksize(fs, &in, 0)); 1888142Smckusick else 189*39474Smckusick wtfs(fsbtodb(fs, in.di_db[0]), (int)fs->fs_bsize, buf); 1908142Smckusick break; 1918142Smckusick } 192*39474Smckusick iput(&in, &ibc, ib, inum); 1938142Smckusick } 1948142Smckusick 1958142Smckusick /*ARGSUSED*/ 1968142Smckusick gmode(c, s, m0, m1, m2, m3) 1978142Smckusick char c, *s; 1988142Smckusick { 1998142Smckusick int i; 2008142Smckusick 2018142Smckusick for (i = 0; s[i]; i++) 2028142Smckusick if (c == s[i]) 2038142Smckusick return((&m0)[i]); 2048142Smckusick printf("%c/%s: bad mode\n", c, token); 2058142Smckusick errs++; 2068142Smckusick return(0); 2078142Smckusick } 2088142Smckusick 2098142Smckusick long 2108142Smckusick getnum() 2118142Smckusick { 2128142Smckusick int i, c; 2138142Smckusick long n; 2148142Smckusick 2158142Smckusick getstr(); 2168142Smckusick n = 0; 2178142Smckusick i = 0; 2188142Smckusick for (i = 0; c=token[i]; i++) { 2198142Smckusick if (c<'0' || c>'9') { 2208142Smckusick printf("%s: bad number\n", token); 2218142Smckusick errs++; 2228142Smckusick return((long)0); 2238142Smckusick } 2248142Smckusick n = n*10 + (c-'0'); 2258142Smckusick } 2268142Smckusick return(n); 2278142Smckusick } 2288142Smckusick 2298142Smckusick getstr() 2308142Smckusick { 2318142Smckusick int i, c; 2328142Smckusick 2338142Smckusick loop: 2348142Smckusick switch (c = getc(proto)) { 2358142Smckusick 2368142Smckusick case ' ': 2378142Smckusick case '\t': 2388142Smckusick case '\n': 2398142Smckusick goto loop; 2408142Smckusick 2418142Smckusick case EOF: 2428142Smckusick printf("Unexpected EOF\n"); 2438142Smckusick exit(1); 2448142Smckusick 2458142Smckusick case ':': 2468142Smckusick while (getc(proto) != '\n') 2478142Smckusick ; 2488142Smckusick goto loop; 2498142Smckusick 2508142Smckusick } 2518142Smckusick i = 0; 2528142Smckusick do { 2538142Smckusick token[i++] = c; 2548142Smckusick c = getc(proto); 2558142Smckusick } while (c != ' ' && c != '\t' && c != '\n' && c != '\0'); 2568142Smckusick token[i] = 0; 2578142Smckusick } 2588142Smckusick 2598142Smckusick entry(ip, inum, str, buf) 260*39474Smckusick struct dinode *ip; 2618142Smckusick ino_t inum; 2628142Smckusick char *str; 2638142Smckusick char *buf; 2648142Smckusick { 2658142Smckusick register struct direct *dp, *odp; 26612214Ssam int oldsize, newsize, spacefree; 2678142Smckusick 2688142Smckusick odp = dp = (struct direct *)buf; 269*39474Smckusick while ((int)dp - (int)buf < ip->di_size) { 2708142Smckusick odp = dp; 2718142Smckusick dp = (struct direct *)((int)dp + dp->d_reclen); 2728142Smckusick } 2738142Smckusick if (odp != dp) 2748142Smckusick oldsize = DIRSIZ(odp); 2758142Smckusick else 2768142Smckusick oldsize = 0; 27712214Ssam spacefree = odp->d_reclen - oldsize; 2788142Smckusick dp = (struct direct *)((int)odp + oldsize); 2798142Smckusick dp->d_ino = inum; 2808142Smckusick dp->d_namlen = strlen(str); 2818142Smckusick newsize = DIRSIZ(dp); 28212214Ssam if (spacefree >= newsize) { 2838142Smckusick odp->d_reclen = oldsize; 28412214Ssam dp->d_reclen = spacefree; 2858142Smckusick } else { 2868142Smckusick dp = (struct direct *)((int)odp + odp->d_reclen); 2878142Smckusick if ((int)dp - (int)buf >= fs->fs_bsize) { 2888142Smckusick printf("directory too large\n"); 2898142Smckusick exit(1); 2908142Smckusick } 2918142Smckusick dp->d_ino = inum; 2928142Smckusick dp->d_namlen = strlen(str); 2938142Smckusick dp->d_reclen = DIRBLKSIZ; 2948142Smckusick } 2958142Smckusick strcpy(dp->d_name, str); 296*39474Smckusick ip->di_size = (int)dp - (int)buf + newsize; 2978142Smckusick } 2988142Smckusick 2998142Smckusick newblk(buf, aibc, ib, size) 3008142Smckusick int *aibc; 3018142Smckusick char *buf; 3028142Smckusick daddr_t *ib; 3038142Smckusick int size; 3048142Smckusick { 3058142Smckusick int i; 30633139Sbostic daddr_t bno, alloc(); 3078142Smckusick 3088142Smckusick bno = alloc(size); 3098142Smckusick wtfs(fsbtodb(fs, bno), (int)fs->fs_bsize, buf); 3108142Smckusick for (i = 0; i < fs->fs_bsize; i++) 3118142Smckusick buf[i] = 0; 3128142Smckusick ib[(*aibc)++] = bno; 3138142Smckusick if (*aibc >= NINDIR(fs)) { 3148142Smckusick printf("indirect block full\n"); 3158142Smckusick errs++; 3168142Smckusick *aibc = 0; 3178142Smckusick } 3188142Smckusick } 3198142Smckusick 320*39474Smckusick iput(ip, aibc, ib, inum) 321*39474Smckusick struct dinode *ip; 3228142Smckusick int *aibc; 3238142Smckusick daddr_t *ib; 324*39474Smckusick ino_t inum; 3258142Smckusick { 32633139Sbostic daddr_t d, alloc(); 3278142Smckusick int i; 3288142Smckusick struct dinode buf[MAXBSIZE / sizeof (struct dinode)]; 32933139Sbostic time_t time(); 3308142Smckusick 331*39474Smckusick ip->di_atime = ip->di_mtime = ip->di_ctime = time((time_t *)NULL); 332*39474Smckusick switch (ip->di_mode&IFMT) { 3338142Smckusick 3348142Smckusick case IFDIR: 3358142Smckusick case IFREG: 3368142Smckusick for (i = 0; i < *aibc; i++) { 3378142Smckusick if (i >= NDADDR) 3388142Smckusick break; 339*39474Smckusick ip->di_db[i] = ib[i]; 3408142Smckusick } 3418142Smckusick if (*aibc > NDADDR) { 342*39474Smckusick ip->di_ib[0] = alloc((int)fs->fs_bsize); 3438142Smckusick for (i = 0; i < NINDIR(fs) - NDADDR; i++) { 3448142Smckusick ib[i] = ib[i+NDADDR]; 3458142Smckusick ib[i+NDADDR] = (daddr_t)0; 3468142Smckusick } 347*39474Smckusick wtfs(fsbtodb(fs, ip->di_ib[0]), 3488142Smckusick (int)fs->fs_bsize, (char *)ib); 3498142Smckusick } 3508142Smckusick break; 3518142Smckusick 3528142Smckusick case IFBLK: 3538142Smckusick case IFCHR: 3548142Smckusick break; 3558142Smckusick 3568142Smckusick default: 357*39474Smckusick printf("bad mode %o\n", ip->di_mode); 3588142Smckusick exit(1); 3598142Smckusick } 360*39474Smckusick d = fsbtodb(fs, itod(fs, inum)); 3618142Smckusick rdfs(d, (int)fs->fs_bsize, (char *)buf); 362*39474Smckusick buf[itoo(fs, inum)] = *ip; 3638142Smckusick wtfs(d, (int)fs->fs_bsize, (char *)buf); 3648142Smckusick } 3658142Smckusick 3668142Smckusick daddr_t 3678142Smckusick alloc(size) 3688142Smckusick int size; 3698142Smckusick { 3708142Smckusick int i, frag; 3718142Smckusick daddr_t d; 3728142Smckusick static int cg = 0; 3738142Smckusick 3748142Smckusick again: 3758142Smckusick rdfs(fsbtodb(&sblock, cgtod(&sblock, cg)), (int)sblock.fs_cgsize, 3768142Smckusick (char *)&acg); 37734575Smckusick if (!cg_chkmagic(&acg)) { 3788142Smckusick printf("cg %d: bad magic number\n", cg); 3798142Smckusick return (0); 3808142Smckusick } 3818142Smckusick if (acg.cg_cs.cs_nbfree == 0) { 3828142Smckusick cg++; 3838142Smckusick if (cg >= fs->fs_ncg) { 3848142Smckusick printf("ran out of space\n"); 3858142Smckusick return (0); 3868142Smckusick } 3878142Smckusick goto again; 3888142Smckusick } 3898142Smckusick for (d = 0; d < acg.cg_ndblk; d += sblock.fs_frag) 39034575Smckusick if (isblock(&sblock, (u_char *)cg_blksfree(&acg), 39134575Smckusick d / sblock.fs_frag)) 3928142Smckusick goto goth; 3938142Smckusick printf("internal error: can't find block in cyl %d\n", cg); 3948142Smckusick return (0); 3958142Smckusick goth: 39634575Smckusick clrblock(&sblock, (u_char *)cg_blksfree(&acg), d / sblock.fs_frag); 3978142Smckusick acg.cg_cs.cs_nbfree--; 3988142Smckusick sblock.fs_cstotal.cs_nbfree--; 3998142Smckusick fscs[cg].cs_nbfree--; 40034575Smckusick cg_blktot(&acg)[cbtocylno(&sblock, d)]--; 40134575Smckusick cg_blks(&sblock, &acg, cbtocylno(&sblock, d))[cbtorpos(&sblock, d)]--; 4028142Smckusick if (size != sblock.fs_bsize) { 4038142Smckusick frag = howmany(size, sblock.fs_fsize); 4048142Smckusick fscs[cg].cs_nffree += sblock.fs_frag - frag; 4058142Smckusick sblock.fs_cstotal.cs_nffree += sblock.fs_frag - frag; 4068142Smckusick acg.cg_cs.cs_nffree += sblock.fs_frag - frag; 4078142Smckusick acg.cg_frsum[sblock.fs_frag - frag]++; 4088142Smckusick for (i = frag; i < sblock.fs_frag; i++) 40934575Smckusick setbit(cg_blksfree(&acg), d + i); 4108142Smckusick } 4118142Smckusick wtfs(fsbtodb(&sblock, cgtod(&sblock, cg)), (int)sblock.fs_cgsize, 4128142Smckusick (char *)&acg); 4138142Smckusick return (acg.cg_cgx * fs->fs_fpg + d); 4148142Smckusick } 4158142Smckusick 4168142Smckusick /* 4178142Smckusick * Allocate an inode on the disk 4188142Smckusick */ 419*39474Smckusick ino_t 4208142Smckusick ialloc(ip) 421*39474Smckusick register struct dinode *ip; 4228142Smckusick { 423*39474Smckusick ino_t inum; 4248142Smckusick int c; 4258142Smckusick 426*39474Smckusick inum = ++ino; 427*39474Smckusick c = itog(&sblock, inum); 4288142Smckusick rdfs(fsbtodb(&sblock, cgtod(&sblock, c)), (int)sblock.fs_cgsize, 4298142Smckusick (char *)&acg); 43034575Smckusick if (!cg_chkmagic(&acg)) { 4318142Smckusick printf("cg %d: bad magic number\n", c); 4328142Smckusick exit(1); 4338142Smckusick } 434*39474Smckusick if (ip->di_mode & IFDIR) { 4358142Smckusick acg.cg_cs.cs_ndir++; 4368142Smckusick sblock.fs_cstotal.cs_ndir++; 4378142Smckusick fscs[c].cs_ndir++; 4388142Smckusick } 4398142Smckusick acg.cg_cs.cs_nifree--; 440*39474Smckusick setbit(cg_inosused(&acg), inum); 4418142Smckusick wtfs(fsbtodb(&sblock, cgtod(&sblock, c)), (int)sblock.fs_cgsize, 4428142Smckusick (char *)&acg); 4438142Smckusick sblock.fs_cstotal.cs_nifree--; 4448142Smckusick fscs[c].cs_nifree--; 445*39474Smckusick if(inum >= sblock.fs_ipg * sblock.fs_ncg) { 446*39474Smckusick printf("fsinit: inode value out of range (%lu).\n", inum); 4478142Smckusick exit(1); 4488142Smckusick } 449*39474Smckusick return (inum); 4508142Smckusick } 4518142Smckusick 4528142Smckusick /* 4538142Smckusick * read a block from the file system 4548142Smckusick */ 4558142Smckusick rdfs(bno, size, bf) 4568142Smckusick int bno, size; 4578142Smckusick char *bf; 4588142Smckusick { 4598142Smckusick int n; 46033139Sbostic off_t lseek(); 4618142Smckusick 46230558Smckusick if (lseek(fsi, bno * dev_bsize, 0) < 0) { 46333139Sbostic printf("seek error: %d\n", bno); 4648142Smckusick perror("rdfs"); 4658142Smckusick exit(1); 4668142Smckusick } 4678142Smckusick n = read(fsi, bf, size); 4688142Smckusick if(n != size) { 46933139Sbostic printf("read error: %d\n", bno); 4708142Smckusick perror("rdfs"); 4718142Smckusick exit(1); 4728142Smckusick } 4738142Smckusick } 4748142Smckusick 4758142Smckusick /* 4768142Smckusick * write a block to the file system 4778142Smckusick */ 4788142Smckusick wtfs(bno, size, bf) 4798142Smckusick int bno, size; 4808142Smckusick char *bf; 4818142Smckusick { 4828142Smckusick int n; 48333139Sbostic off_t lseek(); 4848142Smckusick 48530558Smckusick if (lseek(fso, bno * dev_bsize, 0) < 0) { 48633139Sbostic printf("seek error: %d\n", bno); 4878142Smckusick perror("wtfs"); 4888142Smckusick exit(1); 4898142Smckusick } 4908142Smckusick n = write(fso, bf, size); 4918142Smckusick if(n != size) { 49233139Sbostic printf("write error: %d\n", bno); 4938142Smckusick perror("wtfs"); 4948142Smckusick exit(1); 4958142Smckusick } 4968142Smckusick } 4978142Smckusick /* 4988142Smckusick * check if a block is available 4998142Smckusick */ 5008142Smckusick isblock(fs, cp, h) 5018142Smckusick struct fs *fs; 5028142Smckusick unsigned char *cp; 5038142Smckusick int h; 5048142Smckusick { 5058142Smckusick unsigned char mask; 5068142Smckusick 5078142Smckusick switch (fs->fs_frag) { 5088142Smckusick case 8: 5098142Smckusick return (cp[h] == 0xff); 5108142Smckusick case 4: 5118142Smckusick mask = 0x0f << ((h & 0x1) << 2); 5128142Smckusick return ((cp[h >> 1] & mask) == mask); 5138142Smckusick case 2: 5148142Smckusick mask = 0x03 << ((h & 0x3) << 1); 5158142Smckusick return ((cp[h >> 2] & mask) == mask); 5168142Smckusick case 1: 5178142Smckusick mask = 0x01 << (h & 0x7); 5188142Smckusick return ((cp[h >> 3] & mask) == mask); 5198142Smckusick default: 52033139Sbostic fprintf(stderr, "isblock bad fs_frag %ld\n", fs->fs_frag); 5218142Smckusick return (0); 5228142Smckusick } 5238142Smckusick /*NOTREACHED*/ 5248142Smckusick } 5258142Smckusick 5268142Smckusick /* 5278142Smckusick * take a block out of the map 5288142Smckusick */ 5298142Smckusick clrblock(fs, cp, h) 5308142Smckusick struct fs *fs; 5318142Smckusick unsigned char *cp; 5328142Smckusick int h; 5338142Smckusick { 5348142Smckusick switch ((fs)->fs_frag) { 5358142Smckusick case 8: 5368142Smckusick cp[h] = 0; 5378142Smckusick return; 5388142Smckusick case 4: 5398142Smckusick cp[h >> 1] &= ~(0x0f << ((h & 0x1) << 2)); 5408142Smckusick return; 5418142Smckusick case 2: 5428142Smckusick cp[h >> 2] &= ~(0x03 << ((h & 0x3) << 1)); 5438142Smckusick return; 5448142Smckusick case 1: 5458142Smckusick cp[h >> 3] &= ~(0x01 << (h & 0x7)); 5468142Smckusick return; 5478142Smckusick default: 54833139Sbostic fprintf(stderr, "clrblock bad fs_frag %ld\n", fs->fs_frag); 5498142Smckusick return; 5508142Smckusick } 5518142Smckusick } 5528142Smckusick 553