diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index f7212c1..3e179f2 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -89,10 +89,15 @@ static void xfs_buf_lru_add( struct xfs_buf *bp) { - if (list_lru_add(&bp->b_target->bt_lru, &bp->b_lru)) { + struct list_lru_node *nlru; + nlru = list_lru_to_node(&bp->b_target->bt_lru, &bp->b_lru); + + spin_lock(&nlru->lock); + if (list_lru_add_node(&bp->b_target->bt_lru, nlru, &bp->b_lru)) { bp->b_lru_flags &= ~_XBF_LRU_DISPOSE; atomic_inc(&bp->b_hold); } + spin_unlock(&nlru->lock); } /* @@ -122,6 +127,9 @@ void xfs_buf_stale( struct xfs_buf *bp) { + struct list_lru_node *nlru; + nlru = list_lru_to_node(&bp->b_target->bt_lru, &bp->b_lru); + ASSERT(xfs_buf_islocked(bp)); bp->b_flags |= XBF_STALE; @@ -133,10 +141,12 @@ xfs_buf_stale( */ bp->b_flags &= ~_XBF_DELWRI_Q; + spin_lock(&nlru->lock); atomic_set(&(bp)->b_lru_ref, 0); if (!(bp->b_lru_flags & _XBF_LRU_DISPOSE) && - (list_lru_del(&bp->b_target->bt_lru, &bp->b_lru))) + (list_lru_del_node(&bp->b_target->bt_lru, nlru, &bp->b_lru))) atomic_dec(&bp->b_hold); + spin_unlock(&nlru->lock); ASSERT(atomic_read(&bp->b_hold) >= 1); }