diff options
Diffstat (limited to 'fs/xfs/xfs_trans_buf.c')
-rw-r--r-- | fs/xfs/xfs_trans_buf.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 60b6b898022b..cb0c5839154b 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c | |||
@@ -304,7 +304,8 @@ xfs_trans_read_buf( | |||
304 | if (tp == NULL) { | 304 | if (tp == NULL) { |
305 | bp = xfs_buf_read_flags(target, blkno, len, flags | BUF_BUSY); | 305 | bp = xfs_buf_read_flags(target, blkno, len, flags | BUF_BUSY); |
306 | if (!bp) | 306 | if (!bp) |
307 | return XFS_ERROR(ENOMEM); | 307 | return (flags & XFS_BUF_TRYLOCK) ? |
308 | EAGAIN : XFS_ERROR(ENOMEM); | ||
308 | 309 | ||
309 | if ((bp != NULL) && (XFS_BUF_GETERROR(bp) != 0)) { | 310 | if ((bp != NULL) && (XFS_BUF_GETERROR(bp) != 0)) { |
310 | xfs_ioerror_alert("xfs_trans_read_buf", mp, | 311 | xfs_ioerror_alert("xfs_trans_read_buf", mp, |
@@ -353,17 +354,15 @@ xfs_trans_read_buf( | |||
353 | ASSERT(!XFS_BUF_ISASYNC(bp)); | 354 | ASSERT(!XFS_BUF_ISASYNC(bp)); |
354 | XFS_BUF_READ(bp); | 355 | XFS_BUF_READ(bp); |
355 | xfsbdstrat(tp->t_mountp, bp); | 356 | xfsbdstrat(tp->t_mountp, bp); |
356 | xfs_iowait(bp); | 357 | error = xfs_iowait(bp); |
357 | if (XFS_BUF_GETERROR(bp) != 0) { | 358 | if (error) { |
358 | xfs_ioerror_alert("xfs_trans_read_buf", mp, | 359 | xfs_ioerror_alert("xfs_trans_read_buf", mp, |
359 | bp, blkno); | 360 | bp, blkno); |
360 | error = XFS_BUF_GETERROR(bp); | ||
361 | xfs_buf_relse(bp); | 361 | xfs_buf_relse(bp); |
362 | /* | 362 | /* |
363 | * We can gracefully recover from most | 363 | * We can gracefully recover from most read |
364 | * read errors. Ones we can't are those | 364 | * errors. Ones we can't are those that happen |
365 | * that happen after the transaction's | 365 | * after the transaction's already dirty. |
366 | * already dirty. | ||
367 | */ | 366 | */ |
368 | if (tp->t_flags & XFS_TRANS_DIRTY) | 367 | if (tp->t_flags & XFS_TRANS_DIRTY) |
369 | xfs_force_shutdown(tp->t_mountp, | 368 | xfs_force_shutdown(tp->t_mountp, |