summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKalpak Shah <kalpak@clusterfs.com>2007-06-21 11:59:06 -0400
committerTheodore Ts'o <tytso@mit.edu>2007-06-21 11:59:06 -0400
commit5107d0d196b9c51cf18380b6996b1074afe51df2 (patch)
tree1f02cce3c9cefacaaf7d1613a336a24dc6e03607
parent56d1236726d8e4624d2f3a2f4713864c1e66bb40 (diff)
downloade2fsprogs-5107d0d196b9c51cf18380b6996b1074afe51df2.tar.gz
Recreate journal that had been removed previously due to corruption
If the journal had been removed because it was corrupt, the E2F_FLAG_JOURNAL_INODE flag will be set. If this flag is set, then recreate the filesystem after checking the filesystem. Signed-off-by: Kalpak Shah <kalpak@clusterfs.com> Signed-off-by: Andreas Dilger <adilger@clusterfs.com>
-rw-r--r--e2fsck/journal.c2
-rw-r--r--e2fsck/problem.c5
-rw-r--r--e2fsck/problem.h7
-rw-r--r--e2fsck/unix.c40
-rw-r--r--tests/f_badjourblks/expect.18
-rw-r--r--tests/f_badjourblks/expect.22
-rw-r--r--tests/f_miss_journal/expect.18
-rw-r--r--tests/f_miss_journal/expect.22
8 files changed, 69 insertions, 5 deletions
diff --git a/e2fsck/journal.c b/e2fsck/journal.c
index 519df487..1f10305d 100644
--- a/e2fsck/journal.c
+++ b/e2fsck/journal.c
@@ -420,7 +420,7 @@ static errcode_t e2fsck_journal_fix_bad_inode(e2fsck_t ctx,
"filesystem is now ext2 only ***\n\n");
sb->s_feature_compat &= ~EXT3_FEATURE_COMPAT_HAS_JOURNAL;
sb->s_journal_inum = 0;
- ctx->flags |= E2F_FLAG_JOURNAL_INODE; /* FIXME: todo */
+ ctx->flags |= E2F_FLAG_JOURNAL_INODE;
e2fsck_clear_recover(ctx, 1);
return 0;
}
diff --git a/e2fsck/problem.c b/e2fsck/problem.c
index 9f4af509..87de6459 100644
--- a/e2fsck/problem.c
+++ b/e2fsck/problem.c
@@ -1494,6 +1494,11 @@ static struct e2fsck_problem problem_table[] = {
" +(%i--%j)",
PROMPT_NONE, PR_LATCH_IBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
+ /* Recreate journal if E2F_FLAG_JOURNAL_INODE flag is set */
+ { PR_6_RECREATE_JOURNAL,
+ N_("Recreate journal to make the filesystem ext3 again?\n"),
+ PROMPT_FIX, PR_PREEN_OK | PR_NO_OK },
+
{ 0 }
};
diff --git a/e2fsck/problem.h b/e2fsck/problem.h
index 560907ac..28fe9646 100644
--- a/e2fsck/problem.h
+++ b/e2fsck/problem.h
@@ -901,6 +901,13 @@ struct problem_context {
#define PR_5_INODE_RANGE_USED 0x050017
/*
+ * Post-Pass 5 errors
+ */
+
+/* Recreate the journal if E2F_FLAG_JOURNAL_INODE flag is set */
+#define PR_6_RECREATE_JOURNAL 0x060001
+
+/*
* Function declarations
*/
int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx);
diff --git a/e2fsck/unix.c b/e2fsck/unix.c
index 72091f88..b01a62a3 100644
--- a/e2fsck/unix.c
+++ b/e2fsck/unix.c
@@ -851,6 +851,7 @@ int main (int argc, char *argv[])
e2fsck_t ctx;
struct problem_context pctx;
int flags, run_result;
+ int journal_size;
clear_problem_context(&pctx);
#ifdef MTRACE
@@ -1184,8 +1185,47 @@ restart:
" but we'll try to go on...\n"));
}
+ /*
+ * Save the journal size in megabytes.
+ * Try and use the journal size from the backup else let e2fsck
+ * find the default journal size.
+ */
+ if (sb->s_jnl_backup_type == EXT3_JNL_BACKUP_BLOCKS)
+ journal_size = sb->s_jnl_blocks[16] >> 20;
+ else
+ journal_size = -1;
+
run_result = e2fsck_run(ctx);
e2fsck_clear_progbar(ctx);
+
+ if (ctx->flags & E2F_FLAG_JOURNAL_INODE) {
+ if (fix_problem(ctx, PR_6_RECREATE_JOURNAL, &pctx)) {
+ if (journal_size < 1024)
+ journal_size = ext2fs_default_journal_size(fs->super->s_blocks_count);
+ if (journal_size < 0) {
+ fs->super->s_feature_compat &=
+ ~EXT3_FEATURE_COMPAT_HAS_JOURNAL;
+ com_err(ctx->program_name, 0,
+ _("Couldn't determine journal size"));
+ goto no_journal;
+ }
+ printf(_("Creating journal (%d blocks): "),
+ journal_size);
+ fflush(stdout);
+ retval = ext2fs_add_journal_inode(fs,
+ journal_size, 0);
+ if (retval) {
+ com_err("Error ", retval,
+ _("\n\twhile trying to create journal"));
+ goto no_journal;
+ }
+ printf(_(" Done.\n"));
+ printf(_("\n*** journal has been re-created - "
+ "filesystem is now ext3 again ***\n"));
+ }
+ }
+no_journal:
+
if (run_result == E2F_FLAG_RESTART) {
printf(_("Restarting e2fsck from the beginning...\n"));
retval = e2fsck_reset_context(ctx);
diff --git a/tests/f_badjourblks/expect.1 b/tests/f_badjourblks/expect.1
index 8684286e..5a0bfef5 100644
--- a/tests/f_badjourblks/expect.1
+++ b/tests/f_badjourblks/expect.1
@@ -19,7 +19,13 @@ Fix? yes
Free blocks count wrong (7112, counted=8142).
Fix? yes
+Recreate journal to make the filesystem ext3 again?
+Fix? yes
+
+Creating journal (1024 blocks): Done.
+
+*** journal has been re-created - filesystem is now ext3 again ***
test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
-test_filesys: 11/256 files (0.0% non-contiguous), 50/8192 blocks
+test_filesys: 11/256 files (0.0% non-contiguous), 1080/8192 blocks
Exit status is 1
diff --git a/tests/f_badjourblks/expect.2 b/tests/f_badjourblks/expect.2
index 32ca9775..632dc71b 100644
--- a/tests/f_badjourblks/expect.2
+++ b/tests/f_badjourblks/expect.2
@@ -3,5 +3,5 @@ Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
-test_filesys: 11/256 files (0.0% non-contiguous), 50/8192 blocks
+test_filesys: 11/256 files (0.0% non-contiguous), 1080/8192 blocks
Exit status is 0
diff --git a/tests/f_miss_journal/expect.1 b/tests/f_miss_journal/expect.1
index 140cb518..cad69f63 100644
--- a/tests/f_miss_journal/expect.1
+++ b/tests/f_miss_journal/expect.1
@@ -17,7 +17,13 @@ Fix? yes
Free blocks count wrong (968, counted=1998).
Fix? yes
+Recreate journal to make the filesystem ext3 again?
+Fix? yes
+
+Creating journal (1024 blocks): Done.
+
+*** journal has been re-created - filesystem is now ext3 again ***
test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
-test_filesys: 11/256 files (0.0% non-contiguous), 50/2048 blocks
+test_filesys: 11/256 files (0.0% non-contiguous), 1080/2048 blocks
Exit status is 1
diff --git a/tests/f_miss_journal/expect.2 b/tests/f_miss_journal/expect.2
index 834a1204..1e8c47f9 100644
--- a/tests/f_miss_journal/expect.2
+++ b/tests/f_miss_journal/expect.2
@@ -3,5 +3,5 @@ Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
-test_filesys: 11/256 files (0.0% non-contiguous), 50/2048 blocks
+test_filesys: 11/256 files (0.0% non-contiguous), 1080/2048 blocks
Exit status is 0