pass5.c revision 75557
11558Srgrimes/* 21558Srgrimes * Copyright (c) 1980, 1986, 1993 31558Srgrimes * The Regents of the University of California. All rights reserved. 41558Srgrimes * 51558Srgrimes * Redistribution and use in source and binary forms, with or without 61558Srgrimes * modification, are permitted provided that the following conditions 71558Srgrimes * are met: 81558Srgrimes * 1. Redistributions of source code must retain the above copyright 91558Srgrimes * notice, this list of conditions and the following disclaimer. 101558Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 111558Srgrimes * notice, this list of conditions and the following disclaimer in the 121558Srgrimes * documentation and/or other materials provided with the distribution. 131558Srgrimes * 3. All advertising materials mentioning features or use of this software 141558Srgrimes * must display the following acknowledgement: 151558Srgrimes * This product includes software developed by the University of 161558Srgrimes * California, Berkeley and its contributors. 171558Srgrimes * 4. Neither the name of the University nor the names of its contributors 181558Srgrimes * may be used to endorse or promote products derived from this software 191558Srgrimes * without specific prior written permission. 201558Srgrimes * 211558Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 221558Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 231558Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 241558Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 251558Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 261558Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 271558Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 281558Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 291558Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 301558Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 311558Srgrimes * SUCH DAMAGE. 321558Srgrimes */ 331558Srgrimes 341558Srgrimes#ifndef lint 3541477Sjulian#if 0 3623675Speterstatic const char sccsid[] = "@(#)pass5.c 8.9 (Berkeley) 4/28/95"; 3741477Sjulian#endif 3841477Sjulianstatic const char rcsid[] = 3950476Speter "$FreeBSD: head/sbin/fsck_ffs/pass5.c 75557 2001-04-16 22:22:21Z mckusick $"; 401558Srgrimes#endif /* not lint */ 411558Srgrimes 421558Srgrimes#include <sys/param.h> 4374556Smckusick#include <sys/sysctl.h> 4423675Speter 451558Srgrimes#include <ufs/ufs/dinode.h> 461558Srgrimes#include <ufs/ffs/fs.h> 4723799Sbde 4823675Speter#include <err.h> 491558Srgrimes#include <string.h> 5023675Speter 511558Srgrimes#include "fsck.h" 521558Srgrimes 5374556Smckusickstatic void check_maps __P((u_char *, u_char *, int, int, char *, int *, 5474556Smckusick int, int)); 5574556Smckusick 567585Sbdevoid 571558Srgrimespass5() 581558Srgrimes{ 5941474Sjulian int c, blk, frags, basesize, sumsize, mapsize, savednrpos = 0; 6074556Smckusick int inomapsize, blkmapsize; 6123675Speter struct fs *fs = &sblock; 6223675Speter struct cg *cg = &cgrp; 6374556Smckusick ufs_daddr_t dbase, dmax, d; 6474556Smckusick int i, j, excessdirs; 651558Srgrimes struct csum *cs; 661558Srgrimes struct csum cstotal; 671558Srgrimes struct inodesc idesc[3]; 681558Srgrimes char buf[MAXBSIZE]; 691558Srgrimes register struct cg *newcg = (struct cg *)buf; 701558Srgrimes struct ocg *ocg = (struct ocg *)buf; 711558Srgrimes 7241474Sjulian inoinfo(WINO)->ino_state = USTATE; 7323675Speter memset(newcg, 0, (size_t)fs->fs_cgsize); 741558Srgrimes newcg->cg_niblk = fs->fs_ipg; 7523675Speter if (cvtlevel >= 3) { 761558Srgrimes if (fs->fs_maxcontig < 2 && fs->fs_contigsumsize > 0) { 771558Srgrimes if (preen) 781558Srgrimes pwarn("DELETING CLUSTERING MAPS\n"); 791558Srgrimes if (preen || reply("DELETE CLUSTERING MAPS")) { 801558Srgrimes fs->fs_contigsumsize = 0; 811558Srgrimes doinglevel1 = 1; 821558Srgrimes sbdirty(); 831558Srgrimes } 841558Srgrimes } 851558Srgrimes if (fs->fs_maxcontig > 1) { 861558Srgrimes char *doit = 0; 871558Srgrimes 881558Srgrimes if (fs->fs_contigsumsize < 1) { 891558Srgrimes doit = "CREAT"; 901558Srgrimes } else if (fs->fs_contigsumsize < fs->fs_maxcontig && 911558Srgrimes fs->fs_contigsumsize < FS_MAXCONTIG) { 921558Srgrimes doit = "EXPAND"; 931558Srgrimes } 941558Srgrimes if (doit) { 951558Srgrimes i = fs->fs_contigsumsize; 961558Srgrimes fs->fs_contigsumsize = 971558Srgrimes MIN(fs->fs_maxcontig, FS_MAXCONTIG); 9874556Smckusick if (CGSIZE(fs) > (u_int)fs->fs_bsize) { 991558Srgrimes pwarn("CANNOT %s CLUSTER MAPS\n", doit); 1001558Srgrimes fs->fs_contigsumsize = i; 1011558Srgrimes } else if (preen || 1021558Srgrimes reply("CREATE CLUSTER MAPS")) { 1031558Srgrimes if (preen) 1041558Srgrimes pwarn("%sING CLUSTER MAPS\n", 1051558Srgrimes doit); 1061558Srgrimes fs->fs_cgsize = 1071558Srgrimes fragroundup(fs, CGSIZE(fs)); 1081558Srgrimes doinglevel1 = 1; 1091558Srgrimes sbdirty(); 1101558Srgrimes } 1111558Srgrimes } 1121558Srgrimes } 1131558Srgrimes } 1141558Srgrimes switch ((int)fs->fs_postblformat) { 1151558Srgrimes 1161558Srgrimes case FS_42POSTBLFMT: 11723675Speter basesize = (char *)(&ocg->cg_btot[0]) - 11823675Speter (char *)(&ocg->cg_firstfield); 11923675Speter sumsize = &ocg->cg_iused[0] - (u_int8_t *)(&ocg->cg_btot[0]); 1201558Srgrimes mapsize = &ocg->cg_free[howmany(fs->fs_fpg, NBBY)] - 1211558Srgrimes (u_char *)&ocg->cg_iused[0]; 12234266Sjulian blkmapsize = howmany(fs->fs_fpg, NBBY); 12334266Sjulian inomapsize = &ocg->cg_free[0] - (u_char *)&ocg->cg_iused[0]; 1241558Srgrimes ocg->cg_magic = CG_MAGIC; 1251558Srgrimes savednrpos = fs->fs_nrpos; 1261558Srgrimes fs->fs_nrpos = 8; 1271558Srgrimes break; 1281558Srgrimes 1291558Srgrimes case FS_DYNAMICPOSTBLFMT: 1301558Srgrimes newcg->cg_btotoff = 13123675Speter &newcg->cg_space[0] - (u_char *)(&newcg->cg_firstfield); 1321558Srgrimes newcg->cg_boff = 13338328Sdfr newcg->cg_btotoff + fs->fs_cpg * sizeof(int32_t); 1348871Srgrimes newcg->cg_iusedoff = newcg->cg_boff + 13538328Sdfr fs->fs_cpg * fs->fs_nrpos * sizeof(u_int16_t); 1361558Srgrimes newcg->cg_freeoff = 1371558Srgrimes newcg->cg_iusedoff + howmany(fs->fs_ipg, NBBY); 13834266Sjulian inomapsize = newcg->cg_freeoff - newcg->cg_iusedoff; 13934266Sjulian newcg->cg_nextfreeoff = newcg->cg_freeoff + 14034266Sjulian howmany(fs->fs_cpg * fs->fs_spc / NSPF(fs), NBBY); 14134266Sjulian blkmapsize = newcg->cg_nextfreeoff - newcg->cg_freeoff; 14234266Sjulian if (fs->fs_contigsumsize > 0) { 14334266Sjulian newcg->cg_clustersumoff = newcg->cg_nextfreeoff - 14438328Sdfr sizeof(u_int32_t); 1451558Srgrimes newcg->cg_clustersumoff = 14638328Sdfr roundup(newcg->cg_clustersumoff, sizeof(u_int32_t)); 1471558Srgrimes newcg->cg_clusteroff = newcg->cg_clustersumoff + 14838328Sdfr (fs->fs_contigsumsize + 1) * sizeof(u_int32_t); 1491558Srgrimes newcg->cg_nextfreeoff = newcg->cg_clusteroff + 1501558Srgrimes howmany(fs->fs_cpg * fs->fs_spc / NSPB(fs), NBBY); 1511558Srgrimes } 1521558Srgrimes newcg->cg_magic = CG_MAGIC; 15323675Speter basesize = &newcg->cg_space[0] - 15423675Speter (u_char *)(&newcg->cg_firstfield); 1551558Srgrimes sumsize = newcg->cg_iusedoff - newcg->cg_btotoff; 1561558Srgrimes mapsize = newcg->cg_nextfreeoff - newcg->cg_iusedoff; 1571558Srgrimes break; 1581558Srgrimes 1591558Srgrimes default: 16034266Sjulian inomapsize = blkmapsize = sumsize = 0; /* keep lint happy */ 16123675Speter errx(EEXIT, "UNKNOWN ROTATIONAL TABLE FORMAT %d", 1621558Srgrimes fs->fs_postblformat); 1631558Srgrimes } 16423675Speter memset(&idesc[0], 0, sizeof idesc); 1651558Srgrimes for (i = 0; i < 3; i++) { 1661558Srgrimes idesc[i].id_type = ADDR; 1671558Srgrimes if (doinglevel2) 1681558Srgrimes idesc[i].id_fix = FIX; 1691558Srgrimes } 17023675Speter memset(&cstotal, 0, sizeof(struct csum)); 1711558Srgrimes j = blknum(fs, fs->fs_size + fs->fs_frag - 1); 1721558Srgrimes for (i = fs->fs_size; i < j; i++) 1731558Srgrimes setbmap(i); 1741558Srgrimes for (c = 0; c < fs->fs_ncg; c++) { 17570050Siedowse if (got_siginfo) { 17670050Siedowse printf("%s: phase 5: cyl group %d of %d (%d%%)\n", 17770050Siedowse cdevname, c, sblock.fs_ncg, 17870050Siedowse c * 100 / sblock.fs_ncg); 17970050Siedowse got_siginfo = 0; 18070050Siedowse } 1811558Srgrimes getblk(&cgblk, cgtod(fs, c), fs->fs_cgsize); 1821558Srgrimes if (!cg_chkmagic(cg)) 1831558Srgrimes pfatal("CG %d: BAD MAGIC NUMBER\n", c); 1841558Srgrimes dbase = cgbase(fs, c); 1851558Srgrimes dmax = dbase + fs->fs_fpg; 1861558Srgrimes if (dmax > fs->fs_size) 1871558Srgrimes dmax = fs->fs_size; 1881558Srgrimes newcg->cg_time = cg->cg_time; 1891558Srgrimes newcg->cg_cgx = c; 1901558Srgrimes if (c == fs->fs_ncg - 1) 1911558Srgrimes newcg->cg_ncyl = fs->fs_ncyl % fs->fs_cpg; 1921558Srgrimes else 1931558Srgrimes newcg->cg_ncyl = fs->fs_cpg; 1941558Srgrimes newcg->cg_ndblk = dmax - dbase; 1951558Srgrimes if (fs->fs_contigsumsize > 0) 1961558Srgrimes newcg->cg_nclusterblks = newcg->cg_ndblk / fs->fs_frag; 1971558Srgrimes newcg->cg_cs.cs_ndir = 0; 1981558Srgrimes newcg->cg_cs.cs_nffree = 0; 1991558Srgrimes newcg->cg_cs.cs_nbfree = 0; 2001558Srgrimes newcg->cg_cs.cs_nifree = fs->fs_ipg; 2011558Srgrimes if (cg->cg_rotor < newcg->cg_ndblk) 2021558Srgrimes newcg->cg_rotor = cg->cg_rotor; 2031558Srgrimes else 2041558Srgrimes newcg->cg_rotor = 0; 2051558Srgrimes if (cg->cg_frotor < newcg->cg_ndblk) 2061558Srgrimes newcg->cg_frotor = cg->cg_frotor; 2071558Srgrimes else 2081558Srgrimes newcg->cg_frotor = 0; 20975047Smckusick if (cg->cg_irotor < fs->fs_ipg) 2101558Srgrimes newcg->cg_irotor = cg->cg_irotor; 2111558Srgrimes else 2121558Srgrimes newcg->cg_irotor = 0; 21323675Speter memset(&newcg->cg_frsum[0], 0, sizeof newcg->cg_frsum); 21423675Speter memset(&cg_blktot(newcg)[0], 0, 2151558Srgrimes (size_t)(sumsize + mapsize)); 2161558Srgrimes if (fs->fs_postblformat == FS_42POSTBLFMT) 2171558Srgrimes ocg->cg_magic = CG_MAGIC; 2181558Srgrimes j = fs->fs_ipg * c; 21941474Sjulian for (i = 0; i < inostathead[c].il_numalloced; j++, i++) { 22041474Sjulian switch (inoinfo(j)->ino_state) { 2211558Srgrimes 2221558Srgrimes case USTATE: 2231558Srgrimes break; 2241558Srgrimes 2251558Srgrimes case DSTATE: 2261558Srgrimes case DCLEAR: 2271558Srgrimes case DFOUND: 2281558Srgrimes newcg->cg_cs.cs_ndir++; 2291558Srgrimes /* fall through */ 2301558Srgrimes 2311558Srgrimes case FSTATE: 2321558Srgrimes case FCLEAR: 2331558Srgrimes newcg->cg_cs.cs_nifree--; 2341558Srgrimes setbit(cg_inosused(newcg), i); 2351558Srgrimes break; 2361558Srgrimes 2371558Srgrimes default: 23874556Smckusick if (j < (int)ROOTINO) 2391558Srgrimes break; 24037236Sbde errx(EEXIT, "BAD STATE %d FOR INODE I=%ld", 24141474Sjulian inoinfo(j)->ino_state, j); 2421558Srgrimes } 2431558Srgrimes } 2441558Srgrimes if (c == 0) 24574556Smckusick for (i = 0; i < (int)ROOTINO; i++) { 2461558Srgrimes setbit(cg_inosused(newcg), i); 2471558Srgrimes newcg->cg_cs.cs_nifree--; 2481558Srgrimes } 2491558Srgrimes for (i = 0, d = dbase; 2501558Srgrimes d < dmax; 2511558Srgrimes d += fs->fs_frag, i += fs->fs_frag) { 2521558Srgrimes frags = 0; 2531558Srgrimes for (j = 0; j < fs->fs_frag; j++) { 2541558Srgrimes if (testbmap(d + j)) 2551558Srgrimes continue; 2561558Srgrimes setbit(cg_blksfree(newcg), i + j); 2571558Srgrimes frags++; 2581558Srgrimes } 2591558Srgrimes if (frags == fs->fs_frag) { 2601558Srgrimes newcg->cg_cs.cs_nbfree++; 2611558Srgrimes j = cbtocylno(fs, i); 2621558Srgrimes cg_blktot(newcg)[j]++; 2631558Srgrimes cg_blks(fs, newcg, j)[cbtorpos(fs, i)]++; 2641558Srgrimes if (fs->fs_contigsumsize > 0) 2651558Srgrimes setbit(cg_clustersfree(newcg), 2661558Srgrimes i / fs->fs_frag); 2671558Srgrimes } else if (frags > 0) { 2681558Srgrimes newcg->cg_cs.cs_nffree += frags; 2691558Srgrimes blk = blkmap(fs, cg_blksfree(newcg), i); 2701558Srgrimes ffs_fragacct(fs, blk, newcg->cg_frsum, 1); 2711558Srgrimes } 2721558Srgrimes } 2731558Srgrimes if (fs->fs_contigsumsize > 0) { 27423675Speter int32_t *sump = cg_clustersum(newcg); 2751558Srgrimes u_char *mapp = cg_clustersfree(newcg); 2761558Srgrimes int map = *mapp++; 2771558Srgrimes int bit = 1; 2781558Srgrimes int run = 0; 2791558Srgrimes 2801558Srgrimes for (i = 0; i < newcg->cg_nclusterblks; i++) { 2811558Srgrimes if ((map & bit) != 0) { 2821558Srgrimes run++; 2831558Srgrimes } else if (run != 0) { 2841558Srgrimes if (run > fs->fs_contigsumsize) 2851558Srgrimes run = fs->fs_contigsumsize; 2861558Srgrimes sump[run]++; 2871558Srgrimes run = 0; 2881558Srgrimes } 2891558Srgrimes if ((i & (NBBY - 1)) != (NBBY - 1)) { 2901558Srgrimes bit <<= 1; 2911558Srgrimes } else { 2921558Srgrimes map = *mapp++; 2931558Srgrimes bit = 1; 2941558Srgrimes } 2951558Srgrimes } 2961558Srgrimes if (run != 0) { 2971558Srgrimes if (run > fs->fs_contigsumsize) 2981558Srgrimes run = fs->fs_contigsumsize; 2991558Srgrimes sump[run]++; 3001558Srgrimes } 3011558Srgrimes } 3021558Srgrimes cstotal.cs_nffree += newcg->cg_cs.cs_nffree; 3031558Srgrimes cstotal.cs_nbfree += newcg->cg_cs.cs_nbfree; 3041558Srgrimes cstotal.cs_nifree += newcg->cg_cs.cs_nifree; 3051558Srgrimes cstotal.cs_ndir += newcg->cg_cs.cs_ndir; 3061558Srgrimes cs = &fs->fs_cs(fs, c); 30774556Smckusick if (cursnapshot == 0 && 30874556Smckusick memcmp(&newcg->cg_cs, cs, sizeof *cs) != 0 && 3091558Srgrimes dofix(&idesc[0], "FREE BLK COUNT(S) WRONG IN SUPERBLK")) { 31023675Speter memmove(cs, &newcg->cg_cs, sizeof *cs); 3111558Srgrimes sbdirty(); 3121558Srgrimes } 3131558Srgrimes if (doinglevel1) { 31423675Speter memmove(cg, newcg, (size_t)fs->fs_cgsize); 3151558Srgrimes cgdirty(); 3161558Srgrimes continue; 3171558Srgrimes } 31874556Smckusick if (cursnapshot == 0 && 31974556Smckusick (memcmp(newcg, cg, basesize) != 0 || 32023675Speter memcmp(&cg_blktot(newcg)[0], 32123675Speter &cg_blktot(cg)[0], sumsize) != 0) && 3221558Srgrimes dofix(&idesc[2], "SUMMARY INFORMATION BAD")) { 32323675Speter memmove(cg, newcg, (size_t)basesize); 32423675Speter memmove(&cg_blktot(cg)[0], 32523675Speter &cg_blktot(newcg)[0], (size_t)sumsize); 3261558Srgrimes cgdirty(); 3271558Srgrimes } 32874556Smckusick if (bkgrdflag != 0 || usedsoftdep || debug) { 32974556Smckusick excessdirs = cg->cg_cs.cs_ndir - newcg->cg_cs.cs_ndir; 33074556Smckusick if (excessdirs < 0) { 33174556Smckusick pfatal("LOST %d DIRECTORIES\n", -excessdirs); 33274556Smckusick excessdirs = 0; 33362668Smckusick } 33474556Smckusick if (excessdirs > 0) 33574556Smckusick check_maps(cg_inosused(newcg), cg_inosused(cg), 33674556Smckusick inomapsize, cg->cg_cgx * fs->fs_ipg, "DIR", 33774556Smckusick freedirs, 0, excessdirs); 33874556Smckusick check_maps(cg_inosused(newcg), cg_inosused(cg), 33974556Smckusick inomapsize, cg->cg_cgx * fs->fs_ipg, "FILE", 34074556Smckusick freefiles, excessdirs, fs->fs_ipg); 34174556Smckusick check_maps(cg_blksfree(cg), cg_blksfree(newcg), 34274556Smckusick blkmapsize, cg->cg_cgx * fs->fs_fpg, "FRAG", 34374556Smckusick freeblks, 0, fs->fs_fpg); 34462668Smckusick } 34574556Smckusick if (cursnapshot == 0 && 34674556Smckusick memcmp(cg_inosused(newcg), cg_inosused(cg), mapsize) != 0 && 34734266Sjulian dofix(&idesc[1], "BLK(S) MISSING IN BIT MAPS")) { 34834266Sjulian memmove(cg_inosused(cg), cg_inosused(newcg), 34934266Sjulian (size_t)mapsize); 35034266Sjulian cgdirty(); 35134266Sjulian } 3521558Srgrimes } 3531558Srgrimes if (fs->fs_postblformat == FS_42POSTBLFMT) 3541558Srgrimes fs->fs_nrpos = savednrpos; 35574556Smckusick if (cursnapshot == 0 && 35674556Smckusick memcmp(&cstotal, &fs->fs_cstotal, sizeof *cs) != 0 3571558Srgrimes && dofix(&idesc[0], "FREE BLK COUNT(S) WRONG IN SUPERBLK")) { 35823675Speter memmove(&fs->fs_cstotal, &cstotal, sizeof *cs); 3591558Srgrimes fs->fs_ronly = 0; 36041474Sjulian fs->fs_fmod = 0; 3611558Srgrimes sbdirty(); 3621558Srgrimes } 3631558Srgrimes} 36474556Smckusick 36574556Smckusickstatic void 36674556Smckusickcheck_maps(map1, map2, mapsize, startvalue, name, opcode, skip, limit) 36774556Smckusick u_char *map1; /* map of claimed allocations */ 36874556Smckusick u_char *map2; /* map of determined allocations */ 36974556Smckusick int mapsize; /* size of above two maps */ 37074556Smckusick int startvalue; /* resource value for first element in map */ 37174556Smckusick char *name; /* name of resource found in maps */ 37274556Smckusick int *opcode; /* sysctl opcode to free resource */ 37374556Smckusick int skip; /* number of entries to skip before starting to free */ 37474556Smckusick int limit; /* limit on number of entries to free */ 37574556Smckusick{ 37674556Smckusick# define BUFSIZE 16 37774556Smckusick char buf[BUFSIZE]; 37874556Smckusick long i, j, k, l, m, n, size; 37974556Smckusick int astart, aend, ustart, uend; 38075557Smckusick void (*msg) __P((const char *fmt, ...)); 38174556Smckusick 38275557Smckusick if (bkgrdflag) 38375557Smckusick msg = pfatal; 38475557Smckusick else 38575557Smckusick msg = pwarn; 38674556Smckusick astart = ustart = aend = uend = -1; 38774556Smckusick for (i = 0; i < mapsize; i++) { 38874556Smckusick j = *map1++; 38974556Smckusick k = *map2++; 39074556Smckusick if (j == k) 39174556Smckusick continue; 39274556Smckusick for (m = 0, l = 1; m < NBBY; m++, l <<= 1) { 39374556Smckusick if ((j & l) == (k & l)) 39474556Smckusick continue; 39574556Smckusick n = startvalue + i * NBBY + m; 39674556Smckusick if ((j & l) != 0) { 39774556Smckusick if (astart == -1) { 39874556Smckusick astart = aend = n; 39974556Smckusick continue; 40074556Smckusick } 40174556Smckusick if (aend + 1 == n) { 40274556Smckusick aend = n; 40374556Smckusick continue; 40474556Smckusick } 40574556Smckusick if (astart == aend) 40675557Smckusick (*msg)("ALLOCATED %s %d MARKED FREE\n", 40774556Smckusick name, astart); 40874556Smckusick else 40975557Smckusick (*msg)("%s %sS %d-%d MARKED FREE\n", 41074556Smckusick "ALLOCATED", name, astart, aend); 41174556Smckusick astart = aend = n; 41274556Smckusick } else { 41374556Smckusick if (ustart == -1) { 41474556Smckusick ustart = uend = n; 41574556Smckusick continue; 41674556Smckusick } 41774556Smckusick if (uend + 1 == n) { 41874556Smckusick uend = n; 41974556Smckusick continue; 42074556Smckusick } 42174556Smckusick size = uend - ustart + 1; 42274556Smckusick if (size <= skip) { 42374556Smckusick skip -= size; 42474556Smckusick ustart = uend = n; 42574556Smckusick continue; 42674556Smckusick } 42774556Smckusick if (skip > 0) { 42874556Smckusick ustart += skip; 42974556Smckusick size -= skip; 43074556Smckusick skip = 0; 43174556Smckusick } 43274556Smckusick if (size > limit) 43374556Smckusick size = limit; 43474556Smckusick if (debug && size == 1) 43574556Smckusick pwarn("%s %s %d MARKED USED\n", 43674556Smckusick "UNALLOCATED", name, ustart); 43774556Smckusick else if (debug) 43874556Smckusick pwarn("%s %sS %d-%d MARKED USED\n", 43974556Smckusick "UNALLOCATED", name, ustart, 44074556Smckusick ustart + size - 1); 44174556Smckusick if (bkgrdflag != 0) { 44274556Smckusick cmd.value = ustart; 44374556Smckusick cmd.size = size; 44474556Smckusick if (sysctl(opcode, MIBSIZE, 0, 0, 44574556Smckusick &cmd, sizeof cmd) == -1) { 44674556Smckusick snprintf(buf, BUFSIZE, 44774556Smckusick "FREE %s", name); 44874556Smckusick rwerror(buf, cmd.value); 44974556Smckusick } 45074556Smckusick } 45174556Smckusick limit -= size; 45274556Smckusick if (limit <= 0) 45374556Smckusick return; 45474556Smckusick ustart = uend = n; 45574556Smckusick } 45674556Smckusick } 45774556Smckusick } 45874556Smckusick if (astart != -1) 45974556Smckusick if (astart == aend) 46075557Smckusick (*msg)("ALLOCATED %s %d MARKED FREE\n", name, astart); 46174556Smckusick else 46275557Smckusick (*msg)("ALLOCATED %sS %d-%d MARKED FREE\n", 46374556Smckusick name, astart, aend); 46474556Smckusick if (ustart != -1) { 46574556Smckusick size = uend - ustart + 1; 46674556Smckusick if (size <= skip) 46774556Smckusick return; 46874556Smckusick if (skip > 0) { 46974556Smckusick ustart += skip; 47074556Smckusick size -= skip; 47174556Smckusick } 47274556Smckusick if (size > limit) 47374556Smckusick size = limit; 47474556Smckusick if (debug) { 47574556Smckusick if (size == 1) 47674556Smckusick pwarn("UNALLOCATED %s %d MARKED USED\n", 47774556Smckusick name, ustart); 47874556Smckusick else 47974556Smckusick pwarn("UNALLOCATED %sS %d-%d MARKED USED\n", 48074556Smckusick name, ustart, ustart + size - 1); 48174556Smckusick } 48274556Smckusick if (bkgrdflag != 0) { 48374556Smckusick cmd.value = ustart; 48474556Smckusick cmd.size = size; 48574556Smckusick if (sysctl(opcode, MIBSIZE, 0, 0, &cmd, 48674556Smckusick sizeof cmd) == -1) { 48774556Smckusick snprintf(buf, BUFSIZE, "FREE %s", name); 48874556Smckusick rwerror(buf, cmd.value); 48974556Smckusick } 49074556Smckusick } 49174556Smckusick } 49274556Smckusick} 493