dumpfs.c revision 216798
11558Srgrimes/* 2187814Srwatson * Copyright (c) 2009 Robert N. M. Watson 3187814Srwatson * All rights reserved. 4187814Srwatson * 5187814Srwatson * This software was developed at the University of Cambridge Computer 6187814Srwatson * Laboratory with support from a grant from Google, Inc. 7187814Srwatson * 898542Smckusick * Copyright (c) 2002 Networks Associates Technology, Inc. 998542Smckusick * All rights reserved. 1098542Smckusick * 1198542Smckusick * This software was developed for the FreeBSD Project by Marshall 1298542Smckusick * Kirk McKusick and Network Associates Laboratories, the Security 1398542Smckusick * Research Division of Network Associates, Inc. under DARPA/SPAWAR 1498542Smckusick * contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA CHATS 15110884Smckusick * research program. 1698542Smckusick * 171558Srgrimes * Copyright (c) 1983, 1992, 1993 181558Srgrimes * The Regents of the University of California. All rights reserved. 191558Srgrimes * 201558Srgrimes * Redistribution and use in source and binary forms, with or without 211558Srgrimes * modification, are permitted provided that the following conditions 221558Srgrimes * are met: 231558Srgrimes * 1. Redistributions of source code must retain the above copyright 241558Srgrimes * notice, this list of conditions and the following disclaimer. 251558Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 261558Srgrimes * notice, this list of conditions and the following disclaimer in the 271558Srgrimes * documentation and/or other materials provided with the distribution. 281558Srgrimes * 4. Neither the name of the University nor the names of its contributors 291558Srgrimes * may be used to endorse or promote products derived from this software 301558Srgrimes * without specific prior written permission. 311558Srgrimes * 321558Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 331558Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 341558Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 351558Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 361558Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 371558Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 381558Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 391558Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 401558Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 411558Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 421558Srgrimes * SUCH DAMAGE. 431558Srgrimes */ 441558Srgrimes 451558Srgrimes#ifndef lint 4636998Scharnierstatic const char copyright[] = 471558Srgrimes"@(#) Copyright (c) 1983, 1992, 1993\n\ 481558Srgrimes The Regents of the University of California. All rights reserved.\n"; 491558Srgrimes#endif /* not lint */ 501558Srgrimes 511558Srgrimes#ifndef lint 5236998Scharnier#if 0 5323673Speterstatic char sccsid[] = "@(#)dumpfs.c 8.5 (Berkeley) 4/29/95"; 5436998Scharnier#endif 5536998Scharnierstatic const char rcsid[] = 5650476Speter "$FreeBSD: head/sbin/dumpfs/dumpfs.c 216798 2010-12-29 12:31:18Z kib $"; 571558Srgrimes#endif /* not lint */ 581558Srgrimes 591558Srgrimes#include <sys/param.h> 601558Srgrimes#include <sys/time.h> 6196478Sphk#include <sys/disklabel.h> 621558Srgrimes 6398542Smckusick#include <ufs/ufs/dinode.h> 641558Srgrimes#include <ufs/ffs/fs.h> 651558Srgrimes 6623673Speter#include <err.h> 67105741Sjmallett#include <errno.h> 681558Srgrimes#include <fcntl.h> 691558Srgrimes#include <fstab.h> 7099826Sjmallett#include <libufs.h> 71109525Sjmallett#include <stdint.h> 721558Srgrimes#include <stdio.h> 731558Srgrimes#include <stdlib.h> 7423673Speter#include <unistd.h> 751558Srgrimes 7699826Sjmallett#define afs disk.d_fs 77109510Sjmallett#define acg disk.d_cg 781558Srgrimes 7999826Sjmallettstruct uufsd disk; 801558Srgrimes 8192839Simpint dumpfs(const char *); 82109519Sjmallettint dumpcg(void); 83187814Srwatsonint dumpfreespace(const char *, int); 84187814Srwatsonvoid dumpfreespacecg(int); 85109525Sjmallettint marshal(const char *); 8692839Simpvoid pbits(void *, int); 87187814Srwatsonvoid pblklist(void *, int, off_t, int); 88109525Sjmallettvoid ufserr(const char *); 8992839Simpvoid usage(void) __dead2; 901558Srgrimes 911558Srgrimesint 9292839Simpmain(int argc, char *argv[]) 931558Srgrimes{ 94109525Sjmallett const char *name; 95187814Srwatson int ch, dofreespace, domarshal, eval; 961558Srgrimes 97187814Srwatson dofreespace = domarshal = eval = 0; 98109507Sjmallett 99187814Srwatson while ((ch = getopt(argc, argv, "fm")) != -1) { 100109525Sjmallett switch (ch) { 101187814Srwatson case 'f': 102187814Srwatson dofreespace++; 103187814Srwatson break; 104109525Sjmallett case 'm': 105109525Sjmallett domarshal = 1; 106109525Sjmallett break; 107109525Sjmallett case '?': 108109525Sjmallett default: 109109525Sjmallett usage(); 110109525Sjmallett } 111109525Sjmallett } 1121558Srgrimes argc -= optind; 1131558Srgrimes argv += optind; 1141558Srgrimes 1151558Srgrimes if (argc < 1) 1161558Srgrimes usage(); 117187814Srwatson if (dofreespace && domarshal) 118187814Srwatson usage(); 119187814Srwatson if (dofreespace > 2) 120187814Srwatson usage(); 1211558Srgrimes 122109525Sjmallett while ((name = *argv++) != NULL) { 123109525Sjmallett if (ufs_disk_fillout(&disk, name) == -1) { 124109525Sjmallett ufserr(name); 125109525Sjmallett eval |= 1; 126109525Sjmallett continue; 127109525Sjmallett } 128187814Srwatson if (dofreespace) 129187814Srwatson eval |= dumpfreespace(name, dofreespace); 130187814Srwatson else if (domarshal) 131109525Sjmallett eval |= marshal(name); 132109525Sjmallett else 133109525Sjmallett eval |= dumpfs(name); 134109525Sjmallett ufs_disk_close(&disk); 135109525Sjmallett } 1361558Srgrimes exit(eval); 1371558Srgrimes} 1381558Srgrimes 1391558Srgrimesint 14092839Simpdumpfs(const char *name) 1411558Srgrimes{ 142109532Sjmallett time_t fstime; 14398542Smckusick int64_t fssize; 144109767Snjl int32_t fsflags; 14599827Sjmallett int i; 1461558Srgrimes 147101688Sjmallett switch (disk.d_ufs) { 148101688Sjmallett case 2: 14998542Smckusick fssize = afs.fs_size; 150109532Sjmallett fstime = afs.fs_time; 15198542Smckusick printf("magic\t%x (UFS2)\ttime\t%s", 152109532Sjmallett afs.fs_magic, ctime(&fstime)); 153122670Sjohan printf("superblock location\t%jd\tid\t[ %x %x ]\n", 154122670Sjohan (intmax_t)afs.fs_sblockloc, afs.fs_id[0], afs.fs_id[1]); 155122670Sjohan printf("ncg\t%d\tsize\t%jd\tblocks\t%jd\n", 156122670Sjohan afs.fs_ncg, (intmax_t)fssize, (intmax_t)afs.fs_dsize); 157101688Sjmallett break; 158101688Sjmallett case 1: 15998542Smckusick fssize = afs.fs_old_size; 160109532Sjmallett fstime = afs.fs_old_time; 16198542Smckusick printf("magic\t%x (UFS1)\ttime\t%s", 162109532Sjmallett afs.fs_magic, ctime(&fstime)); 163201647Sgavin printf("id\t[ %08x %08x ]\n", afs.fs_id[0], afs.fs_id[1]); 164122670Sjohan printf("ncg\t%d\tsize\t%jd\tblocks\t%jd\n", 165122670Sjohan afs.fs_ncg, (intmax_t)fssize, (intmax_t)afs.fs_dsize); 166101688Sjmallett break; 167101688Sjmallett default: 168109532Sjmallett goto err; 16998542Smckusick } 1701558Srgrimes printf("bsize\t%d\tshift\t%d\tmask\t0x%08x\n", 1711558Srgrimes afs.fs_bsize, afs.fs_bshift, afs.fs_bmask); 1721558Srgrimes printf("fsize\t%d\tshift\t%d\tmask\t0x%08x\n", 1731558Srgrimes afs.fs_fsize, afs.fs_fshift, afs.fs_fmask); 1741558Srgrimes printf("frag\t%d\tshift\t%d\tfsbtodb\t%d\n", 1751558Srgrimes afs.fs_frag, afs.fs_fragshift, afs.fs_fsbtodb); 17698542Smckusick printf("minfree\t%d%%\toptim\t%s\tsymlinklen %d\n", 1771558Srgrimes afs.fs_minfree, afs.fs_optim == FS_OPTSPACE ? "space" : "time", 17898542Smckusick afs.fs_maxsymlinklen); 179101688Sjmallett switch (disk.d_ufs) { 180101688Sjmallett case 2: 18198542Smckusick printf("%s %d\tmaxbpg\t%d\tmaxcontig %d\tcontigsumsize %d\n", 18298542Smckusick "maxbsize", afs.fs_maxbsize, afs.fs_maxbpg, 18398542Smckusick afs.fs_maxcontig, afs.fs_contigsumsize); 184122670Sjohan printf("nbfree\t%jd\tndir\t%jd\tnifree\t%jd\tnffree\t%jd\n", 185122670Sjohan (intmax_t)afs.fs_cstotal.cs_nbfree, 186122670Sjohan (intmax_t)afs.fs_cstotal.cs_ndir, 187122670Sjohan (intmax_t)afs.fs_cstotal.cs_nifree, 188122670Sjohan (intmax_t)afs.fs_cstotal.cs_nffree); 189163844Spjd printf("bpg\t%d\tfpg\t%d\tipg\t%d\tunrefs\t%jd\n", 190163844Spjd afs.fs_fpg / afs.fs_frag, afs.fs_fpg, afs.fs_ipg, 191163844Spjd (intmax_t)afs.fs_unrefs); 192122670Sjohan printf("nindir\t%d\tinopb\t%d\tmaxfilesize\t%ju\n", 193122670Sjohan afs.fs_nindir, afs.fs_inopb, 194122670Sjohan (uintmax_t)afs.fs_maxfilesize); 195109532Sjmallett printf("sbsize\t%d\tcgsize\t%d\tcsaddr\t%jd\tcssize\t%d\n", 196109532Sjmallett afs.fs_sbsize, afs.fs_cgsize, (intmax_t)afs.fs_csaddr, 197109532Sjmallett afs.fs_cssize); 198101688Sjmallett break; 199101688Sjmallett case 1: 20098542Smckusick printf("maxbpg\t%d\tmaxcontig %d\tcontigsumsize %d\n", 20198542Smckusick afs.fs_maxbpg, afs.fs_maxcontig, afs.fs_contigsumsize); 20298542Smckusick printf("nbfree\t%d\tndir\t%d\tnifree\t%d\tnffree\t%d\n", 20398542Smckusick afs.fs_old_cstotal.cs_nbfree, afs.fs_old_cstotal.cs_ndir, 20498542Smckusick afs.fs_old_cstotal.cs_nifree, afs.fs_old_cstotal.cs_nffree); 20598542Smckusick printf("cpg\t%d\tbpg\t%d\tfpg\t%d\tipg\t%d\n", 20698542Smckusick afs.fs_old_cpg, afs.fs_fpg / afs.fs_frag, afs.fs_fpg, 20798542Smckusick afs.fs_ipg); 208122670Sjohan printf("nindir\t%d\tinopb\t%d\tnspf\t%d\tmaxfilesize\t%ju\n", 20998542Smckusick afs.fs_nindir, afs.fs_inopb, afs.fs_old_nspf, 210122670Sjohan (uintmax_t)afs.fs_maxfilesize); 21198542Smckusick printf("sbsize\t%d\tcgsize\t%d\tcgoffset %d\tcgmask\t0x%08x\n", 21298542Smckusick afs.fs_sbsize, afs.fs_cgsize, afs.fs_old_cgoffset, 21398542Smckusick afs.fs_old_cgmask); 21498542Smckusick printf("csaddr\t%d\tcssize\t%d\n", 21598542Smckusick afs.fs_old_csaddr, afs.fs_cssize); 21698542Smckusick printf("rotdelay %dms\trps\t%d\ttrackskew %d\tinterleave %d\n", 21798542Smckusick afs.fs_old_rotdelay, afs.fs_old_rps, afs.fs_old_trackskew, 21898542Smckusick afs.fs_old_interleave); 21998542Smckusick printf("nsect\t%d\tnpsect\t%d\tspc\t%d\n", 22098542Smckusick afs.fs_old_nsect, afs.fs_old_npsect, afs.fs_old_spc); 221101688Sjmallett break; 222101688Sjmallett default: 223109532Sjmallett goto err; 22498542Smckusick } 2251558Srgrimes printf("sblkno\t%d\tcblkno\t%d\tiblkno\t%d\tdblkno\t%d\n", 2261558Srgrimes afs.fs_sblkno, afs.fs_cblkno, afs.fs_iblkno, afs.fs_dblkno); 2272154Sdg printf("cgrotor\t%d\tfmod\t%d\tronly\t%d\tclean\t%d\n", 2282154Sdg afs.fs_cgrotor, afs.fs_fmod, afs.fs_ronly, afs.fs_clean); 229123219Struckman printf("avgfpdir %d\tavgfilesize %d\n", 230123219Struckman afs.fs_avgfpdir, afs.fs_avgfilesize); 23148875Smpp printf("flags\t"); 232109767Snjl if (afs.fs_old_flags & FS_FLAGS_UPDATED) 233109767Snjl fsflags = afs.fs_flags; 234109767Snjl else 235109767Snjl fsflags = afs.fs_old_flags; 236109767Snjl if (fsflags == 0) 23748875Smpp printf("none"); 238109767Snjl if (fsflags & FS_UNCLEAN) 239109767Snjl printf("unclean "); 240109767Snjl if (fsflags & FS_DOSOFTDEP) 241207141Sjeff printf("soft-updates%s ", (fsflags & FS_SUJ) ? "+journal" : ""); 242109767Snjl if (fsflags & FS_NEEDSFSCK) 243109767Snjl printf("needs fsck run "); 244109767Snjl if (fsflags & FS_INDEXDIRS) 245109767Snjl printf("indexed directories "); 246109767Snjl if (fsflags & FS_ACLS) 247109767Snjl printf("acls "); 248109767Snjl if (fsflags & FS_MULTILABEL) 249109767Snjl printf("multilabel "); 250163844Spjd if (fsflags & FS_GJOURNAL) 251163844Spjd printf("gjournal "); 252109767Snjl if (fsflags & FS_FLAGS_UPDATED) 253109767Snjl printf("fs_flags expanded "); 254200796Strasz if (fsflags & FS_NFS4ACLS) 255200796Strasz printf("nfsv4acls "); 256216798Skib if (fsflags & FS_TRIM) 257216798Skib printf("trim "); 258109767Snjl fsflags &= ~(FS_UNCLEAN | FS_DOSOFTDEP | FS_NEEDSFSCK | FS_INDEXDIRS | 259200796Strasz FS_ACLS | FS_MULTILABEL | FS_GJOURNAL | FS_FLAGS_UPDATED | 260216798Skib FS_NFS4ACLS | FS_SUJ | FS_TRIM); 261109767Snjl if (fsflags != 0) 262109767Snjl printf("unknown flags (%#x)", fsflags); 26348875Smpp putchar('\n'); 264110174Sgordon printf("fsmnt\t%s\n", afs.fs_fsmnt); 265122670Sjohan printf("volname\t%s\tswuid\t%ju\n", 266122670Sjohan afs.fs_volname, (uintmax_t)afs.fs_swuid); 2671558Srgrimes printf("\ncs[].cs_(nbfree,ndir,nifree,nffree):\n\t"); 26871073Siedowse afs.fs_csp = calloc(1, afs.fs_cssize); 269101688Sjmallett if (bread(&disk, fsbtodb(&afs, afs.fs_csaddr), afs.fs_csp, afs.fs_cssize) == -1) 27098542Smckusick goto err; 2711558Srgrimes for (i = 0; i < afs.fs_ncg; i++) { 2721558Srgrimes struct csum *cs = &afs.fs_cs(&afs, i); 2731558Srgrimes if (i && i % 4 == 0) 2741558Srgrimes printf("\n\t"); 2751558Srgrimes printf("(%d,%d,%d,%d) ", 2761558Srgrimes cs->cs_nbfree, cs->cs_ndir, cs->cs_nifree, cs->cs_nffree); 2771558Srgrimes } 2781558Srgrimes printf("\n"); 27998542Smckusick if (fssize % afs.fs_fpg) { 280101688Sjmallett if (disk.d_ufs == 1) 28198542Smckusick printf("cylinders in last group %d\n", 28298542Smckusick howmany(afs.fs_old_size % afs.fs_fpg, 28398542Smckusick afs.fs_old_spc / afs.fs_old_nspf)); 284109532Sjmallett printf("blocks in last group %ld\n\n", 285109532Sjmallett (long)((fssize % afs.fs_fpg) / afs.fs_frag)); 2861558Srgrimes } 287109519Sjmallett while ((i = cgread(&disk)) != 0) { 288109519Sjmallett if (i == -1 || dumpcg()) 2891558Srgrimes goto err; 290109519Sjmallett } 2911558Srgrimes return (0); 2921558Srgrimes 293109525Sjmalletterr: ufserr(name); 2941558Srgrimes return (1); 29599827Sjmallett} 2961558Srgrimes 2971558Srgrimesint 298109519Sjmallettdumpcg(void) 2991558Srgrimes{ 300109532Sjmallett time_t cgtime; 3011558Srgrimes off_t cur; 3021558Srgrimes int i, j; 3031558Srgrimes 304109519Sjmallett printf("\ncg %d:\n", disk.d_lcg); 305109519Sjmallett cur = fsbtodb(&afs, cgtod(&afs, disk.d_lcg)) * disk.d_bsize; 306101688Sjmallett switch (disk.d_ufs) { 307101688Sjmallett case 2: 308109532Sjmallett cgtime = acg.cg_time; 309122670Sjohan printf("magic\t%x\ttell\t%jx\ttime\t%s", 310122670Sjohan acg.cg_magic, (intmax_t)cur, ctime(&cgtime)); 311163844Spjd printf("cgx\t%d\tndblk\t%d\tniblk\t%d\tinitiblk %d\tunrefs %d\n", 312163844Spjd acg.cg_cgx, acg.cg_ndblk, acg.cg_niblk, acg.cg_initediblk, 313163844Spjd acg.cg_unrefs); 314101688Sjmallett break; 315101688Sjmallett case 1: 316109532Sjmallett cgtime = acg.cg_old_time; 317122670Sjohan printf("magic\t%x\ttell\t%jx\ttime\t%s", 318122670Sjohan acg.cg_magic, (intmax_t)cur, ctime(&cgtime)); 31998542Smckusick printf("cgx\t%d\tncyl\t%d\tniblk\t%d\tndblk\t%d\n", 32098542Smckusick acg.cg_cgx, acg.cg_old_ncyl, acg.cg_old_niblk, 32198542Smckusick acg.cg_ndblk); 322101688Sjmallett break; 323101688Sjmallett default: 324101688Sjmallett break; 32598542Smckusick } 3261558Srgrimes printf("nbfree\t%d\tndir\t%d\tnifree\t%d\tnffree\t%d\n", 3271558Srgrimes acg.cg_cs.cs_nbfree, acg.cg_cs.cs_ndir, 3281558Srgrimes acg.cg_cs.cs_nifree, acg.cg_cs.cs_nffree); 3291558Srgrimes printf("rotor\t%d\tirotor\t%d\tfrotor\t%d\nfrsum", 3301558Srgrimes acg.cg_rotor, acg.cg_irotor, acg.cg_frotor); 3311558Srgrimes for (i = 1, j = 0; i < afs.fs_frag; i++) { 3321558Srgrimes printf("\t%d", acg.cg_frsum[i]); 3331558Srgrimes j += i * acg.cg_frsum[i]; 3341558Srgrimes } 3351558Srgrimes printf("\nsum of frsum: %d", j); 3361558Srgrimes if (afs.fs_contigsumsize > 0) { 3371558Srgrimes for (i = 1; i < afs.fs_contigsumsize; i++) { 3381558Srgrimes if ((i - 1) % 8 == 0) 3391558Srgrimes printf("\nclusters %d-%d:", i, 3401558Srgrimes afs.fs_contigsumsize - 1 < i + 7 ? 3411558Srgrimes afs.fs_contigsumsize - 1 : i + 7); 3421558Srgrimes printf("\t%d", cg_clustersum(&acg)[i]); 3431558Srgrimes } 3441558Srgrimes printf("\nclusters size %d and over: %d\n", 3451558Srgrimes afs.fs_contigsumsize, 3461558Srgrimes cg_clustersum(&acg)[afs.fs_contigsumsize]); 3471558Srgrimes printf("clusters free:\t"); 3481558Srgrimes pbits(cg_clustersfree(&acg), acg.cg_nclusterblks); 3491558Srgrimes } else 3501558Srgrimes printf("\n"); 35198542Smckusick printf("inodes used:\t"); 3521558Srgrimes pbits(cg_inosused(&acg), afs.fs_ipg); 35398542Smckusick printf("blks free:\t"); 3541558Srgrimes pbits(cg_blksfree(&acg), afs.fs_fpg); 3551558Srgrimes return (0); 35699827Sjmallett} 3571558Srgrimes 358109525Sjmallettint 359187814Srwatsondumpfreespace(const char *name, int fflag) 360187814Srwatson{ 361187814Srwatson int i; 362187814Srwatson 363187814Srwatson while ((i = cgread(&disk)) != 0) { 364187814Srwatson if (i == -1) 365187814Srwatson goto err; 366187814Srwatson dumpfreespacecg(fflag); 367187814Srwatson } 368187814Srwatson return (0); 369187814Srwatsonerr: 370187814Srwatson ufserr(name); 371187814Srwatson return (1); 372187814Srwatson} 373187814Srwatson 374187814Srwatsonvoid 375187814Srwatsondumpfreespacecg(int fflag) 376187814Srwatson{ 377187814Srwatson 378187814Srwatson pblklist(cg_blksfree(&acg), afs.fs_fpg, disk.d_lcg * afs.fs_fpg, 379187814Srwatson fflag); 380187814Srwatson} 381187814Srwatson 382187814Srwatsonint 383109525Sjmallettmarshal(const char *name) 384109525Sjmallett{ 385109525Sjmallett struct fs *fs; 386109525Sjmallett 387109525Sjmallett fs = &disk.d_fs; 388109525Sjmallett 389109525Sjmallett printf("# newfs command for %s (%s)\n", name, disk.d_name); 390109525Sjmallett printf("newfs "); 391116083Sjmallett if (fs->fs_volname[0] != '\0') 392116083Sjmallett printf("-L %s ", fs->fs_volname); 393109525Sjmallett printf("-O %d ", disk.d_ufs); 394109525Sjmallett if (fs->fs_flags & FS_DOSOFTDEP) 395109525Sjmallett printf("-U "); 396109525Sjmallett printf("-a %d ", fs->fs_maxcontig); 397109525Sjmallett printf("-b %d ", fs->fs_bsize); 398109525Sjmallett /* -c is dumb */ 399109525Sjmallett printf("-d %d ", fs->fs_maxbsize); 400109525Sjmallett printf("-e %d ", fs->fs_maxbpg); 401109525Sjmallett printf("-f %d ", fs->fs_fsize); 402109525Sjmallett printf("-g %d ", fs->fs_avgfilesize); 403109525Sjmallett printf("-h %d ", fs->fs_avgfpdir); 404109525Sjmallett /* -i is dumb */ 405109525Sjmallett /* -j..l unimplemented */ 406109525Sjmallett printf("-m %d ", fs->fs_minfree); 407109525Sjmallett /* -n unimplemented */ 408109525Sjmallett printf("-o "); 409109525Sjmallett switch (fs->fs_optim) { 410109525Sjmallett case FS_OPTSPACE: 411109525Sjmallett printf("space "); 412109525Sjmallett break; 413109525Sjmallett case FS_OPTTIME: 414109525Sjmallett printf("time "); 415109525Sjmallett break; 416109525Sjmallett default: 417109525Sjmallett printf("unknown "); 418109525Sjmallett break; 419109525Sjmallett } 420109525Sjmallett /* -p..r unimplemented */ 421198231Sru printf("-s %jd ", (intmax_t)fsbtodb(fs, fs->fs_size)); 422109525Sjmallett printf("%s ", disk.d_name); 423109525Sjmallett printf("\n"); 424109525Sjmallett 425109525Sjmallett return 0; 426109525Sjmallett} 427109525Sjmallett 4281558Srgrimesvoid 42992839Simppbits(void *vp, int max) 4301558Srgrimes{ 43192806Sobrien int i; 43292806Sobrien char *p; 4331558Srgrimes int count, j; 4341558Srgrimes 4351558Srgrimes for (count = i = 0, p = vp; i < max; i++) 4361558Srgrimes if (isset(p, i)) { 4371558Srgrimes if (count) 4381558Srgrimes printf(",%s", count % 6 ? " " : "\n\t"); 4391558Srgrimes count++; 4401558Srgrimes printf("%d", i); 4411558Srgrimes j = i; 4421558Srgrimes while ((i+1)<max && isset(p, i+1)) 4431558Srgrimes i++; 4441558Srgrimes if (i != j) 4451558Srgrimes printf("-%d", i); 4461558Srgrimes } 4471558Srgrimes printf("\n"); 4481558Srgrimes} 4491558Srgrimes 4501558Srgrimesvoid 451187814Srwatsonpblklist(void *vp, int max, off_t offset, int fflag) 452187814Srwatson{ 453187814Srwatson int i, j; 454187814Srwatson char *p; 455187814Srwatson 456187814Srwatson for (i = 0, p = vp; i < max; i++) { 457187814Srwatson if (isset(p, i)) { 458187814Srwatson printf("%jd", (intmax_t)(i + offset)); 459187814Srwatson if (fflag < 2) { 460187814Srwatson j = i; 461187814Srwatson while ((i+1)<max && isset(p, i+1)) 462187814Srwatson i++; 463187814Srwatson if (i != j) 464187820Srwatson printf("-%jd", (intmax_t)(i + offset)); 465187814Srwatson } 466187814Srwatson printf("\n"); 467187814Srwatson } 468187814Srwatson } 469187814Srwatson} 470187814Srwatson 471187814Srwatsonvoid 472109525Sjmallettufserr(const char *name) 473109525Sjmallett{ 474109525Sjmallett if (disk.d_error != NULL) 475109525Sjmallett warnx("%s: %s", name, disk.d_error); 476109525Sjmallett else if (errno) 477109525Sjmallett warn("%s", name); 478109525Sjmallett} 479109525Sjmallett 480109525Sjmallettvoid 48192839Simpusage(void) 4821558Srgrimes{ 483187814Srwatson (void)fprintf(stderr, "usage: dumpfs [-fm] filesys | device\n"); 4841558Srgrimes exit(1); 4851558Srgrimes} 486