17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 57c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 67c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 77c478bd9Sstevel@tonic-gate * with the License. 87c478bd9Sstevel@tonic-gate * 97c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 107c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 117c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 127c478bd9Sstevel@tonic-gate * and limitations under the License. 137c478bd9Sstevel@tonic-gate * 147c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 157c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 167c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 177c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 187c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 197c478bd9Sstevel@tonic-gate * 207c478bd9Sstevel@tonic-gate * CDDL HEADER END 217c478bd9Sstevel@tonic-gate */ 227c478bd9Sstevel@tonic-gate /* 23*d49934b4Sdmick * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 277c478bd9Sstevel@tonic-gate /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 287c478bd9Sstevel@tonic-gate /* All Rights Reserved */ 297c478bd9Sstevel@tonic-gate 307c478bd9Sstevel@tonic-gate /* 317c478bd9Sstevel@tonic-gate * University Copyright- Copyright (c) 1982, 1986, 1988 327c478bd9Sstevel@tonic-gate * The Regents of the University of California 337c478bd9Sstevel@tonic-gate * All Rights Reserved 347c478bd9Sstevel@tonic-gate * 357c478bd9Sstevel@tonic-gate * University Acknowledgment- Portions of this document are derived from 367c478bd9Sstevel@tonic-gate * software developed by the University of California, Berkeley, and its 377c478bd9Sstevel@tonic-gate * contributors. 387c478bd9Sstevel@tonic-gate */ 397c478bd9Sstevel@tonic-gate 407c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 417c478bd9Sstevel@tonic-gate 427c478bd9Sstevel@tonic-gate /* 437c478bd9Sstevel@tonic-gate * fstyp 447c478bd9Sstevel@tonic-gate */ 457c478bd9Sstevel@tonic-gate #include <stdio.h> 467c478bd9Sstevel@tonic-gate #include <stdlib.h> 477c478bd9Sstevel@tonic-gate #include <unistd.h> 487c478bd9Sstevel@tonic-gate #include <locale.h> 497c478bd9Sstevel@tonic-gate #include <fcntl.h> 507c478bd9Sstevel@tonic-gate #include <errno.h> 517c478bd9Sstevel@tonic-gate #include <strings.h> 527c478bd9Sstevel@tonic-gate 537c478bd9Sstevel@tonic-gate #include <sys/param.h> 547c478bd9Sstevel@tonic-gate #include <sys/types.h> 557c478bd9Sstevel@tonic-gate #include <sys/mntent.h> 567c478bd9Sstevel@tonic-gate #include <sys/errno.h> 577c478bd9Sstevel@tonic-gate #include <sys/fs/ufs_fs.h> 587c478bd9Sstevel@tonic-gate #include <sys/stat.h> 597c478bd9Sstevel@tonic-gate #include <sys/vfs.h> 607c478bd9Sstevel@tonic-gate #include <sys/mnttab.h> 617c478bd9Sstevel@tonic-gate 627c478bd9Sstevel@tonic-gate #include <sys/fs/ufs_log.h> 637c478bd9Sstevel@tonic-gate #include <sys/inttypes.h> 647c478bd9Sstevel@tonic-gate 657c478bd9Sstevel@tonic-gate #define MAXLABELS 20 667c478bd9Sstevel@tonic-gate #define LINEMAX 256 677c478bd9Sstevel@tonic-gate #define NRPOS 8 /* for pre FFFS compatibility */ 687c478bd9Sstevel@tonic-gate 697c478bd9Sstevel@tonic-gate static int vflag = 0; /* verbose output */ 707c478bd9Sstevel@tonic-gate static int errflag = 0; 717c478bd9Sstevel@tonic-gate static char *special; 727c478bd9Sstevel@tonic-gate 737c478bd9Sstevel@tonic-gate static void usage(void); 747c478bd9Sstevel@tonic-gate static int dumpfs(const char *name); 757c478bd9Sstevel@tonic-gate static void dumpcg(const char *name, const int c); 767c478bd9Sstevel@tonic-gate static void pbits(const void *cp, const int max); 777c478bd9Sstevel@tonic-gate 787c478bd9Sstevel@tonic-gate static void dumplog(const char *name); 797c478bd9Sstevel@tonic-gate 807c478bd9Sstevel@tonic-gate extern char *getfullrawname(); 817c478bd9Sstevel@tonic-gate 827c478bd9Sstevel@tonic-gate int 837c478bd9Sstevel@tonic-gate main(int argc, char *argv[]) 847c478bd9Sstevel@tonic-gate { 857c478bd9Sstevel@tonic-gate int c; 867c478bd9Sstevel@tonic-gate struct stat64 st; 877c478bd9Sstevel@tonic-gate char device[MAXPATHLEN]; 887c478bd9Sstevel@tonic-gate 897c478bd9Sstevel@tonic-gate (void) setlocale(LC_ALL, ""); 907c478bd9Sstevel@tonic-gate #if !defined(TEXT_DOMAIN) 917c478bd9Sstevel@tonic-gate #define TEXT_DOMAIN "SYS_TEST" 927c478bd9Sstevel@tonic-gate #endif 937c478bd9Sstevel@tonic-gate (void) textdomain(TEXT_DOMAIN); 947c478bd9Sstevel@tonic-gate 957c478bd9Sstevel@tonic-gate while ((c = getopt(argc, argv, "v")) != EOF) { 967c478bd9Sstevel@tonic-gate switch (c) { 977c478bd9Sstevel@tonic-gate case 'v': /* dump super block */ 987c478bd9Sstevel@tonic-gate vflag++; 997c478bd9Sstevel@tonic-gate break; 1007c478bd9Sstevel@tonic-gate 1017c478bd9Sstevel@tonic-gate case '?': 1027c478bd9Sstevel@tonic-gate errflag++; 1037c478bd9Sstevel@tonic-gate } 1047c478bd9Sstevel@tonic-gate } 1057c478bd9Sstevel@tonic-gate if (errflag || argc <= optind) { 1067c478bd9Sstevel@tonic-gate usage(); 1077c478bd9Sstevel@tonic-gate return (31+1); 1087c478bd9Sstevel@tonic-gate } 1097c478bd9Sstevel@tonic-gate 1107c478bd9Sstevel@tonic-gate /* 1117c478bd9Sstevel@tonic-gate * insure that the special device is raw since > 32-bit seeks 1127c478bd9Sstevel@tonic-gate * will not work with block devices (bugs 1248701 and 4045593). 1137c478bd9Sstevel@tonic-gate */ 1147c478bd9Sstevel@tonic-gate 1157c478bd9Sstevel@tonic-gate special = getfullrawname(argv[optind]); 1167c478bd9Sstevel@tonic-gate if (special == NULL) { 1177c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext("fstyp: malloc failed\n")); 1187c478bd9Sstevel@tonic-gate exit(31+1); 1197c478bd9Sstevel@tonic-gate } 1207c478bd9Sstevel@tonic-gate 1217c478bd9Sstevel@tonic-gate if (*special == '\0') { 1227c478bd9Sstevel@tonic-gate if (strchr(argv[optind], '/') != NULL) { 1237c478bd9Sstevel@tonic-gate if (stat64(argv[optind], &st) < 0) { 1247c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "fstyp: %s: %s\n", 1257c478bd9Sstevel@tonic-gate argv[optind], strerror(errno)); 1267c478bd9Sstevel@tonic-gate usage(); 1277c478bd9Sstevel@tonic-gate exit(31+1); 1287c478bd9Sstevel@tonic-gate } 1297c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 1307c478bd9Sstevel@tonic-gate gettext("%s: not a raw disk device\n"), 1317c478bd9Sstevel@tonic-gate argv[optind]); 1327c478bd9Sstevel@tonic-gate usage(); 1337c478bd9Sstevel@tonic-gate exit(31+1); 1347c478bd9Sstevel@tonic-gate } 1357c478bd9Sstevel@tonic-gate (void) snprintf(device, MAXPATHLEN, "/dev/rdsk/%s", 1367c478bd9Sstevel@tonic-gate argv[optind]); 1377c478bd9Sstevel@tonic-gate if ((special = getfullrawname(device)) == NULL) { 1387c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 1397c478bd9Sstevel@tonic-gate gettext("fstyp: malloc failed\n")); 1407c478bd9Sstevel@tonic-gate exit(31+1); 1417c478bd9Sstevel@tonic-gate } 1427c478bd9Sstevel@tonic-gate 1437c478bd9Sstevel@tonic-gate if (*special == '\0') { 1447c478bd9Sstevel@tonic-gate (void) snprintf(device, MAXPATHLEN, "/dev/%s", 1457c478bd9Sstevel@tonic-gate argv[optind]); 1467c478bd9Sstevel@tonic-gate if ((special = getfullrawname(device)) == NULL) { 1477c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 1487c478bd9Sstevel@tonic-gate gettext("fstyp: malloc failed\n")); 1497c478bd9Sstevel@tonic-gate exit(31+1); 1507c478bd9Sstevel@tonic-gate } 1517c478bd9Sstevel@tonic-gate if (*special == '\0') { 1527c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 1537c478bd9Sstevel@tonic-gate gettext("%s: not a raw disk device\n"), 1547c478bd9Sstevel@tonic-gate argv[optind]); 1557c478bd9Sstevel@tonic-gate usage(); 1567c478bd9Sstevel@tonic-gate exit(31+1); 1577c478bd9Sstevel@tonic-gate } 1587c478bd9Sstevel@tonic-gate } 1597c478bd9Sstevel@tonic-gate } 1607c478bd9Sstevel@tonic-gate 1617c478bd9Sstevel@tonic-gate return (dumpfs(special)); 1627c478bd9Sstevel@tonic-gate } 1637c478bd9Sstevel@tonic-gate 1647c478bd9Sstevel@tonic-gate 1657c478bd9Sstevel@tonic-gate static void 1667c478bd9Sstevel@tonic-gate usage(void) 1677c478bd9Sstevel@tonic-gate { 1687c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext("ufs usage: fstyp [-v] special\n")); 1697c478bd9Sstevel@tonic-gate } 1707c478bd9Sstevel@tonic-gate 1717c478bd9Sstevel@tonic-gate static union { 1727c478bd9Sstevel@tonic-gate struct fs fs; 1737c478bd9Sstevel@tonic-gate char pad[MAXBSIZE]; 1747c478bd9Sstevel@tonic-gate } fsun; 1757c478bd9Sstevel@tonic-gate #define afs fsun.fs 1767c478bd9Sstevel@tonic-gate 1777c478bd9Sstevel@tonic-gate static union { 1787c478bd9Sstevel@tonic-gate struct cg cg; 1797c478bd9Sstevel@tonic-gate char pad[MAXBSIZE]; 1807c478bd9Sstevel@tonic-gate } cgun; 1817c478bd9Sstevel@tonic-gate #define acg cgun.cg 1827c478bd9Sstevel@tonic-gate 1837c478bd9Sstevel@tonic-gate char eg[MAXBSIZE]; 1847c478bd9Sstevel@tonic-gate 1857c478bd9Sstevel@tonic-gate static int 1867c478bd9Sstevel@tonic-gate dumpfs(const char *name) 1877c478bd9Sstevel@tonic-gate { 1887c478bd9Sstevel@tonic-gate int c, i, j, k, size, nrpos; 1897c478bd9Sstevel@tonic-gate struct fs *fsp; 1907c478bd9Sstevel@tonic-gate offset_t offset; 1917c478bd9Sstevel@tonic-gate caddr_t sip; 1927c478bd9Sstevel@tonic-gate time_t t; 1937c478bd9Sstevel@tonic-gate 1947c478bd9Sstevel@tonic-gate (void) close(0); 1957c478bd9Sstevel@tonic-gate if (open64(name, 0) != 0) { 1967c478bd9Sstevel@tonic-gate perror(name); 1977c478bd9Sstevel@tonic-gate return (1); 1987c478bd9Sstevel@tonic-gate } 199*d49934b4Sdmick (void) llseek(0, (offset_t)SBLOCK * DEV_BSIZE, 0); 2007c478bd9Sstevel@tonic-gate if (read(0, &afs, SBSIZE) != SBSIZE) { 2017c478bd9Sstevel@tonic-gate perror(name); 2027c478bd9Sstevel@tonic-gate return (1); 2037c478bd9Sstevel@tonic-gate } 2047c478bd9Sstevel@tonic-gate if ((afs.fs_magic != FS_MAGIC) && (afs.fs_magic != MTB_UFS_MAGIC)) 2057c478bd9Sstevel@tonic-gate return (31+1); 2067c478bd9Sstevel@tonic-gate if ((afs.fs_magic == MTB_UFS_MAGIC) && 2077c478bd9Sstevel@tonic-gate (afs.fs_version > MTB_UFS_VERSION_1 || 2087c478bd9Sstevel@tonic-gate afs.fs_version < MTB_UFS_VERSION_MIN)) 2097c478bd9Sstevel@tonic-gate return (31+1); 210*d49934b4Sdmick (void) printf("%s\n", "ufs"); 2117c478bd9Sstevel@tonic-gate if (!vflag) 2127c478bd9Sstevel@tonic-gate return (0); 2137c478bd9Sstevel@tonic-gate fsp = &afs; 2147c478bd9Sstevel@tonic-gate t = (time_t)afs.fs_time; 215*d49934b4Sdmick (void) printf("magic\t%x\tformat\t%s\ttime\t%s", afs.fs_magic, 2167c478bd9Sstevel@tonic-gate afs.fs_postblformat == FS_42POSTBLFMT ? "static" : "dynamic", 2177c478bd9Sstevel@tonic-gate ctime(&t)); 218*d49934b4Sdmick (void) printf("sblkno\t%d\tcblkno\t%d\tiblkno\t%d\tdblkno\t%d\n", 2197c478bd9Sstevel@tonic-gate afs.fs_sblkno, afs.fs_cblkno, afs.fs_iblkno, afs.fs_dblkno); 220*d49934b4Sdmick (void) printf("sbsize\t%d\tcgsize\t%d\tcgoffset %d\tcgmask\t0x%08x\n", 2217c478bd9Sstevel@tonic-gate afs.fs_sbsize, afs.fs_cgsize, afs.fs_cgoffset, afs.fs_cgmask); 222*d49934b4Sdmick (void) printf("ncg\t%d\tsize\t%d\tblocks\t%d\n", 2237c478bd9Sstevel@tonic-gate afs.fs_ncg, afs.fs_size, afs.fs_dsize); 224*d49934b4Sdmick (void) printf("bsize\t%d\tshift\t%d\tmask\t0x%08x\n", 2257c478bd9Sstevel@tonic-gate afs.fs_bsize, afs.fs_bshift, afs.fs_bmask); 226*d49934b4Sdmick (void) printf("fsize\t%d\tshift\t%d\tmask\t0x%08x\n", 2277c478bd9Sstevel@tonic-gate afs.fs_fsize, afs.fs_fshift, afs.fs_fmask); 228*d49934b4Sdmick (void) printf("frag\t%d\tshift\t%d\tfsbtodb\t%d\n", 2297c478bd9Sstevel@tonic-gate afs.fs_frag, afs.fs_fragshift, afs.fs_fsbtodb); 230*d49934b4Sdmick (void) printf("minfree\t%d%%\tmaxbpg\t%d\toptim\t%s\n", 2317c478bd9Sstevel@tonic-gate afs.fs_minfree, afs.fs_maxbpg, 2327c478bd9Sstevel@tonic-gate afs.fs_optim == FS_OPTSPACE ? "space" : "time"); 233*d49934b4Sdmick (void) printf("maxcontig %d\trotdelay %dms\trps\t%d\n", 2347c478bd9Sstevel@tonic-gate afs.fs_maxcontig, afs.fs_rotdelay, afs.fs_rps); 235*d49934b4Sdmick (void) printf("csaddr\t%d\tcssize\t%d\tshift\t%d\tmask\t0x%08x\n", 2367c478bd9Sstevel@tonic-gate afs.fs_csaddr, afs.fs_cssize, afs.fs_csshift, afs.fs_csmask); 237*d49934b4Sdmick (void) printf("ntrak\t%d\tnsect\t%d\tspc\t%d\tncyl\t%d\n", 2387c478bd9Sstevel@tonic-gate afs.fs_ntrak, afs.fs_nsect, afs.fs_spc, afs.fs_ncyl); 239*d49934b4Sdmick (void) printf("cpg\t%d\tbpg\t%d\tfpg\t%d\tipg\t%d\n", 2407c478bd9Sstevel@tonic-gate afs.fs_cpg, afs.fs_fpg / afs.fs_frag, afs.fs_fpg, afs.fs_ipg); 241*d49934b4Sdmick (void) printf("nindir\t%d\tinopb\t%d\tnspf\t%d\n", 2427c478bd9Sstevel@tonic-gate afs.fs_nindir, afs.fs_inopb, afs.fs_nspf); 243*d49934b4Sdmick (void) printf("nbfree\t%d\tndir\t%d\tnifree\t%d\tnffree\t%d\n", 2447c478bd9Sstevel@tonic-gate afs.fs_cstotal.cs_nbfree, afs.fs_cstotal.cs_ndir, 2457c478bd9Sstevel@tonic-gate afs.fs_cstotal.cs_nifree, afs.fs_cstotal.cs_nffree); 246*d49934b4Sdmick (void) printf("cgrotor\t%d\tfmod\t%d\tronly\t%d\tlogbno\t%d\n", 2477c478bd9Sstevel@tonic-gate afs.fs_cgrotor, afs.fs_fmod, afs.fs_ronly, afs.fs_logbno); 248*d49934b4Sdmick (void) printf("version\t%d\n", afs.fs_version); 2497c478bd9Sstevel@tonic-gate if (afs.fs_reclaim & (FS_RECLAIM | FS_RECLAIMING)) { 250*d49934b4Sdmick (void) printf("fs_reclaim%s%s\n", 2517c478bd9Sstevel@tonic-gate (afs.fs_reclaim & FS_RECLAIM) ? " FS_RECLAIM" : "", 2527c478bd9Sstevel@tonic-gate (afs.fs_reclaim & FS_RECLAIMING) ? " FS_RECLAIMING" : ""); 2537c478bd9Sstevel@tonic-gate } else { 254*d49934b4Sdmick (void) printf("fs_reclaim is not set\n"); 2557c478bd9Sstevel@tonic-gate } 2567c478bd9Sstevel@tonic-gate if (afs.fs_state + (long)afs.fs_time == FSOKAY) { 257*d49934b4Sdmick (void) printf(gettext( 258*d49934b4Sdmick "file system state is valid, fsclean is %d\n"), 2597c478bd9Sstevel@tonic-gate afs.fs_clean); 2607c478bd9Sstevel@tonic-gate } else { 261*d49934b4Sdmick (void) printf(gettext("file system state is not valid\n")); 2627c478bd9Sstevel@tonic-gate } 2637c478bd9Sstevel@tonic-gate if (afs.fs_cpc != 0) { 264*d49934b4Sdmick (void) printf(gettext( 265*d49934b4Sdmick "blocks available in each rotational position")); 2667c478bd9Sstevel@tonic-gate } else { 267*d49934b4Sdmick (void) printf(gettext( 2687c478bd9Sstevel@tonic-gate "insufficient space to maintain rotational tables\n")); 2697c478bd9Sstevel@tonic-gate } 2707c478bd9Sstevel@tonic-gate for (c = 0; c < afs.fs_cpc; c++) { 271*d49934b4Sdmick (void) printf(gettext("\ncylinder number %d:"), c); 2727c478bd9Sstevel@tonic-gate nrpos = (((fsp)->fs_postblformat == FS_DYNAMICPOSTBLFMT) ? 2737c478bd9Sstevel@tonic-gate (fsp)->fs_nrpos : NRPOS); 2747c478bd9Sstevel@tonic-gate for (i = 0; i < nrpos; i++) { 2757c478bd9Sstevel@tonic-gate if (fs_postbl(fsp, c)[i] == -1) 2767c478bd9Sstevel@tonic-gate continue; 277*d49934b4Sdmick (void) printf(gettext("\n position %d:\t"), i); 2787c478bd9Sstevel@tonic-gate /*CSTYLED*/ 2797c478bd9Sstevel@tonic-gate for (j = fs_postbl(fsp, c)[i], k = 1; ; 2807c478bd9Sstevel@tonic-gate j += fs_rotbl(fsp)[j], k++) { 281*d49934b4Sdmick (void) printf("%5d", j); 2827c478bd9Sstevel@tonic-gate if (k % 12 == 0) 283*d49934b4Sdmick (void) printf("\n\t\t"); 2847c478bd9Sstevel@tonic-gate if ((fs_rotbl(fsp))[j] == 0) 2857c478bd9Sstevel@tonic-gate break; 2867c478bd9Sstevel@tonic-gate } 2877c478bd9Sstevel@tonic-gate } 2887c478bd9Sstevel@tonic-gate } 289*d49934b4Sdmick (void) printf("\ncs[].cs_(nbfree,ndir,nifree,nffree):\n\t"); 2907c478bd9Sstevel@tonic-gate sip = calloc(1, afs.fs_cssize); 291*d49934b4Sdmick /* void * cast is to convince lint that sip really is aligned */ 292*d49934b4Sdmick afs.fs_u.fs_csp = (struct csum *)(void *)sip; 2937c478bd9Sstevel@tonic-gate for (i = 0, j = 0; i < afs.fs_cssize; i += afs.fs_bsize, j++) { 2947c478bd9Sstevel@tonic-gate size = afs.fs_cssize - i < afs.fs_bsize ? 2957c478bd9Sstevel@tonic-gate afs.fs_cssize - i : afs.fs_bsize; 2967c478bd9Sstevel@tonic-gate offset = (offset_t)fsbtodb( 2977c478bd9Sstevel@tonic-gate &afs, (afs.fs_csaddr + j * afs.fs_frag)) * DEV_BSIZE; 298*d49934b4Sdmick (void) llseek(0, offset, 0); 2997c478bd9Sstevel@tonic-gate if (read(0, sip, size) != size) { 3007c478bd9Sstevel@tonic-gate perror(name); 3017c478bd9Sstevel@tonic-gate return (1); 3027c478bd9Sstevel@tonic-gate } 3037c478bd9Sstevel@tonic-gate sip += size; 3047c478bd9Sstevel@tonic-gate } 3057c478bd9Sstevel@tonic-gate for (i = 0; i < afs.fs_ncg; i++) { 3067c478bd9Sstevel@tonic-gate struct csum *cs = &afs.fs_cs(&afs, i); 3077c478bd9Sstevel@tonic-gate if (i && i % 4 == 0) 308*d49934b4Sdmick (void) printf("\n\t"); 309*d49934b4Sdmick (void) printf("(%d,%d,%d,%d) ", 3107c478bd9Sstevel@tonic-gate cs->cs_nbfree, cs->cs_ndir, cs->cs_nifree, cs->cs_nffree); 3117c478bd9Sstevel@tonic-gate } 312*d49934b4Sdmick (void) printf("\n"); 3137c478bd9Sstevel@tonic-gate if (afs.fs_ncyl % afs.fs_cpg) { 314*d49934b4Sdmick (void) printf(gettext("cylinders in last group %d\n"), 3157c478bd9Sstevel@tonic-gate i = afs.fs_ncyl % afs.fs_cpg); 316*d49934b4Sdmick (void) printf(gettext("blocks in last group %d\n"), 3177c478bd9Sstevel@tonic-gate i * afs.fs_spc / NSPB(&afs)); 3187c478bd9Sstevel@tonic-gate } 319*d49934b4Sdmick (void) printf("\n"); 3207c478bd9Sstevel@tonic-gate for (i = 0; i < afs.fs_ncg; i++) 3217c478bd9Sstevel@tonic-gate dumpcg(name, i); 3227c478bd9Sstevel@tonic-gate if (afs.fs_logbno) 3237c478bd9Sstevel@tonic-gate dumplog(name); 3247c478bd9Sstevel@tonic-gate (void) close(0); 3257c478bd9Sstevel@tonic-gate return (0); 3267c478bd9Sstevel@tonic-gate } 3277c478bd9Sstevel@tonic-gate 3287c478bd9Sstevel@tonic-gate static void 3297c478bd9Sstevel@tonic-gate setsum(int32_t *sp, int32_t *lp, int nb) 3307c478bd9Sstevel@tonic-gate { 3317c478bd9Sstevel@tonic-gate int32_t csum = 0; 3327c478bd9Sstevel@tonic-gate 3337c478bd9Sstevel@tonic-gate *sp = 0; 3347c478bd9Sstevel@tonic-gate nb /= sizeof (int32_t); 3357c478bd9Sstevel@tonic-gate while (nb--) 3367c478bd9Sstevel@tonic-gate csum += *lp++; 3377c478bd9Sstevel@tonic-gate *sp = csum; 3387c478bd9Sstevel@tonic-gate } 3397c478bd9Sstevel@tonic-gate 3407c478bd9Sstevel@tonic-gate static int 3417c478bd9Sstevel@tonic-gate checksum(int32_t *sp, int32_t *lp, int nb) 3427c478bd9Sstevel@tonic-gate { 3437c478bd9Sstevel@tonic-gate int32_t ssum = *sp; 3447c478bd9Sstevel@tonic-gate 3457c478bd9Sstevel@tonic-gate setsum(sp, lp, nb); 3467c478bd9Sstevel@tonic-gate if (ssum != *sp) { 3477c478bd9Sstevel@tonic-gate *sp = ssum; 3487c478bd9Sstevel@tonic-gate return (0); 3497c478bd9Sstevel@tonic-gate } 3507c478bd9Sstevel@tonic-gate return (1); 3517c478bd9Sstevel@tonic-gate } 3527c478bd9Sstevel@tonic-gate 3537c478bd9Sstevel@tonic-gate static void 3547c478bd9Sstevel@tonic-gate dumplog(const char *name) 3557c478bd9Sstevel@tonic-gate { 3567c478bd9Sstevel@tonic-gate int i; 3577c478bd9Sstevel@tonic-gate long tb = 0; 3587c478bd9Sstevel@tonic-gate extent_block_t *ebp; 3597c478bd9Sstevel@tonic-gate extent_t *ep; 3607c478bd9Sstevel@tonic-gate ml_odunit_t *ud; 3617c478bd9Sstevel@tonic-gate 362*d49934b4Sdmick (void) printf("\nlog\n"); 3637c478bd9Sstevel@tonic-gate if (afs.fs_magic == FS_MAGIC) 364*d49934b4Sdmick (void) printf("log allocation block %d\n", afs.fs_logbno); 3657c478bd9Sstevel@tonic-gate else 366*d49934b4Sdmick (void) printf("log allocation block (in frags) %d\n", 367*d49934b4Sdmick afs.fs_logbno); 3687c478bd9Sstevel@tonic-gate (void) llseek(0, (offset_t)logbtodb(&afs, afs.fs_logbno) * DEV_BSIZE, 3697c478bd9Sstevel@tonic-gate 0); 3707c478bd9Sstevel@tonic-gate if (read(0, (char *)&eg, afs.fs_bsize) != afs.fs_bsize) { 371*d49934b4Sdmick (void) printf(gettext( 3727c478bd9Sstevel@tonic-gate "dumplog: %s: error reading log allocation\n"), 3737c478bd9Sstevel@tonic-gate name); 3747c478bd9Sstevel@tonic-gate return; 3757c478bd9Sstevel@tonic-gate } 3767c478bd9Sstevel@tonic-gate ebp = (void *)eg; 3777c478bd9Sstevel@tonic-gate if (ebp->type != LUFS_EXTENTS) 378*d49934b4Sdmick (void) printf(gettext("Invalid log allocation type %x\n"), 379*d49934b4Sdmick ebp->type); 3807c478bd9Sstevel@tonic-gate if (!checksum(&ebp->chksum, (int32_t *)ebp, afs.fs_bsize)) 381*d49934b4Sdmick (void) printf(gettext("Invalid log checksum\n")); 3827c478bd9Sstevel@tonic-gate 3837c478bd9Sstevel@tonic-gate for (i = 0, ep = &ebp->extents[0]; i < ebp->nextents; ++i, ++ep) { 384*d49934b4Sdmick (void) printf("\tlogical block\t%" PRId32 3857c478bd9Sstevel@tonic-gate "\tphysical block\t%" PRId32 3867c478bd9Sstevel@tonic-gate "\tblocks\t%" PRId32 "\n", 3877c478bd9Sstevel@tonic-gate ep->lbno, ep->pbno, ep->nbno); 3887c478bd9Sstevel@tonic-gate tb += dbtob(ep->nbno); 3897c478bd9Sstevel@tonic-gate } 390*d49934b4Sdmick (void) printf("log size %" PRIu32 " bytes (%ld calculated)\n", 3917c478bd9Sstevel@tonic-gate ebp->nbytes, tb); 392*d49934b4Sdmick (void) printf("\n"); 3937c478bd9Sstevel@tonic-gate ep = &ebp->extents[0]; 3947c478bd9Sstevel@tonic-gate (void) llseek(0, (offset_t)logbtodb(&afs, ep->pbno) * DEV_BSIZE, 0); 3957c478bd9Sstevel@tonic-gate if (read(0, (char *)&eg, dbtob(LS_SECTORS)) != dbtob(LS_SECTORS)) { 396*d49934b4Sdmick (void) printf(gettext( 3977c478bd9Sstevel@tonic-gate "dumplog: %s: error reading log state\n"), name); 3987c478bd9Sstevel@tonic-gate return; 3997c478bd9Sstevel@tonic-gate } 4007c478bd9Sstevel@tonic-gate ud = (void *)⪚ 401*d49934b4Sdmick (void) printf("version\t\t%" PRIu32 "\t\t", ud->od_version); 4027c478bd9Sstevel@tonic-gate if (ud->od_badlog) 403*d49934b4Sdmick (void) printf("logstate\tError\n"); 4047c478bd9Sstevel@tonic-gate else 405*d49934b4Sdmick (void) printf("logstate\tOkay\n"); 406*d49934b4Sdmick (void) printf("bol\t\t%" PRId32 "\t\teol\t\t%" PRId32 "\n", 4077c478bd9Sstevel@tonic-gate ud->od_bol_lof, ud->od_eol_lof); 408*d49934b4Sdmick (void) printf("requestsize\t%" PRIu32 "\n", ud->od_requestsize); 409*d49934b4Sdmick (void) printf("statesize\t%" PRIu32 "\n", ud->od_statesize); 410*d49934b4Sdmick (void) printf("logsize\t\t%" PRIu32 "\n", ud->od_logsize); 411*d49934b4Sdmick (void) printf("maxtransfer\t%" PRIu32 "\t\tdevbsize\t%" PRIu32 "\n", 4127c478bd9Sstevel@tonic-gate ud->od_maxtransfer, ud->od_devbsize); 413*d49934b4Sdmick (void) printf("head\t\t%" PRId32 "\t\thead ident\t%#" PRIx32 "\n", 4147c478bd9Sstevel@tonic-gate ud->od_head_lof, ud->od_head_ident); 415*d49934b4Sdmick (void) printf("tail\t\t%" PRId32 "\t\ttail ident\t%#" PRIx32 "\n", 4167c478bd9Sstevel@tonic-gate ud->od_tail_lof, ud->od_tail_ident); 417*d49934b4Sdmick (void) printf("\t\t\t\tdebug\t\t%#" PRIx32 "\n", ud->od_debug); 4187c478bd9Sstevel@tonic-gate if (ud->od_head_ident + ud->od_tail_ident != ud->od_chksum) 419*d49934b4Sdmick (void) printf("Bad chksum\t%#" PRIx32 "\n", ud->od_chksum); 4207c478bd9Sstevel@tonic-gate else 421*d49934b4Sdmick (void) printf("Good chksum\t%#" PRIx32 "\n", ud->od_chksum); 4227c478bd9Sstevel@tonic-gate } 4237c478bd9Sstevel@tonic-gate 4247c478bd9Sstevel@tonic-gate static void 4257c478bd9Sstevel@tonic-gate dumpcg(const char *name, const int c) 4267c478bd9Sstevel@tonic-gate { 4277c478bd9Sstevel@tonic-gate int i, j; 4287c478bd9Sstevel@tonic-gate offset_t off; 4297c478bd9Sstevel@tonic-gate struct cg *cgp; 4307c478bd9Sstevel@tonic-gate struct ocg *ocgp; 4317c478bd9Sstevel@tonic-gate struct fs *fsp; 4327c478bd9Sstevel@tonic-gate time_t t; 4337c478bd9Sstevel@tonic-gate 434*d49934b4Sdmick (void) printf("\ncg %d:\n", c); 4357c478bd9Sstevel@tonic-gate off = llseek(0, (offset_t)fsbtodb(&afs, cgtod(&afs, c)) * DEV_BSIZE, 0); 4367c478bd9Sstevel@tonic-gate if (read(0, (char *)&acg, afs.fs_bsize) != afs.fs_bsize) { 437*d49934b4Sdmick (void) printf(gettext("dumpfs: %s: error reading cg\n"), name); 4387c478bd9Sstevel@tonic-gate return; 4397c478bd9Sstevel@tonic-gate } 4407c478bd9Sstevel@tonic-gate cgp = (struct cg *)&acg; 4417c478bd9Sstevel@tonic-gate ocgp = (struct ocg *)&acg; 4427c478bd9Sstevel@tonic-gate fsp = &afs; 4437c478bd9Sstevel@tonic-gate if (!cg_chkmagic(cgp)) 444*d49934b4Sdmick (void) printf(gettext( 445*d49934b4Sdmick "Invalid Cylinder grp magic fffs:%x 4.2 fs:%x\n"), 4467c478bd9Sstevel@tonic-gate cgp->cg_magic, ocgp->cg_magic); 4477c478bd9Sstevel@tonic-gate if (cgp->cg_magic == CG_MAGIC) { 4487c478bd9Sstevel@tonic-gate /* print FFFS 4.3 cyl grp format. */ 4497c478bd9Sstevel@tonic-gate t = (time_t)cgp->cg_time; 450*d49934b4Sdmick (void) printf("magic\t%x\ttell\t%llx\ttime\t%s", 451*d49934b4Sdmick cgp->cg_magic, off, ctime(&t)); /* *** */ 452*d49934b4Sdmick (void) printf("cgx\t%d\tncyl\t%d\tniblk\t%d\tndblk\t%d\n", 4537c478bd9Sstevel@tonic-gate cgp->cg_cgx, cgp->cg_ncyl, cgp->cg_niblk, cgp->cg_ndblk); 454*d49934b4Sdmick (void) printf("nbfree\t%d\tndir\t%d\tnifree\t%d\tnffree\t%d\n", 4557c478bd9Sstevel@tonic-gate cgp->cg_cs.cs_nbfree, cgp->cg_cs.cs_ndir, 4567c478bd9Sstevel@tonic-gate cgp->cg_cs.cs_nifree, cgp->cg_cs.cs_nffree); 457*d49934b4Sdmick (void) printf("rotor\t%d\tirotor\t%d\tfrotor\t%d\nfrsum", 4587c478bd9Sstevel@tonic-gate cgp->cg_rotor, cgp->cg_irotor, cgp->cg_frotor); 4597c478bd9Sstevel@tonic-gate for (i = 1, j = 0; i < afs.fs_frag; i++) { 460*d49934b4Sdmick (void) printf("\t%d", cgp->cg_frsum[i]); 4617c478bd9Sstevel@tonic-gate j += i * cgp->cg_frsum[i]; 4627c478bd9Sstevel@tonic-gate } 463*d49934b4Sdmick (void) printf(gettext("\nsum of frsum: %d\niused:\t"), j); 4647c478bd9Sstevel@tonic-gate pbits(cg_inosused(cgp), afs.fs_ipg); 465*d49934b4Sdmick (void) printf(gettext("free:\t")); 4667c478bd9Sstevel@tonic-gate pbits(cg_blksfree(cgp), afs.fs_fpg); 467*d49934b4Sdmick (void) printf("b:\n"); 4687c478bd9Sstevel@tonic-gate for (i = 0; i < afs.fs_cpg; i++) { 469*d49934b4Sdmick (void) printf(" c%d:\t(%d)\t", i, cg_blktot(cgp)[i]); 4707c478bd9Sstevel@tonic-gate for (j = 0; j < fsp->fs_nrpos; j++) /* ****** */ 471*d49934b4Sdmick (void) printf(" %d", cg_blks(fsp, cgp, i)[j]); 472*d49934b4Sdmick (void) printf("\n"); 4737c478bd9Sstevel@tonic-gate } 4747c478bd9Sstevel@tonic-gate } else if (ocgp->cg_magic == CG_MAGIC) { 4757c478bd9Sstevel@tonic-gate /* print Old cyl grp format. */ 4767c478bd9Sstevel@tonic-gate t = (time_t)ocgp->cg_time; 477*d49934b4Sdmick (void) printf("magic\t%x\ttell\t%llx\ttime\t%s", 478*d49934b4Sdmick ocgp->cg_magic, off, ctime(&t)); 479*d49934b4Sdmick (void) printf("cgx\t%d\tncyl\t%d\tniblk\t%d\tndblk\t%d\n", 4807c478bd9Sstevel@tonic-gate ocgp->cg_cgx, ocgp->cg_ncyl, ocgp->cg_niblk, 4817c478bd9Sstevel@tonic-gate ocgp->cg_ndblk); 482*d49934b4Sdmick (void) printf("nbfree\t%d\tndir\t%d\tnifree\t%d\tnffree\t%d\n", 4837c478bd9Sstevel@tonic-gate ocgp->cg_cs.cs_nbfree, ocgp->cg_cs.cs_ndir, 4847c478bd9Sstevel@tonic-gate ocgp->cg_cs.cs_nifree, ocgp->cg_cs.cs_nffree); 485*d49934b4Sdmick (void) printf("rotor\t%d\tirotor\t%d\tfrotor\t%d\nfrsum", 4867c478bd9Sstevel@tonic-gate ocgp->cg_rotor, ocgp->cg_irotor, ocgp->cg_frotor); 4877c478bd9Sstevel@tonic-gate for (i = 1, j = 0; i < afs.fs_frag; i++) { 488*d49934b4Sdmick (void) printf("\t%d", ocgp->cg_frsum[i]); 4897c478bd9Sstevel@tonic-gate j += i * ocgp->cg_frsum[i]; 4907c478bd9Sstevel@tonic-gate } 491*d49934b4Sdmick (void) printf(gettext("\nsum of frsum: %d\niused:\t"), j); 4927c478bd9Sstevel@tonic-gate pbits(ocgp->cg_iused, afs.fs_ipg); 493*d49934b4Sdmick (void) printf(gettext("free:\t")); 4947c478bd9Sstevel@tonic-gate pbits(ocgp->cg_free, afs.fs_fpg); 495*d49934b4Sdmick (void) printf("b:\n"); 4967c478bd9Sstevel@tonic-gate for (i = 0; i < afs.fs_cpg; i++) { 497*d49934b4Sdmick (void) printf(" c%d:\t(%d)\t", i, ocgp->cg_btot[i]); 4987c478bd9Sstevel@tonic-gate for (j = 0; j < NRPOS; j++) 499*d49934b4Sdmick (void) printf(" %d", ocgp->cg_b[i][j]); 500*d49934b4Sdmick (void) printf("\n"); 5017c478bd9Sstevel@tonic-gate } 5027c478bd9Sstevel@tonic-gate } 5037c478bd9Sstevel@tonic-gate } 5047c478bd9Sstevel@tonic-gate 5057c478bd9Sstevel@tonic-gate 5067c478bd9Sstevel@tonic-gate static void 5077c478bd9Sstevel@tonic-gate pbits(const void *p, const int max) 5087c478bd9Sstevel@tonic-gate { 5097c478bd9Sstevel@tonic-gate int i; 5107c478bd9Sstevel@tonic-gate int count = 0, j; 5117c478bd9Sstevel@tonic-gate unsigned char *cp = (unsigned char *)p; 5127c478bd9Sstevel@tonic-gate 5137c478bd9Sstevel@tonic-gate for (i = 0; i < max; i++) { 5147c478bd9Sstevel@tonic-gate if (isset(cp, i)) { 5157c478bd9Sstevel@tonic-gate if (count) 516*d49934b4Sdmick (void) printf(",%s", 517*d49934b4Sdmick (count % 9 == 8) ? "\n\t" : " "); 5187c478bd9Sstevel@tonic-gate count++; 519*d49934b4Sdmick (void) printf("%d", i); 5207c478bd9Sstevel@tonic-gate j = i; 5217c478bd9Sstevel@tonic-gate while ((i + 1) < max && isset(cp, i+1)) 5227c478bd9Sstevel@tonic-gate i++; 5237c478bd9Sstevel@tonic-gate if (i != j) 524*d49934b4Sdmick (void) printf("-%d", i); 5257c478bd9Sstevel@tonic-gate } 5267c478bd9Sstevel@tonic-gate } 527*d49934b4Sdmick (void) printf("\n"); 5287c478bd9Sstevel@tonic-gate } 529