提交 cb64026b 编写于 作者: D Dave Chinner 提交者: Alex Elder

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: NDave Chinner <dchinner@redhat.com>
Reviewed-by: NChristoph Hellwig <hch@lst.de>
Reviewed-by: NAlex Elder <aelder@sgi.com>
上级 ea35a200
...@@ -387,7 +387,7 @@ xfs_ail_worker( ...@@ -387,7 +387,7 @@ xfs_ail_worker(
* lots of contention on the AIL lists. * lots of contention on the AIL lists.
*/ */
lsn = lip->li_lsn; lsn = lip->li_lsn;
while ((XFS_LSN_CMP(lip->li_lsn, target) < 0)) { while ((XFS_LSN_CMP(lip->li_lsn, target) <= 0)) {
int lock_result; int lock_result;
/* /*
* If we can lock the item without sleeping, unlock the AIL * If we can lock the item without sleeping, unlock the AIL
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册