aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/xfs/linux-2.6/xfs_buf.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c
index efce8abb375c..f4d4e708a8d6 100644
--- a/fs/xfs/linux-2.6/xfs_buf.c
+++ b/fs/xfs/linux-2.6/xfs_buf.c
@@ -578,9 +578,9 @@ _xfs_buf_read(
578 XBF_READ_AHEAD | _XBF_RUN_QUEUES); 578 XBF_READ_AHEAD | _XBF_RUN_QUEUES);
579 579
580 status = xfs_buf_iorequest(bp); 580 status = xfs_buf_iorequest(bp);
581 if (!status && !(flags & XBF_ASYNC)) 581 if (status || XFS_BUF_ISERROR(bp) || (flags & XBF_ASYNC))
582 status = xfs_buf_iowait(bp); 582 return status;
583 return status; 583 return xfs_buf_iowait(bp);
584} 584}
585 585
586xfs_buf_t * 586xfs_buf_t *
@@ -1280,8 +1280,19 @@ submit_io:
1280 if (size) 1280 if (size)
1281 goto next_chunk; 1281 goto next_chunk;
1282 } else { 1282 } else {
1283 bio_put(bio); 1283 /*
1284 * if we get here, no pages were added to the bio. However,
1285 * we can't just error out here - if the pages are locked then
1286 * we have to unlock them otherwise we can hang on a later
1287 * access to the page.
1288 */
1284 xfs_buf_ioerror(bp, EIO); 1289 xfs_buf_ioerror(bp, EIO);
1290 if (bp->b_flags & _XBF_PAGE_LOCKED) {
1291 int i;
1292 for (i = 0; i < bp->b_page_count; i++)
1293 unlock_page(bp->b_pages[i]);
1294 }
1295 bio_put(bio);
1285 } 1296 }
1286} 1297}
1287 1298