dumpfs.c revision 109510
11558Srgrimes/* 298542Smckusick * Copyright (c) 2002 Networks Associates Technology, Inc. 398542Smckusick * All rights reserved. 498542Smckusick * 598542Smckusick * This software was developed for the FreeBSD Project by Marshall 698542Smckusick * Kirk McKusick and Network Associates Laboratories, the Security 798542Smckusick * Research Division of Network Associates, Inc. under DARPA/SPAWAR 898542Smckusick * contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA CHATS 998542Smckusick * research program 1098542Smckusick * 1198542Smckusick * Copyright (c) 1982, 1989, 1993 1298542Smckusick * The Regents of the University of California. All rights reserved. 1398542Smckusick * (c) UNIX System Laboratories, Inc. 141558Srgrimes * Copyright (c) 1983, 1992, 1993 151558Srgrimes * The Regents of the University of California. All rights reserved. 161558Srgrimes * 171558Srgrimes * Redistribution and use in source and binary forms, with or without 181558Srgrimes * modification, are permitted provided that the following conditions 191558Srgrimes * are met: 201558Srgrimes * 1. Redistributions of source code must retain the above copyright 211558Srgrimes * notice, this list of conditions and the following disclaimer. 221558Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 231558Srgrimes * notice, this list of conditions and the following disclaimer in the 241558Srgrimes * documentation and/or other materials provided with the distribution. 251558Srgrimes * 3. All advertising materials mentioning features or use of this software 261558Srgrimes * must display the following acknowledgement: 271558Srgrimes * This product includes software developed by the University of 281558Srgrimes * California, Berkeley and its contributors. 291558Srgrimes * 4. Neither the name of the University nor the names of its contributors 301558Srgrimes * may be used to endorse or promote products derived from this software 311558Srgrimes * without specific prior written permission. 321558Srgrimes * 331558Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 341558Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 351558Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 361558Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 371558Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 381558Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 391558Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 401558Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 411558Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 421558Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 431558Srgrimes * SUCH DAMAGE. 441558Srgrimes */ 451558Srgrimes 461558Srgrimes#ifndef lint 4736998Scharnierstatic const char copyright[] = 481558Srgrimes"@(#) Copyright (c) 1983, 1992, 1993\n\ 491558Srgrimes The Regents of the University of California. All rights reserved.\n"; 501558Srgrimes#endif /* not lint */ 511558Srgrimes 521558Srgrimes#ifndef lint 5336998Scharnier#if 0 5423673Speterstatic char sccsid[] = "@(#)dumpfs.c 8.5 (Berkeley) 4/29/95"; 5536998Scharnier#endif 5636998Scharnierstatic const char rcsid[] = 5750476Speter "$FreeBSD: head/sbin/dumpfs/dumpfs.c 109510 2003-01-19 01:31:49Z jmallett $"; 581558Srgrimes#endif /* not lint */ 591558Srgrimes 601558Srgrimes#include <sys/param.h> 611558Srgrimes#include <sys/time.h> 6296478Sphk#include <sys/disklabel.h> 631558Srgrimes 6498542Smckusick#include <ufs/ufs/dinode.h> 651558Srgrimes#include <ufs/ffs/fs.h> 661558Srgrimes 6723673Speter#include <err.h> 68105741Sjmallett#include <errno.h> 691558Srgrimes#include <fcntl.h> 701558Srgrimes#include <fstab.h> 7199826Sjmallett#include <libufs.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 *); 82101688Sjmallettint dumpcg(int); 8392839Simpvoid pbits(void *, int); 8492839Simpvoid usage(void) __dead2; 851558Srgrimes 861558Srgrimesint 8792839Simpmain(int argc, char *argv[]) 881558Srgrimes{ 89109507Sjmallett int eval; 901558Srgrimes 91109507Sjmallett eval = 0; 92109507Sjmallett 93109507Sjmallett while (getopt(argc, argv, "") != -1) 94109507Sjmallett usage(); 951558Srgrimes argc -= optind; 961558Srgrimes argv += optind; 971558Srgrimes 981558Srgrimes if (argc < 1) 991558Srgrimes usage(); 1001558Srgrimes 101109507Sjmallett while (*argv != NULL) 102109507Sjmallett eval |= dumpfs(*argv++); 1031558Srgrimes exit(eval); 1041558Srgrimes} 1051558Srgrimes 1061558Srgrimesint 10792839Simpdumpfs(const char *name) 1081558Srgrimes{ 10998542Smckusick time_t time; 11098542Smckusick int64_t fssize; 11199827Sjmallett int i; 1121558Srgrimes 11399826Sjmallett if (ufs_disk_fillout(&disk, name) == -1) 11498542Smckusick goto err; 11523673Speter 116101688Sjmallett switch (disk.d_ufs) { 117101688Sjmallett case 2: 11898542Smckusick fssize = afs.fs_size; 11998542Smckusick time = afs.fs_time; 12098542Smckusick printf("magic\t%x (UFS2)\ttime\t%s", 12198542Smckusick afs.fs_magic, ctime(&time)); 122107294Smckusick printf("superblock location\t%qd\tid\t[ %x %x ]\n", 12398542Smckusick afs.fs_sblockloc, afs.fs_id[0], afs.fs_id[1]); 12498542Smckusick printf("ncg\t%d\tsize\t%qd\tblocks\t%d\n", 12598542Smckusick afs.fs_ncg, fssize, afs.fs_dsize); 126101688Sjmallett break; 127101688Sjmallett case 1: 12898542Smckusick fssize = afs.fs_old_size; 129107031Speter time = afs.fs_old_time; 13098542Smckusick printf("magic\t%x (UFS1)\ttime\t%s", 131107031Speter afs.fs_magic, ctime(&time)); 13298542Smckusick printf("id\t[ %x %x ]\n", afs.fs_id[0], afs.fs_id[1]); 13398542Smckusick printf("ncg\t%d\tsize\t%qd\tblocks\t%d\n", 13498542Smckusick afs.fs_ncg, fssize, afs.fs_dsize); 135101688Sjmallett break; 136101688Sjmallett default: 137101688Sjmallett break; 13898542Smckusick } 1391558Srgrimes printf("bsize\t%d\tshift\t%d\tmask\t0x%08x\n", 1401558Srgrimes afs.fs_bsize, afs.fs_bshift, afs.fs_bmask); 1411558Srgrimes printf("fsize\t%d\tshift\t%d\tmask\t0x%08x\n", 1421558Srgrimes afs.fs_fsize, afs.fs_fshift, afs.fs_fmask); 1431558Srgrimes printf("frag\t%d\tshift\t%d\tfsbtodb\t%d\n", 1441558Srgrimes afs.fs_frag, afs.fs_fragshift, afs.fs_fsbtodb); 14598542Smckusick printf("minfree\t%d%%\toptim\t%s\tsymlinklen %d\n", 1461558Srgrimes afs.fs_minfree, afs.fs_optim == FS_OPTSPACE ? "space" : "time", 14798542Smckusick afs.fs_maxsymlinklen); 148101688Sjmallett switch (disk.d_ufs) { 149101688Sjmallett case 2: 15098542Smckusick printf("%s %d\tmaxbpg\t%d\tmaxcontig %d\tcontigsumsize %d\n", 15198542Smckusick "maxbsize", afs.fs_maxbsize, afs.fs_maxbpg, 15298542Smckusick afs.fs_maxcontig, afs.fs_contigsumsize); 15398542Smckusick printf("nbfree\t%qd\tndir\t%qd\tnifree\t%qd\tnffree\t%qd\n", 15498542Smckusick afs.fs_cstotal.cs_nbfree, afs.fs_cstotal.cs_ndir, 15598542Smckusick afs.fs_cstotal.cs_nifree, afs.fs_cstotal.cs_nffree); 15698542Smckusick printf("bpg\t%d\tfpg\t%d\tipg\t%d\n", 15798542Smckusick afs.fs_fpg / afs.fs_frag, afs.fs_fpg, afs.fs_ipg); 15898542Smckusick printf("nindir\t%d\tinopb\t%d\tmaxfilesize\t%qu\n", 15998542Smckusick afs.fs_nindir, afs.fs_inopb, afs.fs_maxfilesize); 16098542Smckusick printf("sbsize\t%d\tcgsize\t%d\tcsaddr\t%d\tcssize\t%d\n", 16198542Smckusick afs.fs_sbsize, afs.fs_cgsize, afs.fs_csaddr, afs.fs_cssize); 162101688Sjmallett break; 163101688Sjmallett case 1: 16498542Smckusick printf("maxbpg\t%d\tmaxcontig %d\tcontigsumsize %d\n", 16598542Smckusick afs.fs_maxbpg, afs.fs_maxcontig, afs.fs_contigsumsize); 16698542Smckusick printf("nbfree\t%d\tndir\t%d\tnifree\t%d\tnffree\t%d\n", 16798542Smckusick afs.fs_old_cstotal.cs_nbfree, afs.fs_old_cstotal.cs_ndir, 16898542Smckusick afs.fs_old_cstotal.cs_nifree, afs.fs_old_cstotal.cs_nffree); 16998542Smckusick printf("cpg\t%d\tbpg\t%d\tfpg\t%d\tipg\t%d\n", 17098542Smckusick afs.fs_old_cpg, afs.fs_fpg / afs.fs_frag, afs.fs_fpg, 17198542Smckusick afs.fs_ipg); 17298542Smckusick printf("nindir\t%d\tinopb\t%d\tnspf\t%d\tmaxfilesize\t%qu\n", 17398542Smckusick afs.fs_nindir, afs.fs_inopb, afs.fs_old_nspf, 17498542Smckusick afs.fs_maxfilesize); 17598542Smckusick printf("sbsize\t%d\tcgsize\t%d\tcgoffset %d\tcgmask\t0x%08x\n", 17698542Smckusick afs.fs_sbsize, afs.fs_cgsize, afs.fs_old_cgoffset, 17798542Smckusick afs.fs_old_cgmask); 17898542Smckusick printf("csaddr\t%d\tcssize\t%d\n", 17998542Smckusick afs.fs_old_csaddr, afs.fs_cssize); 18098542Smckusick printf("rotdelay %dms\trps\t%d\ttrackskew %d\tinterleave %d\n", 18198542Smckusick afs.fs_old_rotdelay, afs.fs_old_rps, afs.fs_old_trackskew, 18298542Smckusick afs.fs_old_interleave); 18398542Smckusick printf("nsect\t%d\tnpsect\t%d\tspc\t%d\n", 18498542Smckusick afs.fs_old_nsect, afs.fs_old_npsect, afs.fs_old_spc); 185101688Sjmallett break; 186101688Sjmallett default: 187101688Sjmallett break; 18898542Smckusick } 1891558Srgrimes printf("sblkno\t%d\tcblkno\t%d\tiblkno\t%d\tdblkno\t%d\n", 1901558Srgrimes afs.fs_sblkno, afs.fs_cblkno, afs.fs_iblkno, afs.fs_dblkno); 1912154Sdg printf("cgrotor\t%d\tfmod\t%d\tronly\t%d\tclean\t%d\n", 1922154Sdg afs.fs_cgrotor, afs.fs_fmod, afs.fs_ronly, afs.fs_clean); 19348875Smpp printf("flags\t"); 19448875Smpp if (afs.fs_flags == 0) 19548875Smpp printf("none"); 19648875Smpp if (afs.fs_flags & FS_UNCLEAN) 19748875Smpp printf("unclean "); 19848875Smpp if (afs.fs_flags & FS_DOSOFTDEP) 19948875Smpp printf("soft-updates "); 20098542Smckusick if (afs.fs_flags & FS_NEEDSFSCK) 20198542Smckusick printf("needs fsck run "); 20298542Smckusick if (afs.fs_flags & FS_INDEXDIRS) 20398542Smckusick printf("indexed directories "); 20498542Smckusick if ((afs.fs_flags & 20598542Smckusick ~(FS_UNCLEAN | FS_DOSOFTDEP | FS_NEEDSFSCK | FS_INDEXDIRS)) != 0) 20698542Smckusick printf("unknown flags (%#x)", afs.fs_flags & 20798542Smckusick ~(FS_UNCLEAN | FS_DOSOFTDEP | 20898542Smckusick FS_NEEDSFSCK | FS_INDEXDIRS)); 20948875Smpp putchar('\n'); 2101558Srgrimes printf("\ncs[].cs_(nbfree,ndir,nifree,nffree):\n\t"); 21171073Siedowse afs.fs_csp = calloc(1, afs.fs_cssize); 212101688Sjmallett if (bread(&disk, fsbtodb(&afs, afs.fs_csaddr), afs.fs_csp, afs.fs_cssize) == -1) 21398542Smckusick goto err; 2141558Srgrimes for (i = 0; i < afs.fs_ncg; i++) { 2151558Srgrimes struct csum *cs = &afs.fs_cs(&afs, i); 2161558Srgrimes if (i && i % 4 == 0) 2171558Srgrimes printf("\n\t"); 2181558Srgrimes printf("(%d,%d,%d,%d) ", 2191558Srgrimes cs->cs_nbfree, cs->cs_ndir, cs->cs_nifree, cs->cs_nffree); 2201558Srgrimes } 2211558Srgrimes printf("\n"); 22298542Smckusick if (fssize % afs.fs_fpg) { 223101688Sjmallett if (disk.d_ufs == 1) 22498542Smckusick printf("cylinders in last group %d\n", 22598542Smckusick howmany(afs.fs_old_size % afs.fs_fpg, 22698542Smckusick afs.fs_old_spc / afs.fs_old_nspf)); 22798542Smckusick printf("blocks in last group %d\n\n", 22898542Smckusick (fssize % afs.fs_fpg) / afs.fs_frag); 2291558Srgrimes } 2301558Srgrimes for (i = 0; i < afs.fs_ncg; i++) 231101688Sjmallett if (dumpcg(i)) 2321558Srgrimes goto err; 23399826Sjmallett ufs_disk_close(&disk); 2341558Srgrimes return (0); 2351558Srgrimes 236109461Sjmalletterr: if (disk.d_error != NULL) 237109461Sjmallett warnx("%s: %s", name, disk.d_error); 238109461Sjmallett else if (errno) 239109461Sjmallett warn("%s", name); 240105738Sjmallett ufs_disk_close(&disk); 2411558Srgrimes return (1); 24299827Sjmallett} 2431558Srgrimes 2441558Srgrimesint 245101688Sjmallettdumpcg(int c) 2461558Srgrimes{ 24798542Smckusick time_t time; 2481558Srgrimes off_t cur; 2491558Srgrimes int i, j; 2501558Srgrimes 2511558Srgrimes printf("\ncg %d:\n", c); 252101688Sjmallett cur = fsbtodb(&afs, cgtod(&afs, c)) * disk.d_bsize; 253109510Sjmallett if (cgread1(&disk, c) != 1) 2541558Srgrimes return (1); 255101688Sjmallett switch (disk.d_ufs) { 256101688Sjmallett case 2: 25798542Smckusick time = acg.cg_time; 25898542Smckusick printf("magic\t%x\ttell\t%qx\ttime\t%s", 25998542Smckusick acg.cg_magic, cur, ctime(&time)); 26098542Smckusick printf("cgx\t%d\tndblk\t%d\tniblk\t%d\tinitiblk %d\n", 26198542Smckusick acg.cg_cgx, acg.cg_ndblk, acg.cg_niblk, acg.cg_initediblk); 262101688Sjmallett break; 263101688Sjmallett case 1: 264107031Speter time = acg.cg_old_time; 26598542Smckusick printf("magic\t%x\ttell\t%qx\ttime\t%s", 266107031Speter acg.cg_magic, cur, ctime(&time)); 26798542Smckusick printf("cgx\t%d\tncyl\t%d\tniblk\t%d\tndblk\t%d\n", 26898542Smckusick acg.cg_cgx, acg.cg_old_ncyl, acg.cg_old_niblk, 26998542Smckusick acg.cg_ndblk); 270101688Sjmallett break; 271101688Sjmallett default: 272101688Sjmallett break; 27398542Smckusick } 2741558Srgrimes printf("nbfree\t%d\tndir\t%d\tnifree\t%d\tnffree\t%d\n", 2751558Srgrimes acg.cg_cs.cs_nbfree, acg.cg_cs.cs_ndir, 2761558Srgrimes acg.cg_cs.cs_nifree, acg.cg_cs.cs_nffree); 2771558Srgrimes printf("rotor\t%d\tirotor\t%d\tfrotor\t%d\nfrsum", 2781558Srgrimes acg.cg_rotor, acg.cg_irotor, acg.cg_frotor); 2791558Srgrimes for (i = 1, j = 0; i < afs.fs_frag; i++) { 2801558Srgrimes printf("\t%d", acg.cg_frsum[i]); 2811558Srgrimes j += i * acg.cg_frsum[i]; 2821558Srgrimes } 2831558Srgrimes printf("\nsum of frsum: %d", j); 2841558Srgrimes if (afs.fs_contigsumsize > 0) { 2851558Srgrimes for (i = 1; i < afs.fs_contigsumsize; i++) { 2861558Srgrimes if ((i - 1) % 8 == 0) 2871558Srgrimes printf("\nclusters %d-%d:", i, 2881558Srgrimes afs.fs_contigsumsize - 1 < i + 7 ? 2891558Srgrimes afs.fs_contigsumsize - 1 : i + 7); 2901558Srgrimes printf("\t%d", cg_clustersum(&acg)[i]); 2911558Srgrimes } 2921558Srgrimes printf("\nclusters size %d and over: %d\n", 2931558Srgrimes afs.fs_contigsumsize, 2941558Srgrimes cg_clustersum(&acg)[afs.fs_contigsumsize]); 2951558Srgrimes printf("clusters free:\t"); 2961558Srgrimes pbits(cg_clustersfree(&acg), acg.cg_nclusterblks); 2971558Srgrimes } else 2981558Srgrimes printf("\n"); 29998542Smckusick printf("inodes used:\t"); 3001558Srgrimes pbits(cg_inosused(&acg), afs.fs_ipg); 30198542Smckusick printf("blks free:\t"); 3021558Srgrimes pbits(cg_blksfree(&acg), afs.fs_fpg); 3031558Srgrimes return (0); 30499827Sjmallett} 3051558Srgrimes 3061558Srgrimesvoid 30792839Simppbits(void *vp, int max) 3081558Srgrimes{ 30992806Sobrien int i; 31092806Sobrien char *p; 3111558Srgrimes int count, j; 3121558Srgrimes 3131558Srgrimes for (count = i = 0, p = vp; i < max; i++) 3141558Srgrimes if (isset(p, i)) { 3151558Srgrimes if (count) 3161558Srgrimes printf(",%s", count % 6 ? " " : "\n\t"); 3171558Srgrimes count++; 3181558Srgrimes printf("%d", i); 3191558Srgrimes j = i; 3201558Srgrimes while ((i+1)<max && isset(p, i+1)) 3211558Srgrimes i++; 3221558Srgrimes if (i != j) 3231558Srgrimes printf("-%d", i); 3241558Srgrimes } 3251558Srgrimes printf("\n"); 3261558Srgrimes} 3271558Srgrimes 3281558Srgrimesvoid 32992839Simpusage(void) 3301558Srgrimes{ 3311558Srgrimes (void)fprintf(stderr, "usage: dumpfs filesys | device\n"); 3321558Srgrimes exit(1); 3331558Srgrimes} 334