From f5e596bbef3b0fa583c66c5a83dc9737c0fe2610 Mon Sep 17 00:00:00 2001
From: Christoph Hellwig <hch@sgi.com>
Date: Wed, 11 Jan 2006 20:49:42 +1100
Subject: [PATCH] [XFS] fix writeback control handling  fix a reversed
 condition on where to trylock and deal with block layer congestion properly.
 Patch from David Chinner and Christoph Hellwig.

SGI-PV: 947118
SGI-Modid: xfs-linux-melb:xfs-kern:203830a

Signed-off-by: Christoph Hellwig <hch@sgi.com>
Signed-off-by: Nathan Scott <nathans@sgi.com>
---
 fs/xfs/linux-2.6/xfs_aops.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c
index 9ea33ea6a225..52707b5ddcb8 100644
--- a/fs/xfs/linux-2.6/xfs_aops.c
+++ b/fs/xfs/linux-2.6/xfs_aops.c
@@ -722,8 +722,17 @@ xfs_convert_page(
 		SetPageUptodate(page);
 
 	if (startio) {
-		if (count)
-			wbc->nr_to_write--;
+		if (count) {
+			struct backing_dev_info *bdi;
+
+			bdi = inode->i_mapping->backing_dev_info;
+			if (bdi_write_congested(bdi)) {
+				wbc->encountered_congestion = 1;
+				done = 1;
+			} else if (--wbc->nr_to_write <= 0) {
+				done = 1;
+			}
+		}
 		xfs_start_page_writeback(page, wbc, !page_dirty, count);
 	}
 
@@ -812,7 +821,7 @@ xfs_page_state_convert(
 	int			all_bh = unmapped;
 
 	/* wait for other IO threads? */
-	if (startio && wbc->sync_mode != WB_SYNC_NONE)
+	if (startio && (wbc->sync_mode == WB_SYNC_NONE && wbc->nonblocking))
 		trylock_flag |= BMAPI_TRYLOCK;
 
 	/* Is this page beyond the end of the file? */