diff options
author | Darrick J. Wong <darrick.wong@oracle.com> | 2014-08-27 18:40:05 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2014-08-28 22:22:28 -0400 |
commit | 022eaa7517017efe4f6538750c2b59a804dc7df7 (patch) | |
tree | 1d79bb7473a3112c00df51e260c68e6e1f61b94a | |
parent | 6603120e96eae9a5d6228681ae55c7fdc998d1bb (diff) |
jbd2: fix infinite loop when recovering corrupt journal blocks
When recovering the journal, don't fall into an infinite loop if we
encounter a corrupt journal block. Instead, just skip the block and
return an error, which fails the mount and thus forces the user to run
a full filesystem fsck.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Cc: stable@vger.kernel.org
-rw-r--r-- | fs/jbd2/recovery.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/jbd2/recovery.c b/fs/jbd2/recovery.c index 3b6bb19d60b1..00e9703d7dc6 100644 --- a/fs/jbd2/recovery.c +++ b/fs/jbd2/recovery.c | |||
@@ -426,6 +426,7 @@ static int do_one_pass(journal_t *journal, | |||
426 | int tag_bytes = journal_tag_bytes(journal); | 426 | int tag_bytes = journal_tag_bytes(journal); |
427 | __u32 crc32_sum = ~0; /* Transactional Checksums */ | 427 | __u32 crc32_sum = ~0; /* Transactional Checksums */ |
428 | int descr_csum_size = 0; | 428 | int descr_csum_size = 0; |
429 | int block_error = 0; | ||
429 | 430 | ||
430 | /* | 431 | /* |
431 | * First thing is to establish what we expect to find in the log | 432 | * First thing is to establish what we expect to find in the log |
@@ -598,7 +599,8 @@ static int do_one_pass(journal_t *journal, | |||
598 | "checksum recovering " | 599 | "checksum recovering " |
599 | "block %llu in log\n", | 600 | "block %llu in log\n", |
600 | blocknr); | 601 | blocknr); |
601 | continue; | 602 | block_error = 1; |
603 | goto skip_write; | ||
602 | } | 604 | } |
603 | 605 | ||
604 | /* Find a buffer for the new | 606 | /* Find a buffer for the new |
@@ -797,7 +799,8 @@ static int do_one_pass(journal_t *journal, | |||
797 | success = -EIO; | 799 | success = -EIO; |
798 | } | 800 | } |
799 | } | 801 | } |
800 | 802 | if (block_error && success == 0) | |
803 | success = -EIO; | ||
801 | return success; | 804 | return success; |
802 | 805 | ||
803 | failed: | 806 | failed: |