dumpfs.c revision 207141
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 207141 2010-04-24 07:05:35Z jeff $"; 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 "); 256109767Snjl fsflags &= ~(FS_UNCLEAN | FS_DOSOFTDEP | FS_NEEDSFSCK | FS_INDEXDIRS | 257200796Strasz FS_ACLS | FS_MULTILABEL | FS_GJOURNAL | FS_FLAGS_UPDATED | 258207141Sjeff FS_NFS4ACLS | FS_SUJ); 259109767Snjl if (fsflags != 0) 260109767Snjl printf("unknown flags (%#x)", fsflags); 26148875Smpp putchar('\n'); 262110174Sgordon printf("fsmnt\t%s\n", afs.fs_fsmnt); 263122670Sjohan printf("volname\t%s\tswuid\t%ju\n", 264122670Sjohan afs.fs_volname, (uintmax_t)afs.fs_swuid); 2651558Srgrimes printf("\ncs[].cs_(nbfree,ndir,nifree,nffree):\n\t"); 26671073Siedowse afs.fs_csp = calloc(1, afs.fs_cssize); 267101688Sjmallett if (bread(&disk, fsbtodb(&afs, afs.fs_csaddr), afs.fs_csp, afs.fs_cssize) == -1) 26898542Smckusick goto err; 2691558Srgrimes for (i = 0; i < afs.fs_ncg; i++) { 2701558Srgrimes struct csum *cs = &afs.fs_cs(&afs, i); 2711558Srgrimes if (i && i % 4 == 0) 2721558Srgrimes printf("\n\t"); 2731558Srgrimes printf("(%d,%d,%d,%d) ", 2741558Srgrimes cs->cs_nbfree, cs->cs_ndir, cs->cs_nifree, cs->cs_nffree); 2751558Srgrimes } 2761558Srgrimes printf("\n"); 27798542Smckusick if (fssize % afs.fs_fpg) { 278101688Sjmallett if (disk.d_ufs == 1) 27998542Smckusick printf("cylinders in last group %d\n", 28098542Smckusick howmany(afs.fs_old_size % afs.fs_fpg, 28198542Smckusick afs.fs_old_spc / afs.fs_old_nspf)); 282109532Sjmallett printf("blocks in last group %ld\n\n", 283109532Sjmallett (long)((fssize % afs.fs_fpg) / afs.fs_frag)); 2841558Srgrimes } 285109519Sjmallett while ((i = cgread(&disk)) != 0) { 286109519Sjmallett if (i == -1 || dumpcg()) 2871558Srgrimes goto err; 288109519Sjmallett } 2891558Srgrimes return (0); 2901558Srgrimes 291109525Sjmalletterr: ufserr(name); 2921558Srgrimes return (1); 29399827Sjmallett} 2941558Srgrimes 2951558Srgrimesint 296109519Sjmallettdumpcg(void) 2971558Srgrimes{ 298109532Sjmallett time_t cgtime; 2991558Srgrimes off_t cur; 3001558Srgrimes int i, j; 3011558Srgrimes 302109519Sjmallett printf("\ncg %d:\n", disk.d_lcg); 303109519Sjmallett cur = fsbtodb(&afs, cgtod(&afs, disk.d_lcg)) * disk.d_bsize; 304101688Sjmallett switch (disk.d_ufs) { 305101688Sjmallett case 2: 306109532Sjmallett cgtime = acg.cg_time; 307122670Sjohan printf("magic\t%x\ttell\t%jx\ttime\t%s", 308122670Sjohan acg.cg_magic, (intmax_t)cur, ctime(&cgtime)); 309163844Spjd printf("cgx\t%d\tndblk\t%d\tniblk\t%d\tinitiblk %d\tunrefs %d\n", 310163844Spjd acg.cg_cgx, acg.cg_ndblk, acg.cg_niblk, acg.cg_initediblk, 311163844Spjd acg.cg_unrefs); 312101688Sjmallett break; 313101688Sjmallett case 1: 314109532Sjmallett cgtime = acg.cg_old_time; 315122670Sjohan printf("magic\t%x\ttell\t%jx\ttime\t%s", 316122670Sjohan acg.cg_magic, (intmax_t)cur, ctime(&cgtime)); 31798542Smckusick printf("cgx\t%d\tncyl\t%d\tniblk\t%d\tndblk\t%d\n", 31898542Smckusick acg.cg_cgx, acg.cg_old_ncyl, acg.cg_old_niblk, 31998542Smckusick acg.cg_ndblk); 320101688Sjmallett break; 321101688Sjmallett default: 322101688Sjmallett break; 32398542Smckusick } 3241558Srgrimes printf("nbfree\t%d\tndir\t%d\tnifree\t%d\tnffree\t%d\n", 3251558Srgrimes acg.cg_cs.cs_nbfree, acg.cg_cs.cs_ndir, 3261558Srgrimes acg.cg_cs.cs_nifree, acg.cg_cs.cs_nffree); 3271558Srgrimes printf("rotor\t%d\tirotor\t%d\tfrotor\t%d\nfrsum", 3281558Srgrimes acg.cg_rotor, acg.cg_irotor, acg.cg_frotor); 3291558Srgrimes for (i = 1, j = 0; i < afs.fs_frag; i++) { 3301558Srgrimes printf("\t%d", acg.cg_frsum[i]); 3311558Srgrimes j += i * acg.cg_frsum[i]; 3321558Srgrimes } 3331558Srgrimes printf("\nsum of frsum: %d", j); 3341558Srgrimes if (afs.fs_contigsumsize > 0) { 3351558Srgrimes for (i = 1; i < afs.fs_contigsumsize; i++) { 3361558Srgrimes if ((i - 1) % 8 == 0) 3371558Srgrimes printf("\nclusters %d-%d:", i, 3381558Srgrimes afs.fs_contigsumsize - 1 < i + 7 ? 3391558Srgrimes afs.fs_contigsumsize - 1 : i + 7); 3401558Srgrimes printf("\t%d", cg_clustersum(&acg)[i]); 3411558Srgrimes } 3421558Srgrimes printf("\nclusters size %d and over: %d\n", 3431558Srgrimes afs.fs_contigsumsize, 3441558Srgrimes cg_clustersum(&acg)[afs.fs_contigsumsize]); 3451558Srgrimes printf("clusters free:\t"); 3461558Srgrimes pbits(cg_clustersfree(&acg), acg.cg_nclusterblks); 3471558Srgrimes } else 3481558Srgrimes printf("\n"); 34998542Smckusick printf("inodes used:\t"); 3501558Srgrimes pbits(cg_inosused(&acg), afs.fs_ipg); 35198542Smckusick printf("blks free:\t"); 3521558Srgrimes pbits(cg_blksfree(&acg), afs.fs_fpg); 3531558Srgrimes return (0); 35499827Sjmallett} 3551558Srgrimes 356109525Sjmallettint 357187814Srwatsondumpfreespace(const char *name, int fflag) 358187814Srwatson{ 359187814Srwatson int i; 360187814Srwatson 361187814Srwatson while ((i = cgread(&disk)) != 0) { 362187814Srwatson if (i == -1) 363187814Srwatson goto err; 364187814Srwatson dumpfreespacecg(fflag); 365187814Srwatson } 366187814Srwatson return (0); 367187814Srwatsonerr: 368187814Srwatson ufserr(name); 369187814Srwatson return (1); 370187814Srwatson} 371187814Srwatson 372187814Srwatsonvoid 373187814Srwatsondumpfreespacecg(int fflag) 374187814Srwatson{ 375187814Srwatson 376187814Srwatson pblklist(cg_blksfree(&acg), afs.fs_fpg, disk.d_lcg * afs.fs_fpg, 377187814Srwatson fflag); 378187814Srwatson} 379187814Srwatson 380187814Srwatsonint 381109525Sjmallettmarshal(const char *name) 382109525Sjmallett{ 383109525Sjmallett struct fs *fs; 384109525Sjmallett 385109525Sjmallett fs = &disk.d_fs; 386109525Sjmallett 387109525Sjmallett printf("# newfs command for %s (%s)\n", name, disk.d_name); 388109525Sjmallett printf("newfs "); 389116083Sjmallett if (fs->fs_volname[0] != '\0') 390116083Sjmallett printf("-L %s ", fs->fs_volname); 391109525Sjmallett printf("-O %d ", disk.d_ufs); 392109525Sjmallett if (fs->fs_flags & FS_DOSOFTDEP) 393109525Sjmallett printf("-U "); 394109525Sjmallett printf("-a %d ", fs->fs_maxcontig); 395109525Sjmallett printf("-b %d ", fs->fs_bsize); 396109525Sjmallett /* -c is dumb */ 397109525Sjmallett printf("-d %d ", fs->fs_maxbsize); 398109525Sjmallett printf("-e %d ", fs->fs_maxbpg); 399109525Sjmallett printf("-f %d ", fs->fs_fsize); 400109525Sjmallett printf("-g %d ", fs->fs_avgfilesize); 401109525Sjmallett printf("-h %d ", fs->fs_avgfpdir); 402109525Sjmallett /* -i is dumb */ 403109525Sjmallett /* -j..l unimplemented */ 404109525Sjmallett printf("-m %d ", fs->fs_minfree); 405109525Sjmallett /* -n unimplemented */ 406109525Sjmallett printf("-o "); 407109525Sjmallett switch (fs->fs_optim) { 408109525Sjmallett case FS_OPTSPACE: 409109525Sjmallett printf("space "); 410109525Sjmallett break; 411109525Sjmallett case FS_OPTTIME: 412109525Sjmallett printf("time "); 413109525Sjmallett break; 414109525Sjmallett default: 415109525Sjmallett printf("unknown "); 416109525Sjmallett break; 417109525Sjmallett } 418109525Sjmallett /* -p..r unimplemented */ 419198231Sru printf("-s %jd ", (intmax_t)fsbtodb(fs, fs->fs_size)); 420109525Sjmallett printf("%s ", disk.d_name); 421109525Sjmallett printf("\n"); 422109525Sjmallett 423109525Sjmallett return 0; 424109525Sjmallett} 425109525Sjmallett 4261558Srgrimesvoid 42792839Simppbits(void *vp, int max) 4281558Srgrimes{ 42992806Sobrien int i; 43092806Sobrien char *p; 4311558Srgrimes int count, j; 4321558Srgrimes 4331558Srgrimes for (count = i = 0, p = vp; i < max; i++) 4341558Srgrimes if (isset(p, i)) { 4351558Srgrimes if (count) 4361558Srgrimes printf(",%s", count % 6 ? " " : "\n\t"); 4371558Srgrimes count++; 4381558Srgrimes printf("%d", i); 4391558Srgrimes j = i; 4401558Srgrimes while ((i+1)<max && isset(p, i+1)) 4411558Srgrimes i++; 4421558Srgrimes if (i != j) 4431558Srgrimes printf("-%d", i); 4441558Srgrimes } 4451558Srgrimes printf("\n"); 4461558Srgrimes} 4471558Srgrimes 4481558Srgrimesvoid 449187814Srwatsonpblklist(void *vp, int max, off_t offset, int fflag) 450187814Srwatson{ 451187814Srwatson int i, j; 452187814Srwatson char *p; 453187814Srwatson 454187814Srwatson for (i = 0, p = vp; i < max; i++) { 455187814Srwatson if (isset(p, i)) { 456187814Srwatson printf("%jd", (intmax_t)(i + offset)); 457187814Srwatson if (fflag < 2) { 458187814Srwatson j = i; 459187814Srwatson while ((i+1)<max && isset(p, i+1)) 460187814Srwatson i++; 461187814Srwatson if (i != j) 462187820Srwatson printf("-%jd", (intmax_t)(i + offset)); 463187814Srwatson } 464187814Srwatson printf("\n"); 465187814Srwatson } 466187814Srwatson } 467187814Srwatson} 468187814Srwatson 469187814Srwatsonvoid 470109525Sjmallettufserr(const char *name) 471109525Sjmallett{ 472109525Sjmallett if (disk.d_error != NULL) 473109525Sjmallett warnx("%s: %s", name, disk.d_error); 474109525Sjmallett else if (errno) 475109525Sjmallett warn("%s", name); 476109525Sjmallett} 477109525Sjmallett 478109525Sjmallettvoid 47992839Simpusage(void) 4801558Srgrimes{ 481187814Srwatson (void)fprintf(stderr, "usage: dumpfs [-fm] filesys | device\n"); 4821558Srgrimes exit(1); 4831558Srgrimes} 484