diff options
Diffstat (limited to 'mm/page-writeback.c')
-rw-r--r-- | mm/page-writeback.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index b493db7841dc..6106a5c7ed44 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c | |||
@@ -209,7 +209,7 @@ int dirty_bytes_handler(struct ctl_table *table, int write, | |||
209 | struct file *filp, void __user *buffer, size_t *lenp, | 209 | struct file *filp, void __user *buffer, size_t *lenp, |
210 | loff_t *ppos) | 210 | loff_t *ppos) |
211 | { | 211 | { |
212 | int old_bytes = vm_dirty_bytes; | 212 | unsigned long old_bytes = vm_dirty_bytes; |
213 | int ret; | 213 | int ret; |
214 | 214 | ||
215 | ret = proc_doulongvec_minmax(table, write, filp, buffer, lenp, ppos); | 215 | ret = proc_doulongvec_minmax(table, write, filp, buffer, lenp, ppos); |
@@ -1051,13 +1051,25 @@ continue_unlock: | |||
1051 | } | 1051 | } |
1052 | } | 1052 | } |
1053 | 1053 | ||
1054 | if (wbc->sync_mode == WB_SYNC_NONE) { | 1054 | if (nr_to_write > 0) { |
1055 | wbc->nr_to_write--; | 1055 | nr_to_write--; |
1056 | if (wbc->nr_to_write <= 0) { | 1056 | if (nr_to_write == 0 && |
1057 | wbc->sync_mode == WB_SYNC_NONE) { | ||
1058 | /* | ||
1059 | * We stop writing back only if we are | ||
1060 | * not doing integrity sync. In case of | ||
1061 | * integrity sync we have to keep going | ||
1062 | * because someone may be concurrently | ||
1063 | * dirtying pages, and we might have | ||
1064 | * synced a lot of newly appeared dirty | ||
1065 | * pages, but have not synced all of the | ||
1066 | * old dirty pages. | ||
1067 | */ | ||
1057 | done = 1; | 1068 | done = 1; |
1058 | break; | 1069 | break; |
1059 | } | 1070 | } |
1060 | } | 1071 | } |
1072 | |||
1061 | if (wbc->nonblocking && bdi_write_congested(bdi)) { | 1073 | if (wbc->nonblocking && bdi_write_congested(bdi)) { |
1062 | wbc->encountered_congestion = 1; | 1074 | wbc->encountered_congestion = 1; |
1063 | done = 1; | 1075 | done = 1; |