aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2011-05-05 22:54:06 -0400
committerAlex Elder <aelder@sgi.com>2011-05-09 19:35:03 -0400
commit50e86686dfb287d720af8b0f977202d205c04215 (patch)
treeb939f86e61bb3b57a7db685671f97b3ac1c10d80 /fs/xfs
parent9e7004e741de0b2daabbbadafbaf11ff1a94e00c (diff)
xfs: always push the AIL to the target
The recent conversion of the xfsaild functionality to a work queue introduced a hard-to-hit log space grant hang. One of the problems discovered is a target mismatch between the item pushing loop and the target itself. The push trigger checks for the target increasing (i.e. new target > current) while the push loop only pushes items that have a LSN < current. As a result, we can get the situation where the push target is X, the items at the tail of the AIL have LSN X and they don't get pushed. The push work then completes thinking it is done, and cannot be restarted until the push target increases to >= X + 1. If the push target then never increases (because the tail is not moving), then we never run the push work again and we stall. Fix it by making sure log items with a LSN that matches the target exactly are pushed during the loop. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Alex Elder <aelder@sgi.com> (cherry picked from commit cb64026b6e8af50db598ec7c3f59d504259b00bb)
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/xfs_trans_ail.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c
index 226c58bd62e0..9f427c2597bb 100644
--- a/fs/xfs/xfs_trans_ail.c
+++ b/fs/xfs/xfs_trans_ail.c
@@ -387,7 +387,7 @@ xfs_ail_worker(
387 * lots of contention on the AIL lists. 387 * lots of contention on the AIL lists.
388 */ 388 */
389 lsn = lip->li_lsn; 389 lsn = lip->li_lsn;
390 while ((XFS_LSN_CMP(lip->li_lsn, target) < 0)) { 390 while ((XFS_LSN_CMP(lip->li_lsn, target) <= 0)) {
391 int lock_result; 391 int lock_result;
392 /* 392 /*
393 * If we can lock the item without sleeping, unlock the AIL 393 * If we can lock the item without sleeping, unlock the AIL