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$"; 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> 71224025Sdelphij#include <paths.h> 72109525Sjmallett#include <stdint.h> 731558Srgrimes#include <stdio.h> 741558Srgrimes#include <stdlib.h> 7523673Speter#include <unistd.h> 761558Srgrimes 7799826Sjmallett#define afs disk.d_fs 78109510Sjmallett#define acg disk.d_cg 791558Srgrimes 80227081Sedstatic struct uufsd disk; 811558Srgrimes 82228458Sedstatic int dumpfs(const char *); 83228458Sedstatic int dumpfsid(void); 84228458Sedstatic int dumpcg(void); 85228458Sedstatic int dumpfreespace(const char *, int); 86228458Sedstatic void dumpfreespacecg(int); 87228458Sedstatic int marshal(const char *); 88228458Sedstatic void pbits(void *, int); 89228458Sedstatic void pblklist(void *, int, off_t, int); 90228458Sedstatic void ufserr(const char *); 91228458Sedstatic void usage(void) __dead2; 921558Srgrimes 931558Srgrimesint 9492839Simpmain(int argc, char *argv[]) 951558Srgrimes{ 96109525Sjmallett const char *name; 97224004Sdelphij int ch, dofreespace, domarshal, dolabel, eval; 981558Srgrimes 99224004Sdelphij dofreespace = domarshal = dolabel = eval = 0; 100109507Sjmallett 101224004Sdelphij while ((ch = getopt(argc, argv, "lfm")) != -1) { 102109525Sjmallett switch (ch) { 103187814Srwatson case 'f': 104187814Srwatson dofreespace++; 105187814Srwatson break; 106109525Sjmallett case 'm': 107109525Sjmallett domarshal = 1; 108109525Sjmallett break; 109224004Sdelphij case 'l': 110224004Sdelphij dolabel = 1; 111224004Sdelphij break; 112109525Sjmallett case '?': 113109525Sjmallett default: 114109525Sjmallett usage(); 115109525Sjmallett } 116109525Sjmallett } 1171558Srgrimes argc -= optind; 1181558Srgrimes argv += optind; 1191558Srgrimes 1201558Srgrimes if (argc < 1) 1211558Srgrimes usage(); 122187814Srwatson if (dofreespace && domarshal) 123187814Srwatson usage(); 124187814Srwatson if (dofreespace > 2) 125187814Srwatson usage(); 1261558Srgrimes 127109525Sjmallett while ((name = *argv++) != NULL) { 128109525Sjmallett if (ufs_disk_fillout(&disk, name) == -1) { 129109525Sjmallett ufserr(name); 130109525Sjmallett eval |= 1; 131109525Sjmallett continue; 132109525Sjmallett } 133187814Srwatson if (dofreespace) 134187814Srwatson eval |= dumpfreespace(name, dofreespace); 135187814Srwatson else if (domarshal) 136109525Sjmallett eval |= marshal(name); 137224004Sdelphij else if (dolabel) 138224004Sdelphij eval |= dumpfsid(); 139109525Sjmallett else 140109525Sjmallett eval |= dumpfs(name); 141109525Sjmallett ufs_disk_close(&disk); 142109525Sjmallett } 1431558Srgrimes exit(eval); 1441558Srgrimes} 1451558Srgrimes 146228458Sedstatic int 147224004Sdelphijdumpfsid(void) 148224004Sdelphij{ 149224004Sdelphij 150224025Sdelphij printf("%sufsid/%08x%08x\n", _PATH_DEV, afs.fs_id[0], afs.fs_id[1]); 151224004Sdelphij return 0; 152224004Sdelphij} 153224004Sdelphij 154228458Sedstatic int 15592839Simpdumpfs(const char *name) 1561558Srgrimes{ 157109532Sjmallett time_t fstime; 15898542Smckusick int64_t fssize; 159109767Snjl int32_t fsflags; 16099827Sjmallett int i; 1611558Srgrimes 162101688Sjmallett switch (disk.d_ufs) { 163101688Sjmallett case 2: 16498542Smckusick fssize = afs.fs_size; 165109532Sjmallett fstime = afs.fs_time; 16698542Smckusick printf("magic\t%x (UFS2)\ttime\t%s", 167109532Sjmallett afs.fs_magic, ctime(&fstime)); 168122670Sjohan printf("superblock location\t%jd\tid\t[ %x %x ]\n", 169122670Sjohan (intmax_t)afs.fs_sblockloc, afs.fs_id[0], afs.fs_id[1]); 170122670Sjohan printf("ncg\t%d\tsize\t%jd\tblocks\t%jd\n", 171122670Sjohan afs.fs_ncg, (intmax_t)fssize, (intmax_t)afs.fs_dsize); 172101688Sjmallett break; 173101688Sjmallett case 1: 17498542Smckusick fssize = afs.fs_old_size; 175109532Sjmallett fstime = afs.fs_old_time; 17698542Smckusick printf("magic\t%x (UFS1)\ttime\t%s", 177109532Sjmallett afs.fs_magic, ctime(&fstime)); 178201647Sgavin printf("id\t[ %08x %08x ]\n", afs.fs_id[0], afs.fs_id[1]); 179122670Sjohan printf("ncg\t%d\tsize\t%jd\tblocks\t%jd\n", 180122670Sjohan afs.fs_ncg, (intmax_t)fssize, (intmax_t)afs.fs_dsize); 181101688Sjmallett break; 182101688Sjmallett default: 183109532Sjmallett goto err; 18498542Smckusick } 1851558Srgrimes printf("bsize\t%d\tshift\t%d\tmask\t0x%08x\n", 1861558Srgrimes afs.fs_bsize, afs.fs_bshift, afs.fs_bmask); 1871558Srgrimes printf("fsize\t%d\tshift\t%d\tmask\t0x%08x\n", 1881558Srgrimes afs.fs_fsize, afs.fs_fshift, afs.fs_fmask); 1891558Srgrimes printf("frag\t%d\tshift\t%d\tfsbtodb\t%d\n", 1901558Srgrimes afs.fs_frag, afs.fs_fragshift, afs.fs_fsbtodb); 19198542Smckusick printf("minfree\t%d%%\toptim\t%s\tsymlinklen %d\n", 1921558Srgrimes afs.fs_minfree, afs.fs_optim == FS_OPTSPACE ? "space" : "time", 19398542Smckusick afs.fs_maxsymlinklen); 194101688Sjmallett switch (disk.d_ufs) { 195101688Sjmallett case 2: 19698542Smckusick printf("%s %d\tmaxbpg\t%d\tmaxcontig %d\tcontigsumsize %d\n", 19798542Smckusick "maxbsize", afs.fs_maxbsize, afs.fs_maxbpg, 19898542Smckusick afs.fs_maxcontig, afs.fs_contigsumsize); 199122670Sjohan printf("nbfree\t%jd\tndir\t%jd\tnifree\t%jd\tnffree\t%jd\n", 200250708Smckusick (intmax_t)afs.fs_cstotal.cs_nbfree, 201122670Sjohan (intmax_t)afs.fs_cstotal.cs_ndir, 202250708Smckusick (intmax_t)afs.fs_cstotal.cs_nifree, 203122670Sjohan (intmax_t)afs.fs_cstotal.cs_nffree); 204163844Spjd printf("bpg\t%d\tfpg\t%d\tipg\t%d\tunrefs\t%jd\n", 205163844Spjd afs.fs_fpg / afs.fs_frag, afs.fs_fpg, afs.fs_ipg, 206163844Spjd (intmax_t)afs.fs_unrefs); 207122670Sjohan printf("nindir\t%d\tinopb\t%d\tmaxfilesize\t%ju\n", 208250708Smckusick afs.fs_nindir, afs.fs_inopb, 209122670Sjohan (uintmax_t)afs.fs_maxfilesize); 210109532Sjmallett printf("sbsize\t%d\tcgsize\t%d\tcsaddr\t%jd\tcssize\t%d\n", 211109532Sjmallett afs.fs_sbsize, afs.fs_cgsize, (intmax_t)afs.fs_csaddr, 212109532Sjmallett afs.fs_cssize); 213101688Sjmallett break; 214101688Sjmallett case 1: 21598542Smckusick printf("maxbpg\t%d\tmaxcontig %d\tcontigsumsize %d\n", 21698542Smckusick afs.fs_maxbpg, afs.fs_maxcontig, afs.fs_contigsumsize); 21798542Smckusick printf("nbfree\t%d\tndir\t%d\tnifree\t%d\tnffree\t%d\n", 21898542Smckusick afs.fs_old_cstotal.cs_nbfree, afs.fs_old_cstotal.cs_ndir, 21998542Smckusick afs.fs_old_cstotal.cs_nifree, afs.fs_old_cstotal.cs_nffree); 22098542Smckusick printf("cpg\t%d\tbpg\t%d\tfpg\t%d\tipg\t%d\n", 22198542Smckusick afs.fs_old_cpg, afs.fs_fpg / afs.fs_frag, afs.fs_fpg, 22298542Smckusick afs.fs_ipg); 223122670Sjohan printf("nindir\t%d\tinopb\t%d\tnspf\t%d\tmaxfilesize\t%ju\n", 22498542Smckusick afs.fs_nindir, afs.fs_inopb, afs.fs_old_nspf, 225122670Sjohan (uintmax_t)afs.fs_maxfilesize); 22698542Smckusick printf("sbsize\t%d\tcgsize\t%d\tcgoffset %d\tcgmask\t0x%08x\n", 22798542Smckusick afs.fs_sbsize, afs.fs_cgsize, afs.fs_old_cgoffset, 22898542Smckusick afs.fs_old_cgmask); 22998542Smckusick printf("csaddr\t%d\tcssize\t%d\n", 23098542Smckusick afs.fs_old_csaddr, afs.fs_cssize); 23198542Smckusick printf("rotdelay %dms\trps\t%d\ttrackskew %d\tinterleave %d\n", 23298542Smckusick afs.fs_old_rotdelay, afs.fs_old_rps, afs.fs_old_trackskew, 23398542Smckusick afs.fs_old_interleave); 23498542Smckusick printf("nsect\t%d\tnpsect\t%d\tspc\t%d\n", 23598542Smckusick afs.fs_old_nsect, afs.fs_old_npsect, afs.fs_old_spc); 236101688Sjmallett break; 237101688Sjmallett default: 238109532Sjmallett goto err; 23998542Smckusick } 2401558Srgrimes printf("sblkno\t%d\tcblkno\t%d\tiblkno\t%d\tdblkno\t%d\n", 2411558Srgrimes afs.fs_sblkno, afs.fs_cblkno, afs.fs_iblkno, afs.fs_dblkno); 2422154Sdg printf("cgrotor\t%d\tfmod\t%d\tronly\t%d\tclean\t%d\n", 2432154Sdg afs.fs_cgrotor, afs.fs_fmod, afs.fs_ronly, afs.fs_clean); 244248623Smckusick printf("metaspace %jd\tavgfpdir %d\tavgfilesize %d\n", 245248623Smckusick afs.fs_metaspace, afs.fs_avgfpdir, afs.fs_avgfilesize); 24648875Smpp printf("flags\t"); 247109767Snjl if (afs.fs_old_flags & FS_FLAGS_UPDATED) 248109767Snjl fsflags = afs.fs_flags; 249109767Snjl else 250109767Snjl fsflags = afs.fs_old_flags; 251109767Snjl if (fsflags == 0) 25248875Smpp printf("none"); 253109767Snjl if (fsflags & FS_UNCLEAN) 254109767Snjl printf("unclean "); 255109767Snjl if (fsflags & FS_DOSOFTDEP) 256207141Sjeff printf("soft-updates%s ", (fsflags & FS_SUJ) ? "+journal" : ""); 257109767Snjl if (fsflags & FS_NEEDSFSCK) 258109767Snjl printf("needs fsck run "); 259109767Snjl if (fsflags & FS_INDEXDIRS) 260109767Snjl printf("indexed directories "); 261109767Snjl if (fsflags & FS_ACLS) 262109767Snjl printf("acls "); 263109767Snjl if (fsflags & FS_MULTILABEL) 264109767Snjl printf("multilabel "); 265163844Spjd if (fsflags & FS_GJOURNAL) 266163844Spjd printf("gjournal "); 267109767Snjl if (fsflags & FS_FLAGS_UPDATED) 268109767Snjl printf("fs_flags expanded "); 269200796Strasz if (fsflags & FS_NFS4ACLS) 270200796Strasz printf("nfsv4acls "); 271216798Skib if (fsflags & FS_TRIM) 272216798Skib printf("trim "); 273109767Snjl fsflags &= ~(FS_UNCLEAN | FS_DOSOFTDEP | FS_NEEDSFSCK | FS_INDEXDIRS | 274200796Strasz FS_ACLS | FS_MULTILABEL | FS_GJOURNAL | FS_FLAGS_UPDATED | 275216798Skib FS_NFS4ACLS | FS_SUJ | FS_TRIM); 276109767Snjl if (fsflags != 0) 277109767Snjl printf("unknown flags (%#x)", fsflags); 27848875Smpp putchar('\n'); 279110174Sgordon printf("fsmnt\t%s\n", afs.fs_fsmnt); 280242379Strasz printf("volname\t%s\tswuid\t%ju\tprovidersize\t%ju\n", 281242379Strasz afs.fs_volname, (uintmax_t)afs.fs_swuid, 282242379Strasz (uintmax_t)afs.fs_providersize); 2831558Srgrimes printf("\ncs[].cs_(nbfree,ndir,nifree,nffree):\n\t"); 28471073Siedowse afs.fs_csp = calloc(1, afs.fs_cssize); 285101688Sjmallett if (bread(&disk, fsbtodb(&afs, afs.fs_csaddr), afs.fs_csp, afs.fs_cssize) == -1) 28698542Smckusick goto err; 2871558Srgrimes for (i = 0; i < afs.fs_ncg; i++) { 2881558Srgrimes struct csum *cs = &afs.fs_cs(&afs, i); 2891558Srgrimes if (i && i % 4 == 0) 2901558Srgrimes printf("\n\t"); 2911558Srgrimes printf("(%d,%d,%d,%d) ", 2921558Srgrimes cs->cs_nbfree, cs->cs_ndir, cs->cs_nifree, cs->cs_nffree); 2931558Srgrimes } 2941558Srgrimes printf("\n"); 29598542Smckusick if (fssize % afs.fs_fpg) { 296101688Sjmallett if (disk.d_ufs == 1) 29798542Smckusick printf("cylinders in last group %d\n", 29898542Smckusick howmany(afs.fs_old_size % afs.fs_fpg, 29998542Smckusick afs.fs_old_spc / afs.fs_old_nspf)); 300109532Sjmallett printf("blocks in last group %ld\n\n", 301109532Sjmallett (long)((fssize % afs.fs_fpg) / afs.fs_frag)); 3021558Srgrimes } 303109519Sjmallett while ((i = cgread(&disk)) != 0) { 304109519Sjmallett if (i == -1 || dumpcg()) 3051558Srgrimes goto err; 306109519Sjmallett } 3071558Srgrimes return (0); 3081558Srgrimes 309109525Sjmalletterr: ufserr(name); 3101558Srgrimes return (1); 31199827Sjmallett} 3121558Srgrimes 313228458Sedstatic int 314109519Sjmallettdumpcg(void) 3151558Srgrimes{ 316109532Sjmallett time_t cgtime; 3171558Srgrimes off_t cur; 3181558Srgrimes int i, j; 3191558Srgrimes 320109519Sjmallett printf("\ncg %d:\n", disk.d_lcg); 321109519Sjmallett cur = fsbtodb(&afs, cgtod(&afs, disk.d_lcg)) * disk.d_bsize; 322101688Sjmallett switch (disk.d_ufs) { 323101688Sjmallett case 2: 324109532Sjmallett cgtime = acg.cg_time; 325122670Sjohan printf("magic\t%x\ttell\t%jx\ttime\t%s", 326122670Sjohan acg.cg_magic, (intmax_t)cur, ctime(&cgtime)); 327163844Spjd printf("cgx\t%d\tndblk\t%d\tniblk\t%d\tinitiblk %d\tunrefs %d\n", 328163844Spjd acg.cg_cgx, acg.cg_ndblk, acg.cg_niblk, acg.cg_initediblk, 329163844Spjd acg.cg_unrefs); 330101688Sjmallett break; 331101688Sjmallett case 1: 332109532Sjmallett cgtime = acg.cg_old_time; 333122670Sjohan printf("magic\t%x\ttell\t%jx\ttime\t%s", 334122670Sjohan acg.cg_magic, (intmax_t)cur, ctime(&cgtime)); 33598542Smckusick printf("cgx\t%d\tncyl\t%d\tniblk\t%d\tndblk\t%d\n", 33698542Smckusick acg.cg_cgx, acg.cg_old_ncyl, acg.cg_old_niblk, 33798542Smckusick acg.cg_ndblk); 338101688Sjmallett break; 339101688Sjmallett default: 340101688Sjmallett break; 34198542Smckusick } 3421558Srgrimes printf("nbfree\t%d\tndir\t%d\tnifree\t%d\tnffree\t%d\n", 3431558Srgrimes acg.cg_cs.cs_nbfree, acg.cg_cs.cs_ndir, 3441558Srgrimes acg.cg_cs.cs_nifree, acg.cg_cs.cs_nffree); 3451558Srgrimes printf("rotor\t%d\tirotor\t%d\tfrotor\t%d\nfrsum", 3461558Srgrimes acg.cg_rotor, acg.cg_irotor, acg.cg_frotor); 3471558Srgrimes for (i = 1, j = 0; i < afs.fs_frag; i++) { 3481558Srgrimes printf("\t%d", acg.cg_frsum[i]); 3491558Srgrimes j += i * acg.cg_frsum[i]; 3501558Srgrimes } 3511558Srgrimes printf("\nsum of frsum: %d", j); 3521558Srgrimes if (afs.fs_contigsumsize > 0) { 3531558Srgrimes for (i = 1; i < afs.fs_contigsumsize; i++) { 3541558Srgrimes if ((i - 1) % 8 == 0) 3551558Srgrimes printf("\nclusters %d-%d:", i, 3561558Srgrimes afs.fs_contigsumsize - 1 < i + 7 ? 3571558Srgrimes afs.fs_contigsumsize - 1 : i + 7); 3581558Srgrimes printf("\t%d", cg_clustersum(&acg)[i]); 3591558Srgrimes } 3601558Srgrimes printf("\nclusters size %d and over: %d\n", 3611558Srgrimes afs.fs_contigsumsize, 3621558Srgrimes cg_clustersum(&acg)[afs.fs_contigsumsize]); 3631558Srgrimes printf("clusters free:\t"); 3641558Srgrimes pbits(cg_clustersfree(&acg), acg.cg_nclusterblks); 3651558Srgrimes } else 3661558Srgrimes printf("\n"); 36798542Smckusick printf("inodes used:\t"); 3681558Srgrimes pbits(cg_inosused(&acg), afs.fs_ipg); 36998542Smckusick printf("blks free:\t"); 3701558Srgrimes pbits(cg_blksfree(&acg), afs.fs_fpg); 3711558Srgrimes return (0); 37299827Sjmallett} 3731558Srgrimes 374228458Sedstatic int 375187814Srwatsondumpfreespace(const char *name, int fflag) 376187814Srwatson{ 377187814Srwatson int i; 378187814Srwatson 379187814Srwatson while ((i = cgread(&disk)) != 0) { 380187814Srwatson if (i == -1) 381187814Srwatson goto err; 382187814Srwatson dumpfreespacecg(fflag); 383187814Srwatson } 384187814Srwatson return (0); 385187814Srwatsonerr: 386187814Srwatson ufserr(name); 387187814Srwatson return (1); 388187814Srwatson} 389187814Srwatson 390228458Sedstatic void 391187814Srwatsondumpfreespacecg(int fflag) 392187814Srwatson{ 393187814Srwatson 394187814Srwatson pblklist(cg_blksfree(&acg), afs.fs_fpg, disk.d_lcg * afs.fs_fpg, 395187814Srwatson fflag); 396187814Srwatson} 397187814Srwatson 398228458Sedstatic int 399109525Sjmallettmarshal(const char *name) 400109525Sjmallett{ 401109525Sjmallett struct fs *fs; 402109525Sjmallett 403109525Sjmallett fs = &disk.d_fs; 404109525Sjmallett 405109525Sjmallett printf("# newfs command for %s (%s)\n", name, disk.d_name); 406109525Sjmallett printf("newfs "); 407116083Sjmallett if (fs->fs_volname[0] != '\0') 408116083Sjmallett printf("-L %s ", fs->fs_volname); 409109525Sjmallett printf("-O %d ", disk.d_ufs); 410109525Sjmallett if (fs->fs_flags & FS_DOSOFTDEP) 411109525Sjmallett printf("-U "); 412109525Sjmallett printf("-a %d ", fs->fs_maxcontig); 413109525Sjmallett printf("-b %d ", fs->fs_bsize); 414109525Sjmallett /* -c is dumb */ 415109525Sjmallett printf("-d %d ", fs->fs_maxbsize); 416109525Sjmallett printf("-e %d ", fs->fs_maxbpg); 417109525Sjmallett printf("-f %d ", fs->fs_fsize); 418109525Sjmallett printf("-g %d ", fs->fs_avgfilesize); 419109525Sjmallett printf("-h %d ", fs->fs_avgfpdir); 420250710Smckusick printf("-i %jd ", fragroundup(fs, lblktosize(fs, fragstoblks(fs, 421250710Smckusick fs->fs_fpg)) / fs->fs_ipg)); 422219899Sjmallett if (fs->fs_flags & FS_SUJ) 423219899Sjmallett printf("-j "); 424241842Seadler if (fs->fs_flags & FS_GJOURNAL) 425241842Seadler printf("-J "); 426250710Smckusick printf("-k %jd ", fs->fs_metaspace); 427250710Smckusick if (fs->fs_flags & FS_MULTILABEL) 428250710Smckusick printf("-l "); 429109525Sjmallett printf("-m %d ", fs->fs_minfree); 430109525Sjmallett /* -n unimplemented */ 431109525Sjmallett printf("-o "); 432109525Sjmallett switch (fs->fs_optim) { 433109525Sjmallett case FS_OPTSPACE: 434109525Sjmallett printf("space "); 435109525Sjmallett break; 436109525Sjmallett case FS_OPTTIME: 437109525Sjmallett printf("time "); 438109525Sjmallett break; 439109525Sjmallett default: 440109525Sjmallett printf("unknown "); 441109525Sjmallett break; 442109525Sjmallett } 443109525Sjmallett /* -p..r unimplemented */ 444198231Sru printf("-s %jd ", (intmax_t)fsbtodb(fs, fs->fs_size)); 445219899Sjmallett if (fs->fs_flags & FS_TRIM) 446219899Sjmallett printf("-t "); 447109525Sjmallett printf("%s ", disk.d_name); 448109525Sjmallett printf("\n"); 449109525Sjmallett 450109525Sjmallett return 0; 451109525Sjmallett} 452109525Sjmallett 453228458Sedstatic void 45492839Simppbits(void *vp, int max) 4551558Srgrimes{ 45692806Sobrien int i; 45792806Sobrien char *p; 4581558Srgrimes int count, j; 4591558Srgrimes 4601558Srgrimes for (count = i = 0, p = vp; i < max; i++) 4611558Srgrimes if (isset(p, i)) { 4621558Srgrimes if (count) 4631558Srgrimes printf(",%s", count % 6 ? " " : "\n\t"); 4641558Srgrimes count++; 4651558Srgrimes printf("%d", i); 4661558Srgrimes j = i; 4671558Srgrimes while ((i+1)<max && isset(p, i+1)) 4681558Srgrimes i++; 4691558Srgrimes if (i != j) 4701558Srgrimes printf("-%d", i); 4711558Srgrimes } 4721558Srgrimes printf("\n"); 4731558Srgrimes} 4741558Srgrimes 475228458Sedstatic void 476187814Srwatsonpblklist(void *vp, int max, off_t offset, int fflag) 477187814Srwatson{ 478187814Srwatson int i, j; 479187814Srwatson char *p; 480187814Srwatson 481187814Srwatson for (i = 0, p = vp; i < max; i++) { 482187814Srwatson if (isset(p, i)) { 483187814Srwatson printf("%jd", (intmax_t)(i + offset)); 484187814Srwatson if (fflag < 2) { 485187814Srwatson j = i; 486187814Srwatson while ((i+1)<max && isset(p, i+1)) 487187814Srwatson i++; 488187814Srwatson if (i != j) 489187820Srwatson printf("-%jd", (intmax_t)(i + offset)); 490187814Srwatson } 491187814Srwatson printf("\n"); 492187814Srwatson } 493187814Srwatson } 494187814Srwatson} 495187814Srwatson 496228458Sedstatic void 497109525Sjmallettufserr(const char *name) 498109525Sjmallett{ 499109525Sjmallett if (disk.d_error != NULL) 500109525Sjmallett warnx("%s: %s", name, disk.d_error); 501109525Sjmallett else if (errno) 502109525Sjmallett warn("%s", name); 503109525Sjmallett} 504109525Sjmallett 505228458Sedstatic void 50692839Simpusage(void) 5071558Srgrimes{ 508228898Sbrueffer (void)fprintf(stderr, "usage: dumpfs [-flm] filesys | device\n"); 5091558Srgrimes exit(1); 5101558Srgrimes} 511