151144Sbostic /*- 251144Sbostic * Copyright (c) 1991 The Regents of the University of California. 351144Sbostic * All rights reserved. 451144Sbostic * 551144Sbostic * %sccs.include.redist.c% 651144Sbostic */ 751144Sbostic 851144Sbostic #ifndef lint 951144Sbostic char copyright[] = 1051144Sbostic "@(#) Copyright (c) 1991 The Regents of the University of California.\n\ 1151144Sbostic All rights reserved.\n"; 1251144Sbostic #endif /* not lint */ 1351144Sbostic 1451144Sbostic #ifndef lint 15*55239Sbostic static char sccsid[] = "@(#)dumplfs.c 5.9 (Berkeley) 07/15/92"; 1651144Sbostic #endif /* not lint */ 1751144Sbostic 1851144Sbostic #include <sys/param.h> 1951867Sbostic #include <sys/ucred.h> 2051144Sbostic #include <sys/mount.h> 2154714Sbostic #include <sys/time.h> 2251862Sbostic 2351862Sbostic #include <ufs/ufs/dinode.h> 2451862Sbostic #include <ufs/lfs/lfs.h> 2551862Sbostic 2654714Sbostic #include <fcntl.h> 2751144Sbostic #include <fstab.h> 2851144Sbostic #include <errno.h> 2951144Sbostic #include <unistd.h> 3051144Sbostic #include <stdlib.h> 3151144Sbostic #include <stdio.h> 3251144Sbostic #include <string.h> 3351144Sbostic #include "extern.h" 3451144Sbostic 3551861Sbostic static void addseg __P((char *)); 3651862Sbostic static void dump_cleaner_info __P((struct lfs *, void *)); 3751144Sbostic static void dump_dinode __P((struct dinode *)); 3851862Sbostic static void dump_ifile __P((int, struct lfs *, int)); 3951144Sbostic static int dump_ipage_ifile __P((int, IFILE *, int)); 4051862Sbostic static int dump_ipage_segusage __P((struct lfs *, int, IFILE *, int)); 4151862Sbostic static void dump_segment __P((int, int, daddr_t, struct lfs *, int)); 4252464Sstaelin static int dump_sum __P((int, struct lfs *, SEGSUM *, int, daddr_t)); 4351862Sbostic static void dump_super __P((struct lfs *)); 4451144Sbostic static void usage __P((void)); 4551144Sbostic 4651861Sbostic typedef struct seglist SEGLIST; 4751861Sbostic struct seglist { 4851861Sbostic SEGLIST *next; 4951861Sbostic int num; 5051861Sbostic }; 5151861Sbostic SEGLIST *seglist; 5251861Sbostic 5351861Sbostic int daddr_shift; 5451144Sbostic char *special; 5551144Sbostic 5651144Sbostic /* Segment Usage formats */ 5751144Sbostic #define print_suheader \ 5851144Sbostic (void)printf("segnum\tstatus\tnbytes\t\tlastmod\n") 5951929Sbostic 6051144Sbostic #define print_suentry(i, sp) \ 6151929Sbostic (void)printf("%d\t%c%c%c\t%d\t%s", i, \ 6251929Sbostic (((sp)->su_flags & SEGUSE_ACTIVE) ? 'A' : ' '), \ 6351929Sbostic (((sp)->su_flags & SEGUSE_DIRTY) ? 'D' : 'C'), \ 6451929Sbostic (((sp)->su_flags & SEGUSE_SUPERBLOCK) ? 'S' : ' '), \ 6551144Sbostic (sp)->su_nbytes, ctime((time_t *)&(sp)->su_lastmod)) 6651144Sbostic 6751144Sbostic /* Ifile formats */ 6851144Sbostic #define print_iheader \ 6952094Sbostic (void)printf("inum\tstatus\tversion\tdaddr\t\tfreeptr\n") 7051144Sbostic #define print_ientry(i, ip) \ 7151144Sbostic if (ip->if_daddr == LFS_UNUSED_DADDR) \ 7252094Sbostic (void)printf("%d\tFREE\t%d\t \t\t%d\n", \ 7351144Sbostic i, ip->if_version, ip->if_nextfree); \ 7451144Sbostic else \ 7552094Sbostic (void)printf("%d\tINUSE\t%d\t%8X \n", \ 7652094Sbostic i, ip->if_version, ip->if_daddr) 7751144Sbostic int 7851862Sbostic main(argc, argv) 7951144Sbostic int argc; 8051144Sbostic char *argv[]; 8151144Sbostic { 8251862Sbostic struct lfs lfs_sb1, lfs_sb2, *lfs_master; 8351861Sbostic daddr_t seg_addr; 8451861Sbostic int ch, do_allsb, do_ientries, fd, segnum; 8551144Sbostic 8651144Sbostic do_allsb = 0; 8751144Sbostic do_ientries = 0; 8851861Sbostic while ((ch = getopt(argc, argv, "ais:")) != EOF) 8951144Sbostic switch(ch) { 9051861Sbostic case 'a': /* Dump all superblocks */ 9151861Sbostic do_allsb = 1; 9251861Sbostic break; 9351144Sbostic case 'i': /* Dump ifile entries */ 9451144Sbostic do_ientries = 1; 9551144Sbostic break; 9651861Sbostic case 's': /* Dump out these segments */ 9751861Sbostic addseg(optarg); 9851144Sbostic break; 9951144Sbostic default: 10051144Sbostic usage(); 10151144Sbostic } 10251144Sbostic argc -= optind; 10351144Sbostic argv += optind; 10451144Sbostic 10551144Sbostic if (argc != 1) 10651144Sbostic usage(); 10751144Sbostic 10851144Sbostic special = argv[0]; 10951144Sbostic if ((fd = open(special, O_RDONLY, 0)) < 0) 11051144Sbostic err("%s: %s", special, strerror(errno)); 11151144Sbostic 11251144Sbostic /* Read the first superblock */ 11351862Sbostic get(fd, LFS_LABELPAD, &lfs_sb1, sizeof(struct lfs)); 11451144Sbostic daddr_shift = lfs_sb1.lfs_bshift - lfs_sb1.lfs_fsbtodb; 11551144Sbostic 11651144Sbostic /* 11751144Sbostic * Read the second superblock and figure out which check point is 11851144Sbostic * most up to date. 11951144Sbostic */ 12051862Sbostic get(fd, 12151862Sbostic lfs_sb1.lfs_sboffs[1] << daddr_shift, &lfs_sb2, sizeof(struct lfs)); 12251861Sbostic 12351144Sbostic lfs_master = &lfs_sb1; 12451144Sbostic if (lfs_sb1.lfs_tstamp < lfs_sb2.lfs_tstamp) 12551144Sbostic lfs_master = &lfs_sb2; 12651144Sbostic 12751144Sbostic (void)printf("Master Superblock:\n"); 12851144Sbostic dump_super(lfs_master); 12951144Sbostic 13051144Sbostic dump_ifile(fd, lfs_master, do_ientries); 13151144Sbostic 13251861Sbostic if (seglist != NULL) 13351861Sbostic for (; seglist != NULL; seglist = seglist->next) { 13451861Sbostic seg_addr = lfs_master->lfs_sboffs[0] + seglist->num * 13551861Sbostic (lfs_master->lfs_ssize << lfs_master->lfs_fsbtodb); 13651861Sbostic dump_segment(fd, 13751861Sbostic seglist->num, seg_addr, lfs_master, do_allsb); 13851861Sbostic } 13951861Sbostic else 14051861Sbostic for (segnum = 0, seg_addr = lfs_master->lfs_sboffs[0]; 14151861Sbostic segnum < lfs_master->lfs_nseg; segnum++, seg_addr += 14251861Sbostic lfs_master->lfs_ssize << lfs_master->lfs_fsbtodb) 14351861Sbostic dump_segment(fd, 14451861Sbostic segnum, seg_addr, lfs_master, do_allsb); 14551861Sbostic 14651144Sbostic (void)close(fd); 14751144Sbostic exit(0); 14851144Sbostic } 14951144Sbostic 15051144Sbostic /* 15151144Sbostic * We are reading all the blocks of an inode and dumping out the ifile table. 15251862Sbostic * This code could be tighter, but this is a first pass at getting the stuff 15351144Sbostic * printed out rather than making this code incredibly efficient. 15451144Sbostic */ 15551144Sbostic static void 15651144Sbostic dump_ifile(fd, lfsp, do_ientries) 15751144Sbostic int fd; 15851862Sbostic struct lfs *lfsp; 15951144Sbostic int do_ientries; 16051144Sbostic { 16151144Sbostic IFILE *ipage; 16251144Sbostic struct dinode *dip, *dpage; 16351862Sbostic daddr_t addr, *addrp, *dindir, *iaddrp, *indir; 16451862Sbostic int block_limit, i, inum, j, nblocks, nsupb, psize; 16551144Sbostic 16651144Sbostic psize = lfsp->lfs_bsize; 16751144Sbostic addr = lfsp->lfs_idaddr; 16851144Sbostic 16951144Sbostic if (!(dip = dpage = malloc(psize))) 17051144Sbostic err("%s", strerror(errno)); 17151144Sbostic get(fd, addr << daddr_shift, dip, psize); 17251144Sbostic 17351144Sbostic for (i = 0; i < lfsp->lfs_inopb; i++, dip++) 17451144Sbostic if (dip->di_inum == LFS_IFILE_INUM) 17551144Sbostic break; 17651144Sbostic 17751144Sbostic if (i >= lfsp->lfs_inopb) 17851144Sbostic err("unable to locate ifile inode"); 17951144Sbostic 18051144Sbostic (void)printf("\nIFILE inode\n"); 18151144Sbostic dump_dinode(dip); 18251861Sbostic 18351144Sbostic (void)printf("\nIFILE contents\n"); 18451144Sbostic nblocks = dip->di_size >> lfsp->lfs_bshift; 18551144Sbostic block_limit = MIN(nblocks, NDADDR); 18651144Sbostic 18751144Sbostic /* Get the direct block */ 18851144Sbostic if ((ipage = malloc(psize)) == NULL) 18951144Sbostic err("%s", strerror(errno)); 19051144Sbostic for (inum = 0, addrp = dip->di_db, i = 0; i < block_limit; 19151144Sbostic i++, addrp++) { 19251144Sbostic get(fd, *addrp << daddr_shift, ipage, psize); 19351862Sbostic if (i < lfsp->lfs_cleansz) { 19451862Sbostic dump_cleaner_info(lfsp, ipage); 19552094Sbostic print_suheader; 19651862Sbostic continue; 19752094Sbostic } 19851144Sbostic 19952094Sbostic if (i < (lfsp->lfs_segtabsz + lfsp->lfs_cleansz)) { 20051862Sbostic inum = dump_ipage_segusage(lfsp, inum, ipage, 20151862Sbostic lfsp->lfs_sepb); 20251144Sbostic if (!inum) 20351144Sbostic if(!do_ientries) 20451862Sbostic goto e1; 20551144Sbostic else 20651144Sbostic print_iheader; 20751144Sbostic } else 20851144Sbostic inum = dump_ipage_ifile(inum, ipage, lfsp->lfs_ifpb); 20951862Sbostic 21051144Sbostic } 21151144Sbostic 21251144Sbostic if (nblocks <= NDADDR) 21351144Sbostic goto e0; 21451144Sbostic 21551144Sbostic /* Dump out blocks off of single indirect block */ 21651144Sbostic if (!(indir = malloc(psize))) 21751144Sbostic err("%s", strerror(errno)); 21851144Sbostic get(fd, dip->di_ib[0] << daddr_shift, indir, psize); 21951144Sbostic block_limit = MIN(i + lfsp->lfs_nindir, nblocks); 22051144Sbostic for (addrp = indir; i < block_limit; i++, addrp++) { 22151144Sbostic if (*addrp == LFS_UNUSED_DADDR) 22251144Sbostic break; 22351144Sbostic get(fd, *addrp << daddr_shift,ipage, psize); 22451862Sbostic if (i < lfsp->lfs_cleansz) { 22551862Sbostic dump_cleaner_info(lfsp, ipage); 22651862Sbostic continue; 22751862Sbostic } else 22851862Sbostic i -= lfsp->lfs_cleansz; 22951862Sbostic 23051144Sbostic if (i < lfsp->lfs_segtabsz) { 23151862Sbostic inum = dump_ipage_segusage(lfsp, inum, ipage, 23251862Sbostic lfsp->lfs_sepb); 23351144Sbostic if (!inum) 23451144Sbostic if(!do_ientries) 23551144Sbostic goto e1; 23651144Sbostic else 23751144Sbostic print_iheader; 23851144Sbostic } else 23951144Sbostic inum = dump_ipage_ifile(inum, ipage, lfsp->lfs_ifpb); 24051144Sbostic } 24151144Sbostic 24251144Sbostic if (nblocks <= lfsp->lfs_nindir * lfsp->lfs_ifpb) 24351144Sbostic goto e1; 24451861Sbostic 24551144Sbostic /* Get the double indirect block */ 24651144Sbostic if (!(dindir = malloc(psize))) 24751144Sbostic err("%s", strerror(errno)); 24851144Sbostic get(fd, dip->di_ib[1] << daddr_shift, dindir, psize); 24951144Sbostic for (iaddrp = dindir, j = 0; j < lfsp->lfs_nindir; j++, iaddrp++) { 25051144Sbostic if (*iaddrp == LFS_UNUSED_DADDR) 25151144Sbostic break; 25251144Sbostic get(fd, *iaddrp << daddr_shift, indir, psize); 25351144Sbostic block_limit = MIN(i + lfsp->lfs_nindir, nblocks); 25451144Sbostic for (addrp = indir; i < block_limit; i++, addrp++) { 25551144Sbostic if (*addrp == LFS_UNUSED_DADDR) 25651144Sbostic break; 25751144Sbostic get(fd, *addrp << daddr_shift, ipage, psize); 25851862Sbostic if (i < lfsp->lfs_cleansz) { 25951862Sbostic dump_cleaner_info(lfsp, ipage); 26051862Sbostic continue; 26151862Sbostic } else 26251862Sbostic i -= lfsp->lfs_cleansz; 26351862Sbostic 26451144Sbostic if (i < lfsp->lfs_segtabsz) { 26551144Sbostic inum = dump_ipage_segusage(lfsp, 26651862Sbostic inum, ipage, lfsp->lfs_sepb); 26751144Sbostic if (!inum) 26851144Sbostic if(!do_ientries) 26951144Sbostic goto e2; 27051144Sbostic else 27151144Sbostic print_iheader; 27251144Sbostic } else 27351144Sbostic inum = dump_ipage_ifile(inum, 27451144Sbostic ipage, lfsp->lfs_ifpb); 27551144Sbostic } 27651144Sbostic } 27751144Sbostic e2: free(dindir); 27851144Sbostic e1: free(indir); 27951144Sbostic e0: free(dpage); 28051144Sbostic free(ipage); 28151144Sbostic } 28251144Sbostic 28351144Sbostic static int 28451144Sbostic dump_ipage_ifile(i, pp, tot) 28551144Sbostic int i; 28651144Sbostic IFILE *pp; 28751144Sbostic int tot; 28851144Sbostic { 28951144Sbostic IFILE *ip; 29051144Sbostic int cnt, max; 29151144Sbostic 29251144Sbostic max = i + tot; 29351144Sbostic 29451144Sbostic for (ip = pp, cnt = i; cnt < max; cnt++, ip++) 29551144Sbostic print_ientry(cnt, ip); 29651144Sbostic return (max); 29751144Sbostic } 29851144Sbostic 29951144Sbostic static int 30051144Sbostic dump_ipage_segusage(lfsp, i, pp, tot) 30151862Sbostic struct lfs *lfsp; 30251144Sbostic int i; 30351144Sbostic IFILE *pp; 30451144Sbostic int tot; 30551144Sbostic { 30651861Sbostic SEGUSE *sp; 30751144Sbostic int cnt, max; 30851144Sbostic 30951144Sbostic max = i + tot; 31051861Sbostic for (sp = (SEGUSE *)pp, cnt = i; 31151144Sbostic cnt < lfsp->lfs_nseg && cnt < max; cnt++, sp++) 31251144Sbostic print_suentry(cnt, sp); 31351144Sbostic if (max >= lfsp->lfs_nseg) 31451144Sbostic return (0); 31551144Sbostic else 31651144Sbostic return (max); 31751144Sbostic } 31851144Sbostic 31951144Sbostic static void 32051144Sbostic dump_dinode(dip) 32151144Sbostic struct dinode *dip; 32251144Sbostic { 32351144Sbostic int i; 32451144Sbostic 32551144Sbostic (void)printf("%s%d\t%s%d\t%s%d\t%s%d\t%s%d\n", 32651144Sbostic "mode ", dip->di_mode, 32751144Sbostic "nlink ", dip->di_nlink, 32851144Sbostic "uid ", dip->di_uid, 32951144Sbostic "gid ", dip->di_gid, 33051144Sbostic "size ", dip->di_size); 33151144Sbostic (void)printf("%s%s%s%s%s%s", 33254714Sbostic "atime ", ctime(&dip->di_atime.ts_sec), 33354714Sbostic "mtime ", ctime(&dip->di_mtime.ts_sec), 33454714Sbostic "ctime ", ctime(&dip->di_ctime.ts_sec)); 33551144Sbostic (void)printf("inum %d\n", dip->di_inum); 33651144Sbostic (void)printf("Direct Addresses\n"); 33751144Sbostic for (i = 0; i < NDADDR; i++) { 33851144Sbostic (void)printf("\t%X", dip->di_db[i]); 33951144Sbostic if ((i % 6) == 5) 34051144Sbostic (void)printf("\n"); 34151144Sbostic } 34251144Sbostic for (i = 0; i < NIADDR; i++) 34351144Sbostic (void)printf("\t%X", dip->di_ib[i]); 34451144Sbostic (void)printf("\n"); 34551144Sbostic } 34651144Sbostic 34751144Sbostic static int 34852464Sstaelin dump_sum(fd, lfsp, sp, segnum, addr) 34951862Sbostic struct lfs *lfsp; 35051144Sbostic SEGSUM *sp; 35152464Sstaelin int fd, segnum; 35251861Sbostic daddr_t addr; 35351144Sbostic { 35451144Sbostic FINFO *fp; 35551861Sbostic long *dp; 35651862Sbostic int i, j; 35751861Sbostic int ck; 35851862Sbostic int numblocks; 35952464Sstaelin struct dinode *inop; 36051144Sbostic 36151862Sbostic if (sp->ss_sumsum != (ck = cksum(&sp->ss_datasum, 36251862Sbostic LFS_SUMMARY_SIZE - sizeof(sp->ss_sumsum)))) 36351861Sbostic (void)printf("dumplfs: %s %d address %lx\n", 36451861Sbostic "corrupt summary block; segment", segnum, addr); 36551861Sbostic 36651144Sbostic (void)printf("Segment Summary Info\n"); 36751862Sbostic (void)printf("\t%s%X\t%s%d\t%s%d\t%s%X\t%s%X\n", 36851144Sbostic "next ", sp->ss_next, 36951144Sbostic "nfinfo ", sp->ss_nfinfo, 37051144Sbostic "ninos ", sp->ss_ninos, 37151862Sbostic "sumsum ", sp->ss_sumsum, 37251862Sbostic "datasum ", sp->ss_datasum ); 37351144Sbostic (void)printf("\tcreate %s", ctime((time_t *)&sp->ss_create)); 37451144Sbostic 37551862Sbostic numblocks = (sp->ss_ninos + INOPB(lfsp) - 1) / INOPB(lfsp); 37651862Sbostic 37751862Sbostic /* Dump out inode disk addresses */ 37851862Sbostic dp = (daddr_t *)sp; 37951862Sbostic dp += LFS_SUMMARY_SIZE / sizeof(daddr_t); 38052464Sstaelin inop = malloc(1 << lfsp->lfs_bshift); 38151862Sbostic printf("\tInode addresses:"); 38252464Sstaelin for (dp--, i = 0; i < sp->ss_ninos; dp--) { 38352464Sstaelin printf("\t%X {", *dp); 38452464Sstaelin get(fd, *dp << (lfsp->lfs_bshift - lfsp->lfs_fsbtodb), inop, 38552464Sstaelin (1 << lfsp->lfs_bshift)); 38652464Sstaelin for (j = 0; i < sp->ss_ninos && j < INOPB(lfsp); j++, i++) { 38752464Sstaelin if (j > 0) 38852464Sstaelin (void)printf(", "); 38952464Sstaelin (void)printf("%d", inop[j].di_inum); 39052464Sstaelin } 39152464Sstaelin (void)printf("}"); 39252464Sstaelin if (((i/INOPB(lfsp)) % 4) == 3) 39352464Sstaelin (void)printf("\n"); 39452464Sstaelin } 39552464Sstaelin free(inop); 39651862Sbostic 39751862Sbostic printf("\n"); 39851144Sbostic for (fp = (FINFO *)(sp + 1), i = 0; i < sp->ss_nfinfo; i++) { 39951862Sbostic numblocks += fp->fi_nblocks; 40051144Sbostic (void)printf("File Info for file: %d version %d nblocks %d\n", 40151144Sbostic fp->fi_ino, fp->fi_version, fp->fi_nblocks); 40251144Sbostic dp = &(fp->fi_blocks[0]); 40351144Sbostic for (j = 0; j < fp->fi_nblocks; j++, dp++) { 40451144Sbostic (void)printf("\t%d", *dp); 40551144Sbostic if ((j % 8) == 7) 40651144Sbostic (void)printf("\n"); 40751144Sbostic } 40851144Sbostic if ((j % 8) != 0) 40951144Sbostic (void)printf("\n"); 41051144Sbostic fp = (FINFO *)dp; 41151144Sbostic } 41251862Sbostic return (numblocks); 41351144Sbostic } 41451144Sbostic 41551862Sbostic static void 41651861Sbostic dump_segment(fd, segnum, addr, lfsp, dump_sb) 41751861Sbostic int fd, segnum; 41851144Sbostic daddr_t addr; 41951862Sbostic struct lfs *lfsp; 42051144Sbostic int dump_sb; 42151144Sbostic { 42251862Sbostic struct lfs lfs_sb, *sbp; 42351144Sbostic SEGSUM *sump; 42451144Sbostic char sumblock[LFS_SUMMARY_SIZE]; 42551862Sbostic int did_one, nblocks, sb; 42651862Sbostic off_t sum_offset, super_off; 42751144Sbostic 42851861Sbostic (void)printf("\nSegment Number %d (Disk Address %X)\n", 42951144Sbostic addr >> (lfsp->lfs_segshift - daddr_shift), addr); 43051862Sbostic sum_offset = (addr << (lfsp->lfs_bshift - lfsp->lfs_fsbtodb)); 43151861Sbostic 43251144Sbostic sb = 0; 43351862Sbostic did_one = 0; 43451144Sbostic do { 43551144Sbostic get(fd, sum_offset, sumblock, LFS_SUMMARY_SIZE); 43651144Sbostic sump = (SEGSUM *)sumblock; 43751862Sbostic if (sump->ss_sumsum != cksum (&sump->ss_datasum, 43851862Sbostic LFS_SUMMARY_SIZE - sizeof(sump->ss_sumsum))) { 43951862Sbostic sbp = (struct lfs *)sump; 44051862Sbostic if (sb = (sbp->lfs_magic == LFS_MAGIC)) { 44151862Sbostic super_off = sum_offset; 44251862Sbostic sum_offset += LFS_SBPAD; 44351862Sbostic } else if (did_one) 44451862Sbostic break; 44551862Sbostic else { 44651862Sbostic printf("Segment at %X corrupt\n", addr); 44751862Sbostic break; 44851862Sbostic } 44951862Sbostic } else { 45052464Sstaelin nblocks = dump_sum(fd, lfsp, sump, segnum, addr); 45151862Sbostic if (nblocks) 45252464Sstaelin sum_offset += LFS_SUMMARY_SIZE + 45352464Sstaelin (nblocks << lfsp->lfs_bshift); 45451862Sbostic else 45551862Sbostic sum_offset = 0; 45651862Sbostic did_one = 1; 45751862Sbostic } 45851144Sbostic } while (sum_offset); 45951862Sbostic 46051144Sbostic if (dump_sb && sb) { 46151862Sbostic get(fd, super_off, &lfs_sb, sizeof(struct lfs)); 46251144Sbostic dump_super(&lfs_sb); 46351144Sbostic } 46451862Sbostic return; 46551144Sbostic } 46651144Sbostic 46751861Sbostic static void 46851144Sbostic dump_super(lfsp) 46951862Sbostic struct lfs *lfsp; 47051144Sbostic { 47151144Sbostic int i; 47251144Sbostic 47351144Sbostic (void)printf("%s%X\t%s%X\t%s%d\t%s%d\n", 47451144Sbostic "magic ", lfsp->lfs_magic, 47551144Sbostic "version ", lfsp->lfs_version, 47651144Sbostic "size ", lfsp->lfs_size, 47751144Sbostic "ssize ", lfsp->lfs_ssize); 47851144Sbostic (void)printf("%s%d\t%s%d\t%s%d\t%s%d\n", 47951144Sbostic "dsize ", lfsp->lfs_dsize, 48051144Sbostic "bsize ", lfsp->lfs_bsize, 48151144Sbostic "fsize ", lfsp->lfs_fsize, 48251144Sbostic "frag ", lfsp->lfs_frag); 48351144Sbostic 48451144Sbostic (void)printf("%s%d\t%s%d\t%s%d\t%s%d\n", 48551144Sbostic "minfree ", lfsp->lfs_minfree, 48651144Sbostic "inopb ", lfsp->lfs_inopb, 48751144Sbostic "ifpb ", lfsp->lfs_ifpb, 48851144Sbostic "nindir ", lfsp->lfs_nindir); 48951144Sbostic 49051862Sbostic (void)printf("%s%d\t%s%d\t%s%d\t%s%d\n", 49151144Sbostic "nseg ", lfsp->lfs_nseg, 49251144Sbostic "nspf ", lfsp->lfs_nspf, 49351862Sbostic "cleansz ", lfsp->lfs_cleansz, 49451144Sbostic "segtabsz ", lfsp->lfs_segtabsz); 49551144Sbostic 49651144Sbostic (void)printf("%s%X\t%s%d\t%s%X\t%s%d\n", 49751144Sbostic "segmask ", lfsp->lfs_segmask, 49851144Sbostic "segshift ", lfsp->lfs_segshift, 49951144Sbostic "bmask ", lfsp->lfs_bmask, 50051144Sbostic "bshift ", lfsp->lfs_bshift); 50151144Sbostic 50251144Sbostic (void)printf("%s%X\t%s%d\t%s%X\t%s%d\n", 50351144Sbostic "ffmask ", lfsp->lfs_ffmask, 50451144Sbostic "ffshift ", lfsp->lfs_ffshift, 50551144Sbostic "fbmask ", lfsp->lfs_fbmask, 50651144Sbostic "fbshift ", lfsp->lfs_fbshift); 50751144Sbostic 50851861Sbostic (void)printf("%s%d\t%s%X\n", 50951144Sbostic "fsbtodb ", lfsp->lfs_fsbtodb, 51051144Sbostic "cksum ", lfsp->lfs_cksum); 51151144Sbostic 51251144Sbostic (void)printf("Superblock disk addresses:"); 51351144Sbostic for (i = 0; i < LFS_MAXNUMSB; i++) 51451144Sbostic (void)printf(" %X", lfsp->lfs_sboffs[i]); 51551144Sbostic (void)printf("\n"); 51651144Sbostic 51751144Sbostic (void)printf("Checkpoint Info\n"); 51851861Sbostic (void)printf("%s%d\t%s%X\t%s%d\n", 51951144Sbostic "free ", lfsp->lfs_free, 52051144Sbostic "idaddr ", lfsp->lfs_idaddr, 52151861Sbostic "ifile ", lfsp->lfs_ifile); 52251862Sbostic (void)printf("%s%X\t%s%d\t%s%X\t%s%X\t%s%X\t%s%X\n", 52351861Sbostic "bfree ", lfsp->lfs_bfree, 52451861Sbostic "nfiles ", lfsp->lfs_nfiles, 52551861Sbostic "lastseg ", lfsp->lfs_lastseg, 52651862Sbostic "nextseg ", lfsp->lfs_nextseg, 52751862Sbostic "curseg ", lfsp->lfs_curseg, 52851862Sbostic "offset ", lfsp->lfs_offset); 52951144Sbostic (void)printf("tstamp %s", ctime((time_t *)&lfsp->lfs_tstamp)); 530*55239Sbostic (void)printf("In-Memory Information\n"); 531*55239Sbostic (void)printf("%s%d\t%s%X\t%s%d\t%s%d\t%s%d\n", 532*55239Sbostic "seglock ", lfsp->lfs_seglock, 533*55239Sbostic "iocount ", lfsp->lfs_iocount, 534*55239Sbostic "writer ", lfsp->lfs_writer, 535*55239Sbostic "dirops ", lfsp->lfs_dirops, 536*55239Sbostic "doifile ", lfsp->lfs_doifile ); 537*55239Sbostic (void)printf("%s%d\t%s%X\t%s%d\n", 538*55239Sbostic "fmod ", lfsp->lfs_fmod, 539*55239Sbostic "clean ", lfsp->lfs_clean, 540*55239Sbostic "ronly ", lfsp->lfs_ronly); 54151144Sbostic } 54251144Sbostic 54351144Sbostic static void 54451861Sbostic addseg(arg) 54551861Sbostic char *arg; 54651861Sbostic { 54751861Sbostic SEGLIST *p; 54851861Sbostic 54951861Sbostic if ((p = malloc(sizeof(SEGLIST))) == NULL) 55051861Sbostic err("%s", strerror(errno)); 55151861Sbostic p->next = seglist; 55251861Sbostic p->num = atoi(arg); 55351861Sbostic seglist = p; 55451861Sbostic } 55551861Sbostic 55651861Sbostic static void 55751862Sbostic dump_cleaner_info(lfsp, ipage) 55851862Sbostic struct lfs *lfsp; 55951862Sbostic void *ipage; 56051862Sbostic { 56151929Sbostic CLEANERINFO *cip; 56251929Sbostic 56351929Sbostic cip = (CLEANERINFO *)ipage; 56451929Sbostic (void)printf("Cleaner Info\nclean\t%d\tdirty\t%d\n", 56551929Sbostic cip->clean, cip->dirty); 56651862Sbostic } 56751862Sbostic 56851862Sbostic static void 56951144Sbostic usage() 57051144Sbostic { 57151861Sbostic (void)fprintf(stderr, "usage: dumplfs [-ai] [-s segnum] file\n"); 57251144Sbostic exit(1); 57351144Sbostic } 574