xfs
[Top] [All Lists]

[PATCH 5/9] xfs: Use delay write promotion for dquot flushing

To: xfs@xxxxxxxxxxx
Subject: [PATCH 5/9] xfs: Use delay write promotion for dquot flushing
From: Dave Chinner <david@xxxxxxxxxxxxx>
Date: Tue, 9 Feb 2010 14:56:38 +1100
In-reply-to: <1265687802-23043-1-git-send-email-david@xxxxxxxxxxxxx>
References: <1265687802-23043-1-git-send-email-david@xxxxxxxxxxxxx>
xfs_qm_dqflock_pushbuf_wait() does a very similar trick to item
pushing used to do to flush out delayed write dquot buffers. Change
it to use the new promotion method rather than an async flush.

Also, xfs_qm_dqflock_pushbuf_wait() can return without the flush lock
held, yet the callers make the assumption that after this call the
flush lock is held. Always return with the flush lock held.

Signed-off-by: Dave Chinner <david@xxxxxxxxxxxxx>
Reviewed-by: Christoph Hellwig <hch@xxxxxx>
---
 fs/xfs/quota/xfs_dquot.c |   25 ++++++++++---------------
 1 files changed, 10 insertions(+), 15 deletions(-)

diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c
index f9baeed..1620a56 100644
--- a/fs/xfs/quota/xfs_dquot.c
+++ b/fs/xfs/quota/xfs_dquot.c
@@ -1528,21 +1528,16 @@ xfs_qm_dqflock_pushbuf_wait(
         */
        bp = xfs_incore(dqp->q_mount->m_ddev_targp, dqp->q_blkno,
                    XFS_QI_DQCHUNKLEN(dqp->q_mount), XBF_TRYLOCK);
-       if (bp != NULL) {
-               if (XFS_BUF_ISDELAYWRITE(bp)) {
-                       int     error;
-
-                       if (XFS_BUF_ISPINNED(bp))
-                               xfs_log_force(dqp->q_mount, 0);
-                       error = xfs_bawrite(dqp->q_mount, bp);
-                       if (error)
-                               xfs_fs_cmn_err(CE_WARN, dqp->q_mount,
-                                       "xfs_qm_dqflock_pushbuf_wait: "
-                                       "pushbuf error %d on dqp %p, bp %p",
-                                       error, dqp, bp);
-               } else {
-                       xfs_buf_relse(bp);
-               }
+       if (!bp)
+               goto out_lock;
+
+       if (XFS_BUF_ISDELAYWRITE(bp)) {
+               if (XFS_BUF_ISPINNED(bp))
+                       xfs_log_force(dqp->q_mount, 0);
+               xfs_buf_delwri_promote(bp);
+               wake_up_process(bp->b_target->bt_task);
        }
+       xfs_buf_relse(bp);
+out_lock:
        xfs_dqflock(dqp);
 }
-- 
1.6.5

<Prev in Thread] Current Thread [Next in Thread>