dumpe2fs.c revision e0ed7404719a9ddd2ba427a80db5365c8bad18c0
13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * dumpe2fs.c - List the control structures of a second 33839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * extended filesystem 43839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 53839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Copyright (C) 1992, 1993, 1994 Remy Card <card@masi.ibp.fr> 63839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Laboratoire MASI, Institut Blaise Pascal 73839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Universite Pierre et Marie Curie (Paris VI) 83839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * Copyright 1995, 1996, 1997 by Theodore Ts'o. 1019c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * 1119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * %Begin-Header% 1219c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * This file may be redistributed under the terms of the GNU Public 1319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * License. 1419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * %End-Header% 153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * History: 193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 94/01/09 - Creation 203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 94/02/27 - Ported to use the ext2fs library 213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 23a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o#ifdef HAVE_GETOPT_H 243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <getopt.h> 25373b8337c7b6c6243810be250083fa4773891e92Theodore Ts'o#else 26373b8337c7b6c6243810be250083fa4773891e92Theodore Ts'oextern char *optarg; 27373b8337c7b6c6243810be250083fa4773891e92Theodore Ts'oextern int optind; 28a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o#endif 293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <fcntl.h> 303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdio.h> 313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdlib.h> 323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <string.h> 333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <unistd.h> 343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 3554c637d4d29af3e6365779f8b12976abe95a4753Theodore Ts'o#include "ext2fs/ext2_fs.h" 363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "ext2fs/ext2fs.h" 383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "e2p/e2p.h" 3916ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o#include "jfs_user.h" 404ea7bd04390935e1f8b473c8b857e518df2e226bTheodore Ts'o#include <uuid/uuid.h> 413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "../version.h" 43d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o#include "nls-enable.h" 443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 4574becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o#define in_use(m, x) (ext2fs_test_bit ((x), (m))) 463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 47e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic const char * program_name = "dumpe2fs"; 48e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic char * device_name = NULL; 49e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int hex_format = 0; 50e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int blocks64 = 0; 513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 52818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'ostatic void usage(void) 533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 5477f464fb19d2c9c1865879ab1a743870f7c97068Theodore Ts'o fprintf (stderr, _("Usage: %s [-bfhixV] [-o superblock=<num>] " 5577f464fb19d2c9c1865879ab1a743870f7c97068Theodore Ts'o "[-o blocksize=<num>] device\n"), program_name); 563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit (1); 573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 59e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic void print_number(unsigned long long num) 60544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o{ 61e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (hex_format) { 62e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (blocks64) 63e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("0x%08llx", num); 64e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall else 65e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("0x%04llx", num); 66e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else 67e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%llu", num); 689b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o} 699b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o 70e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic void print_range(unsigned long long a, unsigned long long b) 719b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o{ 72e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (hex_format) { 73e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (blocks64) 74e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("0x%08llx-0x%08llx", a, b); 75e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall else 76e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("0x%04llx-0x%04llx", a, b); 77e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else 78e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%llu-%llu", a, b); 79544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o} 80544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o 81e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic void print_free(unsigned long group, char * bitmap, 82e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall unsigned long num, unsigned long offset, int ratio) 833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o int p = 0; 853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o unsigned long i; 863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o unsigned long j; 873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 88e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall offset /= ratio; 89e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall offset += group * num; 90e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall for (i = 0; i < num; i++) 913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (!in_use (bitmap, i)) 923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o { 933839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (p) 943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o printf (", "); 95e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall print_number((i + offset) * ratio); 96e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall for (j = i; j < num && !in_use (bitmap, j); j++) 97a5f0bb9d1b295ad907b2d8a58ce9121f4105e1a8Theodore Ts'o ; 98a5f0bb9d1b295ad907b2d8a58ce9121f4105e1a8Theodore Ts'o if (--j != i) { 99a5f0bb9d1b295ad907b2d8a58ce9121f4105e1a8Theodore Ts'o fputc('-', stdout); 100e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall print_number((j + offset) * ratio); 101a5f0bb9d1b295ad907b2d8a58ce9121f4105e1a8Theodore Ts'o i = j; 1023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 1033839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o p = 1; 1043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 1053839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 1063839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 107f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'ostatic void print_bg_opt(int bg_flags, int mask, 108f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o const char *str, int *first) 109f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o{ 110f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o if (bg_flags & mask) { 111f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o if (*first) { 112f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o fputs(" [", stdout); 113f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o *first = 0; 114f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o } else 115f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o fputs(", ", stdout); 116f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o fputs(str, stdout); 117f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o } 118f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o} 119f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'ostatic void print_bg_opts(ext2_filsys fs, dgrp_t i) 120f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o{ 12116b851cdae98244e117fe91d93b267fcad1102b3Theodore Ts'o int first = 1, bg_flags = 0; 122f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o 12316b851cdae98244e117fe91d93b267fcad1102b3Theodore Ts'o if (fs->super->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_GDT_CSUM) 124e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall bg_flags = ext2fs_bg_flags(fs, i); 125f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o 126b89fc30dd7ff8a81b195296299564df9c1ff5433Theodore Ts'o print_bg_opt(bg_flags, EXT2_BG_INODE_UNINIT, "INODE_UNINIT", 127f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o &first); 128b89fc30dd7ff8a81b195296299564df9c1ff5433Theodore Ts'o print_bg_opt(bg_flags, EXT2_BG_BLOCK_UNINIT, "BLOCK_UNINIT", 129b89fc30dd7ff8a81b195296299564df9c1ff5433Theodore Ts'o &first); 130b89fc30dd7ff8a81b195296299564df9c1ff5433Theodore Ts'o print_bg_opt(bg_flags, EXT2_BG_INODE_ZEROED, "ITABLE_ZEROED", 131f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o &first); 132f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o if (!first) 133f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o fputc(']', stdout); 134f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o fputc('\n', stdout); 135f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o} 136f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o 1370e2afdbaccbd56d58c291763bac5902032bf5f53Andreas Dilgerstatic void print_bg_rel_offset(ext2_filsys fs, blk64_t block, int itable, 1380e2afdbaccbd56d58c291763bac5902032bf5f53Andreas Dilger blk64_t first_block, blk64_t last_block) 1390e2afdbaccbd56d58c291763bac5902032bf5f53Andreas Dilger{ 1400e2afdbaccbd56d58c291763bac5902032bf5f53Andreas Dilger if ((block >= first_block) && (block <= last_block)) { 1410e2afdbaccbd56d58c291763bac5902032bf5f53Andreas Dilger if (itable && block == first_block) 1420e2afdbaccbd56d58c291763bac5902032bf5f53Andreas Dilger return; 1430e2afdbaccbd56d58c291763bac5902032bf5f53Andreas Dilger printf(" (+%u)", (unsigned)(block - first_block)); 1440e2afdbaccbd56d58c291763bac5902032bf5f53Andreas Dilger } else if (fs->super->s_feature_incompat & 1450e2afdbaccbd56d58c291763bac5902032bf5f53Andreas Dilger EXT4_FEATURE_INCOMPAT_FLEX_BG) { 146e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall dgrp_t flex_grp = ext2fs_group_of_blk2(fs, block); 1470e2afdbaccbd56d58c291763bac5902032bf5f53Andreas Dilger printf(" (bg #%u + %u)", flex_grp, 148e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (unsigned)(block-ext2fs_group_first_block2(fs,flex_grp))); 1490e2afdbaccbd56d58c291763bac5902032bf5f53Andreas Dilger } 1500e2afdbaccbd56d58c291763bac5902032bf5f53Andreas Dilger} 1510e2afdbaccbd56d58c291763bac5902032bf5f53Andreas Dilger 1523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostatic void list_desc (ext2_filsys fs) 1533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o unsigned long i; 155e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t first_block, last_block; 156e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t super_blk, old_desc_blk, new_desc_blk; 157d90a23e2f52904326764619481fa8f209a40e226Theodore Ts'o char *block_bitmap=NULL, *inode_bitmap=NULL; 158e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall const char *units = _("blocks"); 15935238dd1a5585d042e5f0d478211e9fdfb4873e1Theodore Ts'o int inode_blocks_per_group, old_desc_blocks, reserved_gdt; 160f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o int block_nbytes, inode_nbytes; 161ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o int has_super; 162e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t blk_itr = EXT2FS_B2C(fs, fs->super->s_first_data_block); 163f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o ext2_ino_t ino_itr = 1; 164e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall errcode_t retval; 165e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 166e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (EXT2_HAS_RO_COMPAT_FEATURE(fs->super, 167e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_RO_COMPAT_BIGALLOC)) 168e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall units = _("clusters"); 1692418dfd7b934ee6bf3dc9a0aa4ffee8b37f4384fTheodore Ts'o 170e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall block_nbytes = EXT2_CLUSTERS_PER_GROUP(fs->super) / 8; 171f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o inode_nbytes = EXT2_INODES_PER_GROUP(fs->super) / 8; 17280c22c90145bc495502210ac4502cca8228f997bTheodore Ts'o 173d90a23e2f52904326764619481fa8f209a40e226Theodore Ts'o if (fs->block_map) 174f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o block_bitmap = malloc(block_nbytes); 175d90a23e2f52904326764619481fa8f209a40e226Theodore Ts'o if (fs->inode_map) 176f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o inode_bitmap = malloc(inode_nbytes); 177d90a23e2f52904326764619481fa8f209a40e226Theodore Ts'o 17880c22c90145bc495502210ac4502cca8228f997bTheodore Ts'o inode_blocks_per_group = ((fs->super->s_inodes_per_group * 17980c22c90145bc495502210ac4502cca8228f997bTheodore Ts'o EXT2_INODE_SIZE(fs->super)) + 18080c22c90145bc495502210ac4502cca8228f997bTheodore Ts'o EXT2_BLOCK_SIZE(fs->super) - 1) / 18180c22c90145bc495502210ac4502cca8228f997bTheodore Ts'o EXT2_BLOCK_SIZE(fs->super); 18235238dd1a5585d042e5f0d478211e9fdfb4873e1Theodore Ts'o reserved_gdt = fs->super->s_reserved_gdt_blocks; 183a5f0bb9d1b295ad907b2d8a58ce9121f4105e1a8Theodore Ts'o fputc('\n', stdout); 184bb1a46a430a99f73ddaf7cf74e380dd5cf36382fEric Sandeen first_block = fs->super->s_first_data_block; 18576dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o if (fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) 18676dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o old_desc_blocks = fs->super->s_first_meta_bg; 18776dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o else 18876dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o old_desc_blocks = fs->desc_blocks; 189521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o for (i = 0; i < fs->group_desc_count; i++) { 190e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall first_block = ext2fs_group_first_block2(fs, i); 191e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall last_block = ext2fs_group_last_block2(fs, i); 192abf23439d51a3ddbca475b931abebd381ff7ceeaEric Sandeen 193e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_super_and_bgd_loc2(fs, i, &super_blk, 194e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall &old_desc_blk, &new_desc_blk, 0); 195bb1a46a430a99f73ddaf7cf74e380dd5cf36382fEric Sandeen 196a5f0bb9d1b295ad907b2d8a58ce9121f4105e1a8Theodore Ts'o printf (_("Group %lu: (Blocks "), i); 197bb1a46a430a99f73ddaf7cf74e380dd5cf36382fEric Sandeen print_range(first_block, last_block); 198f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o fputs(")", stdout); 199f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o print_bg_opts(fs, i); 200e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs->super->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_GDT_CSUM) { 201e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall unsigned csum = ext2fs_bg_checksum(fs, i); 202e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall unsigned exp_csum = ext2fs_group_desc_csum(fs, i); 203e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 204e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf(_(" Checksum 0x%04x"), csum); 205e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (csum != exp_csum) 206e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf(_(" (EXPECTED 0x%04x)"), exp_csum); 207e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf(_(", unused inodes %u\n"), 208e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_bg_itable_unused(fs, i)); 209e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 210ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o has_super = ((i==0) || super_blk); 211c046ac7f2e4c53e20cf1e909bbe511f91074b396Theodore Ts'o if (has_super) { 212c046ac7f2e4c53e20cf1e909bbe511f91074b396Theodore Ts'o printf (_(" %s superblock at "), 213a5f0bb9d1b295ad907b2d8a58ce9121f4105e1a8Theodore Ts'o i == 0 ? _("Primary") : _("Backup")); 214544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o print_number(super_blk); 215c046ac7f2e4c53e20cf1e909bbe511f91074b396Theodore Ts'o } 216ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o if (old_desc_blk) { 217e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _(", Group descriptors at ")); 218efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o print_range(old_desc_blk, 2199b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o old_desc_blk + old_desc_blocks - 1); 22035238dd1a5585d042e5f0d478211e9fdfb4873e1Theodore Ts'o if (reserved_gdt) { 221e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _("\n Reserved GDT blocks at ")); 2229b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o print_range(old_desc_blk + old_desc_blocks, 223efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o old_desc_blk + old_desc_blocks + 2249b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o reserved_gdt - 1); 22535238dd1a5585d042e5f0d478211e9fdfb4873e1Theodore Ts'o } 226ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o } else if (new_desc_blk) { 227ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o fputc(has_super ? ',' : ' ', stdout); 228e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _(" Group descriptor at ")); 229544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o print_number(new_desc_blk); 230ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o has_super++; 231a5f0bb9d1b295ad907b2d8a58ce9121f4105e1a8Theodore Ts'o } 232ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o if (has_super) 233ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o fputc('\n', stdout); 234a5f0bb9d1b295ad907b2d8a58ce9121f4105e1a8Theodore Ts'o fputs(_(" Block bitmap at "), stdout); 235e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall print_number(ext2fs_block_bitmap_loc(fs, i)); 236e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall print_bg_rel_offset(fs, ext2fs_block_bitmap_loc(fs, i), 0, 2370e2afdbaccbd56d58c291763bac5902032bf5f53Andreas Dilger first_block, last_block); 238a5f0bb9d1b295ad907b2d8a58ce9121f4105e1a8Theodore Ts'o fputs(_(", Inode bitmap at "), stdout); 239e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall print_number(ext2fs_inode_bitmap_loc(fs, i)); 240e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall print_bg_rel_offset(fs, ext2fs_inode_bitmap_loc(fs, i), 0, 2410e2afdbaccbd56d58c291763bac5902032bf5f53Andreas Dilger first_block, last_block); 242a5f0bb9d1b295ad907b2d8a58ce9121f4105e1a8Theodore Ts'o fputs(_("\n Inode table at "), stdout); 243e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall print_range(ext2fs_inode_table_loc(fs, i), 244e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_inode_table_loc(fs, i) + 2459b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o inode_blocks_per_group - 1); 246e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall print_bg_rel_offset(fs, ext2fs_inode_table_loc(fs, i), 1, 2470e2afdbaccbd56d58c291763bac5902032bf5f53Andreas Dilger first_block, last_block); 248e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf (_("\n %u free %s, %u free inodes, " 249777a8c1bf0a37e14bf1f9c6270328a066111b88eJose R. Santos "%u directories%s"), 250e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_bg_free_blocks_count(fs, i), units, 251e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_bg_free_inodes_count(fs, i), 252e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_bg_used_dirs_count(fs, i), 253e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_bg_itable_unused(fs, i) ? "" : "\n"); 254e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (ext2fs_bg_itable_unused(fs, i)) 255777a8c1bf0a37e14bf1f9c6270328a066111b88eJose R. Santos printf (_(", %u unused inodes\n"), 256e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_bg_itable_unused(fs, i)); 257d90a23e2f52904326764619481fa8f209a40e226Theodore Ts'o if (block_bitmap) { 258d90a23e2f52904326764619481fa8f209a40e226Theodore Ts'o fputs(_(" Free blocks: "), stdout); 259e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = ext2fs_get_block_bitmap_range2(fs->block_map, 260f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o blk_itr, block_nbytes << 3, block_bitmap); 261e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (retval) 262e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err("list_desc", retval, 263e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "while reading block bitmap"); 264e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall else 265e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall print_free(i, block_bitmap, 266e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->super->s_clusters_per_group, 267e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->super->s_first_data_block, 268e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT2FS_CLUSTER_RATIO(fs)); 269d90a23e2f52904326764619481fa8f209a40e226Theodore Ts'o fputc('\n', stdout); 270e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk_itr += fs->super->s_clusters_per_group; 271d90a23e2f52904326764619481fa8f209a40e226Theodore Ts'o } 272d90a23e2f52904326764619481fa8f209a40e226Theodore Ts'o if (inode_bitmap) { 273d90a23e2f52904326764619481fa8f209a40e226Theodore Ts'o fputs(_(" Free inodes: "), stdout); 274e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = ext2fs_get_inode_bitmap_range2(fs->inode_map, 275f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o ino_itr, inode_nbytes << 3, inode_bitmap); 276e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (retval) 277e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err("list_desc", retval, 278e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "while reading inode bitmap"); 279e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall else 280e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall print_free(i, inode_bitmap, 281e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->super->s_inodes_per_group, 282e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1, 1); 283d90a23e2f52904326764619481fa8f209a40e226Theodore Ts'o fputc('\n', stdout); 284f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o ino_itr += fs->super->s_inodes_per_group; 285d90a23e2f52904326764619481fa8f209a40e226Theodore Ts'o } 2863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 2871acde2b2776fca4d9386a04909296c2e6b11f242Theodore Ts'o if (block_bitmap) 2881acde2b2776fca4d9386a04909296c2e6b11f242Theodore Ts'o free(block_bitmap); 2891acde2b2776fca4d9386a04909296c2e6b11f242Theodore Ts'o if (inode_bitmap) 2901acde2b2776fca4d9386a04909296c2e6b11f242Theodore Ts'o free(inode_bitmap); 2913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 2923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 2930655b104e6b7940ff28c979c96c5ecf3565537e9Theodore Ts'ostatic void list_bad_blocks(ext2_filsys fs, int dump) 2943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 2953839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o badblocks_list bb_list = 0; 2963839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o badblocks_iterate bb_iter; 2973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o blk_t blk; 2983839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o errcode_t retval; 2990655b104e6b7940ff28c979c96c5ecf3565537e9Theodore Ts'o const char *header, *fmt; 3003839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 3013839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o retval = ext2fs_read_bb_inode(fs, &bb_list); 3023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 3039b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o com_err("ext2fs_read_bb_inode", retval, 0); 3040655b104e6b7940ff28c979c96c5ecf3565537e9Theodore Ts'o return; 3053839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 306cbbf031b6edf9bdf5511af2193e44cff7fdaa66aTheodore Ts'o retval = ext2fs_badblocks_list_iterate_begin(bb_list, &bb_iter); 3073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 308cbbf031b6edf9bdf5511af2193e44cff7fdaa66aTheodore Ts'o com_err("ext2fs_badblocks_list_iterate_begin", retval, 309e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "%s", _("while printing bad block list")); 3100655b104e6b7940ff28c979c96c5ecf3565537e9Theodore Ts'o return; 3113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 3120655b104e6b7940ff28c979c96c5ecf3565537e9Theodore Ts'o if (dump) { 313d0ff90d5202428583c78a60c3042e7b60d88bc45Eric Sandeen header = fmt = "%u\n"; 3140655b104e6b7940ff28c979c96c5ecf3565537e9Theodore Ts'o } else { 315d0ff90d5202428583c78a60c3042e7b60d88bc45Eric Sandeen header = _("Bad blocks: %u"); 316d0ff90d5202428583c78a60c3042e7b60d88bc45Eric Sandeen fmt = ", %u"; 317f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 3180655b104e6b7940ff28c979c96c5ecf3565537e9Theodore Ts'o while (ext2fs_badblocks_list_iterate(bb_iter, &blk)) { 3190655b104e6b7940ff28c979c96c5ecf3565537e9Theodore Ts'o printf(header ? header : fmt, blk); 3200655b104e6b7940ff28c979c96c5ecf3565537e9Theodore Ts'o header = 0; 321f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 322cbbf031b6edf9bdf5511af2193e44cff7fdaa66aTheodore Ts'o ext2fs_badblocks_list_iterate_end(bb_iter); 3230655b104e6b7940ff28c979c96c5ecf3565537e9Theodore Ts'o if (!dump) 3240655b104e6b7940ff28c979c96c5ecf3565537e9Theodore Ts'o fputc('\n', stdout); 3251acde2b2776fca4d9386a04909296c2e6b11f242Theodore Ts'o ext2fs_badblocks_list_free(bb_list); 3261e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o} 327f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o 3286515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'ostatic void print_inline_journal_information(ext2_filsys fs) 3296515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o{ 3301d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o journal_superblock_t *jsb; 3316515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o struct ext2_inode inode; 3321d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o ext2_file_t journal_file; 3336515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o errcode_t retval; 3346515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o ino_t ino = fs->super->s_journal_inum; 3351d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o char buf[1024]; 3361d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o __u32 *mask_ptr, mask, m; 3371d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o int i, j, size, printed = 0; 338efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 339e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs->flags & EXT2_FLAG_IMAGE_FILE) 340e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return; 3416515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o retval = ext2fs_read_inode(fs, ino, &inode); 3426515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o if (retval) { 343e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, retval, "%s", 3446515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o _("while reading journal inode")); 3456515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o exit(1); 3466515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o } 3471d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o retval = ext2fs_file_open2(fs, ino, &inode, 0, &journal_file); 3481d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o if (retval) { 349e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, retval, "%s", 3501d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o _("while opening journal inode")); 3511d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o exit(1); 3521d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o } 3531d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o retval = ext2fs_file_read(journal_file, buf, sizeof(buf), 0); 3541d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o if (retval) { 355e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, retval, "%s", 3561d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o _("while reading journal super block")); 3571d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o exit(1); 3581d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o } 3591d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o ext2fs_file_close(journal_file); 3601d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o jsb = (journal_superblock_t *) buf; 3611d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o if (be32_to_cpu(jsb->s_header.h_magic) != JFS_MAGIC_NUMBER) { 362e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", 363e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("Journal superblock magic number invalid!\n")); 3641d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o exit(1); 3651d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o } 366e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _("Journal features: ")); 3671d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o for (i=0, mask_ptr=&jsb->s_feature_compat; i <3; i++,mask_ptr++) { 3681d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o mask = be32_to_cpu(*mask_ptr); 3691d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o for (j=0,m=1; j < 32; j++, m<<=1) { 3701d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o if (mask & m) { 3711d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o printf(" %s", e2p_jrnl_feature2string(i, m)); 3721d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o printed++; 3731d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o } 3741d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o } 3751d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o } 3761d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o if (printed == 0) 3771d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o printf(" (none)"); 3781d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o printf("\n"); 3796515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o fputs(_("Journal size: "), stdout); 3801ca1059fd0126fd2c065f272a566c18f14bab16dTheodore Ts'o if ((fs->super->s_feature_ro_compat & 3811ca1059fd0126fd2c065f272a566c18f14bab16dTheodore Ts'o EXT4_FEATURE_RO_COMPAT_HUGE_FILE) && 3821ca1059fd0126fd2c065f272a566c18f14bab16dTheodore Ts'o (inode.i_flags & EXT4_HUGE_FILE_FL)) 3831ca1059fd0126fd2c065f272a566c18f14bab16dTheodore Ts'o size = inode.i_blocks / (fs->blocksize / 1024); 3841ca1059fd0126fd2c065f272a566c18f14bab16dTheodore Ts'o else 3851ca1059fd0126fd2c065f272a566c18f14bab16dTheodore Ts'o size = inode.i_blocks >> 1; 3866515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o if (size < 8192) 3876515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o printf("%uk\n", size); 3886515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o else 3896515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o printf("%uM\n", size >> 10); 3901d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o printf(_("Journal length: %u\n" 3911d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o "Journal sequence: 0x%08x\n" 3921d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o "Journal start: %u\n"), 3931d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o (unsigned int)ntohl(jsb->s_maxlen), 3941d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o (unsigned int)ntohl(jsb->s_sequence), 3951d9b818317b6874f42a63310c913c4de840c377aTheodore Ts'o (unsigned int)ntohl(jsb->s_start)); 396e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (jsb->s_errno != 0) 397e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf(_("Journal errno: %d\n"), 398e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (int) ntohl(jsb->s_errno)); 3996515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o} 4006515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o 40116ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'ostatic void print_journal_information(ext2_filsys fs) 40216ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o{ 40316ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o errcode_t retval; 40416ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o char buf[1024]; 40516ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o char str[80]; 406544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o unsigned int i; 40716ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o journal_superblock_t *jsb; 40816ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o 40916ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o /* Get the journal superblock */ 410e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if ((retval = io_channel_read_blk64(fs->io, 411e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->super->s_first_data_block + 1, 412e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall -1024, buf))) { 413e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, retval, "%s", 41416ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o _("while reading journal superblock")); 41516ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o exit(1); 41616ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o } 41716ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o jsb = (journal_superblock_t *) buf; 41816ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o if ((jsb->s_header.h_magic != (unsigned) ntohl(JFS_MAGIC_NUMBER)) || 41916ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o (jsb->s_header.h_blocktype != 42016ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o (unsigned) ntohl(JFS_SUPERBLOCK_V2))) { 421e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 42216ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o _("Couldn't find journal superblock magic numbers")); 42316ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o exit(1); 42416ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o } 42516ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o 4268deb80a5d1078cbe43eaffcdeebf0a1a549d6a54Takashi Sato printf(_("\nJournal block size: %u\n" 4278deb80a5d1078cbe43eaffcdeebf0a1a549d6a54Takashi Sato "Journal length: %u\n" 4288deb80a5d1078cbe43eaffcdeebf0a1a549d6a54Takashi Sato "Journal first block: %u\n" 429a5f0bb9d1b295ad907b2d8a58ce9121f4105e1a8Theodore Ts'o "Journal sequence: 0x%08x\n" 4308deb80a5d1078cbe43eaffcdeebf0a1a549d6a54Takashi Sato "Journal start: %u\n" 431f6567a889f071c6b294f85792abc75fa76953d1aMatthias Andree "Journal number of users: %u\n"), 432f6567a889f071c6b294f85792abc75fa76953d1aMatthias Andree (unsigned int)ntohl(jsb->s_blocksize), (unsigned int)ntohl(jsb->s_maxlen), 433f6567a889f071c6b294f85792abc75fa76953d1aMatthias Andree (unsigned int)ntohl(jsb->s_first), (unsigned int)ntohl(jsb->s_sequence), 434f6567a889f071c6b294f85792abc75fa76953d1aMatthias Andree (unsigned int)ntohl(jsb->s_start), (unsigned int)ntohl(jsb->s_nr_users)); 435a5f0bb9d1b295ad907b2d8a58ce9121f4105e1a8Theodore Ts'o 43616ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o for (i=0; i < ntohl(jsb->s_nr_users); i++) { 43716ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o uuid_unparse(&jsb->s_users[i*16], str); 438a5f0bb9d1b295ad907b2d8a58ce9121f4105e1a8Theodore Ts'o printf(i ? " %s\n" 439bb145b01cf5fd27d9afe03c3262d0e1a326e7ec1Theodore Ts'o : _("Journal users: %s\n"), 440a5f0bb9d1b295ad907b2d8a58ce9121f4105e1a8Theodore Ts'o str); 44116ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o } 44216ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o} 44316ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o 444e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic void parse_extended_opts(const char *opts, blk64_t *superblock, 445db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o int *blocksize) 446db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o{ 4472d328bb76d2d63bdfdba923b54c28bd686bd8fecTheodore Ts'o char *buf, *token, *next, *p, *arg, *badopt = 0; 448db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o int len; 4492d328bb76d2d63bdfdba923b54c28bd686bd8fecTheodore Ts'o int do_usage = 0; 450db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o 451db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o len = strlen(opts); 452db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o buf = malloc(len+1); 453db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o if (!buf) { 454e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", 455db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o _("Couldn't allocate memory to parse options!\n")); 456db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o exit(1); 457db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o } 458db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o strcpy(buf, opts); 459db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o for (token = buf; token && *token; token = next) { 460db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o p = strchr(token, ','); 461db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o next = 0; 462db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o if (p) { 463db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o *p = 0; 464db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o next = p+1; 465db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o } 466db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o arg = strchr(token, '='); 467db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o if (arg) { 468db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o *arg = 0; 469db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o arg++; 470db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o } 471db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o if (strcmp(token, "superblock") == 0 || 472db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o strcmp(token, "sb") == 0) { 473db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o if (!arg) { 4742d328bb76d2d63bdfdba923b54c28bd686bd8fecTheodore Ts'o do_usage++; 475db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o badopt = token; 476db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o continue; 477db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o } 478db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o *superblock = strtoul(arg, &p, 0); 479db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o if (*p) { 480db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o fprintf(stderr, 481db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o _("Invalid superblock parameter: %s\n"), 482db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o arg); 4832d328bb76d2d63bdfdba923b54c28bd686bd8fecTheodore Ts'o do_usage++; 484db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o continue; 485db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o } 486db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o } else if (strcmp(token, "blocksize") == 0 || 487db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o strcmp(token, "bs") == 0) { 488db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o if (!arg) { 4892d328bb76d2d63bdfdba923b54c28bd686bd8fecTheodore Ts'o do_usage++; 490db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o badopt = token; 491db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o continue; 492db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o } 493db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o *blocksize = strtoul(arg, &p, 0); 494db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o if (*p) { 495db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o fprintf(stderr, 496db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o _("Invalid blocksize parameter: %s\n"), 497db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o arg); 4982d328bb76d2d63bdfdba923b54c28bd686bd8fecTheodore Ts'o do_usage++; 499db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o continue; 500db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o } 501db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o } else { 5022d328bb76d2d63bdfdba923b54c28bd686bd8fecTheodore Ts'o do_usage++; 503db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o badopt = token; 504db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o } 505db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o } 5062d328bb76d2d63bdfdba923b54c28bd686bd8fecTheodore Ts'o if (do_usage) { 507db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o fprintf(stderr, _("\nBad extended option(s) specified: %s\n\n" 508db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o "Extended options are separated by commas, " 509db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o "and may take an argument which\n" 510db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o "\tis set off by an equals ('=') sign.\n\n" 511db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o "Valid extended options are:\n" 512db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o "\tsuperblock=<superblock number>\n" 513db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o "\tblocksize=<blocksize>\n"), 5142d328bb76d2d63bdfdba923b54c28bd686bd8fecTheodore Ts'o badopt ? badopt : ""); 515db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o free(buf); 516db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o exit(1); 517db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o } 518db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o free(buf); 519efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o} 520db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o 52100e5433eb5e9f70f485968b809fdcf297d7fe7b9Theodore Ts'oint main (int argc, char ** argv) 5223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 5233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o errcode_t retval; 5243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o ext2_filsys fs; 525f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o int print_badblocks = 0; 526e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t use_superblock = 0; 52702e7dd9ac779f108d2bf1c166f4faeae1db5c7a4Theodore Ts'o int use_blocksize = 0; 528348e43dccbbc0511be3b151b319ff95830753decTheodore Ts'o int image_dump = 0; 5292740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o int force = 0; 53016ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o int flags; 5312740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o int header_only = 0; 532519149fb458b0fa69c10fecd83fae42e838cf01dTheodore Ts'o int c; 5333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 534d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o#ifdef ENABLE_NLS 535d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o setlocale(LC_MESSAGES, ""); 53614308a5398984842e808faa3ff2dd6a1c52d90bdTheodore Ts'o setlocale(LC_CTYPE, ""); 537d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o bindtextdomain(NLS_CAT_NAME, LOCALEDIR); 538d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o textdomain(NLS_CAT_NAME); 539e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall set_com_err_gettext(gettext); 540d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o#endif 541a6d8302b4873527798a77c1ba3106a04b71dfeacTheodore Ts'o add_error_table(&et_ext2_error_table); 5420f8973fb092a40fd0a11b7ec95c09128c9fb8f0cTheodore Ts'o fprintf (stderr, "dumpe2fs %s (%s)\n", E2FSPROGS_VERSION, 5430f8973fb092a40fd0a11b7ec95c09128c9fb8f0cTheodore Ts'o E2FSPROGS_DATE); 5443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (argc && *argv) 5453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o program_name = *argv; 546efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 547348e43dccbbc0511be3b151b319ff95830753decTheodore Ts'o while ((c = getopt (argc, argv, "bfhixVo:")) != EOF) { 548f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o switch (c) { 549f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o case 'b': 550f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o print_badblocks++; 551f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o break; 5522740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o case 'f': 5532740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o force++; 5542740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o break; 5552740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o case 'h': 5562740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o header_only++; 5572740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o break; 558348e43dccbbc0511be3b151b319ff95830753decTheodore Ts'o case 'i': 559348e43dccbbc0511be3b151b319ff95830753decTheodore Ts'o image_dump++; 560348e43dccbbc0511be3b151b319ff95830753decTheodore Ts'o break; 56102e7dd9ac779f108d2bf1c166f4faeae1db5c7a4Theodore Ts'o case 'o': 562efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o parse_extended_opts(optarg, &use_superblock, 563db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o &use_blocksize); 56402e7dd9ac779f108d2bf1c166f4faeae1db5c7a4Theodore Ts'o break; 5655c576477ccb2f0ca8c5d5af2e2354fd8eeff1589Theodore Ts'o case 'V': 5665c576477ccb2f0ca8c5d5af2e2354fd8eeff1589Theodore Ts'o /* Print version number and exit */ 567d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o fprintf(stderr, _("\tUsing %s\n"), 5685c576477ccb2f0ca8c5d5af2e2354fd8eeff1589Theodore Ts'o error_message(EXT2_ET_BASE)); 5695c576477ccb2f0ca8c5d5af2e2354fd8eeff1589Theodore Ts'o exit(0); 57080c22c90145bc495502210ac4502cca8228f997bTheodore Ts'o case 'x': 5719b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o hex_format++; 57280c22c90145bc495502210ac4502cca8228f997bTheodore Ts'o break; 573f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o default: 574818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o usage(); 575f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 576f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 577f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o if (optind > argc - 1) 578818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o usage(); 579f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o device_name = argv[optind++]; 580e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall flags = EXT2_FLAG_JOURNAL_DEV_OK | EXT2_FLAG_SOFTSUPP_FEATURES | EXT2_FLAG_64BITS; 58116ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o if (force) 58216ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o flags |= EXT2_FLAG_FORCE; 583348e43dccbbc0511be3b151b319ff95830753decTheodore Ts'o if (image_dump) 584348e43dccbbc0511be3b151b319ff95830753decTheodore Ts'o flags |= EXT2_FLAG_IMAGE_FILE; 585efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 586db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o if (use_superblock && !use_blocksize) { 587db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o for (use_blocksize = EXT2_MIN_BLOCK_SIZE; 588db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o use_blocksize <= EXT2_MAX_BLOCK_SIZE; 589db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o use_blocksize *= 2) { 590db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o retval = ext2fs_open (device_name, flags, 591db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o use_superblock, 592db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o use_blocksize, unix_io_manager, 593db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o &fs); 594db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o if (!retval) 595db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o break; 596db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o } 597db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o } else 598db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o retval = ext2fs_open (device_name, flags, use_superblock, 599db197a81cc7841af1afeb499645fd2a5767fa146Theodore Ts'o use_blocksize, unix_io_manager, &fs); 600f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o if (retval) { 601d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o com_err (program_name, retval, _("while trying to open %s"), 6023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o device_name); 603e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _("Couldn't find valid filesystem superblock.\n")); 6043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit (1); 6053839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 606e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->default_bitmap_type = EXT2FS_BMAP64_RBTREE; 607e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) 608e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blocks64 = 1; 609f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o if (print_badblocks) { 6100655b104e6b7940ff28c979c96c5ecf3565537e9Theodore Ts'o list_bad_blocks(fs, 1); 611f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } else { 6122740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o list_super (fs->super); 61316ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o if (fs->super->s_feature_incompat & 61416ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) { 61516ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o print_journal_information(fs); 61616ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o ext2fs_close(fs); 61716ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o exit(0); 61816ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o } 619a11d0746b4fb2ac41dcb5e7acf31942b1e8925e2Theodore Ts'o if ((fs->super->s_feature_compat & 620a11d0746b4fb2ac41dcb5e7acf31942b1e8925e2Theodore Ts'o EXT3_FEATURE_COMPAT_HAS_JOURNAL) && 621a11d0746b4fb2ac41dcb5e7acf31942b1e8925e2Theodore Ts'o (fs->super->s_journal_inum != 0)) 6226515a6f1bc8dbf2f69d7a33a56a4ebf3e4f1910bTheodore Ts'o print_inline_journal_information(fs); 6230655b104e6b7940ff28c979c96c5ecf3565537e9Theodore Ts'o list_bad_blocks(fs, 0); 6242740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o if (header_only) { 6252740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o ext2fs_close (fs); 6262740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o exit (0); 6272740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o } 628f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o retval = ext2fs_read_bitmaps (fs); 629d90a23e2f52904326764619481fa8f209a40e226Theodore Ts'o list_desc (fs); 630f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o if (retval) { 631d90a23e2f52904326764619481fa8f209a40e226Theodore Ts'o printf(_("\n%s: %s: error reading bitmaps: %s\n"), 632d90a23e2f52904326764619481fa8f209a40e226Theodore Ts'o program_name, device_name, 633d90a23e2f52904326764619481fa8f209a40e226Theodore Ts'o error_message(retval)); 634f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 6353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 6363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o ext2fs_close (fs); 637a6d8302b4873527798a77c1ba3106a04b71dfeacTheodore Ts'o remove_error_table(&et_ext2_error_table); 6383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit (0); 6393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 640