1*6286Smckusick static char *sccsid = "@(#)icheck.c 1.20 (Berkeley) 03/23/82"; 24410Smckusic 34240Smckusick /* 44240Smckusick * icheck 54240Smckusick */ 64240Smckusick #define NB 500 74240Smckusick #define MAXFN 500 85349Smckusic #define MAXNINDIR (MAXBSIZE / sizeof (daddr_t)) 94240Smckusick 104240Smckusick #ifndef STANDALONE 114240Smckusick #include <stdio.h> 124240Smckusick #endif 134240Smckusick #include "../h/param.h" 144240Smckusick #include "../h/inode.h" 154240Smckusick #include "../h/fs.h" 164240Smckusick 174240Smckusick union { 184240Smckusick struct fs sb; 195326Smckusic char pad[MAXBSIZE]; 204240Smckusick } sbun; 214240Smckusick #define sblock sbun.sb 224240Smckusick 234240Smckusick union { 244240Smckusick struct cg cg; 255326Smckusic char pad[MAXBSIZE]; 264240Smckusick } cgun; 274240Smckusick #define cgrp cgun.cg 284240Smckusick 294240Smckusick struct dinode itab[MAXIPG]; 304240Smckusick daddr_t blist[NB]; 314240Smckusick char *bmap; 324240Smckusick 334240Smckusick int mflg; 345098Smckusic int sflg; 354240Smckusick int dflg; 364240Smckusick int fi; 374240Smckusick ino_t ino; 384240Smckusick int cginit; 394240Smckusick 404240Smckusick ino_t nrfile; 414240Smckusick ino_t ndfile; 424240Smckusick ino_t nbfile; 434240Smckusick ino_t ncfile; 44*6286Smckusick ino_t nlfile; 454240Smckusick 464240Smckusick daddr_t nblock; 474240Smckusick daddr_t nfrag; 484240Smckusick daddr_t nindir; 494240Smckusick daddr_t niindir; 504240Smckusick 514240Smckusick daddr_t nffree; 524240Smckusick daddr_t nbfree; 534240Smckusick 544240Smckusick daddr_t ndup; 554240Smckusick 564240Smckusick int nerror; 574240Smckusick 585098Smckusic extern int inside[], around[]; 595326Smckusic extern unsigned char *fragtbl[]; 605098Smckusic 614240Smckusick long atol(); 624240Smckusick #ifndef STANDALONE 634240Smckusick char *malloc(); 645098Smckusic char *calloc(); 654240Smckusick #endif 664240Smckusick 674240Smckusick main(argc, argv) 685098Smckusic int argc; 695098Smckusic char *argv[]; 704240Smckusick { 714240Smckusick register i; 724240Smckusick long n; 734240Smckusick 744240Smckusick blist[0] = -1; 754240Smckusick #ifndef STANDALONE 764240Smckusick while (--argc) { 774240Smckusick argv++; 784240Smckusick if (**argv=='-') 794240Smckusick switch ((*argv)[1]) { 804240Smckusick case 'd': 814240Smckusick dflg++; 824240Smckusick continue; 834240Smckusick 844240Smckusick case 'm': 854240Smckusick mflg++; 864240Smckusick continue; 874240Smckusick 885098Smckusic case 's': 895098Smckusic sflg++; 905098Smckusic continue; 915098Smckusic 924240Smckusick case 'b': 934240Smckusick for(i=0; i<NB; i++) { 944240Smckusick n = atol(argv[1]); 954240Smckusick if(n == 0) 964240Smckusick break; 974240Smckusick blist[i] = n; 984240Smckusick argv++; 994240Smckusick argc--; 1004240Smckusick } 1014240Smckusick blist[i] = -1; 1024240Smckusick continue; 1034240Smckusick 1044240Smckusick default: 1054240Smckusick printf("Bad flag\n"); 1064240Smckusick } 1074240Smckusick check(*argv); 1084240Smckusick } 1094240Smckusick #else 1104240Smckusick { 1114240Smckusick static char fname[128]; 1124240Smckusick 1134240Smckusick printf("File: "); 1144240Smckusick gets(fname); 1154240Smckusick check(fname); 1164240Smckusick } 1174240Smckusick #endif 1184240Smckusick return(nerror); 1194240Smckusick } 1204240Smckusick 1214240Smckusick check(file) 1225098Smckusic char *file; 1234240Smckusick { 1244240Smckusick register i, j, c; 1254240Smckusick daddr_t d, cgd, cbase, b; 1264240Smckusick long n; 1274240Smckusick 1285098Smckusic fi = open(file, sflg ? 2 : 0); 1294240Smckusick if (fi < 0) { 1305098Smckusic perror(file); 1314240Smckusick nerror |= 04; 1324240Smckusick return; 1334240Smckusick } 1344240Smckusick printf("%s:\n", file); 1354240Smckusick nrfile = 0; 1364240Smckusick ndfile = 0; 1374240Smckusick ncfile = 0; 1384240Smckusick nbfile = 0; 139*6286Smckusick nlfile = 0; 1404240Smckusick 1414240Smckusick nblock = 0; 1424240Smckusick nfrag = 0; 1434240Smckusick nindir = 0; 1444240Smckusick niindir = 0; 1454240Smckusick 1464240Smckusick ndup = 0; 1474240Smckusick #ifndef STANDALONE 1484240Smckusick sync(); 1494240Smckusick #endif 1505326Smckusic getsb(&sblock, file); 1515326Smckusic if (nerror) 1524240Smckusick return; 1534240Smckusick ino = 0; 1545098Smckusic n = roundup(howmany(sblock.fs_size, NBBY), sizeof(short)); 1554240Smckusick #ifdef STANDALONE 1564240Smckusick bmap = NULL; 1574240Smckusick #else 1584240Smckusick bmap = malloc((unsigned)n); 1594240Smckusick #endif 1604240Smckusick if (bmap==NULL) { 1614240Smckusick printf("Not enough core; duplicates unchecked\n"); 1624240Smckusick dflg++; 1635098Smckusic if (sflg) { 1645098Smckusic printf("No Updates\n"); 1655098Smckusic sflg = 0; 1665098Smckusic } 1674240Smckusick } 1684240Smckusick ino = 0; 1694240Smckusick cginit = 1; 1704240Smckusick if(!dflg) { 1714240Smckusick for (i=0; i<(unsigned)n; i++) 1724240Smckusick bmap[i] = 0; 1734240Smckusick for (c=0; c < sblock.fs_ncg; c++) { 1745382Smckusic cgd = cgtod(&sblock, c); 1755382Smckusic for (d = cgbase(&sblock, c); d < cgd; d += sblock.fs_frag) 1765326Smckusic chk(d, "badcg", sblock.fs_bsize); 1775382Smckusic d = cgimin(&sblock, c); 1784240Smckusick while (cgd < d) { 1795326Smckusic chk(cgd, "cg", sblock.fs_bsize); 1805326Smckusic cgd += sblock.fs_frag; 1814240Smckusick } 1825382Smckusic d = cgdmin(&sblock, c); 1835326Smckusic for (; cgd < d; cgd += sblock.fs_frag) 1845326Smckusic chk(cgd, "inode", sblock.fs_bsize); 1854240Smckusick if (c == 0) { 1865326Smckusic d += howmany(sblock.fs_cssize, sblock.fs_bsize) 1875326Smckusic * sblock.fs_frag; 1885326Smckusic for (; cgd < d; cgd += sblock.fs_frag) 1895326Smckusic chk(cgd, "csum", sblock.fs_bsize); 1904240Smckusick } 1914240Smckusick } 1924240Smckusick } 1934240Smckusick cginit = 0; 1944240Smckusick for (c = 0; c < sblock.fs_ncg; c++) { 1955382Smckusic bread(fsbtodb(&sblock, cgimin(&sblock, c)), (char *)itab, 1964240Smckusick sblock.fs_ipg * sizeof (struct dinode)); 1974240Smckusick for (j=0; j < sblock.fs_ipg; j++) { 1984240Smckusick pass1(&itab[j]); 1994240Smckusick ino++; 2004240Smckusick } 2014240Smckusick } 2024240Smckusick ino = 0; 2034240Smckusick #ifndef STANDALONE 2044240Smckusick sync(); 2054240Smckusick #endif 2065098Smckusic if (sflg) { 2075098Smckusic makecg(); 2085098Smckusic close(fi); 2095098Smckusic #ifndef STANDALONE 2105098Smckusic if (bmap) 2115098Smckusic free(bmap); 2125098Smckusic #endif 2135098Smckusic return; 2145098Smckusic } 2154240Smckusick nffree = 0; 2164240Smckusick nbfree = 0; 2174240Smckusick for (c = 0; c < sblock.fs_ncg; c++) { 2185382Smckusic cbase = cgbase(&sblock, c); 2195382Smckusic bread(fsbtodb(&sblock, cgtod(&sblock, c)), (char *)&cgrp, 2205326Smckusic sblock.fs_cgsize); 2215326Smckusic for (b = 0; b < sblock.fs_fpg; b += sblock.fs_frag) { 2225326Smckusic if (isblock(&sblock, cgrp.cg_free, 2235326Smckusic b / sblock.fs_frag)) { 2244240Smckusick nbfree++; 2255326Smckusic chk(cbase+b, "block", sblock.fs_bsize); 2264240Smckusick } else { 2275326Smckusic for (d = 0; d < sblock.fs_frag; d++) 2284240Smckusick if (isset(cgrp.cg_free, b+d)) { 2295326Smckusic chk(cbase+b+d, "frag", sblock.fs_fsize); 2304240Smckusick nffree++; 2314240Smckusick } 2324240Smckusick } 2334240Smckusick } 2344240Smckusick } 2354240Smckusick close(fi); 2364240Smckusick #ifndef STANDALONE 2374240Smckusick if (bmap) 2384240Smckusick free(bmap); 2394240Smckusick #endif 2404240Smckusick 241*6286Smckusick i = nrfile + ndfile + ncfile + nbfile + nlfile; 2424240Smckusick #ifndef STANDALONE 243*6286Smckusick printf("files %6u (r=%u,d=%u,b=%u,c=%u,sl=%u)\n", 244*6286Smckusick i, nrfile, ndfile, nbfile, ncfile, nlfile); 2454240Smckusick #else 246*6286Smckusick printf("files %u (r=%u,d=%u,b=%u,c=%u,sl=%u)\n", 247*6286Smckusick i, nrfile, ndfile, nbfile, ncfile, nlfile); 2484240Smckusick #endif 2495326Smckusic n = (nblock + nindir + niindir) * sblock.fs_frag + nfrag; 2504240Smckusick #ifdef STANDALONE 2514240Smckusick printf("used %ld (i=%ld,ii=%ld,b=%ld,f=%ld)\n", 2524240Smckusick n, nindir, niindir, nblock, nfrag); 2535326Smckusic printf("free %ld (b=%ld,f=%ld)\n", nffree + sblock.fs_frag * nbfree, 2544240Smckusick nbfree, nffree); 2554240Smckusick #else 2564240Smckusick printf("used %7ld (i=%ld,ii=%ld,b=%ld,f=%ld)\n", 2574240Smckusick n, nindir, niindir, nblock, nfrag); 2585326Smckusic printf("free %7ld (b=%ld,f=%ld)\n", nffree + sblock.fs_frag * nbfree, 2594240Smckusick nbfree, nffree); 2604240Smckusick #endif 2614240Smckusick if(!dflg) { 2624240Smckusick n = 0; 2634410Smckusic for (d = 0; d < sblock.fs_size; d++) 2645326Smckusic if(!duped(d, sblock.fs_fsize)) { 2654240Smckusick if(mflg) 2664240Smckusick printf("%ld missing\n", d); 2674240Smckusick n++; 2684240Smckusick } 2694240Smckusick printf("missing%5ld\n", n); 2704240Smckusick } 2714240Smckusick } 2724240Smckusick 2734240Smckusick pass1(ip) 2744410Smckusic register struct dinode *ip; 2754240Smckusick { 2765326Smckusic daddr_t ind1[MAXNINDIR]; 2775326Smckusic daddr_t ind2[MAXNINDIR]; 2784429Smckusic daddr_t db, ib; 2794429Smckusic register int i, j, k, siz; 2804240Smckusick 2814240Smckusick i = ip->di_mode & IFMT; 2824790Smckusic if(i == 0) 2834240Smckusick return; 2844240Smckusick switch (i) { 2854240Smckusick case IFCHR: 2864240Smckusick ncfile++; 2874240Smckusick return; 2884240Smckusick case IFBLK: 2894240Smckusick nbfile++; 2904240Smckusick return; 2914240Smckusick case IFDIR: 2924240Smckusick ndfile++; 2934240Smckusick break; 2944240Smckusick case IFREG: 2954240Smckusick nrfile++; 2964240Smckusick break; 297*6286Smckusick case IFLNK: 298*6286Smckusick nlfile++; 299*6286Smckusick break; 3004240Smckusick default: 3014240Smckusick printf("bad mode %u\n", ino); 3024240Smckusick return; 3034240Smckusick } 3044410Smckusic for (i = 0; i < NDADDR; i++) { 3054410Smckusic db = ip->di_db[i]; 3064410Smckusic if (db == 0) 3074240Smckusick continue; 3085326Smckusic siz = dblksize(&sblock, ip, i); 3094429Smckusic chk(db, "data (block)", siz); 3105326Smckusic if (siz == sblock.fs_bsize) 3114429Smckusic nblock++; 3124429Smckusic else 3135326Smckusic nfrag += howmany(siz, sblock.fs_fsize); 3144240Smckusick } 3154410Smckusic for(i = 0; i < NIADDR; i++) { 3164410Smckusic ib = ip->di_ib[i]; 3174410Smckusic if(ib == 0) 3184240Smckusick continue; 3195326Smckusic if (chk(ib, "1st indirect", sblock.fs_bsize)) 3204410Smckusic continue; 3215326Smckusic bread(fsbtodb(&sblock, ib), (char *)ind1, sblock.fs_bsize); 3224240Smckusick nindir++; 3235326Smckusic for (j = 0; j < NINDIR(&sblock); j++) { 3244410Smckusic ib = ind1[j]; 3254410Smckusic if (ib == 0) 3264240Smckusick continue; 3274410Smckusic if (i == 0) { 3285326Smckusic siz = dblksize(&sblock, ip, NDADDR + j); 3294429Smckusic chk(ib, "data (large)", siz); 3305326Smckusic if (siz == sblock.fs_bsize) 3314429Smckusic nblock++; 3324429Smckusic else 3335326Smckusic nfrag += howmany(siz, sblock.fs_fsize); 3344240Smckusick continue; 3354240Smckusick } 3365326Smckusic if (chk(ib, "2nd indirect", sblock.fs_bsize)) 3374410Smckusic continue; 3385326Smckusic bread(fsbtodb(&sblock, ib), (char *)ind2, 3395326Smckusic sblock.fs_bsize); 3404240Smckusick niindir++; 3415326Smckusic for (k = 0; k < NINDIR(&sblock); k++) { 3424410Smckusic ib = ind2[k]; 3434410Smckusic if (ib == 0) 3444240Smckusick continue; 3455326Smckusic siz = dblksize(&sblock, ip, 3465326Smckusic NDADDR + NINDIR(&sblock) * (i + j) + k); 3474429Smckusic chk(ib, "data (huge)", siz); 3485326Smckusic if (siz == sblock.fs_bsize) 3494429Smckusic nblock++; 3504429Smckusic else 3515326Smckusic nfrag += howmany(siz, sblock.fs_fsize); 3524240Smckusick } 3534240Smckusick } 3544240Smckusick } 3554240Smckusick } 3564240Smckusick 3574429Smckusic chk(bno, s, size) 3584410Smckusic daddr_t bno; 3594410Smckusic char *s; 3604429Smckusic int size; 3614240Smckusick { 3624240Smckusick register n, cg; 3635957Smckusic int frags; 3644240Smckusick 3655382Smckusic cg = dtog(&sblock, bno); 3664429Smckusic if (cginit==0 && 3675382Smckusic bno<cgdmin(&sblock, cg) || bno >= sblock.fs_frag * sblock.fs_size) { 3684240Smckusick printf("%ld bad; inode=%u, class=%s\n", bno, ino, s); 3694240Smckusick return(1); 3704240Smckusick } 3715326Smckusic if (size == sblock.fs_bsize) { 3724429Smckusic if (duped(bno, size)) { 3734429Smckusic printf("%ld dup block; inode=%u, class=%s\n", 3744429Smckusic bno, ino, s); 3755326Smckusic ndup += sblock.fs_frag; 3764429Smckusic } 3774429Smckusic } else { 3785957Smckusic frags = numfrags(&sblock, size); 3795957Smckusic for (n = 0; n < frags; n++) { 3805326Smckusic if (duped(bno + n, sblock.fs_fsize)) { 3814429Smckusic printf("%ld dup frag; inode=%u, class=%s\n", 3824429Smckusic bno, ino, s); 3834429Smckusic ndup++; 3844429Smckusic } 3854429Smckusic } 3864240Smckusick } 3874240Smckusick for (n=0; blist[n] != -1; n++) 3884240Smckusick if (bno == blist[n]) 3894240Smckusick printf("%ld arg; inode=%u, class=%s\n", bno, ino, s); 3904240Smckusick return(0); 3914240Smckusick } 3924240Smckusick 3934429Smckusic duped(bno, size) 3944410Smckusic daddr_t bno; 3954429Smckusic int size; 3964240Smckusick { 3974240Smckusick if(dflg) 3984240Smckusick return(0); 3995326Smckusic if (size != sblock.fs_fsize && size != sblock.fs_bsize) 4004429Smckusic printf("bad size %d to duped\n", size); 4015326Smckusic if (size == sblock.fs_fsize) { 4024410Smckusic if (isset(bmap, bno)) 4034410Smckusic return(1); 4044410Smckusic setbit(bmap, bno); 4054410Smckusic return (0); 4064410Smckusic } 4075326Smckusic if (bno % sblock.fs_frag != 0) 4084410Smckusic printf("bad bno %d to duped\n", bno); 4095326Smckusic if (isblock(&sblock, bmap, bno/sblock.fs_frag)) 4104410Smckusic return (1); 4115326Smckusic setblock(&sblock, bmap, bno/sblock.fs_frag); 4124240Smckusick return(0); 4134240Smckusick } 4144240Smckusick 4155098Smckusic makecg() 4165098Smckusic { 4175098Smckusic int c, blk; 4185098Smckusic daddr_t dbase, d, dmin, dmax; 4195098Smckusic long i, j, s; 4205098Smckusic register struct csum *cs; 4215098Smckusic register struct dinode *dp; 4225098Smckusic 4235098Smckusic sblock.fs_cstotal.cs_nbfree = 0; 4245098Smckusic sblock.fs_cstotal.cs_nffree = 0; 4255098Smckusic sblock.fs_cstotal.cs_nifree = 0; 4265098Smckusic sblock.fs_cstotal.cs_ndir = 0; 4275098Smckusic for (c = 0; c < sblock.fs_ncg; c++) { 4285382Smckusic dbase = cgbase(&sblock, c); 4295098Smckusic dmax = dbase + sblock.fs_fpg; 4305410Smckusic if (dmax > sblock.fs_size) { 4315410Smckusic for ( ; dmax >= sblock.fs_size; dmax--) 4325400Smckusic clrbit(cgrp.cg_free, dmax - dbase); 4335410Smckusic dmax++; 4345410Smckusic } 4355400Smckusic dmin = sblock.fs_dblkno; 4365326Smckusic cs = &sblock.fs_cs(&sblock, c); 4375098Smckusic cgrp.cg_time = time(0); 4385098Smckusic cgrp.cg_magic = CG_MAGIC; 4395098Smckusic cgrp.cg_cgx = c; 4405098Smckusic cgrp.cg_ncyl = sblock.fs_cpg; 4415098Smckusic cgrp.cg_niblk = sblock.fs_ipg; 4425098Smckusic cgrp.cg_ndblk = dmax - dbase; 4435098Smckusic cgrp.cg_cs.cs_ndir = 0; 4445098Smckusic cgrp.cg_cs.cs_nffree = 0; 4455098Smckusic cgrp.cg_cs.cs_nbfree = 0; 4465098Smckusic cgrp.cg_cs.cs_nifree = 0; 4475098Smckusic cgrp.cg_rotor = dmin; 4485098Smckusic cgrp.cg_frotor = dmin; 4495098Smckusic cgrp.cg_irotor = 0; 4505326Smckusic for (i = 0; i < sblock.fs_frag; i++) 4515098Smckusic cgrp.cg_frsum[i] = 0; 4525382Smckusic bread(fsbtodb(&sblock, cgimin(&sblock, c)), (char *)itab, 4535098Smckusic sblock.fs_ipg * sizeof(struct dinode)); 4545098Smckusic for (i = 0; i < sblock.fs_ipg; i++) { 4555945Smckusic cgrp.cg_cs.cs_nifree++; 4565945Smckusic clrbit(cgrp.cg_iused, i); 4575098Smckusic dp = &itab[i]; 4585098Smckusic if ((dp->di_mode & IFMT) != 0) { 4595098Smckusic if ((dp->di_mode & IFMT) == IFDIR) 4605098Smckusic cgrp.cg_cs.cs_ndir++; 4615945Smckusic cgrp.cg_cs.cs_nifree--; 4625098Smckusic setbit(cgrp.cg_iused, i); 4635098Smckusic continue; 4645098Smckusic } 4655098Smckusic } 4665098Smckusic while (i < MAXIPG) { 4675098Smckusic clrbit(cgrp.cg_iused, i); 4685098Smckusic i++; 4695098Smckusic } 4705338Smckusic if (c == 0) 4715338Smckusic for (i = 0; i < ROOTINO; i++) { 4725338Smckusic setbit(cgrp.cg_iused, i); 4735338Smckusic cgrp.cg_cs.cs_nifree--; 4745338Smckusic } 4755372Smckusic for (s = 0; s < MAXCPG; s++) { 4765372Smckusic cgrp.cg_btot[s] = 0; 4775098Smckusic for (i = 0; i < NRPOS; i++) 4785098Smckusic cgrp.cg_b[s][i] = 0; 4795372Smckusic } 4805098Smckusic if (c == 0) { 4815326Smckusic dmin += howmany(sblock.fs_cssize, sblock.fs_bsize) * 4825326Smckusic sblock.fs_frag; 4835098Smckusic } 4845098Smckusic for (d = 0; d < dmin; d++) 4855098Smckusic clrbit(cgrp.cg_free, d); 4865326Smckusic for (; (d + sblock.fs_frag) <= dmax - dbase; d += sblock.fs_frag) { 4875098Smckusic j = 0; 4885326Smckusic for (i = 0; i < sblock.fs_frag; i++) { 4895098Smckusic if (!isset(bmap, dbase+d+i)) { 4905098Smckusic setbit(cgrp.cg_free, d+i); 4915098Smckusic j++; 4925098Smckusic } else 4935098Smckusic clrbit(cgrp.cg_free, d+i); 4945098Smckusic } 4955326Smckusic if (j == sblock.fs_frag) { 4965098Smckusic cgrp.cg_cs.cs_nbfree++; 4975372Smckusic cgrp.cg_btot[cbtocylno(&sblock, d)]++; 4985364Smckusic cgrp.cg_b[cbtocylno(&sblock, d)] 4995364Smckusic [cbtorpos(&sblock, d)]++; 5005098Smckusic } else if (j > 0) { 5015098Smckusic cgrp.cg_cs.cs_nffree += j; 5025098Smckusic blk = ((cgrp.cg_free[d / NBBY] >> (d % NBBY)) & 5035326Smckusic (0xff >> (NBBY - sblock.fs_frag))); 5045326Smckusic fragacct(&sblock, blk, cgrp.cg_frsum, 1); 5055098Smckusic } 5065098Smckusic } 5075098Smckusic for (j = d; d < dmax - dbase; d++) { 5085098Smckusic if (!isset(bmap, dbase+d)) { 5095098Smckusic setbit(cgrp.cg_free, d); 5105098Smckusic cgrp.cg_cs.cs_nffree++; 5115098Smckusic } else 5125098Smckusic clrbit(cgrp.cg_free, d); 5135098Smckusic } 5145098Smckusic if (j != d) { 5155098Smckusic blk = ((cgrp.cg_free[j / NBBY] >> (j % NBBY)) & 5165326Smckusic (0xff >> (NBBY - sblock.fs_frag))); 5175326Smckusic fragacct(&sblock, blk, cgrp.cg_frsum, 1); 5185098Smckusic } 5195326Smckusic for (; d < MAXBPG(&sblock); d++) 5205098Smckusic clrbit(cgrp.cg_free, d); 5215098Smckusic sblock.fs_cstotal.cs_nffree += cgrp.cg_cs.cs_nffree; 5225098Smckusic sblock.fs_cstotal.cs_nbfree += cgrp.cg_cs.cs_nbfree; 5235098Smckusic sblock.fs_cstotal.cs_nifree += cgrp.cg_cs.cs_nifree; 5245098Smckusic sblock.fs_cstotal.cs_ndir += cgrp.cg_cs.cs_ndir; 5255098Smckusic *cs = cgrp.cg_cs; 5265382Smckusic bwrite(fsbtodb(&sblock, cgtod(&sblock, c)), &cgrp, 5275326Smckusic sblock.fs_cgsize); 5285098Smckusic } 5295326Smckusic for (i = 0; i < howmany(sblock.fs_cssize, sblock.fs_bsize); i++) { 5305326Smckusic bwrite(fsbtodb(&sblock, 5315326Smckusic sblock.fs_csaddr + (i * sblock.fs_frag)), 5325326Smckusic (char *)sblock.fs_csp[i], sblock.fs_bsize); 5335098Smckusic } 5345098Smckusic sblock.fs_ronly = 0; 5355098Smckusic sblock.fs_fmod = 0; 5365349Smckusic bwrite(SBLOCK, (char *)&sblock, SBSIZE); 5375098Smckusic } 5385098Smckusic 5395098Smckusic /* 5405098Smckusic * update the frsum fields to reflect addition or deletion 5415098Smckusic * of some frags 5425098Smckusic */ 5435326Smckusic fragacct(fs, fragmap, fraglist, cnt) 5445326Smckusic struct fs *fs; 5455098Smckusic int fragmap; 5465098Smckusic long fraglist[]; 5475098Smckusic int cnt; 5485098Smckusic { 5495098Smckusic int inblk; 5505098Smckusic register int field, subfield; 5515098Smckusic register int siz, pos; 5525098Smckusic 5535326Smckusic inblk = (int)(fragtbl[fs->fs_frag][fragmap] << 1); 5545098Smckusic fragmap <<= 1; 5555326Smckusic for (siz = 1; siz < fs->fs_frag; siz++) { 5565098Smckusic if (((1 << siz) & inblk) == 0) 5575098Smckusic continue; 5585098Smckusic field = around[siz]; 5595098Smckusic subfield = inside[siz]; 5605326Smckusic for (pos = siz; pos <= fs->fs_frag; pos++) { 5615098Smckusic if ((fragmap & field) == subfield) { 5625098Smckusic fraglist[siz] += cnt; 5635098Smckusic pos += siz; 5645098Smckusic field <<= siz; 5655098Smckusic subfield <<= siz; 5665098Smckusic } 5675098Smckusic field <<= 1; 5685098Smckusic subfield <<= 1; 5695098Smckusic } 5705098Smckusic } 5715098Smckusic } 5725098Smckusic 5735326Smckusic getsb(fs, file) 5745326Smckusic register struct fs *fs; 5755326Smckusic char *file; 5765326Smckusic { 5775326Smckusic int i; 5785326Smckusic 5795349Smckusic if (bread(SBLOCK, fs, SBSIZE)) { 5805326Smckusic printf("bad super block"); 5815326Smckusic perror(file); 5825326Smckusic nerror |= 04; 5835326Smckusic return; 5845326Smckusic } 5855326Smckusic if (fs->fs_magic != FS_MAGIC) { 5865326Smckusic printf("%s: bad magic number\n", file); 5875326Smckusic nerror |= 04; 5885326Smckusic return; 5895326Smckusic } 5905326Smckusic for (i = 0; i < howmany(fs->fs_cssize, fs->fs_bsize); i++) { 5915326Smckusic fs->fs_csp[i] = (struct csum *)calloc(1, fs->fs_bsize); 5925326Smckusic bread(fsbtodb(fs, fs->fs_csaddr + (i * fs->fs_frag)), 5935326Smckusic (char *)fs->fs_csp[i], fs->fs_bsize); 5945326Smckusic } 5955326Smckusic } 5965326Smckusic 5975098Smckusic bwrite(blk, buf, size) 5985098Smckusic char *buf; 5995098Smckusic daddr_t blk; 6005098Smckusic register size; 6015098Smckusic { 6025326Smckusic if (lseek(fi, blk * DEV_BSIZE, 0) < 0) { 6035098Smckusic perror("FS SEEK"); 6045098Smckusic return(1); 6055098Smckusic } 6065098Smckusic if (write(fi, buf, size) != size) { 6075098Smckusic perror("FS WRITE"); 6085098Smckusic return(1); 6095098Smckusic } 6105326Smckusic return (0); 6115098Smckusic } 6125098Smckusic 6134240Smckusick bread(bno, buf, cnt) 6144410Smckusic daddr_t bno; 6154410Smckusic char *buf; 6164240Smckusick { 6174240Smckusick register i; 6184240Smckusick 6195326Smckusic lseek(fi, bno * DEV_BSIZE, 0); 6204240Smckusick if ((i = read(fi, buf, cnt)) != cnt) { 6215098Smckusic if (sflg) { 6225098Smckusic printf("No Update\n"); 6235098Smckusic sflg = 0; 6245098Smckusic } 6255326Smckusic for(i=0; i<sblock.fs_bsize; i++) 6264240Smckusick buf[i] = 0; 6275326Smckusic return (1); 6284240Smckusick } 6295326Smckusic return (0); 6304240Smckusick } 6315326Smckusic 6325326Smckusic /* 6335326Smckusic * block operations 6345326Smckusic */ 6355326Smckusic 6365326Smckusic isblock(fs, cp, h) 6375326Smckusic struct fs *fs; 6385326Smckusic unsigned char *cp; 6395326Smckusic int h; 6405326Smckusic { 6415326Smckusic unsigned char mask; 6425326Smckusic 6435326Smckusic switch (fs->fs_frag) { 6445326Smckusic case 8: 6455326Smckusic return (cp[h] == 0xff); 6465326Smckusic case 4: 6475326Smckusic mask = 0x0f << ((h & 0x1) << 2); 6485326Smckusic return ((cp[h >> 1] & mask) == mask); 6495326Smckusic case 2: 6505326Smckusic mask = 0x03 << ((h & 0x3) << 1); 6515326Smckusic return ((cp[h >> 2] & mask) == mask); 6525326Smckusic case 1: 6535326Smckusic mask = 0x01 << (h & 0x7); 6545326Smckusic return ((cp[h >> 3] & mask) == mask); 6555326Smckusic default: 6565326Smckusic fprintf(stderr, "isblock bad fs_frag %d\n", fs->fs_frag); 6575326Smckusic return; 6585326Smckusic } 6595326Smckusic } 6605326Smckusic 6615326Smckusic setblock(fs, cp, h) 6625326Smckusic struct fs *fs; 6635326Smckusic unsigned char *cp; 6645326Smckusic int h; 6655326Smckusic { 6665326Smckusic switch (fs->fs_frag) { 6675326Smckusic case 8: 6685326Smckusic cp[h] = 0xff; 6695326Smckusic return; 6705326Smckusic case 4: 6715326Smckusic cp[h >> 1] |= (0x0f << ((h & 0x1) << 2)); 6725326Smckusic return; 6735326Smckusic case 2: 6745326Smckusic cp[h >> 2] |= (0x03 << ((h & 0x3) << 1)); 6755326Smckusic return; 6765326Smckusic case 1: 6775326Smckusic cp[h >> 3] |= (0x01 << (h & 0x7)); 6785326Smckusic return; 6795326Smckusic default: 6805326Smckusic fprintf(stderr, "setblock bad fs_frag %d\n", fs->fs_frag); 6815326Smckusic return; 6825326Smckusic } 6835326Smckusic } 684