diff options
Diffstat (limited to 'fs/xfs')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.c | 19 |
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 | ||
586 | xfs_buf_t * | 586 | xfs_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 | ||