]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
xfs: Use delay write promotion for dquot flushing
authorDave Chinner <david@fromorbit.com>
Tue, 26 Jan 2010 04:13:41 +0000 (15:13 +1100)
committerDave Chinner <david@fromorbit.com>
Tue, 26 Jan 2010 04:13:41 +0000 (15:13 +1100)
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@fromorbit.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/quota/xfs_dquot.c

index f9baeedbfdfe1c17f35ff4ec59def52cc49fd357..1620a56b067efd318babbb8706ba1c59867a6ba5 100644 (file)
@@ -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);
 }