From 010c49cf499738c7a06de13077f31f2a12ecadeb Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Wed, 21 Mar 2012 23:40:24 -0400 Subject: [PATCH] e2fsck: report ext2fs_open2() and ext2fs_check_desc() errors Print the actual errors returned by ext2fs_open2() and ext2fs_check_desc() before we fall back to the backup block group descriptors so that it's easier to see if there is some obscure failure that is causing e2fsck to think that it should use the backup block group descriptors. Addresses-Google-Bug: #6208183 Signed-off-by: "Theodore Ts'o" --- e2fsck/problem.c | 10 ++++++++++ e2fsck/problem.h | 5 +++++ e2fsck/unix.c | 9 +++++++++ tests/f_crashdisk/expect.1 | 1 + tests/f_illbbitmap/expect.1 | 1 + tests/f_illibitmap/expect.1 | 1 + tests/f_illitable/expect.1 | 1 + tests/f_illitable_flexbg/expect.1 | 1 + tests/f_miss_blk_bmap/expect.1 | 1 + tests/f_misstable/expect.1 | 1 + tests/f_overfsblks/expect.1 | 1 + tests/f_resize_inode/expect | 1 + tests/f_zero_group/expect.1 | 1 + tests/f_zero_inode_size/expect.1 | 1 + tests/f_zero_super/expect.1 | 1 + 15 files changed, 36 insertions(+) diff --git a/e2fsck/problem.c b/e2fsck/problem.c index 56d10b15..f5c0554c 100644 --- a/e2fsck/problem.c +++ b/e2fsck/problem.c @@ -423,6 +423,16 @@ static struct e2fsck_problem problem_table[] = { N_("@S has invalid MMP magic. "), PROMPT_FIX, PR_PREEN_OK | PR_NO_OK}, + /* Opening file system failed */ + { PR_0_OPEN_FAILED, + N_("ext2fs_open2: %m\n"), + PROMPT_NONE, 0 }, + + /* Checking group descriptor failed */ + { PR_0_CHECK_DESC_FAILED, + N_("ext2fs_check_desc: %m\n"), + PROMPT_NONE, 0 }, + /* Pass 1 errors */ /* Pass 1: Checking inodes, blocks, and sizes */ diff --git a/e2fsck/problem.h b/e2fsck/problem.h index 66330559..348cfbce 100644 --- a/e2fsck/problem.h +++ b/e2fsck/problem.h @@ -243,6 +243,11 @@ struct problem_context { /* Superblock has invalid MMP magic. */ #define PR_0_MMP_INVALID_MAGIC 0x000043 +/* Opening file system failed */ +#define PR_0_OPEN_FAILED 0x000044 + +/* Checking group descriptor failed */ +#define PR_0_CHECK_DESC_FAILED 0x000045 /* * Pass 1 errors diff --git a/e2fsck/unix.c b/e2fsck/unix.c index d0b10d49..190deaf9 100644 --- a/e2fsck/unix.c +++ b/e2fsck/unix.c @@ -1232,6 +1232,15 @@ restart: ((retval == EXT2_ET_BAD_MAGIC) || (retval == EXT2_ET_CORRUPT_SUPERBLOCK) || ((retval == 0) && (retval2 = ext2fs_check_desc(fs))))) { + if (retval) { + pctx.errcode = retval; + fix_problem(ctx, PR_0_OPEN_FAILED, &pctx); + } + if (retval2) { + pctx.errcode = retval2; + fix_problem(ctx, PR_0_CHECK_DESC_FAILED, &pctx); + } + pctx.errcode = 0; if (retval2 == ENOMEM || retval2 == EXT2_ET_NO_MEMORY) { retval = retval2; goto failure; diff --git a/tests/f_crashdisk/expect.1 b/tests/f_crashdisk/expect.1 index 132d49af..70ddf2ec 100644 --- a/tests/f_crashdisk/expect.1 +++ b/tests/f_crashdisk/expect.1 @@ -1,3 +1,4 @@ +ext2fs_open2: The ext2 superblock is corrupt ../e2fsck/e2fsck: Superblock invalid, trying backup blocks... ../e2fsck/e2fsck: The ext2 superblock is corrupt while trying to open test.img diff --git a/tests/f_illbbitmap/expect.1 b/tests/f_illbbitmap/expect.1 index ae61bf52..8746d23a 100644 --- a/tests/f_illbbitmap/expect.1 +++ b/tests/f_illbbitmap/expect.1 @@ -1,3 +1,4 @@ +ext2fs_check_desc: Corrupt group descriptor: bad block for block bitmap Note: if several inode or block bitmap blocks or part of the inode table require relocation, you may wish to try running e2fsck with the '-b 8193' option first. The problem diff --git a/tests/f_illibitmap/expect.1 b/tests/f_illibitmap/expect.1 index 2ed55b67..5bae25d1 100644 --- a/tests/f_illibitmap/expect.1 +++ b/tests/f_illibitmap/expect.1 @@ -1,3 +1,4 @@ +ext2fs_check_desc: Corrupt group descriptor: bad block for inode bitmap Note: if several inode or block bitmap blocks or part of the inode table require relocation, you may wish to try running e2fsck with the '-b 8193' option first. The problem diff --git a/tests/f_illitable/expect.1 b/tests/f_illitable/expect.1 index fbb3aefa..552a2e79 100644 --- a/tests/f_illitable/expect.1 +++ b/tests/f_illitable/expect.1 @@ -1,3 +1,4 @@ +ext2fs_check_desc: Corrupt group descriptor: bad block for inode table Note: if several inode or block bitmap blocks or part of the inode table require relocation, you may wish to try running e2fsck with the '-b 8193' option first. The problem diff --git a/tests/f_illitable_flexbg/expect.1 b/tests/f_illitable_flexbg/expect.1 index 2d547285..fa42a0f8 100644 --- a/tests/f_illitable_flexbg/expect.1 +++ b/tests/f_illitable_flexbg/expect.1 @@ -1,3 +1,4 @@ +ext2fs_check_desc: Corrupt group descriptor: bad block for inode table ../e2fsck/e2fsck: Group descriptors look bad... trying backup blocks... Inode table for group 1 is not in group. (block 0) WARNING: SEVERE DATA LOSS POSSIBLE. diff --git a/tests/f_miss_blk_bmap/expect.1 b/tests/f_miss_blk_bmap/expect.1 index 4c51a16e..998b61ad 100644 --- a/tests/f_miss_blk_bmap/expect.1 +++ b/tests/f_miss_blk_bmap/expect.1 @@ -1,3 +1,4 @@ +ext2fs_check_desc: Corrupt group descriptor: bad block for block bitmap Pass 1: Checking inodes, blocks, and sizes Relocating group 0's block bitmap to 2... Pass 2: Checking directory structure diff --git a/tests/f_misstable/expect.1 b/tests/f_misstable/expect.1 index 93d4e899..a8cf264e 100644 --- a/tests/f_misstable/expect.1 +++ b/tests/f_misstable/expect.1 @@ -1,3 +1,4 @@ +ext2fs_check_desc: Corrupt group descriptor: bad block for inode table ../e2fsck/e2fsck: Group descriptors look bad... trying backup blocks... Inode table for group 1 is not in group. (block 0) WARNING: SEVERE DATA LOSS POSSIBLE. diff --git a/tests/f_overfsblks/expect.1 b/tests/f_overfsblks/expect.1 index 60f77d55..e5b93f0d 100644 --- a/tests/f_overfsblks/expect.1 +++ b/tests/f_overfsblks/expect.1 @@ -1,3 +1,4 @@ +ext2fs_check_desc: Corrupt group descriptor: bad block for inode bitmap Filesystem did not have a UUID; generating one. Pass 1: Checking inodes, blocks, and sizes diff --git a/tests/f_resize_inode/expect b/tests/f_resize_inode/expect index a396927c..84618d4d 100644 --- a/tests/f_resize_inode/expect +++ b/tests/f_resize_inode/expect @@ -113,6 +113,7 @@ Exit status is 0 debugfs -R ''set_super_value reserved_gdt_blocks 15679'' -w test.img Exit status is 0 +ext2fs_check_desc: Corrupt group descriptor: bad block for block bitmap ../e2fsck/e2fsck: Group descriptors look bad... trying backup blocks... Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure diff --git a/tests/f_zero_group/expect.1 b/tests/f_zero_group/expect.1 index 577dadd4..2a077674 100644 --- a/tests/f_zero_group/expect.1 +++ b/tests/f_zero_group/expect.1 @@ -1,3 +1,4 @@ +ext2fs_check_desc: Corrupt group descriptor: bad block for block bitmap ../e2fsck/e2fsck: Group descriptors look bad... trying backup blocks... Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure diff --git a/tests/f_zero_inode_size/expect.1 b/tests/f_zero_inode_size/expect.1 index 9202131f..b8bd7da2 100644 --- a/tests/f_zero_inode_size/expect.1 +++ b/tests/f_zero_inode_size/expect.1 @@ -1,3 +1,4 @@ +ext2fs_open2: The ext2 superblock is corrupt ../e2fsck/e2fsck: Superblock invalid, trying backup blocks... Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure diff --git a/tests/f_zero_super/expect.1 b/tests/f_zero_super/expect.1 index 029f3f14..e2b954d0 100644 --- a/tests/f_zero_super/expect.1 +++ b/tests/f_zero_super/expect.1 @@ -1,3 +1,4 @@ +ext2fs_open2: Bad magic number in super-block ../e2fsck/e2fsck: Superblock invalid, trying backup blocks... Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure