Skip to content

Commit

Permalink
xfs: uncached buffer reads need to return an error
Browse files Browse the repository at this point in the history
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: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Phil White <pwhite@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
  • Loading branch information
Dave Chinner authored and Ben Myers committed Nov 16, 2012
1 parent c3f8fc7 commit eab4e63
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 8 deletions.
9 changes: 2 additions & 7 deletions fs/xfs/xfs_buf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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;
}

Expand Down
5 changes: 5 additions & 0 deletions fs/xfs/xfs_fsops.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
6 changes: 6 additions & 0 deletions fs/xfs/xfs_mount.c
Original file line number Diff line number Diff line change
Expand Up @@ -658,6 +658,12 @@ xfs_readsb(xfs_mount_t *mp, int flags)
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.
Expand Down
9 changes: 8 additions & 1 deletion fs/xfs/xfs_rtalloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

/*
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit eab4e63

Please sign in to comment.