1*55859Sbostic /*- 2*55859Sbostic * Copyright (c) 1992 The Regents of the University of California. 3*55859Sbostic * All rights reserved. 4*55859Sbostic * 5*55859Sbostic * %sccs.include.redist.c% 6*55859Sbostic */ 7*55859Sbostic 8*55859Sbostic #ifndef lint 9*55859Sbostic static char sccsid[] = "@(#)print.c 5.1 (Berkeley) 08/06/92"; 10*55859Sbostic #endif /* not lint */ 11*55859Sbostic 12*55859Sbostic #include <sys/param.h> 13*55859Sbostic #include <sys/ucred.h> 14*55859Sbostic #include <sys/mount.h> 15*55859Sbostic #include <sys/time.h> 16*55859Sbostic 17*55859Sbostic #include <ufs/ufs/dinode.h> 18*55859Sbostic #include <ufs/lfs/lfs.h> 19*55859Sbostic 20*55859Sbostic #include <stdlib.h> 21*55859Sbostic #include <stdio.h> 22*55859Sbostic #include "clean.h" 23*55859Sbostic 24*55859Sbostic /* 25*55859Sbostic * Print out a summary block; return number of blocks in segment; 0 26*55859Sbostic * for empty segment or corrupt segment. 27*55859Sbostic * Returns a pointer to the array of inode addresses. 28*55859Sbostic */ 29*55859Sbostic int 30*55859Sbostic dump_summary(lfsp, sp, flags, iaddrp) 31*55859Sbostic struct lfs *lfsp; 32*55859Sbostic SEGSUM *sp; 33*55859Sbostic u_long flags; 34*55859Sbostic daddr_t **iaddrp; 35*55859Sbostic { 36*55859Sbostic int i, j, numblocks; 37*55859Sbostic daddr_t *dp; 38*55859Sbostic 39*55859Sbostic FINFO *fp; 40*55859Sbostic int ck; 41*55859Sbostic 42*55859Sbostic if (sp->ss_sumsum != (ck = cksum(&sp->ss_datasum, 43*55859Sbostic LFS_SUMMARY_SIZE - sizeof(sp->ss_sumsum)))) 44*55859Sbostic return(-1); 45*55859Sbostic 46*55859Sbostic if (flags & DUMP_SUM_HEADER) { 47*55859Sbostic (void)printf(" %s0x%X\t%s%d\t%s%d\n %s0x%X\t%s0x%X", 48*55859Sbostic "next ", sp->ss_next, 49*55859Sbostic "nfinfo ", sp->ss_nfinfo, 50*55859Sbostic "ninos ", sp->ss_ninos, 51*55859Sbostic "sumsum ", sp->ss_sumsum, 52*55859Sbostic "datasum ", sp->ss_datasum ); 53*55859Sbostic (void)printf("\tcreate %s", ctime((time_t *)&sp->ss_create)); 54*55859Sbostic } 55*55859Sbostic 56*55859Sbostic numblocks = (sp->ss_ninos + INOPB(lfsp) - 1) / INOPB(lfsp); 57*55859Sbostic 58*55859Sbostic /* Dump out inode disk addresses */ 59*55859Sbostic if (flags & DUMP_INODE_ADDRS) 60*55859Sbostic printf(" Inode addresses:"); 61*55859Sbostic 62*55859Sbostic dp = (daddr_t *)((caddr_t)sp + LFS_SUMMARY_SIZE); 63*55859Sbostic for (--dp, i = 0; i < sp->ss_ninos; --dp) 64*55859Sbostic if (flags & DUMP_INODE_ADDRS) { 65*55859Sbostic (void)printf("\t0x%lx", *dp); 66*55859Sbostic if (++i % 7 == 0) 67*55859Sbostic (void)printf("\n"); 68*55859Sbostic } else 69*55859Sbostic ++i; 70*55859Sbostic if (iaddrp) 71*55859Sbostic *iaddrp = ++dp; 72*55859Sbostic if (flags & DUMP_INODE_ADDRS) 73*55859Sbostic printf("\n"); 74*55859Sbostic 75*55859Sbostic for (fp = (FINFO *)(sp + 1), i = 0; i < sp->ss_nfinfo; ++i) { 76*55859Sbostic numblocks += fp->fi_nblocks; 77*55859Sbostic if (flags & DUMP_FINFOS) { 78*55859Sbostic (void)printf(" %s%d version %d nblocks %d\n", 79*55859Sbostic "FINFO for inode: ", fp->fi_ino, 80*55859Sbostic fp->fi_version, fp->fi_nblocks); 81*55859Sbostic dp = &(fp->fi_blocks[0]); 82*55859Sbostic for (j = 0; j < fp->fi_nblocks; j++, dp++) { 83*55859Sbostic (void)printf("\t%d", *dp); 84*55859Sbostic if ((j % 8) == 7) 85*55859Sbostic (void)printf("\n"); 86*55859Sbostic } 87*55859Sbostic if ((j % 8) != 0) 88*55859Sbostic (void)printf("\n"); 89*55859Sbostic fp = (FINFO *)dp; 90*55859Sbostic } else { 91*55859Sbostic fp = (FINFO *)(&fp->fi_blocks[fp->fi_nblocks]); 92*55859Sbostic } 93*55859Sbostic } 94*55859Sbostic return (numblocks); 95*55859Sbostic } 96*55859Sbostic 97*55859Sbostic #ifdef VERBOSE 98*55859Sbostic void 99*55859Sbostic dump_cleaner_info(ipage) 100*55859Sbostic void *ipage; 101*55859Sbostic { 102*55859Sbostic CLEANERINFO *cip; 103*55859Sbostic 104*55859Sbostic cip = (CLEANERINFO *)ipage; 105*55859Sbostic (void)printf("segments clean\t%d\tsegments dirty\t%d\n\n", 106*55859Sbostic cip->clean, cip->dirty); 107*55859Sbostic } 108*55859Sbostic 109*55859Sbostic void 110*55859Sbostic dump_super(lfsp) 111*55859Sbostic struct lfs *lfsp; 112*55859Sbostic { 113*55859Sbostic int i; 114*55859Sbostic 115*55859Sbostic (void)printf("%s0x%X\t%s0x%X\t%s%d\t%s%d\n", 116*55859Sbostic "magic ", lfsp->lfs_magic, 117*55859Sbostic "version ", lfsp->lfs_version, 118*55859Sbostic "size ", lfsp->lfs_size, 119*55859Sbostic "ssize ", lfsp->lfs_ssize); 120*55859Sbostic (void)printf("%s%d\t\t%s%d\t%s%d\t%s%d\n", 121*55859Sbostic "dsize ", lfsp->lfs_dsize, 122*55859Sbostic "bsize ", lfsp->lfs_bsize, 123*55859Sbostic "fsize ", lfsp->lfs_fsize, 124*55859Sbostic "frag ", lfsp->lfs_frag); 125*55859Sbostic 126*55859Sbostic (void)printf("%s%d\t\t%s%d\t%s%d\t%s%d\n", 127*55859Sbostic "minfree ", lfsp->lfs_minfree, 128*55859Sbostic "inopb ", lfsp->lfs_inopb, 129*55859Sbostic "ifpb ", lfsp->lfs_ifpb, 130*55859Sbostic "nindir ", lfsp->lfs_nindir); 131*55859Sbostic 132*55859Sbostic (void)printf("%s%d\t\t%s%d\t%s%d\t%s%d\n", 133*55859Sbostic "nseg ", lfsp->lfs_nseg, 134*55859Sbostic "nspf ", lfsp->lfs_nspf, 135*55859Sbostic "cleansz ", lfsp->lfs_cleansz, 136*55859Sbostic "segtabsz ", lfsp->lfs_segtabsz); 137*55859Sbostic 138*55859Sbostic (void)printf("%s0x%X\t%s%d\t%s0x%X\t%s%d\n", 139*55859Sbostic "segmask ", lfsp->lfs_segmask, 140*55859Sbostic "segshift ", lfsp->lfs_segshift, 141*55859Sbostic "bmask ", lfsp->lfs_bmask, 142*55859Sbostic "bshift ", lfsp->lfs_bshift); 143*55859Sbostic 144*55859Sbostic (void)printf("%s0x%X\t\t%s%d\t%s0x%X\t%s%d\n", 145*55859Sbostic "ffmask ", lfsp->lfs_ffmask, 146*55859Sbostic "ffshift ", lfsp->lfs_ffshift, 147*55859Sbostic "fbmask ", lfsp->lfs_fbmask, 148*55859Sbostic "fbshift ", lfsp->lfs_fbshift); 149*55859Sbostic 150*55859Sbostic (void)printf("%s%d\t\t%s0x%X\t%s0x%qx\n", 151*55859Sbostic "fsbtodb ", lfsp->lfs_fsbtodb, 152*55859Sbostic "cksum ", lfsp->lfs_cksum, 153*55859Sbostic "maxfilesize ", lfsp->lfs_maxfilesize); 154*55859Sbostic 155*55859Sbostic (void)printf("Superblock disk addresses:\t"); 156*55859Sbostic for (i = 0; i < LFS_MAXNUMSB; i++) { 157*55859Sbostic (void)printf(" 0x%X", lfsp->lfs_sboffs[i]); 158*55859Sbostic if ( i == (LFS_MAXNUMSB >> 1)) 159*55859Sbostic (void)printf("\n\t\t\t\t"); 160*55859Sbostic } 161*55859Sbostic (void)printf("\n"); 162*55859Sbostic 163*55859Sbostic (void)printf("Checkpoint Info\n"); 164*55859Sbostic (void)printf("%s%d\t%s0x%X\t%s%d\n", 165*55859Sbostic "free ", lfsp->lfs_free, 166*55859Sbostic "idaddr ", lfsp->lfs_idaddr, 167*55859Sbostic "ifile ", lfsp->lfs_ifile); 168*55859Sbostic (void)printf("%s0x%X\t%s%d\t%s0x%X\t%s0x%X\n%s0x%X\t%s0x%X\t", 169*55859Sbostic "bfree ", lfsp->lfs_bfree, 170*55859Sbostic "nfiles ", lfsp->lfs_nfiles, 171*55859Sbostic "lastseg ", lfsp->lfs_lastseg, 172*55859Sbostic "nextseg ", lfsp->lfs_nextseg, 173*55859Sbostic "curseg ", lfsp->lfs_curseg, 174*55859Sbostic "offset ", lfsp->lfs_offset); 175*55859Sbostic (void)printf("tstamp %s", ctime((time_t *)&lfsp->lfs_tstamp)); 176*55859Sbostic (void)printf("\nIn-Memory Information\n"); 177*55859Sbostic (void)printf("%s%d\t%s0x%X\t%s%d\t%s%d\t%s%d\n", 178*55859Sbostic "seglock ", lfsp->lfs_seglock, 179*55859Sbostic "iocount ", lfsp->lfs_iocount, 180*55859Sbostic "writer ", lfsp->lfs_writer, 181*55859Sbostic "dirops ", lfsp->lfs_dirops, 182*55859Sbostic "doifile ", lfsp->lfs_doifile ); 183*55859Sbostic (void)printf("%s%d\t%s0x%X\t%s%d\n", 184*55859Sbostic "fmod ", lfsp->lfs_fmod, 185*55859Sbostic "clean ", lfsp->lfs_clean, 186*55859Sbostic "ronly ", lfsp->lfs_ronly); 187*55859Sbostic } 188*55859Sbostic #endif /* VERBOSE */ 189