print more than one partial segment per segment; print out inode
[unix-history] / usr / src / sbin / dumplfs / dumplfs.c
index 85b825b..7ad53ec 100644 (file)
@@ -12,7 +12,7 @@ char copyright[] =
 #endif /* not lint */
 
 #ifndef lint
 #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>
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -39,7 +39,7 @@ static void   dump_ifile __P((int, struct lfs *, int));
 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_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));
 
 static void    dump_super __P((struct lfs *));
 static void    usage __P((void));
 
@@ -56,22 +56,24 @@ char *special;
 /* Segment Usage formats */
 #define print_suheader \
        (void)printf("segnum\tstatus\tnbytes\t\tlastmod\n")
 /* Segment Usage formats */
 #define print_suheader \
        (void)printf("segnum\tstatus\tnbytes\t\tlastmod\n")
+
 #define print_suentry(i, sp) \
 #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 \
            (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) \
 #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 \
                    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;
 int
 main(argc, argv)
        int argc;
@@ -179,7 +181,6 @@ dump_ifile(fd, lfsp, do_ientries)
        dump_dinode(dip);
 
        (void)printf("\nIFILE contents\n");
        dump_dinode(dip);
 
        (void)printf("\nIFILE contents\n");
-       print_suheader;
        nblocks = dip->di_size >> lfsp->lfs_bshift;
        block_limit = MIN(nblocks, NDADDR);
 
        nblocks = dip->di_size >> lfsp->lfs_bshift;
        block_limit = MIN(nblocks, NDADDR);
 
@@ -191,11 +192,11 @@ dump_ifile(fd, lfsp, do_ientries)
                get(fd, *addrp << daddr_shift, ipage, psize);
                if (i < lfsp->lfs_cleansz) {
                        dump_cleaner_info(lfsp, ipage);
                get(fd, *addrp << daddr_shift, ipage, psize);
                if (i < lfsp->lfs_cleansz) {
                        dump_cleaner_info(lfsp, ipage);
+                       print_suheader;
                        continue;
                        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)
                        inum = dump_ipage_segusage(lfsp, inum, ipage, 
                            lfsp->lfs_sepb);
                        if (!inum)
@@ -344,10 +345,10 @@ dump_dinode(dip)
 }
 
 static int
 }
 
 static int
-dump_sum(lfsp, sp, segnum, addr)
+dump_sum(fd, lfsp, sp, segnum, addr)
        struct lfs *lfsp;
        SEGSUM *sp;
        struct lfs *lfsp;
        SEGSUM *sp;
-       int segnum;
+       int fd, segnum;
        daddr_t addr;
 {
        FINFO *fp;
        daddr_t addr;
 {
        FINFO *fp;
@@ -355,6 +356,7 @@ dump_sum(lfsp, sp, segnum, addr)
        int i, j;
        int ck;
        int numblocks;
        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))))
 
        if (sp->ss_sumsum != (ck = cksum(&sp->ss_datasum, 
            LFS_SUMMARY_SIZE - sizeof(sp->ss_sumsum))))
@@ -375,9 +377,22 @@ dump_sum(lfsp, sp, segnum, addr)
        /* Dump out inode disk addresses */
        dp = (daddr_t *)sp;
        dp += LFS_SUMMARY_SIZE / sizeof(daddr_t);
        /* 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:");
        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++) {
 
        printf("\n");
        for (fp = (FINFO *)(sp + 1), i = 0; i < sp->ss_nfinfo; i++) {
@@ -432,9 +447,10 @@ dump_segment(fd, segnum, addr, lfsp, dump_sb)
                                break;
                        }
                } else {
                                break;
                        }
                } else {
-                       nblocks = dump_sum(lfsp, sump, segnum, addr);
+                       nblocks = dump_sum(fd, lfsp, sump, segnum, addr);
                        if (nblocks)
                        if (nblocks)
-                               sum_offset += (nblocks << lfsp->lfs_bshift);
+                               sum_offset += LFS_SUMMARY_SIZE + 
+                                       (nblocks << lfsp->lfs_bshift);
                        else
                                sum_offset = 0;
                        did_one = 1;
                        else
                                sum_offset = 0;
                        did_one = 1;
@@ -531,7 +547,11 @@ dump_cleaner_info(lfsp, ipage)
        struct lfs *lfsp;
        void *ipage;
 {
        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
 }
 
 static void