|
@@ -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;
|
|
|
+ ASSERT(spin_is_locked(&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
|