mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 21:33:00 +00:00
xfs: don't leak EFSBADCRC to userspace
While the verifier routines may return EFSBADCRC when a buffer has a bad CRC, we need to translate that to EFSCORRUPTED so that the higher layers treat the error appropriately and we return a consistent error to userspace. This fixes a xfs/005 regression. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
parent
38dbfb59d1
commit
ac75a1f7a4
@ -307,6 +307,9 @@ reread:
|
||||
error = bp->b_error;
|
||||
if (loud)
|
||||
xfs_warn(mp, "SB validate failed with error %d.", error);
|
||||
/* bad CRC means corrupted metadata */
|
||||
if (error == EFSBADCRC)
|
||||
error = EFSCORRUPTED;
|
||||
goto release_buf;
|
||||
}
|
||||
|
||||
|
@ -80,6 +80,10 @@ xfs_readlink_bmap(
|
||||
if (error) {
|
||||
xfs_buf_ioerror_alert(bp, __func__);
|
||||
xfs_buf_relse(bp);
|
||||
|
||||
/* bad CRC means corrupted metadata */
|
||||
if (error == EFSBADCRC)
|
||||
error = EFSCORRUPTED;
|
||||
goto out;
|
||||
}
|
||||
byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt);
|
||||
|
@ -275,6 +275,10 @@ xfs_trans_read_buf_map(
|
||||
XFS_BUF_UNDONE(bp);
|
||||
xfs_buf_stale(bp);
|
||||
xfs_buf_relse(bp);
|
||||
|
||||
/* bad CRC means corrupted metadata */
|
||||
if (error == EFSBADCRC)
|
||||
error = EFSCORRUPTED;
|
||||
return error;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
@ -338,6 +342,9 @@ xfs_trans_read_buf_map(
|
||||
if (tp->t_flags & XFS_TRANS_DIRTY)
|
||||
xfs_force_shutdown(tp->t_mountp,
|
||||
SHUTDOWN_META_IO_ERROR);
|
||||
/* bad CRC means corrupted metadata */
|
||||
if (error == EFSBADCRC)
|
||||
error = EFSCORRUPTED;
|
||||
return error;
|
||||
}
|
||||
}
|
||||
@ -375,6 +382,10 @@ xfs_trans_read_buf_map(
|
||||
if (tp->t_flags & XFS_TRANS_DIRTY)
|
||||
xfs_force_shutdown(tp->t_mountp, SHUTDOWN_META_IO_ERROR);
|
||||
xfs_buf_relse(bp);
|
||||
|
||||
/* bad CRC means corrupted metadata */
|
||||
if (error == EFSBADCRC)
|
||||
error = EFSCORRUPTED;
|
||||
return error;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
|
Loading…
Reference in New Issue
Block a user