diff options
Diffstat (limited to 'fs/xfs/xfs_buf.c')
| -rw-r--r-- | fs/xfs/xfs_buf.c | 38 | 
1 files changed, 26 insertions, 12 deletions
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 62fa39276a24..16d6a578fc16 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -97,12 +97,16 @@ static inline void  xfs_buf_ioacct_inc(  	struct xfs_buf	*bp)  { -	if (bp->b_flags & (XBF_NO_IOACCT|_XBF_IN_FLIGHT)) +	if (bp->b_flags & XBF_NO_IOACCT)  		return;  	ASSERT(bp->b_flags & XBF_ASYNC); -	bp->b_flags |= _XBF_IN_FLIGHT; -	percpu_counter_inc(&bp->b_target->bt_io_count); +	spin_lock(&bp->b_lock); +	if (!(bp->b_state & XFS_BSTATE_IN_FLIGHT)) { +		bp->b_state |= XFS_BSTATE_IN_FLIGHT; +		percpu_counter_inc(&bp->b_target->bt_io_count); +	} +	spin_unlock(&bp->b_lock);  }  /* @@ -110,14 +114,24 @@ xfs_buf_ioacct_inc(   * freed and unaccount from the buftarg.   */  static inline void -xfs_buf_ioacct_dec( +__xfs_buf_ioacct_dec(  	struct xfs_buf	*bp)  { -	if (!(bp->b_flags & _XBF_IN_FLIGHT)) -		return; +	lockdep_assert_held(&bp->b_lock); -	bp->b_flags &= ~_XBF_IN_FLIGHT; -	percpu_counter_dec(&bp->b_target->bt_io_count); +	if (bp->b_state & XFS_BSTATE_IN_FLIGHT) { +		bp->b_state &= ~XFS_BSTATE_IN_FLIGHT; +		percpu_counter_dec(&bp->b_target->bt_io_count); +	} +} + +static inline void +xfs_buf_ioacct_dec( +	struct xfs_buf	*bp) +{ +	spin_lock(&bp->b_lock); +	__xfs_buf_ioacct_dec(bp); +	spin_unlock(&bp->b_lock);  }  /* @@ -149,9 +163,9 @@ xfs_buf_stale(  	 * unaccounted (released to LRU) before that occurs. Drop in-flight  	 * status now to preserve accounting consistency.  	 */ -	xfs_buf_ioacct_dec(bp); -  	spin_lock(&bp->b_lock); +	__xfs_buf_ioacct_dec(bp); +  	atomic_set(&bp->b_lru_ref, 0);  	if (!(bp->b_state & XFS_BSTATE_DISPOSE) &&  	    (list_lru_del(&bp->b_target->bt_lru, &bp->b_lru))) @@ -979,12 +993,12 @@ xfs_buf_rele(  		 * ensures the decrement occurs only once per-buf.  		 */  		if ((atomic_read(&bp->b_hold) == 1) && !list_empty(&bp->b_lru)) -			xfs_buf_ioacct_dec(bp); +			__xfs_buf_ioacct_dec(bp);  		goto out_unlock;  	}  	/* the last reference has been dropped ... */ -	xfs_buf_ioacct_dec(bp); +	__xfs_buf_ioacct_dec(bp);  	if (!(bp->b_flags & XBF_STALE) && atomic_read(&bp->b_lru_ref)) {  		/*  		 * If the buffer is added to the LRU take a new reference to the  |