ext4: save the error code which triggered an ext4_error() in the superblock
This allows the cause of an ext4_error() report to be categorized based on whether it was triggered due to an I/O error, or an memory allocation error, or other possible causes. Most errors are caused by a detected file system inconsistency, so the default code stored in the superblock will be EXT4_ERR_EFSCORRUPTED. Link: https://lore.kernel.org/r/20191204032335.7683-1-tytso@mit.edu Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
@@ -156,6 +156,7 @@ static struct buffer_head *__ext4_read_dirblock(struct inode *inode,
|
||||
if (ext4_dx_csum_verify(inode, dirent))
|
||||
set_buffer_verified(bh);
|
||||
else {
|
||||
ext4_set_errno(inode->i_sb, EFSBADCRC);
|
||||
ext4_error_inode(inode, func, line, block,
|
||||
"Directory index failed checksum");
|
||||
brelse(bh);
|
||||
@@ -166,6 +167,7 @@ static struct buffer_head *__ext4_read_dirblock(struct inode *inode,
|
||||
if (ext4_dirblock_csum_verify(inode, bh))
|
||||
set_buffer_verified(bh);
|
||||
else {
|
||||
ext4_set_errno(inode->i_sb, EFSBADCRC);
|
||||
ext4_error_inode(inode, func, line, block,
|
||||
"Directory block failed checksum");
|
||||
brelse(bh);
|
||||
@@ -1527,6 +1529,7 @@ restart:
|
||||
goto next;
|
||||
wait_on_buffer(bh);
|
||||
if (!buffer_uptodate(bh)) {
|
||||
ext4_set_errno(sb, EIO);
|
||||
EXT4_ERROR_INODE(dir, "reading directory lblock %lu",
|
||||
(unsigned long) block);
|
||||
brelse(bh);
|
||||
@@ -1537,6 +1540,7 @@ restart:
|
||||
!is_dx_internal_node(dir, block,
|
||||
(struct ext4_dir_entry *)bh->b_data) &&
|
||||
!ext4_dirblock_csum_verify(dir, bh)) {
|
||||
ext4_set_errno(sb, EFSBADCRC);
|
||||
EXT4_ERROR_INODE(dir, "checksumming directory "
|
||||
"block %lu", (unsigned long)block);
|
||||
brelse(bh);
|
||||
|
Reference in New Issue
Block a user