#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)dumplfs.c 5.4 (Berkeley) %G%";
+static char sccsid[] = "@(#)dumplfs.c 5.7 (Berkeley) %G%";
#endif /* not lint */
#include <sys/param.h>
static int dump_ipage_ifile __P((int, IFILE *, int));
static int dump_ipage_segusage __P((struct lfs *, int, IFILE *, int));
static void dump_segment __P((int, int, daddr_t, struct lfs *, int));
-static int dump_sum __P((struct lfs *, SEGSUM *, int, daddr_t));
+static int dump_sum __P((int, struct lfs *, SEGSUM *, int, daddr_t));
static void dump_super __P((struct lfs *));
static void usage __P((void));
/* Segment Usage formats */
#define print_suheader \
(void)printf("segnum\tstatus\tnbytes\t\tlastmod\n")
+
#define print_suentry(i, sp) \
- (void)printf("%d\t%s\t%d\t%s", \
- i, (((sp)->su_flags) ? "DIRTY" : "CLEAN"), \
+ (void)printf("%d\t%c%c%c\t%d\t%s", i, \
+ (((sp)->su_flags & SEGUSE_ACTIVE) ? 'A' : ' '), \
+ (((sp)->su_flags & SEGUSE_DIRTY) ? 'D' : 'C'), \
+ (((sp)->su_flags & SEGUSE_SUPERBLOCK) ? 'S' : ' '), \
(sp)->su_nbytes, ctime((time_t *)&(sp)->su_lastmod))
/* Ifile formats */
#define print_iheader \
- (void)printf("inum\tstatus\tversion\tdaddr\t\tatime\tfreeptr\n")
+ (void)printf("inum\tstatus\tversion\tdaddr\t\tfreeptr\n")
#define print_ientry(i, ip) \
if (ip->if_daddr == LFS_UNUSED_DADDR) \
- (void)printf("%d\tFREE\t%d\t \t\t \t%d\n", \
+ (void)printf("%d\tFREE\t%d\t \t\t%d\n", \
i, ip->if_version, ip->if_nextfree); \
else \
- (void)printf("%d\tINUSE\t%d\t%8X \t%s\n", \
- i, ip->if_version, ip->if_daddr, \
- ctime((time_t *)&ip->if_st_atime))
+ (void)printf("%d\tINUSE\t%d\t%8X \n", \
+ i, ip->if_version, ip->if_daddr)
int
main(argc, argv)
int argc;
dump_dinode(dip);
(void)printf("\nIFILE contents\n");
- print_suheader;
nblocks = dip->di_size >> lfsp->lfs_bshift;
block_limit = MIN(nblocks, NDADDR);
get(fd, *addrp << daddr_shift, ipage, psize);
if (i < lfsp->lfs_cleansz) {
dump_cleaner_info(lfsp, ipage);
+ print_suheader;
continue;
- } else
- i -= lfsp->lfs_cleansz;
+ }
- if (i < lfsp->lfs_segtabsz) {
+ if (i < (lfsp->lfs_segtabsz + lfsp->lfs_cleansz)) {
inum = dump_ipage_segusage(lfsp, inum, ipage,
lfsp->lfs_sepb);
if (!inum)
}
static int
-dump_sum(lfsp, sp, segnum, addr)
+dump_sum(fd, lfsp, sp, segnum, addr)
struct lfs *lfsp;
SEGSUM *sp;
- int segnum;
+ int fd, segnum;
daddr_t addr;
{
FINFO *fp;
int i, j;
int ck;
int numblocks;
+ struct dinode *inop;
if (sp->ss_sumsum != (ck = cksum(&sp->ss_datasum,
LFS_SUMMARY_SIZE - sizeof(sp->ss_sumsum))))
/* Dump out inode disk addresses */
dp = (daddr_t *)sp;
dp += LFS_SUMMARY_SIZE / sizeof(daddr_t);
+ inop = malloc(1 << lfsp->lfs_bshift);
printf("\tInode addresses:");
- for (dp--, i = 0; i < numblocks; i += INOPB(lfsp))
- printf("\t%X", *dp--);
+ for (dp--, i = 0; i < sp->ss_ninos; dp--) {
+ printf("\t%X {", *dp);
+ get(fd, *dp << (lfsp->lfs_bshift - lfsp->lfs_fsbtodb), inop,
+ (1 << lfsp->lfs_bshift));
+ for (j = 0; i < sp->ss_ninos && j < INOPB(lfsp); j++, i++) {
+ if (j > 0)
+ (void)printf(", ");
+ (void)printf("%d", inop[j].di_inum);
+ }
+ (void)printf("}");
+ if (((i/INOPB(lfsp)) % 4) == 3)
+ (void)printf("\n");
+ }
+ free(inop);
printf("\n");
for (fp = (FINFO *)(sp + 1), i = 0; i < sp->ss_nfinfo; i++) {
break;
}
} else {
- nblocks = dump_sum(lfsp, sump, segnum, addr);
+ nblocks = dump_sum(fd, lfsp, sump, segnum, addr);
if (nblocks)
- sum_offset += (nblocks << lfsp->lfs_bshift);
+ sum_offset += LFS_SUMMARY_SIZE +
+ (nblocks << lfsp->lfs_bshift);
else
sum_offset = 0;
did_one = 1;
struct lfs *lfsp;
void *ipage;
{
- return;
+ CLEANERINFO *cip;
+
+ cip = (CLEANERINFO *)ipage;
+ (void)printf("Cleaner Info\nclean\t%d\tdirty\t%d\n",
+ cip->clean, cip->dirty);
}
static void