diff options
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_buf.c')
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index f01de3c55c43..649ade8ef598 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | 37 | ||
| 38 | #include "xfs_sb.h" | 38 | #include "xfs_sb.h" |
| 39 | #include "xfs_inum.h" | 39 | #include "xfs_inum.h" |
| 40 | #include "xfs_log.h" | ||
| 40 | #include "xfs_ag.h" | 41 | #include "xfs_ag.h" |
| 41 | #include "xfs_dmapi.h" | 42 | #include "xfs_dmapi.h" |
| 42 | #include "xfs_mount.h" | 43 | #include "xfs_mount.h" |
| @@ -850,6 +851,12 @@ xfs_buf_lock_value( | |||
| 850 | * Note that this in no way locks the underlying pages, so it is only | 851 | * Note that this in no way locks the underlying pages, so it is only |
| 851 | * useful for synchronizing concurrent use of buffer objects, not for | 852 | * useful for synchronizing concurrent use of buffer objects, not for |
| 852 | * synchronizing independent access to the underlying pages. | 853 | * synchronizing independent access to the underlying pages. |
| 854 | * | ||
| 855 | * If we come across a stale, pinned, locked buffer, we know that we | ||
| 856 | * are being asked to lock a buffer that has been reallocated. Because | ||
| 857 | * it is pinned, we know that the log has not been pushed to disk and | ||
| 858 | * hence it will still be locked. Rather than sleeping until someone | ||
| 859 | * else pushes the log, push it ourselves before trying to get the lock. | ||
| 853 | */ | 860 | */ |
| 854 | void | 861 | void |
| 855 | xfs_buf_lock( | 862 | xfs_buf_lock( |
| @@ -857,6 +864,8 @@ xfs_buf_lock( | |||
| 857 | { | 864 | { |
| 858 | trace_xfs_buf_lock(bp, _RET_IP_); | 865 | trace_xfs_buf_lock(bp, _RET_IP_); |
| 859 | 866 | ||
| 867 | if (atomic_read(&bp->b_pin_count) && (bp->b_flags & XBF_STALE)) | ||
| 868 | xfs_log_force(bp->b_mount, 0); | ||
| 860 | if (atomic_read(&bp->b_io_remaining)) | 869 | if (atomic_read(&bp->b_io_remaining)) |
| 861 | blk_run_address_space(bp->b_target->bt_mapping); | 870 | blk_run_address_space(bp->b_target->bt_mapping); |
| 862 | down(&bp->b_sema); | 871 | down(&bp->b_sema); |
