|
@@ -600,17 +600,15 @@ _xfs_buf_read(
|
|
|
xfs_buf_t *bp,
|
|
|
xfs_buf_flags_t flags)
|
|
|
{
|
|
|
- int status;
|
|
|
-
|
|
|
ASSERT(!(flags & XBF_WRITE));
|
|
|
ASSERT(bp->b_bn != XFS_BUF_DADDR_NULL);
|
|
|
|
|
|
bp->b_flags &= ~(XBF_WRITE | XBF_ASYNC | XBF_READ_AHEAD);
|
|
|
bp->b_flags |= flags & (XBF_READ | XBF_ASYNC | XBF_READ_AHEAD);
|
|
|
|
|
|
- status = xfs_buf_iorequest(bp);
|
|
|
- if (status || bp->b_error || (flags & XBF_ASYNC))
|
|
|
- return status;
|
|
|
+ xfs_buf_iorequest(bp);
|
|
|
+ if (flags & XBF_ASYNC)
|
|
|
+ return 0;
|
|
|
return xfs_buf_iowait(bp);
|
|
|
}
|
|
|
|
|
@@ -695,7 +693,7 @@ xfs_buf_read_uncached(
|
|
|
|
|
|
xfsbdstrat(mp, bp);
|
|
|
error = xfs_buf_iowait(bp);
|
|
|
- if (error || bp->b_error) {
|
|
|
+ if (error) {
|
|
|
xfs_buf_relse(bp);
|
|
|
return NULL;
|
|
|
}
|
|
@@ -1252,7 +1250,7 @@ next_chunk:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-int
|
|
|
+void
|
|
|
xfs_buf_iorequest(
|
|
|
xfs_buf_t *bp)
|
|
|
{
|
|
@@ -1273,13 +1271,12 @@ xfs_buf_iorequest(
|
|
|
_xfs_buf_ioend(bp, 0);
|
|
|
|
|
|
xfs_buf_rele(bp);
|
|
|
- return 0;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Waits for I/O to complete on the buffer supplied.
|
|
|
- * It returns immediately if no I/O is pending.
|
|
|
- * It returns the I/O error code, if any, or 0 if there was no error.
|
|
|
+ * Waits for I/O to complete on the buffer supplied. It returns immediately if
|
|
|
+ * no I/O is pending or there is already a pending error on the buffer. It
|
|
|
+ * returns the I/O error code, if any, or 0 if there was no error.
|
|
|
*/
|
|
|
int
|
|
|
xfs_buf_iowait(
|
|
@@ -1287,7 +1284,8 @@ xfs_buf_iowait(
|
|
|
{
|
|
|
trace_xfs_buf_iowait(bp, _RET_IP_);
|
|
|
|
|
|
- wait_for_completion(&bp->b_iowait);
|
|
|
+ if (!bp->b_error)
|
|
|
+ wait_for_completion(&bp->b_iowait);
|
|
|
|
|
|
trace_xfs_buf_iowait_done(bp, _RET_IP_);
|
|
|
return bp->b_error;
|