aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Piggin <npiggin@suse.de>2009-01-06 14:39:09 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2009-01-24 16:36:26 -0800
commitcb0083692dfdd1a33b538b093f5e35b3802b41ef (patch)
treedbfa72c11286667e2db3d33cb736dd62818ff14a
parent006333c0e94602d992c087a4a93ce6e53f1af0e9 (diff)
downloadlinux-linaro-stable-cb0083692dfdd1a33b538b093f5e35b3802b41ef.tar.gz
mm: write_cache_pages cleanups
commit 5a3d5c9813db56a75934eb1015367fda23a8b0b4 upstream. Get rid of some complex expressions from flow control statements, add a comment, remove some duplicate code. Signed-off-by: Nick Piggin <npiggin@suse.de> Cc: Chris Mason <chris.mason@oracle.com> Cc: Dave Chinner <david@fromorbit.com> 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>
-rw-r--r--mm/page-writeback.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 362640c3228c..5b3f4c9cffe3 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -902,11 +902,14 @@ int write_cache_pages(struct address_space *mapping,
}
retry:
done_index = index;
- while (!done && (index <= end) &&
- (nr_pages = pagevec_lookup_tag(&pvec, mapping, &index,
- PAGECACHE_TAG_DIRTY,
- min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1))) {
- unsigned i;
+ while (!done && (index <= end)) {
+ int i;
+
+ nr_pages = pagevec_lookup_tag(&pvec, mapping, &index,
+ PAGECACHE_TAG_DIRTY,
+ min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1);
+ if (nr_pages == 0)
+ break;
for (i = 0; i < nr_pages; i++) {
struct page *page = pvec.pages[i];
@@ -922,7 +925,16 @@ retry:
*/
lock_page(page);
+ /*
+ * Page truncated or invalidated. We can freely skip it
+ * then, even for data integrity operations: the page
+ * has disappeared concurrently, so there could be no
+ * real expectation of this data interity operation
+ * even if there is now a new, dirty page at the same
+ * pagecache address.
+ */
if (unlikely(page->mapping != mapping)) {
+continue_unlock:
unlock_page(page);
continue;
}
@@ -933,18 +945,15 @@ retry:
* end == -1 in that case.
*/
done = 1;
- unlock_page(page);
- continue;
+ goto continue_unlock;
}
if (wbc->sync_mode != WB_SYNC_NONE)
wait_on_page_writeback(page);
if (PageWriteback(page) ||
- !clear_page_dirty_for_io(page)) {
- unlock_page(page);
- continue;
- }
+ !clear_page_dirty_for_io(page))
+ goto continue_unlock;
ret = (*writepage)(page, wbc, data);
@@ -968,7 +977,8 @@ retry:
}
if (wbc->sync_mode == WB_SYNC_NONE) {
- if (--wbc->nr_to_write <= 0)
+ wbc->nr_to_write--;
+ if (wbc->nr_to_write <= 0)
done = 1;
}
if (wbc->nonblocking && bdi_write_congested(bdi)) {