13d500078SThomas-Henning von Kamptz /* 23d500078SThomas-Henning von Kamptz * Copyright (c) 2000 Christoph Herrmann, Thomas-Henning von Kamptz 33d500078SThomas-Henning von Kamptz * Copyright (c) 1980, 1989, 1993 The Regents of the University of California. 43d500078SThomas-Henning von Kamptz * All rights reserved. 53d500078SThomas-Henning von Kamptz * 63d500078SThomas-Henning von Kamptz * This code is derived from software contributed to Berkeley by 73d500078SThomas-Henning von Kamptz * Christoph Herrmann and Thomas-Henning von Kamptz, Munich and Frankfurt. 83d500078SThomas-Henning von Kamptz * 93d500078SThomas-Henning von Kamptz * Redistribution and use in source and binary forms, with or without 103d500078SThomas-Henning von Kamptz * modification, are permitted provided that the following conditions 113d500078SThomas-Henning von Kamptz * are met: 123d500078SThomas-Henning von Kamptz * 1. Redistributions of source code must retain the above copyright 133d500078SThomas-Henning von Kamptz * notice, this list of conditions and the following disclaimer. 143d500078SThomas-Henning von Kamptz * 2. Redistributions in binary form must reproduce the above copyright 153d500078SThomas-Henning von Kamptz * notice, this list of conditions and the following disclaimer in the 163d500078SThomas-Henning von Kamptz * documentation and/or other materials provided with the distribution. 173d500078SThomas-Henning von Kamptz * 3. All advertising materials mentioning features or use of this software 183d500078SThomas-Henning von Kamptz * must display the following acknowledgment: 193d500078SThomas-Henning von Kamptz * This product includes software developed by the University of 203d500078SThomas-Henning von Kamptz * California, Berkeley and its contributors, as well as Christoph 213d500078SThomas-Henning von Kamptz * Herrmann and Thomas-Henning von Kamptz. 223d500078SThomas-Henning von Kamptz * 4. Neither the name of the University nor the names of its contributors 233d500078SThomas-Henning von Kamptz * may be used to endorse or promote products derived from this software 243d500078SThomas-Henning von Kamptz * without specific prior written permission. 253d500078SThomas-Henning von Kamptz * 263d500078SThomas-Henning von Kamptz * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 273d500078SThomas-Henning von Kamptz * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 283d500078SThomas-Henning von Kamptz * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 293d500078SThomas-Henning von Kamptz * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 303d500078SThomas-Henning von Kamptz * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 313d500078SThomas-Henning von Kamptz * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 323d500078SThomas-Henning von Kamptz * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 333d500078SThomas-Henning von Kamptz * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 343d500078SThomas-Henning von Kamptz * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 353d500078SThomas-Henning von Kamptz * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 363d500078SThomas-Henning von Kamptz * SUCH DAMAGE. 373d500078SThomas-Henning von Kamptz * 384020c5bcSThomas-Henning von Kamptz * $TSHeader: src/sbin/ffsinfo/ffsinfo.c,v 1.4 2000/12/12 19:30:55 tomsoft Exp $ 393d500078SThomas-Henning von Kamptz * 403d500078SThomas-Henning von Kamptz */ 413d500078SThomas-Henning von Kamptz 423d500078SThomas-Henning von Kamptz #ifndef lint 433d500078SThomas-Henning von Kamptz static const char copyright[] = 443d500078SThomas-Henning von Kamptz "@(#) Copyright (c) 2000 Christoph Herrmann, Thomas-Henning von Kamptz\n\ 453d500078SThomas-Henning von Kamptz Copyright (c) 1980, 1989, 1993 The Regents of the University of California.\n\ 463d500078SThomas-Henning von Kamptz All rights reserved.\n"; 473d500078SThomas-Henning von Kamptz #endif /* not lint */ 483d500078SThomas-Henning von Kamptz 493d500078SThomas-Henning von Kamptz #ifndef lint 503d500078SThomas-Henning von Kamptz static const char rcsid[] = 513d500078SThomas-Henning von Kamptz "$FreeBSD$"; 523d500078SThomas-Henning von Kamptz #endif /* not lint */ 533d500078SThomas-Henning von Kamptz 543d500078SThomas-Henning von Kamptz /* ********************************************************** INCLUDES ***** */ 553d500078SThomas-Henning von Kamptz #include <sys/param.h> 563d500078SThomas-Henning von Kamptz #include <sys/disklabel.h> 57942d2e02SRobert Watson #include <sys/mount.h> 583d500078SThomas-Henning von Kamptz #include <sys/stat.h> 593d500078SThomas-Henning von Kamptz 60942d2e02SRobert Watson #include <ufs/ufs/ufsmount.h> 61942d2e02SRobert Watson #include <ufs/ufs/dinode.h> 62942d2e02SRobert Watson #include <ufs/ffs/fs.h> 63942d2e02SRobert Watson 643d500078SThomas-Henning von Kamptz #include <ctype.h> 653d500078SThomas-Henning von Kamptz #include <err.h> 667bb84191SRobert Watson #include <errno.h> 673d500078SThomas-Henning von Kamptz #include <fcntl.h> 68942d2e02SRobert Watson #include <libufs.h> 69942d2e02SRobert Watson #include <paths.h> 70942d2e02SRobert Watson #include <stdio.h> 713d500078SThomas-Henning von Kamptz #include <stdlib.h> 723d500078SThomas-Henning von Kamptz #include <string.h> 733d500078SThomas-Henning von Kamptz #include <unistd.h> 743d500078SThomas-Henning von Kamptz 753d500078SThomas-Henning von Kamptz #include "debug.h" 763d500078SThomas-Henning von Kamptz 773d500078SThomas-Henning von Kamptz /* *********************************************************** GLOBALS ***** */ 783d500078SThomas-Henning von Kamptz #ifdef FS_DEBUG 793d500078SThomas-Henning von Kamptz int _dbg_lvl_ = (DL_INFO); /* DL_TRC */ 803d500078SThomas-Henning von Kamptz #endif /* FS_DEBUG */ 813d500078SThomas-Henning von Kamptz 82942d2e02SRobert Watson struct uufsd disk; 83942d2e02SRobert Watson 84942d2e02SRobert Watson #define sblock disk.d_fs 85942d2e02SRobert Watson #define acg disk.d_cg 86942d2e02SRobert Watson 873d500078SThomas-Henning von Kamptz static union { 883d500078SThomas-Henning von Kamptz struct fs fs; 89942d2e02SRobert Watson char pad[SBLOCKSIZE]; 90942d2e02SRobert Watson } fsun; 913d500078SThomas-Henning von Kamptz 92942d2e02SRobert Watson #define osblock fsun.fs 933d500078SThomas-Henning von Kamptz 943d500078SThomas-Henning von Kamptz static char i1blk[MAXBSIZE]; 953d500078SThomas-Henning von Kamptz static char i2blk[MAXBSIZE]; 963d500078SThomas-Henning von Kamptz static char i3blk[MAXBSIZE]; 973d500078SThomas-Henning von Kamptz 983d500078SThomas-Henning von Kamptz static struct csum *fscs; 993d500078SThomas-Henning von Kamptz 1003d500078SThomas-Henning von Kamptz /* ******************************************************** PROTOTYPES ***** */ 1014020c5bcSThomas-Henning von Kamptz static void usage(void); 102942d2e02SRobert Watson static void dump_whole_ufs1_inode(ino_t, int); 103942d2e02SRobert Watson static void dump_whole_ufs2_inode(ino_t, int); 1043d500078SThomas-Henning von Kamptz 105942d2e02SRobert Watson #define DUMP_WHOLE_INODE(A,B) \ 106942d2e02SRobert Watson ( disk.d_ufs == 1 \ 107942d2e02SRobert Watson ? dump_whole_ufs1_inode((A),(B)) : dump_whole_ufs2_inode((A),(B)) ) 1083d500078SThomas-Henning von Kamptz 1093d500078SThomas-Henning von Kamptz /* ************************************************************** main ***** */ 1103d500078SThomas-Henning von Kamptz /* 1113d500078SThomas-Henning von Kamptz * ffsinfo(8) is a tool to dump all metadata of a file system. It helps to find 1123d500078SThomas-Henning von Kamptz * errors is the file system much easier. You can run ffsinfo before and after 1133d500078SThomas-Henning von Kamptz * an fsck(8), and compare the two ascii dumps easy with diff, and you see 1143d500078SThomas-Henning von Kamptz * directly where the problem is. You can control how much detail you want to 1153d500078SThomas-Henning von Kamptz * see with some command line arguments. You can also easy check the status 1163d500078SThomas-Henning von Kamptz * of a file system, like is there is enough space for growing a file system, 1173d500078SThomas-Henning von Kamptz * or how many active snapshots do we have. It provides much more detailed 1183d500078SThomas-Henning von Kamptz * information then dumpfs. Snapshots, as they are very new, are not really 1193d500078SThomas-Henning von Kamptz * supported. They are just mentioned currently, but it is planned to run 1203d500078SThomas-Henning von Kamptz * also over active snapshots, to even get that output. 1213d500078SThomas-Henning von Kamptz */ 1223d500078SThomas-Henning von Kamptz int 1233d500078SThomas-Henning von Kamptz main(int argc, char **argv) 1243d500078SThomas-Henning von Kamptz { 1253d500078SThomas-Henning von Kamptz DBG_FUNC("main") 126942d2e02SRobert Watson char *device, *special; 127f901ebcfSStefan Farfeleder int ch; 1283d500078SThomas-Henning von Kamptz size_t len; 1293d500078SThomas-Henning von Kamptz struct stat st; 1303d500078SThomas-Henning von Kamptz struct csum *dbg_csp; 1313d500078SThomas-Henning von Kamptz int dbg_csc; 1323d500078SThomas-Henning von Kamptz char dbg_line[80]; 1333d500078SThomas-Henning von Kamptz int cylno,i; 1343d500078SThomas-Henning von Kamptz int cfg_cg, cfg_in, cfg_lv; 1353d500078SThomas-Henning von Kamptz int cg_start, cg_stop; 1363d500078SThomas-Henning von Kamptz ino_t in; 1373d500078SThomas-Henning von Kamptz char *out_file; 1383d500078SThomas-Henning von Kamptz 1393d500078SThomas-Henning von Kamptz DBG_ENTER; 1403d500078SThomas-Henning von Kamptz 1413d500078SThomas-Henning von Kamptz cfg_lv=0xff; 1423d500078SThomas-Henning von Kamptz cfg_in=-2; 1433d500078SThomas-Henning von Kamptz cfg_cg=-2; 1443d500078SThomas-Henning von Kamptz out_file=strdup("/var/tmp/ffsinfo"); 1454020c5bcSThomas-Henning von Kamptz if(out_file == NULL) { 1464020c5bcSThomas-Henning von Kamptz errx(1, "strdup failed"); 1474020c5bcSThomas-Henning von Kamptz } 1483d500078SThomas-Henning von Kamptz 149942d2e02SRobert Watson while ((ch=getopt(argc, argv, "g:i:l:o:")) != -1) { 1503d500078SThomas-Henning von Kamptz switch(ch) { 1513d500078SThomas-Henning von Kamptz case 'g': 1527bb84191SRobert Watson cfg_cg=strtol(optarg, NULL, 0); 1537bb84191SRobert Watson if(errno == EINVAL||errno == ERANGE) 1547bb84191SRobert Watson err(1, "%s", optarg); 1553d500078SThomas-Henning von Kamptz if(cfg_cg < -1) { 1564020c5bcSThomas-Henning von Kamptz usage(); 1573d500078SThomas-Henning von Kamptz } 1583d500078SThomas-Henning von Kamptz break; 1593d500078SThomas-Henning von Kamptz case 'i': 1607bb84191SRobert Watson cfg_in=strtol(optarg, NULL, 0); 1617bb84191SRobert Watson if(errno == EINVAL||errno == ERANGE) 1627bb84191SRobert Watson err(1, "%s", optarg); 1633d500078SThomas-Henning von Kamptz if(cfg_in < 0) { 1644020c5bcSThomas-Henning von Kamptz usage(); 1653d500078SThomas-Henning von Kamptz } 1663d500078SThomas-Henning von Kamptz break; 1673d500078SThomas-Henning von Kamptz case 'l': 1687bb84191SRobert Watson cfg_lv=strtol(optarg, NULL, 0); 1697bb84191SRobert Watson if(errno == EINVAL||errno == ERANGE) 1707bb84191SRobert Watson err(1, "%s", optarg); 1713d500078SThomas-Henning von Kamptz if(cfg_lv < 0x1||cfg_lv > 0x3ff) { 1724020c5bcSThomas-Henning von Kamptz usage(); 1733d500078SThomas-Henning von Kamptz } 1743d500078SThomas-Henning von Kamptz break; 1753d500078SThomas-Henning von Kamptz case 'o': 1763d500078SThomas-Henning von Kamptz free(out_file); 1773d500078SThomas-Henning von Kamptz out_file=strdup(optarg); 1784020c5bcSThomas-Henning von Kamptz if(out_file == NULL) { 1794020c5bcSThomas-Henning von Kamptz errx(1, "strdup failed"); 1804020c5bcSThomas-Henning von Kamptz } 1813d500078SThomas-Henning von Kamptz break; 1823d500078SThomas-Henning von Kamptz case '?': 1833d500078SThomas-Henning von Kamptz /* FALLTHROUGH */ 1843d500078SThomas-Henning von Kamptz default: 1854020c5bcSThomas-Henning von Kamptz usage(); 1863d500078SThomas-Henning von Kamptz } 1873d500078SThomas-Henning von Kamptz } 1883d500078SThomas-Henning von Kamptz argc -= optind; 1893d500078SThomas-Henning von Kamptz argv += optind; 1903d500078SThomas-Henning von Kamptz 1913d500078SThomas-Henning von Kamptz if(argc != 1) { 1924020c5bcSThomas-Henning von Kamptz usage(); 1933d500078SThomas-Henning von Kamptz } 1943d500078SThomas-Henning von Kamptz device=*argv; 1953d500078SThomas-Henning von Kamptz 1963d500078SThomas-Henning von Kamptz /* 1973d500078SThomas-Henning von Kamptz * Now we try to guess the (raw)device name. 1983d500078SThomas-Henning von Kamptz */ 1993d500078SThomas-Henning von Kamptz if (0 == strrchr(device, '/') && (stat(device, &st) == -1)) { 2003d500078SThomas-Henning von Kamptz /* 2013d500078SThomas-Henning von Kamptz * No path prefix was given, so try in that order: 2023d500078SThomas-Henning von Kamptz * /dev/r%s 2033d500078SThomas-Henning von Kamptz * /dev/%s 2043d500078SThomas-Henning von Kamptz * /dev/vinum/r%s 2053d500078SThomas-Henning von Kamptz * /dev/vinum/%s. 2063d500078SThomas-Henning von Kamptz * 2073d500078SThomas-Henning von Kamptz * FreeBSD now doesn't distinguish between raw and block 2083d500078SThomas-Henning von Kamptz * devices any longer, but it should still work this way. 2093d500078SThomas-Henning von Kamptz */ 2103d500078SThomas-Henning von Kamptz len=strlen(device)+strlen(_PATH_DEV)+2+strlen("vinum/"); 2113d500078SThomas-Henning von Kamptz special=(char *)malloc(len); 2124020c5bcSThomas-Henning von Kamptz if(special == NULL) { 2134020c5bcSThomas-Henning von Kamptz errx(1, "malloc failed"); 2144020c5bcSThomas-Henning von Kamptz } 2153d500078SThomas-Henning von Kamptz snprintf(special, len, "%sr%s", _PATH_DEV, device); 2163d500078SThomas-Henning von Kamptz if (stat(special, &st) == -1) { 2173d500078SThomas-Henning von Kamptz snprintf(special, len, "%s%s", _PATH_DEV, device); 2183d500078SThomas-Henning von Kamptz if (stat(special, &st) == -1) { 2193d500078SThomas-Henning von Kamptz snprintf(special, len, "%svinum/r%s", 2203d500078SThomas-Henning von Kamptz _PATH_DEV, device); 2213d500078SThomas-Henning von Kamptz if (stat(special, &st) == -1) { 2223d500078SThomas-Henning von Kamptz /* 2233d500078SThomas-Henning von Kamptz * For now this is the 'last resort'. 2243d500078SThomas-Henning von Kamptz */ 2253d500078SThomas-Henning von Kamptz snprintf(special, len, "%svinum/%s", 2263d500078SThomas-Henning von Kamptz _PATH_DEV, device); 2273d500078SThomas-Henning von Kamptz } 2283d500078SThomas-Henning von Kamptz } 2293d500078SThomas-Henning von Kamptz } 2303d500078SThomas-Henning von Kamptz device = special; 2313d500078SThomas-Henning von Kamptz } 2323d500078SThomas-Henning von Kamptz 233942d2e02SRobert Watson if (ufs_disk_fillout(&disk, device) == -1) 234942d2e02SRobert Watson err(1, "ufs_disk_fillout(%s) failed: %s", device, disk.d_error); 2353d500078SThomas-Henning von Kamptz 2363d500078SThomas-Henning von Kamptz DBG_OPEN(out_file); /* already here we need a superblock */ 2373d500078SThomas-Henning von Kamptz 2383d500078SThomas-Henning von Kamptz if(cfg_lv & 0x001) { 2394020c5bcSThomas-Henning von Kamptz DBG_DUMP_FS(&sblock, 2404020c5bcSThomas-Henning von Kamptz "primary sblock"); 2413d500078SThomas-Henning von Kamptz } 2423d500078SThomas-Henning von Kamptz 2433d500078SThomas-Henning von Kamptz /* 2443d500078SThomas-Henning von Kamptz * Determine here what cylinder groups to dump. 2453d500078SThomas-Henning von Kamptz */ 2463d500078SThomas-Henning von Kamptz if(cfg_cg==-2) { 2473d500078SThomas-Henning von Kamptz cg_start=0; 2483d500078SThomas-Henning von Kamptz cg_stop=sblock.fs_ncg; 2493d500078SThomas-Henning von Kamptz } else if (cfg_cg==-1) { 2503d500078SThomas-Henning von Kamptz cg_start=sblock.fs_ncg-1; 2513d500078SThomas-Henning von Kamptz cg_stop=sblock.fs_ncg; 2523d500078SThomas-Henning von Kamptz } else if (cfg_cg<sblock.fs_ncg) { 2533d500078SThomas-Henning von Kamptz cg_start=cfg_cg; 2543d500078SThomas-Henning von Kamptz cg_stop=cfg_cg+1; 2553d500078SThomas-Henning von Kamptz } else { 2563d500078SThomas-Henning von Kamptz cg_start=sblock.fs_ncg; 2573d500078SThomas-Henning von Kamptz cg_stop=sblock.fs_ncg; 2583d500078SThomas-Henning von Kamptz } 2593d500078SThomas-Henning von Kamptz 2603d500078SThomas-Henning von Kamptz if (cfg_lv & 0x004) { 261adcaff07SThomas-Henning von Kamptz fscs = (struct csum *)calloc((size_t)1, 262adcaff07SThomas-Henning von Kamptz (size_t)sblock.fs_cssize); 2634020c5bcSThomas-Henning von Kamptz if(fscs == NULL) { 2644020c5bcSThomas-Henning von Kamptz errx(1, "calloc failed"); 2654020c5bcSThomas-Henning von Kamptz } 2663d500078SThomas-Henning von Kamptz 2673d500078SThomas-Henning von Kamptz /* 2683d500078SThomas-Henning von Kamptz * Get the cylinder summary into the memory ... 2693d500078SThomas-Henning von Kamptz */ 2703d500078SThomas-Henning von Kamptz for (i = 0; i < sblock.fs_cssize; i += sblock.fs_bsize) { 271942d2e02SRobert Watson if (bread(&disk, 272942d2e02SRobert Watson fsbtodb(&sblock, sblock.fs_csaddr + numfrags(&sblock, i)), 273942d2e02SRobert Watson (void *)(((char *)fscs)+i), 274942d2e02SRobert Watson (size_t)(sblock.fs_cssize-i < sblock.fs_bsize 275942d2e02SRobert Watson ? sblock.fs_cssize - i 276942d2e02SRobert Watson : sblock.fs_bsize)) == -1) { 277942d2e02SRobert Watson err(1, "bread: %s", disk.d_error); 278942d2e02SRobert Watson } 2793d500078SThomas-Henning von Kamptz } 2803d500078SThomas-Henning von Kamptz 2813d500078SThomas-Henning von Kamptz dbg_csp=fscs; 2823d500078SThomas-Henning von Kamptz /* 2833d500078SThomas-Henning von Kamptz * ... and dump it. 2843d500078SThomas-Henning von Kamptz */ 2853d500078SThomas-Henning von Kamptz for(dbg_csc=0; dbg_csc<sblock.fs_ncg; dbg_csc++) { 286adcaff07SThomas-Henning von Kamptz snprintf(dbg_line, sizeof(dbg_line), 287adcaff07SThomas-Henning von Kamptz "%d. csum in fscs", dbg_csc); 2884020c5bcSThomas-Henning von Kamptz DBG_DUMP_CSUM(&sblock, 2894020c5bcSThomas-Henning von Kamptz dbg_line, 2904020c5bcSThomas-Henning von Kamptz dbg_csp++); 2913d500078SThomas-Henning von Kamptz } 2923d500078SThomas-Henning von Kamptz } 2933d500078SThomas-Henning von Kamptz 2943d500078SThomas-Henning von Kamptz /* 2953d500078SThomas-Henning von Kamptz * For each requested cylinder group ... 2963d500078SThomas-Henning von Kamptz */ 2973d500078SThomas-Henning von Kamptz for(cylno=cg_start; cylno<cg_stop; cylno++) { 298adcaff07SThomas-Henning von Kamptz snprintf(dbg_line, sizeof(dbg_line), "cgr %d", cylno); 2993d500078SThomas-Henning von Kamptz if(cfg_lv & 0x002) { 3003d500078SThomas-Henning von Kamptz /* 3013d500078SThomas-Henning von Kamptz * ... dump the superblock copies ... 3023d500078SThomas-Henning von Kamptz */ 303942d2e02SRobert Watson if (bread(&disk, fsbtodb(&sblock, cgsblock(&sblock, cylno)), 304942d2e02SRobert Watson (void *)&osblock, SBLOCKSIZE) == -1) { 305942d2e02SRobert Watson err(1, "bread: %s", disk.d_error); 306942d2e02SRobert Watson } 3074020c5bcSThomas-Henning von Kamptz DBG_DUMP_FS(&osblock, 3084020c5bcSThomas-Henning von Kamptz dbg_line); 3093d500078SThomas-Henning von Kamptz } 3103d500078SThomas-Henning von Kamptz /* 3113d500078SThomas-Henning von Kamptz * ... read the cylinder group and dump whatever was requested. 3123d500078SThomas-Henning von Kamptz */ 313942d2e02SRobert Watson if (bread(&disk, fsbtodb(&sblock, cgtod(&sblock, cylno)), 314942d2e02SRobert Watson (void *)&acg, (size_t)sblock.fs_cgsize) == -1) { 315942d2e02SRobert Watson err(1, "bread: %s", disk.d_error); 316942d2e02SRobert Watson } 3173d500078SThomas-Henning von Kamptz if(cfg_lv & 0x008) { 3184020c5bcSThomas-Henning von Kamptz DBG_DUMP_CG(&sblock, 3194020c5bcSThomas-Henning von Kamptz dbg_line, 3204020c5bcSThomas-Henning von Kamptz &acg); 3213d500078SThomas-Henning von Kamptz } 3223d500078SThomas-Henning von Kamptz if(cfg_lv & 0x010) { 3234020c5bcSThomas-Henning von Kamptz DBG_DUMP_INMAP(&sblock, 3244020c5bcSThomas-Henning von Kamptz dbg_line, 3254020c5bcSThomas-Henning von Kamptz &acg); 3263d500078SThomas-Henning von Kamptz } 3273d500078SThomas-Henning von Kamptz if(cfg_lv & 0x020) { 3284020c5bcSThomas-Henning von Kamptz DBG_DUMP_FRMAP(&sblock, 3294020c5bcSThomas-Henning von Kamptz dbg_line, 3304020c5bcSThomas-Henning von Kamptz &acg); 3313d500078SThomas-Henning von Kamptz } 3323d500078SThomas-Henning von Kamptz if(cfg_lv & 0x040) { 3334020c5bcSThomas-Henning von Kamptz DBG_DUMP_CLMAP(&sblock, 3344020c5bcSThomas-Henning von Kamptz dbg_line, 3354020c5bcSThomas-Henning von Kamptz &acg); 3364020c5bcSThomas-Henning von Kamptz DBG_DUMP_CLSUM(&sblock, 3374020c5bcSThomas-Henning von Kamptz dbg_line, 3384020c5bcSThomas-Henning von Kamptz &acg); 3393d500078SThomas-Henning von Kamptz } 340942d2e02SRobert Watson #ifdef NOT_CURRENTLY 341942d2e02SRobert Watson /* 342942d2e02SRobert Watson * See the comment in sbin/growfs/debug.c for why this 343942d2e02SRobert Watson * is currently disabled, and what needs to be done to 344942d2e02SRobert Watson * re-enable it. 345942d2e02SRobert Watson */ 346942d2e02SRobert Watson if(disk.d_ufs == 1 && cfg_lv & 0x080) { 3474020c5bcSThomas-Henning von Kamptz DBG_DUMP_SPTBL(&sblock, 3484020c5bcSThomas-Henning von Kamptz dbg_line, 3494020c5bcSThomas-Henning von Kamptz &acg); 3503d500078SThomas-Henning von Kamptz } 351942d2e02SRobert Watson #endif 3523d500078SThomas-Henning von Kamptz } 3533d500078SThomas-Henning von Kamptz /* 3543d500078SThomas-Henning von Kamptz * Dump the requested inode(s). 3553d500078SThomas-Henning von Kamptz */ 3563d500078SThomas-Henning von Kamptz if(cfg_in != -2) { 357942d2e02SRobert Watson DUMP_WHOLE_INODE((ino_t)cfg_in, cfg_lv); 3583d500078SThomas-Henning von Kamptz } else { 3593d500078SThomas-Henning von Kamptz for(in=cg_start*sblock.fs_ipg; in<(ino_t)cg_stop*sblock.fs_ipg; 3603d500078SThomas-Henning von Kamptz in++) { 361942d2e02SRobert Watson DUMP_WHOLE_INODE(in, cfg_lv); 3623d500078SThomas-Henning von Kamptz } 3633d500078SThomas-Henning von Kamptz } 3643d500078SThomas-Henning von Kamptz 3653d500078SThomas-Henning von Kamptz DBG_CLOSE; 3663d500078SThomas-Henning von Kamptz 3673d500078SThomas-Henning von Kamptz DBG_LEAVE; 3683d500078SThomas-Henning von Kamptz return 0; 3693d500078SThomas-Henning von Kamptz } 3703d500078SThomas-Henning von Kamptz 371942d2e02SRobert Watson /* ********************************************** dump_whole_ufs1_inode ***** */ 3723d500078SThomas-Henning von Kamptz /* 3733d500078SThomas-Henning von Kamptz * Here we dump a list of all blocks allocated by this inode. We follow 3743d500078SThomas-Henning von Kamptz * all indirect blocks. 3753d500078SThomas-Henning von Kamptz */ 3763d500078SThomas-Henning von Kamptz void 377942d2e02SRobert Watson dump_whole_ufs1_inode(ino_t inode, int level) 3783d500078SThomas-Henning von Kamptz { 379942d2e02SRobert Watson DBG_FUNC("dump_whole_ufs1_inode") 380942d2e02SRobert Watson struct ufs1_dinode *ino; 381942d2e02SRobert Watson int rb, mode; 3823d500078SThomas-Henning von Kamptz unsigned int ind2ctr, ind3ctr; 383942d2e02SRobert Watson ufs1_daddr_t *ind2ptr, *ind3ptr; 3843d500078SThomas-Henning von Kamptz char comment[80]; 3853d500078SThomas-Henning von Kamptz 3863d500078SThomas-Henning von Kamptz DBG_ENTER; 3873d500078SThomas-Henning von Kamptz 3883d500078SThomas-Henning von Kamptz /* 3893d500078SThomas-Henning von Kamptz * Read the inode from disk/cache. 3903d500078SThomas-Henning von Kamptz */ 391942d2e02SRobert Watson if (getino(&disk, (void **)&ino, inode, &mode) == -1) 392942d2e02SRobert Watson err(1, "getino: %s", disk.d_error); 3933d500078SThomas-Henning von Kamptz 3943d500078SThomas-Henning von Kamptz if(ino->di_nlink==0) { 3953d500078SThomas-Henning von Kamptz DBG_LEAVE; 3963d500078SThomas-Henning von Kamptz return; /* inode not in use */ 3973d500078SThomas-Henning von Kamptz } 3983d500078SThomas-Henning von Kamptz 3993d500078SThomas-Henning von Kamptz /* 4003d500078SThomas-Henning von Kamptz * Dump the main inode structure. 4013d500078SThomas-Henning von Kamptz */ 402adcaff07SThomas-Henning von Kamptz snprintf(comment, sizeof(comment), "Inode 0x%08x", inode); 4033d500078SThomas-Henning von Kamptz if (level & 0x100) { 4044020c5bcSThomas-Henning von Kamptz DBG_DUMP_INO(&sblock, 4054020c5bcSThomas-Henning von Kamptz comment, 4064020c5bcSThomas-Henning von Kamptz ino); 4073d500078SThomas-Henning von Kamptz } 4083d500078SThomas-Henning von Kamptz 4093d500078SThomas-Henning von Kamptz if (!(level & 0x200)) { 4103d500078SThomas-Henning von Kamptz DBG_LEAVE; 4113d500078SThomas-Henning von Kamptz return; 4123d500078SThomas-Henning von Kamptz } 4133d500078SThomas-Henning von Kamptz 4143d500078SThomas-Henning von Kamptz /* 4153d500078SThomas-Henning von Kamptz * Ok, now prepare for dumping all direct and indirect pointers. 4163d500078SThomas-Henning von Kamptz */ 4173d500078SThomas-Henning von Kamptz rb=howmany(ino->di_size, sblock.fs_bsize)-NDADDR; 4183d500078SThomas-Henning von Kamptz if(rb>0) { 4193d500078SThomas-Henning von Kamptz /* 4203d500078SThomas-Henning von Kamptz * Dump single indirect block. 4213d500078SThomas-Henning von Kamptz */ 422942d2e02SRobert Watson if (bread(&disk, fsbtodb(&sblock, ino->di_ib[0]), (void *)&i1blk, 423942d2e02SRobert Watson (size_t)sblock.fs_bsize) == -1) { 424942d2e02SRobert Watson err(1, "bread: %s", disk.d_error); 425942d2e02SRobert Watson } 426adcaff07SThomas-Henning von Kamptz snprintf(comment, sizeof(comment), "Inode 0x%08x: indirect 0", 427adcaff07SThomas-Henning von Kamptz inode); 4284020c5bcSThomas-Henning von Kamptz DBG_DUMP_IBLK(&sblock, 4294020c5bcSThomas-Henning von Kamptz comment, 4304020c5bcSThomas-Henning von Kamptz i1blk, 4314020c5bcSThomas-Henning von Kamptz (size_t)rb); 432942d2e02SRobert Watson rb-=howmany(sblock.fs_bsize, sizeof(ufs1_daddr_t)); 4333d500078SThomas-Henning von Kamptz } 4343d500078SThomas-Henning von Kamptz if(rb>0) { 4353d500078SThomas-Henning von Kamptz /* 4363d500078SThomas-Henning von Kamptz * Dump double indirect blocks. 4373d500078SThomas-Henning von Kamptz */ 438942d2e02SRobert Watson if (bread(&disk, fsbtodb(&sblock, ino->di_ib[1]), (void *)&i2blk, 439942d2e02SRobert Watson (size_t)sblock.fs_bsize) == -1) { 440942d2e02SRobert Watson err(1, "bread: %s", disk.d_error); 441942d2e02SRobert Watson } 442adcaff07SThomas-Henning von Kamptz snprintf(comment, sizeof(comment), "Inode 0x%08x: indirect 1", 443adcaff07SThomas-Henning von Kamptz inode); 4444020c5bcSThomas-Henning von Kamptz DBG_DUMP_IBLK(&sblock, 4454020c5bcSThomas-Henning von Kamptz comment, 4464020c5bcSThomas-Henning von Kamptz i2blk, 447942d2e02SRobert Watson howmany(rb, howmany(sblock.fs_bsize, sizeof(ufs1_daddr_t)))); 4483d500078SThomas-Henning von Kamptz for(ind2ctr=0; ((ind2ctr < howmany(sblock.fs_bsize, 449942d2e02SRobert Watson sizeof(ufs1_daddr_t))) && (rb>0)); ind2ctr++) { 450942d2e02SRobert Watson ind2ptr=&((ufs1_daddr_t *)(void *)&i2blk)[ind2ctr]; 4513d500078SThomas-Henning von Kamptz 452942d2e02SRobert Watson if (bread(&disk, fsbtodb(&sblock, *ind2ptr), (void *)&i1blk, 453942d2e02SRobert Watson (size_t)sblock.fs_bsize) == -1) { 454942d2e02SRobert Watson err(1, "bread: %s", disk.d_error); 455942d2e02SRobert Watson } 456adcaff07SThomas-Henning von Kamptz snprintf(comment, sizeof(comment), 457adcaff07SThomas-Henning von Kamptz "Inode 0x%08x: indirect 1->%d", inode, ind2ctr); 4584020c5bcSThomas-Henning von Kamptz DBG_DUMP_IBLK(&sblock, 4594020c5bcSThomas-Henning von Kamptz comment, 4604020c5bcSThomas-Henning von Kamptz i1blk, 4614020c5bcSThomas-Henning von Kamptz (size_t)rb); 462942d2e02SRobert Watson rb-=howmany(sblock.fs_bsize, sizeof(ufs1_daddr_t)); 4633d500078SThomas-Henning von Kamptz } 4643d500078SThomas-Henning von Kamptz } 4653d500078SThomas-Henning von Kamptz if(rb>0) { 4663d500078SThomas-Henning von Kamptz /* 4673d500078SThomas-Henning von Kamptz * Dump triple indirect blocks. 4683d500078SThomas-Henning von Kamptz */ 469942d2e02SRobert Watson if (bread(&disk, fsbtodb(&sblock, ino->di_ib[2]), (void *)&i3blk, 470942d2e02SRobert Watson (size_t)sblock.fs_bsize) == -1) { 471942d2e02SRobert Watson err(1, "bread: %s", disk.d_error); 472942d2e02SRobert Watson } 473adcaff07SThomas-Henning von Kamptz snprintf(comment, sizeof(comment), "Inode 0x%08x: indirect 2", 474adcaff07SThomas-Henning von Kamptz inode); 4753d500078SThomas-Henning von Kamptz #define SQUARE(a) ((a)*(a)) 4764020c5bcSThomas-Henning von Kamptz DBG_DUMP_IBLK(&sblock, 4774020c5bcSThomas-Henning von Kamptz comment, 4784020c5bcSThomas-Henning von Kamptz i3blk, 4794020c5bcSThomas-Henning von Kamptz howmany(rb, 480942d2e02SRobert Watson SQUARE(howmany(sblock.fs_bsize, sizeof(ufs1_daddr_t))))); 4813d500078SThomas-Henning von Kamptz #undef SQUARE 4823d500078SThomas-Henning von Kamptz for(ind3ctr=0; ((ind3ctr<howmany(sblock.fs_bsize, 483942d2e02SRobert Watson sizeof(ufs1_daddr_t)))&&(rb>0)); ind3ctr++) { 484942d2e02SRobert Watson ind3ptr=&((ufs1_daddr_t *)(void *)&i3blk)[ind3ctr]; 4853d500078SThomas-Henning von Kamptz 486942d2e02SRobert Watson if (bread(&disk, fsbtodb(&sblock, *ind3ptr), (void *)&i2blk, 487942d2e02SRobert Watson (size_t)sblock.fs_bsize) == -1) { 488942d2e02SRobert Watson err(1, "bread: %s", disk.d_error); 489942d2e02SRobert Watson } 490adcaff07SThomas-Henning von Kamptz snprintf(comment, sizeof(comment), 491adcaff07SThomas-Henning von Kamptz "Inode 0x%08x: indirect 2->%d", inode, ind3ctr); 4924020c5bcSThomas-Henning von Kamptz DBG_DUMP_IBLK(&sblock, 4934020c5bcSThomas-Henning von Kamptz comment, 4944020c5bcSThomas-Henning von Kamptz i2blk, 4954020c5bcSThomas-Henning von Kamptz howmany(rb, 496942d2e02SRobert Watson howmany(sblock.fs_bsize, sizeof(ufs1_daddr_t)))); 4973d500078SThomas-Henning von Kamptz for(ind2ctr=0; ((ind2ctr < howmany(sblock.fs_bsize, 498942d2e02SRobert Watson sizeof(ufs1_daddr_t)))&&(rb>0)); ind2ctr++) { 499942d2e02SRobert Watson ind2ptr=&((ufs1_daddr_t *)(void *)&i2blk) 500adcaff07SThomas-Henning von Kamptz [ind2ctr]; 501942d2e02SRobert Watson if (bread(&disk, fsbtodb(&sblock, *ind2ptr), 502942d2e02SRobert Watson (void *)&i1blk, (size_t)sblock.fs_bsize) 503942d2e02SRobert Watson == -1) { 504942d2e02SRobert Watson err(1, "bread: %s", disk.d_error); 505942d2e02SRobert Watson } 506adcaff07SThomas-Henning von Kamptz snprintf(comment, sizeof(comment), 5073d500078SThomas-Henning von Kamptz "Inode 0x%08x: indirect 2->%d->%d", inode, 5083d500078SThomas-Henning von Kamptz ind3ctr, ind3ctr); 5094020c5bcSThomas-Henning von Kamptz DBG_DUMP_IBLK(&sblock, 5104020c5bcSThomas-Henning von Kamptz comment, 5114020c5bcSThomas-Henning von Kamptz i1blk, 5124020c5bcSThomas-Henning von Kamptz (size_t)rb); 5133d500078SThomas-Henning von Kamptz rb-=howmany(sblock.fs_bsize, 514942d2e02SRobert Watson sizeof(ufs1_daddr_t)); 5153d500078SThomas-Henning von Kamptz } 5163d500078SThomas-Henning von Kamptz } 5173d500078SThomas-Henning von Kamptz } 5183d500078SThomas-Henning von Kamptz 5193d500078SThomas-Henning von Kamptz DBG_LEAVE; 5203d500078SThomas-Henning von Kamptz return; 5213d500078SThomas-Henning von Kamptz } 5223d500078SThomas-Henning von Kamptz 523942d2e02SRobert Watson /* ********************************************** dump_whole_ufs2_inode ***** */ 5243d500078SThomas-Henning von Kamptz /* 525942d2e02SRobert Watson * Here we dump a list of all blocks allocated by this inode. We follow 526942d2e02SRobert Watson * all indirect blocks. 5273d500078SThomas-Henning von Kamptz */ 528942d2e02SRobert Watson void 529942d2e02SRobert Watson dump_whole_ufs2_inode(ino_t inode, int level) 5303d500078SThomas-Henning von Kamptz { 531942d2e02SRobert Watson DBG_FUNC("dump_whole_ufs2_inode") 532942d2e02SRobert Watson struct ufs2_dinode *ino; 533942d2e02SRobert Watson int rb, mode; 534942d2e02SRobert Watson unsigned int ind2ctr, ind3ctr; 535942d2e02SRobert Watson ufs2_daddr_t *ind2ptr, *ind3ptr; 536942d2e02SRobert Watson char comment[80]; 5373d500078SThomas-Henning von Kamptz 5383d500078SThomas-Henning von Kamptz DBG_ENTER; 5393d500078SThomas-Henning von Kamptz 540942d2e02SRobert Watson /* 541942d2e02SRobert Watson * Read the inode from disk/cache. 542942d2e02SRobert Watson */ 543942d2e02SRobert Watson if (getino(&disk, (void **)&ino, inode, &mode) == -1) 544942d2e02SRobert Watson err(1, "getino: %s", disk.d_error); 545942d2e02SRobert Watson 546942d2e02SRobert Watson if (ino->di_nlink == 0) { 547942d2e02SRobert Watson DBG_LEAVE; 548942d2e02SRobert Watson return; /* inode not in use */ 5493d500078SThomas-Henning von Kamptz } 550942d2e02SRobert Watson 551942d2e02SRobert Watson /* 552942d2e02SRobert Watson * Dump the main inode structure. 553942d2e02SRobert Watson */ 554942d2e02SRobert Watson snprintf(comment, sizeof(comment), "Inode 0x%08x", inode); 555942d2e02SRobert Watson if (level & 0x100) { 556942d2e02SRobert Watson DBG_DUMP_INO(&sblock, comment, ino); 557942d2e02SRobert Watson } 558942d2e02SRobert Watson 559942d2e02SRobert Watson if (!(level & 0x200)) { 560942d2e02SRobert Watson DBG_LEAVE; 561942d2e02SRobert Watson return; 562942d2e02SRobert Watson } 563942d2e02SRobert Watson 564942d2e02SRobert Watson /* 565942d2e02SRobert Watson * Ok, now prepare for dumping all direct and indirect pointers. 566942d2e02SRobert Watson */ 567942d2e02SRobert Watson rb = howmany(ino->di_size, sblock.fs_bsize) - NDADDR; 568942d2e02SRobert Watson if (rb > 0) { 569942d2e02SRobert Watson /* 570942d2e02SRobert Watson * Dump single indirect block. 571942d2e02SRobert Watson */ 572942d2e02SRobert Watson if (bread(&disk, fsbtodb(&sblock, ino->di_ib[0]), (void *)&i1blk, 573942d2e02SRobert Watson (size_t)sblock.fs_bsize) == -1) { 574942d2e02SRobert Watson err(1, "bread: %s", disk.d_error); 575942d2e02SRobert Watson } 576942d2e02SRobert Watson snprintf(comment, sizeof(comment), "Inode 0x%08x: indirect 0", inode); 577942d2e02SRobert Watson DBG_DUMP_IBLK(&sblock, comment, i1blk, (size_t)rb); 578942d2e02SRobert Watson rb -= howmany(sblock.fs_bsize, sizeof(ufs2_daddr_t)); 579942d2e02SRobert Watson } 580942d2e02SRobert Watson if (rb > 0) { 581942d2e02SRobert Watson /* 582942d2e02SRobert Watson * Dump double indirect blocks. 583942d2e02SRobert Watson */ 584942d2e02SRobert Watson if (bread(&disk, fsbtodb(&sblock, ino->di_ib[1]), (void *)&i2blk, 585942d2e02SRobert Watson (size_t)sblock.fs_bsize) == -1) { 586942d2e02SRobert Watson err(1, "bread: %s", disk.d_error); 587942d2e02SRobert Watson } 588942d2e02SRobert Watson snprintf(comment, sizeof(comment), "Inode 0x%08x: indirect 1", inode); 589942d2e02SRobert Watson DBG_DUMP_IBLK(&sblock, 590942d2e02SRobert Watson comment, 591942d2e02SRobert Watson i2blk, 592942d2e02SRobert Watson howmany(rb, howmany(sblock.fs_bsize, sizeof(ufs2_daddr_t)))); 593942d2e02SRobert Watson for (ind2ctr = 0; ((ind2ctr < howmany(sblock.fs_bsize, 594942d2e02SRobert Watson sizeof(ufs2_daddr_t))) && (rb>0)); ind2ctr++) { 595942d2e02SRobert Watson ind2ptr = &((ufs2_daddr_t *)(void *)&i2blk)[ind2ctr]; 596942d2e02SRobert Watson 597942d2e02SRobert Watson if (bread(&disk, fsbtodb(&sblock, *ind2ptr), (void *)&i1blk, 598942d2e02SRobert Watson (size_t)sblock.fs_bsize) == -1) { 599942d2e02SRobert Watson err(1, "bread: %s", disk.d_error); 600942d2e02SRobert Watson } 601942d2e02SRobert Watson snprintf(comment, sizeof(comment), 602942d2e02SRobert Watson "Inode 0x%08x: indirect 1->%d", inode, ind2ctr); 603942d2e02SRobert Watson DBG_DUMP_IBLK(&sblock, comment, i1blk, (size_t)rb); 604942d2e02SRobert Watson rb -= howmany(sblock.fs_bsize, sizeof(ufs2_daddr_t)); 605942d2e02SRobert Watson } 606942d2e02SRobert Watson } 607942d2e02SRobert Watson if (rb > 0) { 608942d2e02SRobert Watson /* 609942d2e02SRobert Watson * Dump triple indirect blocks. 610942d2e02SRobert Watson */ 611942d2e02SRobert Watson if (bread(&disk, fsbtodb(&sblock, ino->di_ib[2]), (void *)&i3blk, 612942d2e02SRobert Watson (size_t)sblock.fs_bsize) == -1) { 613942d2e02SRobert Watson err(1, "bread: %s", disk.d_error); 614942d2e02SRobert Watson } 615942d2e02SRobert Watson snprintf(comment, sizeof(comment), "Inode 0x%08x: indirect 2", inode); 616942d2e02SRobert Watson #define SQUARE(a) ((a)*(a)) 617942d2e02SRobert Watson DBG_DUMP_IBLK(&sblock, 618942d2e02SRobert Watson comment, 619942d2e02SRobert Watson i3blk, 620942d2e02SRobert Watson howmany(rb, 621942d2e02SRobert Watson SQUARE(howmany(sblock.fs_bsize, sizeof(ufs2_daddr_t))))); 622942d2e02SRobert Watson #undef SQUARE 623942d2e02SRobert Watson for (ind3ctr = 0; ((ind3ctr < howmany(sblock.fs_bsize, 624942d2e02SRobert Watson sizeof(ufs2_daddr_t))) && (rb > 0)); ind3ctr++) { 625942d2e02SRobert Watson ind3ptr = &((ufs2_daddr_t *)(void *)&i3blk)[ind3ctr]; 626942d2e02SRobert Watson 627942d2e02SRobert Watson if (bread(&disk, fsbtodb(&sblock, *ind3ptr), (void *)&i2blk, 628942d2e02SRobert Watson (size_t)sblock.fs_bsize) == -1) { 629942d2e02SRobert Watson err(1, "bread: %s", disk.d_error); 630942d2e02SRobert Watson } 631942d2e02SRobert Watson snprintf(comment, sizeof(comment), 632942d2e02SRobert Watson "Inode 0x%08x: indirect 2->%d", inode, ind3ctr); 633942d2e02SRobert Watson DBG_DUMP_IBLK(&sblock, 634942d2e02SRobert Watson comment, 635942d2e02SRobert Watson i2blk, 636942d2e02SRobert Watson howmany(rb, 637942d2e02SRobert Watson howmany(sblock.fs_bsize, sizeof(ufs2_daddr_t)))); 638942d2e02SRobert Watson for (ind2ctr = 0; ((ind2ctr < howmany(sblock.fs_bsize, 639942d2e02SRobert Watson sizeof(ufs2_daddr_t))) && (rb > 0)); ind2ctr++) { 640942d2e02SRobert Watson ind2ptr = &((ufs2_daddr_t *)(void *)&i2blk) [ind2ctr]; 641942d2e02SRobert Watson if (bread(&disk, fsbtodb(&sblock, *ind2ptr), (void *)&i1blk, 642942d2e02SRobert Watson (size_t)sblock.fs_bsize) == -1) { 643942d2e02SRobert Watson err(1, "bread: %s", disk.d_error); 644942d2e02SRobert Watson } 645942d2e02SRobert Watson snprintf(comment, sizeof(comment), 646942d2e02SRobert Watson "Inode 0x%08x: indirect 2->%d->%d", inode, 647942d2e02SRobert Watson ind3ctr, ind3ctr); 648942d2e02SRobert Watson DBG_DUMP_IBLK(&sblock, comment, i1blk, (size_t)rb); 649942d2e02SRobert Watson rb -= howmany(sblock.fs_bsize, sizeof(ufs2_daddr_t)); 650942d2e02SRobert Watson } 651942d2e02SRobert Watson } 6523d500078SThomas-Henning von Kamptz } 6533d500078SThomas-Henning von Kamptz 6543d500078SThomas-Henning von Kamptz DBG_LEAVE; 655942d2e02SRobert Watson return; 6563d500078SThomas-Henning von Kamptz } 6573d500078SThomas-Henning von Kamptz 6583d500078SThomas-Henning von Kamptz /* ************************************************************* usage ***** */ 6593d500078SThomas-Henning von Kamptz /* 6603d500078SThomas-Henning von Kamptz * Dump a line of usage. 6613d500078SThomas-Henning von Kamptz */ 6623d500078SThomas-Henning von Kamptz void 6634020c5bcSThomas-Henning von Kamptz usage(void) 6643d500078SThomas-Henning von Kamptz { 6653d500078SThomas-Henning von Kamptz DBG_FUNC("usage") 6663d500078SThomas-Henning von Kamptz 6673d500078SThomas-Henning von Kamptz DBG_ENTER; 6683d500078SThomas-Henning von Kamptz 6693d500078SThomas-Henning von Kamptz fprintf(stderr, 6708d646af5SRuslan Ermilov "usage: ffsinfo [-g cylinder_group] [-i inode] [-l level] " 6714020c5bcSThomas-Henning von Kamptz "[-o outfile]\n" 6724020c5bcSThomas-Henning von Kamptz " special | file\n"); 6733d500078SThomas-Henning von Kamptz 6743d500078SThomas-Henning von Kamptz DBG_LEAVE; 6754020c5bcSThomas-Henning von Kamptz exit(1); 6763d500078SThomas-Henning von Kamptz } 677