From: Peter Zijlstra <a.p.zijlstra@chello.nl>
To: Trond Myklebust <trond.myklebust@fys.uio.no>
Cc: Andrew Morton <akpm@osdl.org>,
linux-kernel <linux-kernel@vger.kernel.org>,
Nick Piggin <nickpiggin@yahoo.com.au>
Subject: Re: [PATCH] nfs: fix NR_FILE_DIRTY underflow
Date: Wed, 13 Dec 2006 19:48:34 +0100 [thread overview]
Message-ID: <1166035714.32332.159.camel@twins> (raw)
In-Reply-To: <1166031601.9127.1.camel@lade.trondhjem.org>
On Wed, 2006-12-13 at 12:40 -0500, Trond Myklebust wrote:
> On Wed, 2006-12-13 at 16:01 +0100, Peter Zijlstra wrote:
> > @@ -386,12 +380,13 @@ int invalidate_inode_pages2_range(struct
> > PAGE_CACHE_SIZE, 0);
> > }
> > }
> > - was_dirty = test_clear_page_dirty(page);
> > + was_dirty = PageDirty(page);
> > if (!invalidate_complete_page2(mapping, page)) {
> > if (was_dirty)
> > set_page_dirty(page);
> ^^^^^^^^^^^^^^^^^^^^^
>
> Why would you still need this?
Hmm yeah, that doesn't make sense. What kind of twist did I get my brain
into.
This should do.
Hmm, does this agree with the DIO path? I just noticed
generic_file_direct_IO() also uses invalidate_inode_pages2_range().
I think it does, its looks like all they want is to ensure nothing
remains in the pagecache after a write, which itself ensures nothing is
dirty to begin with.
---
Delay clearing the dirty page state till after we've invalidated the
page in invalidate_complete_page2(). This gives try_to_release_pages() a
chance to flush dirty data.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
---
fs/nfs/file.c | 2 --
mm/truncate.c | 14 ++------------
2 files changed, 2 insertions(+), 14 deletions(-)
Index: linux-2.6-git/fs/nfs/file.c
===================================================================
--- linux-2.6-git.orig/fs/nfs/file.c 2006-12-13 19:41:09.000000000 +0100
+++ linux-2.6-git/fs/nfs/file.c 2006-12-13 19:42:18.000000000 +0100
@@ -320,8 +320,6 @@ static int nfs_release_page(struct page
*/
if (!(gfp & __GFP_FS))
return 0;
- /* Hack... Force nfs_wb_page() to write out the page */
- set_page_dirty(page);
return !nfs_wb_page(page_file_mapping(page)->host, page);
}
Index: linux-2.6-git/mm/truncate.c
===================================================================
--- linux-2.6-git.orig/mm/truncate.c 2006-12-13 19:41:09.000000000 +0100
+++ linux-2.6-git/mm/truncate.c 2006-12-13 19:42:56.000000000 +0100
@@ -306,19 +306,14 @@ invalidate_complete_page2(struct address
if (PagePrivate(page) && !try_to_release_page(page, GFP_KERNEL))
return 0;
+ test_clear_page_dirty(page);
write_lock_irq(&mapping->tree_lock);
- if (PageDirty(page))
- goto failed;
-
BUG_ON(PagePrivate(page));
__remove_from_page_cache(page);
write_unlock_irq(&mapping->tree_lock);
ClearPageUptodate(page);
page_cache_release(page); /* pagecache ref */
return 1;
-failed:
- write_unlock_irq(&mapping->tree_lock);
- return 0;
}
/**
@@ -350,7 +345,6 @@ int invalidate_inode_pages2_range(struct
for (i = 0; !ret && i < pagevec_count(&pvec); i++) {
struct page *page = pvec.pages[i];
pgoff_t page_index;
- int was_dirty;
lock_page(page);
if (page->mapping != mapping) {
@@ -386,12 +380,8 @@ int invalidate_inode_pages2_range(struct
PAGE_CACHE_SIZE, 0);
}
}
- was_dirty = test_clear_page_dirty(page);
- if (!invalidate_complete_page2(mapping, page)) {
- if (was_dirty)
- set_page_dirty(page);
+ if (!invalidate_complete_page2(mapping, page))
ret = -EIO;
- }
unlock_page(page);
}
pagevec_release(&pvec);
next prev parent reply other threads:[~2006-12-13 18:51 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-12-13 12:12 [PATCH] nfs: fix NR_FILE_DIRTY underflow Peter Zijlstra
2006-12-13 12:26 ` Trond Myklebust
2006-12-13 15:01 ` Peter Zijlstra
2006-12-13 17:40 ` Trond Myklebust
2006-12-13 18:48 ` Peter Zijlstra [this message]
2006-12-14 1:29 ` Andrew Morton
2006-12-14 1:41 ` Andrew Morton
2006-12-14 14:52 ` Trond Myklebust
2006-12-13 16:22 ` Peter Zijlstra
2006-12-13 16:22 ` Peter Zijlstra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1166035714.32332.159.camel@twins \
--to=a.p.zijlstra@chello.nl \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nickpiggin@yahoo.com.au \
--cc=trond.myklebust@fys.uio.no \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.