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