|
@@ -1197,9 +1197,14 @@ xfs_buf_bio_end_io(
|
|
|
{
|
|
|
xfs_buf_t *bp = (xfs_buf_t *)bio->bi_private;
|
|
|
|
|
|
- xfs_buf_ioerror(bp, -error);
|
|
|
+ /*
|
|
|
+ * don't overwrite existing errors - otherwise we can lose errors on
|
|
|
+ * buffers that require multiple bios to complete.
|
|
|
+ */
|
|
|
+ if (!bp->b_error)
|
|
|
+ xfs_buf_ioerror(bp, -error);
|
|
|
|
|
|
- if (!error && xfs_buf_is_vmapped(bp) && (bp->b_flags & XBF_READ))
|
|
|
+ if (!bp->b_error && xfs_buf_is_vmapped(bp) && (bp->b_flags & XBF_READ))
|
|
|
invalidate_kernel_vmap_range(bp->b_addr, xfs_buf_vmap_len(bp));
|
|
|
|
|
|
_xfs_buf_ioend(bp, 1);
|
|
@@ -1279,6 +1284,11 @@ next_chunk:
|
|
|
if (size)
|
|
|
goto next_chunk;
|
|
|
} else {
|
|
|
+ /*
|
|
|
+ * This is guaranteed not to be the last io reference count
|
|
|
+ * because the caller (xfs_buf_iorequest) holds a count itself.
|
|
|
+ */
|
|
|
+ atomic_dec(&bp->b_io_remaining);
|
|
|
xfs_buf_ioerror(bp, EIO);
|
|
|
bio_put(bio);
|
|
|
}
|