int main (int argc, char * argv[]) { char * file_name; int dev, i; #if 1 if (1) { /* ???? */ schedule (); iput (0); } #endif fprintf (stderr, "\n<-----------dumpreiserfs, version 0.99, 2000----------->\n"); file_name = parse_options (argc, argv); dev = open (file_name, O_RDONLY); if (dev == -1) die ("dumpreiserfs: Can not open device %s: %s\n", file_name, strerror (errno)); g_sb.s_dev = dev; if (uread_super_block (&g_sb)) die ("dumpreiserfs: no reiserfs found on %s", file_name); if (uread_bitmaps (&g_sb)) die ("dumpreiserfs: read_bitmap failed"); if (opt_pack || opt_pack_all) { pack_partition (&g_sb); } else { /* dump file system to stdout */ if (opt_block_to_print != -1) { print_one_block (opt_block_to_print); goto end; } print_block (SB_BUFFER_WITH_SB (&g_sb)); if (opt_print_journal) print_journal (&g_sb); if (opt_print_objectid_map == 1) print_objectid_map (&g_sb); if (opt_print_block_map) { print_bmap (&g_sb, opt_print_block_map == 1 ? 1 : 0); } if (opt_print_regular_file_content || opt_print_directory_contents || opt_print_leaf_items) { print_disk_tree (SB_ROOT_BLOCK (&g_sb)); /* print the statistic */ printf ("File system uses %d internal + %d leaves + %d unformatted nodes = %d blocks\n", g_stat_info.nr_internals, g_stat_info.nr_leaves, g_stat_info.nr_unformatted, g_stat_info.nr_internals + g_stat_info.nr_leaves + g_stat_info.nr_unformatted); } } end: /* brelse bitmaps */ if (SB_AP_BITMAP (&g_sb)) { for (i = 0; i < SB_BMAP_NR (&g_sb); i ++) { brelse (SB_AP_BITMAP (&g_sb)[i]); } freemem (SB_AP_BITMAP (&g_sb)); } /* brelse buffer containing super block */ brelse (SB_BUFFER_WITH_SB (&g_sb)); check_and_free_buffer_mem (); return 0; }
static void print_fattr (const fattr4 *attr) { print_bmap(&attr->attrmask); }
void pass5(void) { int c; struct m_ext2fs *fs = &sblock; daddr_t dbase, dmax; daddr_t d; long i, j; struct inodesc idesc[3]; struct bufarea *ino_bitmap = NULL, *blk_bitmap = NULL; char *ibmap, *bbmap; u_int32_t cs_ndir, cs_nbfree, cs_nifree; char msg[255]; cs_ndir = 0; cs_nbfree = 0; cs_nifree = 0; ibmap = malloc(fs->e2fs_bsize); bbmap = malloc(fs->e2fs_bsize); if (ibmap == NULL || bbmap == NULL) { errexit("out of memory\n"); } for (c = 0; c < fs->e2fs_ncg; c++) { u_int32_t nbfree = 0; u_int32_t nifree = 0; u_int32_t ndirs = 0; nbfree = 0; nifree = fs->e2fs.e2fs_ipg; ndirs = 0; if (blk_bitmap == NULL) { blk_bitmap = getdatablk(fs2h32(fs->e2fs_gd[c].ext2bgd_b_bitmap), fs->e2fs_bsize); } else { getblk(blk_bitmap, fs2h32(fs->e2fs_gd[c].ext2bgd_b_bitmap), fs->e2fs_bsize); } if (ino_bitmap == NULL) { ino_bitmap = getdatablk(fs2h32(fs->e2fs_gd[c].ext2bgd_i_bitmap), fs->e2fs_bsize); } else { getblk(ino_bitmap, fs2h32(fs->e2fs_gd[c].ext2bgd_i_bitmap), fs->e2fs_bsize); } memset(bbmap, 0, fs->e2fs_bsize); memset(ibmap, 0, fs->e2fs_bsize); memset(&idesc[0], 0, sizeof idesc); for (i = 0; i < 3; i++) { idesc[i].id_type = ADDR; } j = fs->e2fs.e2fs_ipg * c + 1; for (i = 0; i < fs->e2fs.e2fs_ipg; j++, i++) { if ((j < EXT2_FIRSTINO) && (j != EXT2_ROOTINO)) { setbit(ibmap, i); nifree--; continue; } if (j > fs->e2fs.e2fs_icount) { setbit(ibmap, i); continue; } switch (statemap[j]) { case USTATE: break; case DSTATE: case DCLEAR: case DFOUND: ndirs++; /* fall through */ case FSTATE: case FCLEAR: nifree--; setbit(ibmap, i); break; default: errexit("BAD STATE %d FOR INODE I=%ld\n", statemap[j], j); } } /* fill in unused par of the inode map */ for (i = fs->e2fs.e2fs_ipg / NBBY; i < fs->e2fs_bsize; i++) ibmap[i] = 0xff; dbase = c * sblock.e2fs.e2fs_bpg + sblock.e2fs.e2fs_first_dblock; dmax = (c+1) * sblock.e2fs.e2fs_bpg + sblock.e2fs.e2fs_first_dblock; for (i = 0, d = dbase; d < dmax; d ++, i ++) { if (testbmap(d) || d >= sblock.e2fs.e2fs_bcount) { setbit(bbmap, i); continue; } else { nbfree++; } } cs_nbfree += nbfree; cs_nifree += nifree; cs_ndir += ndirs; if (debug && (fs2h16(fs->e2fs_gd[c].ext2bgd_nbfree) != nbfree || fs2h16(fs->e2fs_gd[c].ext2bgd_nifree) != nifree || fs2h16(fs->e2fs_gd[c].ext2bgd_ndirs) != ndirs)) { printf("summary info for cg %d is %d, %d, %d," "should be %d, %d, %d\n", c, fs2h16(fs->e2fs_gd[c].ext2bgd_nbfree), fs2h16(fs->e2fs_gd[c].ext2bgd_nifree), fs2h16(fs->e2fs_gd[c].ext2bgd_ndirs), nbfree, nifree, ndirs); } (void)snprintf(msg, sizeof(msg), "SUMMARY INFORMATIONS WRONG FOR CG #%d", c); if ((fs2h16(fs->e2fs_gd[c].ext2bgd_nbfree) != nbfree || fs2h16(fs->e2fs_gd[c].ext2bgd_nifree) != nifree || fs2h16(fs->e2fs_gd[c].ext2bgd_ndirs) != ndirs) && dofix(&idesc[0], msg)) { fs->e2fs_gd[c].ext2bgd_nbfree = h2fs16(nbfree); fs->e2fs_gd[c].ext2bgd_nifree = h2fs16(nifree); fs->e2fs_gd[c].ext2bgd_ndirs = h2fs16(ndirs); sbdirty(); } if (debug && memcmp(blk_bitmap->b_un.b_buf, bbmap, fs->e2fs_bsize)) { printf("blk_bitmap:\n"); print_bmap(blk_bitmap->b_un.b_buf, fs->e2fs_bsize); printf("bbmap:\n"); print_bmap(bbmap, fs->e2fs_bsize); } (void)snprintf(msg, sizeof(msg), "BLK(S) MISSING IN BIT MAPS #%d", c); if (memcmp(blk_bitmap->b_un.b_buf, bbmap, fs->e2fs_bsize) && dofix(&idesc[1], msg)) { memcpy(blk_bitmap->b_un.b_buf, bbmap, fs->e2fs_bsize); dirty(blk_bitmap); } if (debug && memcmp(ino_bitmap->b_un.b_buf, ibmap, fs->e2fs_bsize)) { printf("ino_bitmap:\n"); print_bmap(ino_bitmap->b_un.b_buf, fs->e2fs_bsize); printf("ibmap:\n"); print_bmap(ibmap, fs->e2fs_bsize); } (void)snprintf(msg, sizeof(msg), "INODE(S) MISSING IN BIT MAPS #%d", c); if (memcmp(ino_bitmap->b_un.b_buf, ibmap, fs->e2fs_bsize) && dofix(&idesc[1], msg)) { memcpy(ino_bitmap->b_un.b_buf, ibmap, fs->e2fs_bsize); dirty(ino_bitmap); } } if (debug && (fs->e2fs.e2fs_fbcount != cs_nbfree || fs->e2fs.e2fs_ficount != cs_nifree)) { printf("summary info bad in superblock: %d, %d should be %d, %d\n", fs->e2fs.e2fs_fbcount, fs->e2fs.e2fs_ficount, cs_nbfree, cs_nifree); } if ((fs->e2fs.e2fs_fbcount != cs_nbfree || fs->e2fs.e2fs_ficount != cs_nifree) && dofix(&idesc[0], "SUPERBLK SUMMARY INFORMATION BAD")) { fs->e2fs.e2fs_fbcount = cs_nbfree; fs->e2fs.e2fs_ficount = cs_nifree; sbdirty(); } free(ibmap); free(bbmap); }