Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac75a1f7 authored by Dave Chinner's avatar Dave Chinner Committed by Dave Chinner
Browse files

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: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent 38dbfb59
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -307,6 +307,9 @@ xfs_readsb(
		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;
	}

+4 −0
Original line number Diff line number Diff line
@@ -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);
+11 −0
Original line number Diff line number Diff line
@@ -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