dumpfs.c revision 109767
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 109767 2003-01-24 00:07:40Z njl $"; 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> 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 8099826Sjmallettstruct uufsd disk; 811558Srgrimes 8292839Simpint dumpfs(const char *); 83109519Sjmallettint dumpcg(void); 84109525Sjmallettint marshal(const char *); 8592839Simpvoid pbits(void *, int); 86109525Sjmallettvoid ufserr(const char *); 8792839Simpvoid usage(void) __dead2; 881558Srgrimes 891558Srgrimesint 9092839Simpmain(int argc, char *argv[]) 911558Srgrimes{ 92109525Sjmallett const char *name; 93109525Sjmallett int ch, domarshal, eval; 941558Srgrimes 95109525Sjmallett domarshal = eval = 0; 96109507Sjmallett 97109525Sjmallett while ((ch = getopt(argc, argv, "m")) != -1) { 98109525Sjmallett switch (ch) { 99109525Sjmallett case 'm': 100109525Sjmallett domarshal = 1; 101109525Sjmallett break; 102109525Sjmallett case '?': 103109525Sjmallett default: 104109525Sjmallett usage(); 105109525Sjmallett } 106109525Sjmallett } 1071558Srgrimes argc -= optind; 1081558Srgrimes argv += optind; 1091558Srgrimes 1101558Srgrimes if (argc < 1) 1111558Srgrimes usage(); 1121558Srgrimes 113109525Sjmallett while ((name = *argv++) != NULL) { 114109525Sjmallett if (ufs_disk_fillout(&disk, name) == -1) { 115109525Sjmallett ufserr(name); 116109525Sjmallett eval |= 1; 117109525Sjmallett continue; 118109525Sjmallett } 119109525Sjmallett if (domarshal) 120109525Sjmallett eval |= marshal(name); 121109525Sjmallett else 122109525Sjmallett eval |= dumpfs(name); 123109525Sjmallett ufs_disk_close(&disk); 124109525Sjmallett } 1251558Srgrimes exit(eval); 1261558Srgrimes} 1271558Srgrimes 1281558Srgrimesint 12992839Simpdumpfs(const char *name) 1301558Srgrimes{ 131109532Sjmallett time_t fstime; 13298542Smckusick int64_t fssize; 133109767Snjl int32_t fsflags; 13499827Sjmallett int i; 1351558Srgrimes 136101688Sjmallett switch (disk.d_ufs) { 137101688Sjmallett case 2: 13898542Smckusick fssize = afs.fs_size; 139109532Sjmallett fstime = afs.fs_time; 14098542Smckusick printf("magic\t%x (UFS2)\ttime\t%s", 141109532Sjmallett afs.fs_magic, ctime(&fstime)); 142107294Smckusick printf("superblock location\t%qd\tid\t[ %x %x ]\n", 14398542Smckusick afs.fs_sblockloc, afs.fs_id[0], afs.fs_id[1]); 144109532Sjmallett printf("ncg\t%d\tsize\t%qd\tblocks\t%jd\n", 145109532Sjmallett afs.fs_ncg, fssize, (intmax_t)afs.fs_dsize); 146101688Sjmallett break; 147101688Sjmallett case 1: 14898542Smckusick fssize = afs.fs_old_size; 149109532Sjmallett fstime = afs.fs_old_time; 15098542Smckusick printf("magic\t%x (UFS1)\ttime\t%s", 151109532Sjmallett afs.fs_magic, ctime(&fstime)); 15298542Smckusick printf("id\t[ %x %x ]\n", afs.fs_id[0], afs.fs_id[1]); 153109532Sjmallett printf("ncg\t%d\tsize\t%qd\tblocks\t%jd\n", 154109532Sjmallett afs.fs_ncg, fssize, (intmax_t)afs.fs_dsize); 155101688Sjmallett break; 156101688Sjmallett default: 157109532Sjmallett goto err; 15898542Smckusick } 1591558Srgrimes printf("bsize\t%d\tshift\t%d\tmask\t0x%08x\n", 1601558Srgrimes afs.fs_bsize, afs.fs_bshift, afs.fs_bmask); 1611558Srgrimes printf("fsize\t%d\tshift\t%d\tmask\t0x%08x\n", 1621558Srgrimes afs.fs_fsize, afs.fs_fshift, afs.fs_fmask); 1631558Srgrimes printf("frag\t%d\tshift\t%d\tfsbtodb\t%d\n", 1641558Srgrimes afs.fs_frag, afs.fs_fragshift, afs.fs_fsbtodb); 16598542Smckusick printf("minfree\t%d%%\toptim\t%s\tsymlinklen %d\n", 1661558Srgrimes afs.fs_minfree, afs.fs_optim == FS_OPTSPACE ? "space" : "time", 16798542Smckusick afs.fs_maxsymlinklen); 168101688Sjmallett switch (disk.d_ufs) { 169101688Sjmallett case 2: 17098542Smckusick printf("%s %d\tmaxbpg\t%d\tmaxcontig %d\tcontigsumsize %d\n", 17198542Smckusick "maxbsize", afs.fs_maxbsize, afs.fs_maxbpg, 17298542Smckusick afs.fs_maxcontig, afs.fs_contigsumsize); 17398542Smckusick printf("nbfree\t%qd\tndir\t%qd\tnifree\t%qd\tnffree\t%qd\n", 17498542Smckusick afs.fs_cstotal.cs_nbfree, afs.fs_cstotal.cs_ndir, 17598542Smckusick afs.fs_cstotal.cs_nifree, afs.fs_cstotal.cs_nffree); 17698542Smckusick printf("bpg\t%d\tfpg\t%d\tipg\t%d\n", 17798542Smckusick afs.fs_fpg / afs.fs_frag, afs.fs_fpg, afs.fs_ipg); 17898542Smckusick printf("nindir\t%d\tinopb\t%d\tmaxfilesize\t%qu\n", 17998542Smckusick afs.fs_nindir, afs.fs_inopb, afs.fs_maxfilesize); 180109532Sjmallett printf("sbsize\t%d\tcgsize\t%d\tcsaddr\t%jd\tcssize\t%d\n", 181109532Sjmallett afs.fs_sbsize, afs.fs_cgsize, (intmax_t)afs.fs_csaddr, 182109532Sjmallett afs.fs_cssize); 183101688Sjmallett break; 184101688Sjmallett case 1: 18598542Smckusick printf("maxbpg\t%d\tmaxcontig %d\tcontigsumsize %d\n", 18698542Smckusick afs.fs_maxbpg, afs.fs_maxcontig, afs.fs_contigsumsize); 18798542Smckusick printf("nbfree\t%d\tndir\t%d\tnifree\t%d\tnffree\t%d\n", 18898542Smckusick afs.fs_old_cstotal.cs_nbfree, afs.fs_old_cstotal.cs_ndir, 18998542Smckusick afs.fs_old_cstotal.cs_nifree, afs.fs_old_cstotal.cs_nffree); 19098542Smckusick printf("cpg\t%d\tbpg\t%d\tfpg\t%d\tipg\t%d\n", 19198542Smckusick afs.fs_old_cpg, afs.fs_fpg / afs.fs_frag, afs.fs_fpg, 19298542Smckusick afs.fs_ipg); 19398542Smckusick printf("nindir\t%d\tinopb\t%d\tnspf\t%d\tmaxfilesize\t%qu\n", 19498542Smckusick afs.fs_nindir, afs.fs_inopb, afs.fs_old_nspf, 19598542Smckusick afs.fs_maxfilesize); 19698542Smckusick printf("sbsize\t%d\tcgsize\t%d\tcgoffset %d\tcgmask\t0x%08x\n", 19798542Smckusick afs.fs_sbsize, afs.fs_cgsize, afs.fs_old_cgoffset, 19898542Smckusick afs.fs_old_cgmask); 19998542Smckusick printf("csaddr\t%d\tcssize\t%d\n", 20098542Smckusick afs.fs_old_csaddr, afs.fs_cssize); 20198542Smckusick printf("rotdelay %dms\trps\t%d\ttrackskew %d\tinterleave %d\n", 20298542Smckusick afs.fs_old_rotdelay, afs.fs_old_rps, afs.fs_old_trackskew, 20398542Smckusick afs.fs_old_interleave); 20498542Smckusick printf("nsect\t%d\tnpsect\t%d\tspc\t%d\n", 20598542Smckusick afs.fs_old_nsect, afs.fs_old_npsect, afs.fs_old_spc); 206101688Sjmallett break; 207101688Sjmallett default: 208109532Sjmallett goto err; 20998542Smckusick } 2101558Srgrimes printf("sblkno\t%d\tcblkno\t%d\tiblkno\t%d\tdblkno\t%d\n", 2111558Srgrimes afs.fs_sblkno, afs.fs_cblkno, afs.fs_iblkno, afs.fs_dblkno); 2122154Sdg printf("cgrotor\t%d\tfmod\t%d\tronly\t%d\tclean\t%d\n", 2132154Sdg afs.fs_cgrotor, afs.fs_fmod, afs.fs_ronly, afs.fs_clean); 21448875Smpp printf("flags\t"); 215109767Snjl if (afs.fs_old_flags & FS_FLAGS_UPDATED) 216109767Snjl fsflags = afs.fs_flags; 217109767Snjl else 218109767Snjl fsflags = afs.fs_old_flags; 219109767Snjl if (fsflags == 0) 22048875Smpp printf("none"); 221109767Snjl if (fsflags & FS_UNCLEAN) 222109767Snjl printf("unclean "); 223109767Snjl if (fsflags & FS_DOSOFTDEP) 224109767Snjl printf("soft-updates "); 225109767Snjl if (fsflags & FS_NEEDSFSCK) 226109767Snjl printf("needs fsck run "); 227109767Snjl if (fsflags & FS_INDEXDIRS) 228109767Snjl printf("indexed directories "); 229109767Snjl if (fsflags & FS_ACLS) 230109767Snjl printf("acls "); 231109767Snjl if (fsflags & FS_MULTILABEL) 232109767Snjl printf("multilabel "); 233109767Snjl if (fsflags & FS_FLAGS_UPDATED) 234109767Snjl printf("fs_flags expanded "); 235109767Snjl fsflags &= ~(FS_UNCLEAN | FS_DOSOFTDEP | FS_NEEDSFSCK | FS_INDEXDIRS | 236109767Snjl FS_ACLS | FS_MULTILABEL | FS_FLAGS_UPDATED); 237109767Snjl if (fsflags != 0) 238109767Snjl printf("unknown flags (%#x)", fsflags); 23948875Smpp putchar('\n'); 2401558Srgrimes printf("\ncs[].cs_(nbfree,ndir,nifree,nffree):\n\t"); 24171073Siedowse afs.fs_csp = calloc(1, afs.fs_cssize); 242101688Sjmallett if (bread(&disk, fsbtodb(&afs, afs.fs_csaddr), afs.fs_csp, afs.fs_cssize) == -1) 24398542Smckusick goto err; 2441558Srgrimes for (i = 0; i < afs.fs_ncg; i++) { 2451558Srgrimes struct csum *cs = &afs.fs_cs(&afs, i); 2461558Srgrimes if (i && i % 4 == 0) 2471558Srgrimes printf("\n\t"); 2481558Srgrimes printf("(%d,%d,%d,%d) ", 2491558Srgrimes cs->cs_nbfree, cs->cs_ndir, cs->cs_nifree, cs->cs_nffree); 2501558Srgrimes } 2511558Srgrimes printf("\n"); 25298542Smckusick if (fssize % afs.fs_fpg) { 253101688Sjmallett if (disk.d_ufs == 1) 25498542Smckusick printf("cylinders in last group %d\n", 25598542Smckusick howmany(afs.fs_old_size % afs.fs_fpg, 25698542Smckusick afs.fs_old_spc / afs.fs_old_nspf)); 257109532Sjmallett printf("blocks in last group %ld\n\n", 258109532Sjmallett (long)((fssize % afs.fs_fpg) / afs.fs_frag)); 2591558Srgrimes } 260109519Sjmallett while ((i = cgread(&disk)) != 0) { 261109519Sjmallett if (i == -1 || dumpcg()) 2621558Srgrimes goto err; 263109519Sjmallett } 2641558Srgrimes return (0); 2651558Srgrimes 266109525Sjmalletterr: ufserr(name); 2671558Srgrimes return (1); 26899827Sjmallett} 2691558Srgrimes 2701558Srgrimesint 271109519Sjmallettdumpcg(void) 2721558Srgrimes{ 273109532Sjmallett time_t cgtime; 2741558Srgrimes off_t cur; 2751558Srgrimes int i, j; 2761558Srgrimes 277109519Sjmallett printf("\ncg %d:\n", disk.d_lcg); 278109519Sjmallett cur = fsbtodb(&afs, cgtod(&afs, disk.d_lcg)) * disk.d_bsize; 279101688Sjmallett switch (disk.d_ufs) { 280101688Sjmallett case 2: 281109532Sjmallett cgtime = acg.cg_time; 28298542Smckusick printf("magic\t%x\ttell\t%qx\ttime\t%s", 283109532Sjmallett acg.cg_magic, cur, ctime(&cgtime)); 28498542Smckusick printf("cgx\t%d\tndblk\t%d\tniblk\t%d\tinitiblk %d\n", 28598542Smckusick acg.cg_cgx, acg.cg_ndblk, acg.cg_niblk, acg.cg_initediblk); 286101688Sjmallett break; 287101688Sjmallett case 1: 288109532Sjmallett cgtime = acg.cg_old_time; 28998542Smckusick printf("magic\t%x\ttell\t%qx\ttime\t%s", 290109532Sjmallett acg.cg_magic, cur, ctime(&cgtime)); 29198542Smckusick printf("cgx\t%d\tncyl\t%d\tniblk\t%d\tndblk\t%d\n", 29298542Smckusick acg.cg_cgx, acg.cg_old_ncyl, acg.cg_old_niblk, 29398542Smckusick acg.cg_ndblk); 294101688Sjmallett break; 295101688Sjmallett default: 296101688Sjmallett break; 29798542Smckusick } 2981558Srgrimes printf("nbfree\t%d\tndir\t%d\tnifree\t%d\tnffree\t%d\n", 2991558Srgrimes acg.cg_cs.cs_nbfree, acg.cg_cs.cs_ndir, 3001558Srgrimes acg.cg_cs.cs_nifree, acg.cg_cs.cs_nffree); 3011558Srgrimes printf("rotor\t%d\tirotor\t%d\tfrotor\t%d\nfrsum", 3021558Srgrimes acg.cg_rotor, acg.cg_irotor, acg.cg_frotor); 3031558Srgrimes for (i = 1, j = 0; i < afs.fs_frag; i++) { 3041558Srgrimes printf("\t%d", acg.cg_frsum[i]); 3051558Srgrimes j += i * acg.cg_frsum[i]; 3061558Srgrimes } 3071558Srgrimes printf("\nsum of frsum: %d", j); 3081558Srgrimes if (afs.fs_contigsumsize > 0) { 3091558Srgrimes for (i = 1; i < afs.fs_contigsumsize; i++) { 3101558Srgrimes if ((i - 1) % 8 == 0) 3111558Srgrimes printf("\nclusters %d-%d:", i, 3121558Srgrimes afs.fs_contigsumsize - 1 < i + 7 ? 3131558Srgrimes afs.fs_contigsumsize - 1 : i + 7); 3141558Srgrimes printf("\t%d", cg_clustersum(&acg)[i]); 3151558Srgrimes } 3161558Srgrimes printf("\nclusters size %d and over: %d\n", 3171558Srgrimes afs.fs_contigsumsize, 3181558Srgrimes cg_clustersum(&acg)[afs.fs_contigsumsize]); 3191558Srgrimes printf("clusters free:\t"); 3201558Srgrimes pbits(cg_clustersfree(&acg), acg.cg_nclusterblks); 3211558Srgrimes } else 3221558Srgrimes printf("\n"); 32398542Smckusick printf("inodes used:\t"); 3241558Srgrimes pbits(cg_inosused(&acg), afs.fs_ipg); 32598542Smckusick printf("blks free:\t"); 3261558Srgrimes pbits(cg_blksfree(&acg), afs.fs_fpg); 3271558Srgrimes return (0); 32899827Sjmallett} 3291558Srgrimes 330109525Sjmallettint 331109525Sjmallettmarshal(const char *name) 332109525Sjmallett{ 333109525Sjmallett struct fs *fs; 334109525Sjmallett 335109525Sjmallett fs = &disk.d_fs; 336109525Sjmallett 337109525Sjmallett printf("# newfs command for %s (%s)\n", name, disk.d_name); 338109525Sjmallett printf("newfs "); 339109525Sjmallett printf("-O %d ", disk.d_ufs); 340109525Sjmallett if (fs->fs_flags & FS_DOSOFTDEP) 341109525Sjmallett printf("-U "); 342109525Sjmallett printf("-a %d ", fs->fs_maxcontig); 343109525Sjmallett printf("-b %d ", fs->fs_bsize); 344109525Sjmallett /* -c is dumb */ 345109525Sjmallett printf("-d %d ", fs->fs_maxbsize); 346109525Sjmallett printf("-e %d ", fs->fs_maxbpg); 347109525Sjmallett printf("-f %d ", fs->fs_fsize); 348109525Sjmallett printf("-g %d ", fs->fs_avgfilesize); 349109525Sjmallett printf("-h %d ", fs->fs_avgfpdir); 350109525Sjmallett /* -i is dumb */ 351109525Sjmallett /* -j..l unimplemented */ 352109525Sjmallett printf("-m %d ", fs->fs_minfree); 353109525Sjmallett /* -n unimplemented */ 354109525Sjmallett printf("-o "); 355109525Sjmallett switch (fs->fs_optim) { 356109525Sjmallett case FS_OPTSPACE: 357109525Sjmallett printf("space "); 358109525Sjmallett break; 359109525Sjmallett case FS_OPTTIME: 360109525Sjmallett printf("time "); 361109525Sjmallett break; 362109525Sjmallett default: 363109525Sjmallett printf("unknown "); 364109525Sjmallett break; 365109525Sjmallett } 366109525Sjmallett /* -p..r unimplemented */ 367109525Sjmallett printf("-s %jd ", (intmax_t)fs->fs_size); 368109525Sjmallett printf("%s ", disk.d_name); 369109525Sjmallett printf("\n"); 370109525Sjmallett 371109525Sjmallett return 0; 372109525Sjmallett} 373109525Sjmallett 3741558Srgrimesvoid 37592839Simppbits(void *vp, int max) 3761558Srgrimes{ 37792806Sobrien int i; 37892806Sobrien char *p; 3791558Srgrimes int count, j; 3801558Srgrimes 3811558Srgrimes for (count = i = 0, p = vp; i < max; i++) 3821558Srgrimes if (isset(p, i)) { 3831558Srgrimes if (count) 3841558Srgrimes printf(",%s", count % 6 ? " " : "\n\t"); 3851558Srgrimes count++; 3861558Srgrimes printf("%d", i); 3871558Srgrimes j = i; 3881558Srgrimes while ((i+1)<max && isset(p, i+1)) 3891558Srgrimes i++; 3901558Srgrimes if (i != j) 3911558Srgrimes printf("-%d", i); 3921558Srgrimes } 3931558Srgrimes printf("\n"); 3941558Srgrimes} 3951558Srgrimes 3961558Srgrimesvoid 397109525Sjmallettufserr(const char *name) 398109525Sjmallett{ 399109525Sjmallett if (disk.d_error != NULL) 400109525Sjmallett warnx("%s: %s", name, disk.d_error); 401109525Sjmallett else if (errno) 402109525Sjmallett warn("%s", name); 403109525Sjmallett} 404109525Sjmallett 405109525Sjmallettvoid 40692839Simpusage(void) 4071558Srgrimes{ 408109525Sjmallett (void)fprintf(stderr, "usage: dumpfs [-m] filesys | device\n"); 4091558Srgrimes exit(1); 4101558Srgrimes} 411