From d9ee2c2472440f2ca1e6ef55147903a6387637f2 Mon Sep 17 00:00:00 2001 From: Dave Chinner Date: Wed, 9 Jun 2010 10:37:20 +1000 Subject: [PATCH] --- yaml --- r: 200216 b: refs/heads/master c: d87815cb2090e07b0b0b2d73dc9740706e92c80c h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/mm/page-writeback.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index beef80db42c0..60feca120fe5 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 254c8c2dbf0e06a560a5814eb90cb628adb2de66 +refs/heads/master: d87815cb2090e07b0b0b2d73dc9740706e92c80c diff --git a/trunk/mm/page-writeback.c b/trunk/mm/page-writeback.c index b3dbb8040ed5..bbd396ac9546 100644 --- a/trunk/mm/page-writeback.c +++ b/trunk/mm/page-writeback.c @@ -851,7 +851,22 @@ int write_cache_pages(struct address_space *mapping, if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) range_whole = 1; cycled = 1; /* ignore range_cyclic tests */ + + /* + * If this is a data integrity sync, cap the writeback to the + * current end of file. Any extension to the file that occurs + * after this is a new write and we don't need to write those + * pages out to fulfil our data integrity requirements. If we + * try to write them out, we can get stuck in this scan until + * the concurrent writer stops adding dirty pages and extending + * EOF. + */ + if (wbc->sync_mode == WB_SYNC_ALL && + wbc->range_end == LLONG_MAX) { + end = i_size_read(mapping->host) >> PAGE_CACHE_SHIFT; + } } + retry: done_index = index; while (!done && (index <= end)) {