| From 89e1219004b3657cc014521663eeef0744f1c99d Mon Sep 17 00:00:00 2001 |
| From: Federico Cuello <fedux@lugmen.org.ar> |
| Date: Wed, 11 Feb 2009 13:04:39 -0800 |
| Subject: writeback: fix break condition |
| |
| From: Federico Cuello <fedux@lugmen.org.ar> |
| |
| commit 89e1219004b3657cc014521663eeef0744f1c99d upstream. |
| |
| Commit dcf6a79dda5cc2a2bec183e50d829030c0972aaa ("write-back: fix |
| nr_to_write counter") fixed nr_to_write counter, but didn't set the break |
| condition properly. |
| |
| If nr_to_write == 0 after being decremented it will loop one more time |
| before setting done = 1 and breaking the loop. |
| |
| [akpm@linux-foundation.org: coding-style fixes] |
| Cc: Artem Bityutskiy <Artem.Bityutskiy@nokia.com> |
| Acked-by: Nick Piggin <npiggin@suse.de> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| mm/page-writeback.c | 29 ++++++++++++++++------------- |
| 1 file changed, 16 insertions(+), 13 deletions(-) |
| |
| --- a/mm/page-writeback.c |
| +++ b/mm/page-writeback.c |
| @@ -985,20 +985,23 @@ continue_unlock: |
| } |
| } |
| |
| - if (wbc->nr_to_write > 0) |
| + if (wbc->nr_to_write > 0) { |
| wbc->nr_to_write--; |
| - else if (wbc->sync_mode == WB_SYNC_NONE) { |
| - /* |
| - * We stop writing back only if we are not |
| - * doing integrity sync. In case of integrity |
| - * sync we have to keep going because someone |
| - * may be concurrently dirtying pages, and we |
| - * might have synced a lot of newly appeared |
| - * dirty pages, but have not synced all of the |
| - * old dirty pages. |
| - */ |
| - done = 1; |
| - break; |
| + if (wbc->nr_to_write == 0 && |
| + wbc->sync_mode == WB_SYNC_NONE) { |
| + /* |
| + * We stop writing back only if we are |
| + * not doing integrity sync. In case of |
| + * integrity sync we have to keep going |
| + * because someone may be concurrently |
| + * dirtying pages, and we might have |
| + * synced a lot of newly appeared dirty |
| + * pages, but have not synced all of the |
| + * old dirty pages. |
| + */ |
| + done = 1; |
| + break; |
| + } |
| } |
| |
| if (wbc->nonblocking && bdi_write_congested(bdi)) { |