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