mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-04 02:02:28 +09:00
jbd2: fix infinite loop when recovering corrupt journal blocks
commit 022eaa7517 upstream.
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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
d9fab037c6
commit
666cec8db7
@@ -427,6 +427,7 @@ static int do_one_pass(journal_t *journal,
|
||||
int tag_bytes = journal_tag_bytes(journal);
|
||||
__u32 crc32_sum = ~0; /* Transactional Checksums */
|
||||
int descr_csum_size = 0;
|
||||
int block_error = 0;
|
||||
|
||||
/*
|
||||
* First thing is to establish what we expect to find in the log
|
||||
@@ -599,7 +600,8 @@ static int do_one_pass(journal_t *journal,
|
||||
"checksum recovering "
|
||||
"block %llu in log\n",
|
||||
blocknr);
|
||||
continue;
|
||||
block_error = 1;
|
||||
goto skip_write;
|
||||
}
|
||||
|
||||
/* Find a buffer for the new
|
||||
@@ -798,7 +800,8 @@ static int do_one_pass(journal_t *journal,
|
||||
success = -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
if (block_error && success == 0)
|
||||
success = -EIO;
|
||||
return success;
|
||||
|
||||
failed:
|
||||
|
||||
Reference in New Issue
Block a user