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

Commit eab4e633 authored by Dave Chinner's avatar Dave Chinner Committed by Ben Myers
Browse files

xfs: uncached buffer reads need to return an error



With verification being done as an IO completion callback, different
errors can be returned from a read. Uncached reads only return a
buffer or NULL on failure, which means the verification error cannot
be returned to the caller.

Split the error handling for these reads into two - a failure to get
a buffer will still return NULL, but a read error will return a
referenced buffer with b_error set rather than NULL. The caller is
responsible for checking the error state of the buffer returned.

Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarPhil White <pwhite@sgi.com>
Signed-off-by: default avatarBen Myers <bpm@sgi.com>
parent c3f8fc73
Loading
Loading
Loading
Loading
+2 −7
Original line number Diff line number Diff line
@@ -715,8 +715,7 @@ xfs_buf_read_uncached(
	int			flags,
	xfs_buf_iodone_t	verify)
{
	xfs_buf_t		*bp;
	int			error;
	struct xfs_buf		*bp;

	bp = xfs_buf_get_uncached(target, numblks, flags);
	if (!bp)
@@ -730,11 +729,7 @@ xfs_buf_read_uncached(
	bp->b_iodone = verify;

	xfsbdstrat(target->bt_mount, bp);
	error = xfs_buf_iowait(bp);
	if (error) {
		xfs_buf_relse(bp);
		return NULL;
	}
	xfs_buf_iowait(bp);
	return bp;
}

+5 −0
Original line number Diff line number Diff line
@@ -171,6 +171,11 @@ xfs_growfs_data_private(
				XFS_FSS_TO_BB(mp, 1), 0, NULL);
	if (!bp)
		return EIO;
	if (bp->b_error) {
		int	error = bp->b_error;
		xfs_buf_relse(bp);
		return error;
	}
	xfs_buf_relse(bp);

	new = nb;	/* use new as a temporary here */
+6 −0
Original line number Diff line number Diff line
@@ -658,6 +658,12 @@ reread:
			xfs_warn(mp, "SB buffer read failed");
		return EIO;
	}
	if (bp->b_error) {
		error = bp->b_error;
		if (loud)
			xfs_warn(mp, "SB validate failed");
		goto release_buf;
	}

	/*
	 * Initialize the mount structure from the superblock.
+8 −1
Original line number Diff line number Diff line
@@ -1876,6 +1876,11 @@ xfs_growfs_rt(
				XFS_FSB_TO_BB(mp, 1), 0, NULL);
	if (!bp)
		return EIO;
	if (bp->b_error) {
		error = bp->b_error;
		xfs_buf_relse(bp);
		return error;
	}
	xfs_buf_relse(bp);

	/*
@@ -2221,8 +2226,10 @@ xfs_rtmount_init(
	bp = xfs_buf_read_uncached(mp->m_rtdev_targp,
					d - XFS_FSB_TO_BB(mp, 1),
					XFS_FSB_TO_BB(mp, 1), 0, NULL);
	if (!bp) {
	if (!bp || bp->b_error) {
		xfs_warn(mp, "realtime device size check failed");
		if (bp)
			xfs_buf_relse(bp);
		return EIO;
	}
	xfs_buf_relse(bp);