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 f01de3c55c4..649ade8ef59 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -37,6 +37,7 @@  #include "xfs_sb.h"  #include "xfs_inum.h" +#include "xfs_log.h"  #include "xfs_ag.h"  #include "xfs_dmapi.h"  #include "xfs_mount.h" @@ -850,6 +851,12 @@ xfs_buf_lock_value(   *	Note that this in no way locks the underlying pages, so it is only   *	useful for synchronizing concurrent use of buffer objects, not for   *	synchronizing independent access to the underlying pages. + * + *	If we come across a stale, pinned, locked buffer, we know that we + *	are being asked to lock a buffer that has been reallocated. Because + *	it is pinned, we know that the log has not been pushed to disk and + *	hence it will still be locked. Rather than sleeping until someone + *	else pushes the log, push it ourselves before trying to get the lock.   */  void  xfs_buf_lock( @@ -857,6 +864,8 @@ xfs_buf_lock(  {  	trace_xfs_buf_lock(bp, _RET_IP_); +	if (atomic_read(&bp->b_pin_count) && (bp->b_flags & XBF_STALE)) +		xfs_log_force(bp->b_mount, 0);  	if (atomic_read(&bp->b_io_remaining))  		blk_run_address_space(bp->b_target->bt_mapping);  	down(&bp->b_sema);  |