mirror of https://github.com/vitalif/e2fsprogs
e2fsck: Interpret negative blkcount in file system problem reports
Non-expert users get confused when they see messages like this: Illegal block #-1 (2291965952) in inode 176. CLEARED. So change it to be something a little bit more understandable: Illegal indirect block (2291965952) in inode 176. CLEARED. Addresses-SourceForge-Bug: #2871782 Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>bitmap-optimize
parent
f790bc33b2
commit
695706ca21
|
@ -14,7 +14,7 @@
|
|||
* The following % expansions are supported:
|
||||
*
|
||||
* %b <blk> block number
|
||||
* %B <blkcount> integer
|
||||
* %B <blkcount> interpret blkcount as blkcount
|
||||
* %c <blk2> block number
|
||||
* %Di <dirent>->ino inode number
|
||||
* %Dn <dirent>->name string
|
||||
|
@ -46,6 +46,7 @@
|
|||
* %q ext2fs_get_pathname of directory <dir>
|
||||
* %Q ext2fs_get_pathname of directory <ino> with <dir> as
|
||||
* the containing directory.
|
||||
* %r <blkcount> interpret blkcount as refcount
|
||||
* %s <str> miscellaneous string
|
||||
* %S backup superblock
|
||||
* %X <num> hexadecimal format
|
||||
|
@ -395,9 +396,11 @@ static _INLINE_ void expand_dirent_expression(ext2_filsys fs, char ch,
|
|||
}
|
||||
|
||||
static _INLINE_ void expand_percent_expression(ext2_filsys fs, char ch,
|
||||
int *first,
|
||||
struct problem_context *ctx)
|
||||
{
|
||||
e2fsck_t e2fsck_ctx = fs ? (e2fsck_t) fs->priv_data : NULL;
|
||||
const char *m;
|
||||
|
||||
if (!ctx)
|
||||
goto no_context;
|
||||
|
@ -414,11 +417,26 @@ static _INLINE_ void expand_percent_expression(ext2_filsys fs, char ch,
|
|||
#endif
|
||||
break;
|
||||
case 'B':
|
||||
if (ctx->blkcount == BLOCK_COUNT_IND)
|
||||
m = _("indirect block");
|
||||
else if (ctx->blkcount == BLOCK_COUNT_DIND)
|
||||
m = _("double indirect block");
|
||||
else if (ctx->blkcount == BLOCK_COUNT_TIND)
|
||||
m = _("triple indirect block");
|
||||
else if (ctx->blkcount == BLOCK_COUNT_TRANSLATOR)
|
||||
m = _("translator block");
|
||||
else
|
||||
m = _("block #");
|
||||
if (*first && islower(m[0]))
|
||||
fputc(toupper(*m++), stdout);
|
||||
fputs(m, stdout);
|
||||
if (ctx->blkcount >= 0) {
|
||||
#ifdef EXT2_NO_64_TYPE
|
||||
printf("%d", ctx->blkcount);
|
||||
printf("%d", ctx->blkcount);
|
||||
#else
|
||||
printf("%lld", (long long)ctx->blkcount);
|
||||
printf("%lld", (long long) ctx->blkcount);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case 'c':
|
||||
#ifdef EXT2_NO_64_TYPE
|
||||
|
@ -462,6 +480,13 @@ static _INLINE_ void expand_percent_expression(ext2_filsys fs, char ch,
|
|||
case 'Q':
|
||||
print_pathname(fs, ctx->dir, ctx->ino);
|
||||
break;
|
||||
case 'r':
|
||||
#ifdef EXT2_NO_64_TYPE
|
||||
printf("%d", ctx->blkcount);
|
||||
#else
|
||||
printf("%lld", (long long) ctx->blkcount);
|
||||
#endif
|
||||
break;
|
||||
case 'S':
|
||||
printf("%u", get_backup_sb(NULL, fs, NULL, NULL));
|
||||
break;
|
||||
|
@ -509,7 +534,7 @@ void print_e2fsck_message(e2fsck_t ctx, const char *msg,
|
|||
expand_dirent_expression(fs, *cp, pctx);
|
||||
} else if ((cp[0] == '%')) {
|
||||
cp++;
|
||||
expand_percent_expression(fs, *cp, pctx);
|
||||
expand_percent_expression(fs, *cp, &first, pctx);
|
||||
} else {
|
||||
for (i=0; cp[i]; i++)
|
||||
if ((cp[i] == '@') || cp[i] == '%')
|
||||
|
|
|
@ -252,12 +252,12 @@ static struct e2fsck_problem problem_table[] = {
|
|||
|
||||
/* Illegal block found in orphaned inode */
|
||||
{ PR_0_ORPHAN_ILLEGAL_BLOCK_NUM,
|
||||
N_("@I @b #%B (%b) found in @o @i %i.\n"),
|
||||
N_("@I %B (%b) found in @o @i %i.\n"),
|
||||
PROMPT_NONE, 0 },
|
||||
|
||||
/* Already cleared block found in orphaned inode */
|
||||
{ PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
|
||||
N_("Already cleared @b #%B (%b) found in @o @i %i.\n"),
|
||||
N_("Already cleared %B (%b) found in @o @i %i.\n"),
|
||||
PROMPT_NONE, 0 },
|
||||
|
||||
/* Illegal orphan inode in superblock */
|
||||
|
@ -475,12 +475,12 @@ static struct e2fsck_problem problem_table[] = {
|
|||
|
||||
/* Illegal blocknumber in inode */
|
||||
{ PR_1_ILLEGAL_BLOCK_NUM,
|
||||
N_("@I @b #%B (%b) in @i %i. "),
|
||||
N_("@I %B (%b) in @i %i. "),
|
||||
PROMPT_CLEAR, PR_LATCH_BLOCK },
|
||||
|
||||
/* Block number overlaps fs metadata */
|
||||
{ PR_1_BLOCK_OVERLAPS_METADATA,
|
||||
N_("@b #%B (%b) overlaps @f metadata in @i %i. "),
|
||||
N_("%B (%b) overlaps @f metadata in @i %i. "),
|
||||
PROMPT_CLEAR, PR_LATCH_BLOCK },
|
||||
|
||||
/* Inode has illegal blocks (latch question) */
|
||||
|
@ -495,7 +495,7 @@ static struct e2fsck_problem problem_table[] = {
|
|||
|
||||
/* Illegal block number in bad block inode */
|
||||
{ PR_1_BB_ILLEGAL_BLOCK_NUM,
|
||||
N_("@I @b #%B (%b) in bad @b @i. "),
|
||||
N_("@I %B (%b) in bad @b @i. "),
|
||||
PROMPT_CLEAR, PR_LATCH_BBLOCK },
|
||||
|
||||
/* Bad block inode has illegal blocks (latch question) */
|
||||
|
@ -707,7 +707,7 @@ static struct e2fsck_problem problem_table[] = {
|
|||
|
||||
/* Extended attribute reference count incorrect */
|
||||
{ PR_1_EXTATTR_REFCOUNT,
|
||||
N_("@a @b %b has reference count %B, @s %N. "),
|
||||
N_("@a @b %b has reference count %r, @s %N. "),
|
||||
PROMPT_FIX, 0 },
|
||||
|
||||
/* Error writing Extended Attribute block while fixing refcount */
|
||||
|
@ -746,17 +746,17 @@ static struct e2fsck_problem problem_table[] = {
|
|||
|
||||
/* Directory too big */
|
||||
{ PR_1_TOOBIG_DIR,
|
||||
N_("@b #%B (%b) causes @d to be too big. "),
|
||||
N_("%B (%b) causes @d to be too big. "),
|
||||
PROMPT_CLEAR, PR_LATCH_TOOBIG },
|
||||
|
||||
/* Regular file too big */
|
||||
{ PR_1_TOOBIG_REG,
|
||||
N_("@b #%B (%b) causes file to be too big. "),
|
||||
N_("%B (%b) causes file to be too big. "),
|
||||
PROMPT_CLEAR, PR_LATCH_TOOBIG },
|
||||
|
||||
/* Symlink too big */
|
||||
{ PR_1_TOOBIG_SYMLINK,
|
||||
N_("@b #%B (%b) causes symlink to be too big. "),
|
||||
N_("%B (%b) causes symlink to be too big. "),
|
||||
PROMPT_CLEAR, PR_LATCH_TOOBIG },
|
||||
|
||||
/* INDEX_FL flag set on a non-HTREE filesystem */
|
||||
|
@ -943,7 +943,7 @@ static struct e2fsck_problem problem_table[] = {
|
|||
/* File has duplicate blocks */
|
||||
{ PR_1D_DUP_FILE,
|
||||
N_("File %Q (@i #%i, mod time %IM) \n"
|
||||
" has %B @m @b(s), shared with %N file(s):\n"),
|
||||
" has %r @m @b(s), shared with %N file(s):\n"),
|
||||
PROMPT_NONE, 0 },
|
||||
|
||||
/* List of files sharing duplicate blocks */
|
||||
|
@ -1077,17 +1077,17 @@ static struct e2fsck_problem problem_table[] = {
|
|||
|
||||
/* directory corrupted */
|
||||
{ PR_2_DIR_CORRUPTED,
|
||||
N_("@d @i %i, @b %B, offset %N: @d corrupted\n"),
|
||||
N_("@d @i %i, %B, offset %N: @d corrupted\n"),
|
||||
PROMPT_SALVAGE, 0 },
|
||||
|
||||
/* filename too long */
|
||||
{ PR_2_FILENAME_LONG,
|
||||
N_("@d @i %i, @b %B, offset %N: filename too long\n"),
|
||||
N_("@d @i %i, %B, offset %N: filename too long\n"),
|
||||
PROMPT_TRUNCATE, 0 },
|
||||
|
||||
/* Directory inode has a missing block (hole) */
|
||||
{ PR_2_DIRECTORY_HOLE,
|
||||
N_("@d @i %i has an unallocated @b #%B. "),
|
||||
N_("@d @i %i has an unallocated %B. "),
|
||||
PROMPT_ALLOCATE, 0 },
|
||||
|
||||
/* '.' is not NULL terminated */
|
||||
|
@ -1212,22 +1212,22 @@ static struct e2fsck_problem problem_table[] = {
|
|||
|
||||
/* Node in HTREE directory not referenced */
|
||||
{ PR_2_HTREE_NOTREF,
|
||||
N_("@p @h %d: node (%B) not referenced\n"),
|
||||
N_("@p @h %d: %B not referenced\n"),
|
||||
PROMPT_NONE, 0 },
|
||||
|
||||
/* Node in HTREE directory referenced twice */
|
||||
{ PR_2_HTREE_DUPREF,
|
||||
N_("@p @h %d: node (%B) referenced twice\n"),
|
||||
N_("@p @h %d: %B referenced twice\n"),
|
||||
PROMPT_NONE, 0 },
|
||||
|
||||
/* Node in HTREE directory has bad min hash */
|
||||
{ PR_2_HTREE_MIN_HASH,
|
||||
N_("@p @h %d: node (%B) has bad min hash\n"),
|
||||
N_("@p @h %d: %B has bad min hash\n"),
|
||||
PROMPT_NONE, 0 },
|
||||
|
||||
/* Node in HTREE directory has bad max hash */
|
||||
{ PR_2_HTREE_MAX_HASH,
|
||||
N_("@p @h %d: node (%B) has bad max hash\n"),
|
||||
N_("@p @h %d: %B has bad max hash\n"),
|
||||
PROMPT_NONE, 0 },
|
||||
|
||||
/* Clear invalid HTREE directory */
|
||||
|
@ -1251,22 +1251,22 @@ static struct e2fsck_problem problem_table[] = {
|
|||
|
||||
/* Invalid HTREE limit */
|
||||
{ PR_2_HTREE_BAD_LIMIT,
|
||||
N_("@p @h %d: node (%B) has @n limit (%N)\n"),
|
||||
N_("@p @h %d: %B has @n limit (%N)\n"),
|
||||
PROMPT_CLEAR_HTREE, PR_PREEN_OK },
|
||||
|
||||
/* Invalid HTREE count */
|
||||
{ PR_2_HTREE_BAD_COUNT,
|
||||
N_("@p @h %d: node (%B) has @n count (%N)\n"),
|
||||
N_("@p @h %d: %B has @n count (%N)\n"),
|
||||
PROMPT_CLEAR_HTREE, PR_PREEN_OK },
|
||||
|
||||
/* HTREE interior node has out-of-order hashes in table */
|
||||
{ PR_2_HTREE_HASH_ORDER,
|
||||
N_("@p @h %d: node (%B) has an unordered hash table\n"),
|
||||
N_("@p @h %d: %B has an unordered hash table\n"),
|
||||
PROMPT_CLEAR_HTREE, PR_PREEN_OK },
|
||||
|
||||
/* Node in HTREE directory has invalid depth */
|
||||
{ PR_2_HTREE_BAD_DEPTH,
|
||||
N_("@p @h %d: node (%B) has @n depth (%N)\n"),
|
||||
N_("@p @h %d: %B has @n depth (%N)\n"),
|
||||
PROMPT_NONE, 0 },
|
||||
|
||||
/* Duplicate directory entry found */
|
||||
|
|
|
@ -8,7 +8,7 @@ Bad block inode has illegal block(s). Clear? yes
|
|||
Illegal block #1 (101) in bad block inode. CLEARED.
|
||||
Illegal block #2 (103) in bad block inode. CLEARED.
|
||||
Illegal block #3 (234523) in bad block inode. CLEARED.
|
||||
Illegal block #-1 (200) in bad block inode. CLEARED.
|
||||
Illegal indirect block (200) in bad block inode. CLEARED.
|
||||
Pass 2: Checking directory structure
|
||||
Pass 3: Checking directory connectivity
|
||||
Pass 4: Checking reference counts
|
||||
|
|
|
@ -19,7 +19,7 @@ Clear? yes
|
|||
|
||||
Entry 'dot' in /test (14) is a link to '.' Clear? yes
|
||||
|
||||
Directory inode 12, block 0, offset 0: directory corrupted
|
||||
Directory inode 12, block #0, offset 0: directory corrupted
|
||||
Salvage? yes
|
||||
|
||||
Missing '.' in directory inode 12.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
Pass 1: Checking inodes, blocks, and sizes
|
||||
Pass 2: Checking directory structure
|
||||
Directory inode 12, block 0, offset 60: directory corrupted
|
||||
Directory inode 12, block #0, offset 60: directory corrupted
|
||||
Salvage? yes
|
||||
|
||||
Pass 3: Checking directory connectivity
|
||||
|
|
|
@ -44,7 +44,7 @@ Clear? yes
|
|||
Entry '' in ??? (12) has a zero-length name.
|
||||
Clear? yes
|
||||
|
||||
Directory inode 12, block 4, offset 100: directory corrupted
|
||||
Directory inode 12, block #4, offset 100: directory corrupted
|
||||
Salvage? yes
|
||||
|
||||
Pass 3: Checking directory connectivity
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
Pass 1: Checking inodes, blocks, and sizes
|
||||
Pass 2: Checking directory structure
|
||||
Problem in HTREE directory inode 12929: node (531) has bad max hash
|
||||
Problem in HTREE directory inode 12929: node (993) referenced twice
|
||||
Problem in HTREE directory inode 12929: node (1061) has bad min hash
|
||||
Problem in HTREE directory inode 12929: node (1062) has invalid depth (2)
|
||||
Problem in HTREE directory inode 12929: node (1062) has bad max hash
|
||||
Problem in HTREE directory inode 12929: node (1062) not referenced
|
||||
Problem in HTREE directory inode 12929: block #531 has bad max hash
|
||||
Problem in HTREE directory inode 12929: block #993 referenced twice
|
||||
Problem in HTREE directory inode 12929: block #1061 has bad min hash
|
||||
Problem in HTREE directory inode 12929: block #1062 has invalid depth (2)
|
||||
Problem in HTREE directory inode 12929: block #1062 has bad max hash
|
||||
Problem in HTREE directory inode 12929: block #1062 not referenced
|
||||
Invalid HTREE directory inode 12929 (/test2). Clear HTree index? yes
|
||||
|
||||
Pass 3: Checking directory connectivity
|
||||
|
|
|
@ -17,17 +17,17 @@ HTREE directory inode 66721 uses an incompatible htree root node flag.
|
|||
Clear HTree index? yes
|
||||
|
||||
Pass 2: Checking directory structure
|
||||
Problem in HTREE directory inode 80065: node (0) has an unordered hash table
|
||||
Problem in HTREE directory inode 80065: block #0 has an unordered hash table
|
||||
Clear HTree index? yes
|
||||
|
||||
Problem in HTREE directory inode 86737: node (0) has invalid limit (511)
|
||||
Problem in HTREE directory inode 86737: block #0 has invalid limit (511)
|
||||
Clear HTree index? yes
|
||||
|
||||
Problem in HTREE directory inode 93409: node (0) has invalid count (234)
|
||||
Problem in HTREE directory inode 93409: block #0 has invalid count (234)
|
||||
Clear HTree index? yes
|
||||
|
||||
Problem in HTREE directory inode 73393: node (1) has bad min hash
|
||||
Problem in HTREE directory inode 73393: node (2) has bad max hash
|
||||
Problem in HTREE directory inode 73393: block #1 has bad min hash
|
||||
Problem in HTREE directory inode 73393: block #2 has bad max hash
|
||||
Invalid HTREE directory inode 73393 (/test6). Clear HTree index? yes
|
||||
|
||||
Pass 3: Checking directory connectivity
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,13 +1,13 @@
|
|||
Pass 1: Checking inodes, blocks, and sizes
|
||||
Pass 2: Checking directory structure
|
||||
Directory inode 13, block 0, offset 48: directory corrupted
|
||||
Directory inode 13, block #0, offset 48: directory corrupted
|
||||
Salvage? yes
|
||||
|
||||
Directory inode 12, block 1, offset 0: directory corrupted
|
||||
Directory inode 12, block #1, offset 0: directory corrupted
|
||||
Salvage? yes
|
||||
|
||||
Setting filetype for entry 'c' in /test (12) to 1.
|
||||
Directory inode 12, block 1, offset 1016: directory corrupted
|
||||
Directory inode 12, block #1, offset 1016: directory corrupted
|
||||
Salvage? yes
|
||||
|
||||
Pass 3: Checking directory connectivity
|
||||
|
|
Loading…
Reference in New Issue