diff options
Diffstat (limited to 'fs/xfs/xfs_inode.c')
-rw-r--r-- | fs/xfs/xfs_inode.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 96f606deee31..696936cad0fa 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
@@ -3327,7 +3327,7 @@ xfs_iflush( | |||
3327 | struct xfs_buf **bpp) | 3327 | struct xfs_buf **bpp) |
3328 | { | 3328 | { |
3329 | struct xfs_mount *mp = ip->i_mount; | 3329 | struct xfs_mount *mp = ip->i_mount; |
3330 | struct xfs_buf *bp; | 3330 | struct xfs_buf *bp = NULL; |
3331 | struct xfs_dinode *dip; | 3331 | struct xfs_dinode *dip; |
3332 | int error; | 3332 | int error; |
3333 | 3333 | ||
@@ -3369,14 +3369,22 @@ xfs_iflush( | |||
3369 | } | 3369 | } |
3370 | 3370 | ||
3371 | /* | 3371 | /* |
3372 | * Get the buffer containing the on-disk inode. | 3372 | * Get the buffer containing the on-disk inode. We are doing a try-lock |
3373 | * operation here, so we may get an EAGAIN error. In that case, we | ||
3374 | * simply want to return with the inode still dirty. | ||
3375 | * | ||
3376 | * If we get any other error, we effectively have a corruption situation | ||
3377 | * and we cannot flush the inode, so we treat it the same as failing | ||
3378 | * xfs_iflush_int(). | ||
3373 | */ | 3379 | */ |
3374 | error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK, | 3380 | error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK, |
3375 | 0); | 3381 | 0); |
3376 | if (error || !bp) { | 3382 | if (error == -EAGAIN) { |
3377 | xfs_ifunlock(ip); | 3383 | xfs_ifunlock(ip); |
3378 | return error; | 3384 | return error; |
3379 | } | 3385 | } |
3386 | if (error) | ||
3387 | goto corrupt_out; | ||
3380 | 3388 | ||
3381 | /* | 3389 | /* |
3382 | * First flush out the inode that xfs_iflush was called with. | 3390 | * First flush out the inode that xfs_iflush was called with. |
@@ -3404,7 +3412,8 @@ xfs_iflush( | |||
3404 | return 0; | 3412 | return 0; |
3405 | 3413 | ||
3406 | corrupt_out: | 3414 | corrupt_out: |
3407 | xfs_buf_relse(bp); | 3415 | if (bp) |
3416 | xfs_buf_relse(bp); | ||
3408 | xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); | 3417 | xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); |
3409 | cluster_corrupt_out: | 3418 | cluster_corrupt_out: |
3410 | error = -EFSCORRUPTED; | 3419 | error = -EFSCORRUPTED; |