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
This commit is contained in:
Родитель
6603120e96
Коммит
022eaa7517
|
@ -426,6 +426,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
|
||||
|
@ -598,7 +599,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
|
||||
|
@ -797,7 +799,8 @@ static int do_one_pass(journal_t *journal,
|
|||
success = -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
if (block_error && success == 0)
|
||||
success = -EIO;
|
||||
return success;
|
||||
|
||||
failed:
|
||||
|
|
Загрузка…
Ссылка в новой задаче