xfs: fix dquot isolation hang
Subsystems (3)
PATCH 1/1 xfs: fix dquot isolation hang
From: Dave Chinner <[email protected]>
The new LRU list isolation code in xfs_qm_dquot_isolate() isn't completely up to date. Firstly, it needs conversion to return enum lru_status values, not raw numbers. Secondly - most importantly - it fails to unlock the dquot and relock the LRU in the LRU_RETRY path. This leads to deadlocks in xfstests generic/232. Fix them.
--- fs/xfs/xfs_qm.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
fs/xfs/xfs_qm.c +6 -4
@@ -659,7 +659,7 @@ xfs_qm_dquot_isolate(trace_xfs_dqreclaim_want (dqp);list_del_init (&dqp->q_lru);XFS_STATS_DEC (xs_qm_dquot_unused); -return 0 ; +return LRU_REMOVED ; }/*
@@ -705,17 +705,19 @@ xfs_qm_dquot_isolate(XFS_STATS_DEC (xs_qm_dquot_unused);trace_xfs_dqreclaim_done (dqp);XFS_STATS_INC (xs_qm_dqreclaims); -return 0 ; +return LRU_REMOVED ; out_miss_busy:trace_xfs_dqreclaim_busy (dqp);XFS_STATS_INC (xs_qm_dqreclaim_misses); -return 2 ; +return LRU_SKIP ; out_unlock_dirty:trace_xfs_dqreclaim_busy (dqp);XFS_STATS_INC (xs_qm_dqreclaim_misses); -return 3 ; +xfs_dqunlock (dqp); +spin_lock (lru_lock); +return LRU_RETRY ; } static unsigned long
Signature · 7 lines
1.8.3.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Michal and Andrew, here is the patch
Quoted 52 lines · Dave Chinner
From: Dave Chinner <[email protected]>
The new LRU list isolation code in
xfs_qm_dquot_isolate()isn't completely up to date. Firstly, it needs conversion to return enumlru_statusvalues, not raw numbers. Secondly - most importantly - it fails to unlock the dquot and relock the LRU in theLRU_RETRYpath. This leads to deadlocks in xfstests generic/232. Fix them.Signed-off-by Dave Chinner <[email protected]>--- fs/xfs/xfs_qm.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)fs/xfs/xfs_qm.c +6
-4@@ -659,7 +659,7 @@ xfs_qm_dquot_isolate(trace_xfs_dqreclaim_want (dqp);list_del_init (&dqp->q_lru);XFS_STATS_DEC (xs_qm_dquot_unused); -return 0 ; +return LRU_REMOVED ; }/* @@ -705,17 +705,19 @@ xfs_qm_dquot_isolate(XFS_STATS_DEC (xs_qm_dquot_unused);trace_xfs_dqreclaim_done (dqp);XFS_STATS_INC (xs_qm_dqreclaims); -return 0 ; +return LRU_REMOVED ; out_miss_busy:trace_xfs_dqreclaim_busy (dqp);XFS_STATS_INC (xs_qm_dqreclaim_misses); -return 2 ; +return LRU_SKIP ; out_unlock_dirty:trace_xfs_dqreclaim_busy (dqp);XFS_STATS_INC (xs_qm_dqreclaim_misses); -return 3 ; +xfs_dqunlock (dqp); +spin_lock (lru_lock); +return LRU_RETRY ; } static unsigned longSignature · 1 line
1.8.3.2
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>