mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: ebiederm@xmission.com (Eric W. Biederman)
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
	<linux-kernel@vger.kernel.org>,
	Nick Piggin <nickpiggin@yahoo.com.au>
Subject: [PATCH 2/3] rd: Mark ramdisk buffer heads dirty in ramdisk_set_page_dirty
Date: Mon, 21 May 2007 20:36:51 -0600	[thread overview]
Message-ID: <m1zm3xh9do.fsf@ebiederm.dsl.xmission.com> (raw)
In-Reply-To: <m14pm5io6h.fsf@ebiederm.dsl.xmission.com> (Eric W. Biederman's message of "Mon, 21 May 2007 20:31:50 -0600")


The problem:  When we are trying to free buffers try_to_free_buffers
will look at ramdisk pages with clean buffer heads and remove the
dirty bit from the page.  Resulting in ramdisk pages with data that
get removed from the page cache.  Ouch!

When we mark a ramdisk page dirty we call set_page_dirty which then
calls ramdisk_set_page_dirty.  Currently we don't mark the buffer
heads dirty leaving us susceptible to the problem above.

So to fix the mismatch between buffer head state and page state this patch
modifies ramdisk_set_page_dirty to set the dirty bit on all of the buffers
a page may posses.

I set the uptodate bit on the buffer head so that later we can use
simple_commit_write, and because it is trivially safe.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
---
 drivers/block/rd.c |   15 +++++++++++++++
 1 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/drivers/block/rd.c b/drivers/block/rd.c
index a1512da..41de0f4 100644
--- a/drivers/block/rd.c
+++ b/drivers/block/rd.c
@@ -184,6 +184,21 @@ static int ramdisk_writepages(struct address_space *mapping,
  */
 static int ramdisk_set_page_dirty(struct page *page)
 {
+	struct address_space * const mapping = page_mapping(page);
+
+	spin_lock(&mapping->private_lock);
+	if (page_has_buffers(page)) {
+		struct buffer_head *head = page_buffers(page);
+		struct buffer_head *bh = head;
+
+		do {
+			set_buffer_uptodate(bh);
+			set_buffer_dirty(bh);
+			bh = bh->b_this_page;
+		} while (bh != head);
+	}
+	spin_unlock(&mapping->private_lock);
+
 	if (!TestSetPageDirty(page))
 		return 1;
 	return 0;
-- 
1.5.1.1.181.g2de0


  reply	other threads:[~2007-05-22  2:38 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-05-22  2:31 [PATCH 1/3] Preserve the dirty bit in init_page_buffers Eric W. Biederman
2007-05-22  2:36 ` Eric W. Biederman [this message]
2007-05-22  2:40   ` [PATCH 3/3] rd: Simplify by using the same helper functions in libfs Eric W. Biederman
2007-05-28  4:09 ` [PATCH 1/3] Preserve the dirty bit in init_page_buffers Nick Piggin
2007-05-28  4:30   ` Eric W. Biederman
2007-05-28  4:54     ` Nick Piggin
2007-05-28  4:59       ` Nick Piggin
2007-05-28 14:05         ` Eric W. Biederman
2007-05-29  5:14           ` Nick Piggin
2007-05-29  5:28             ` Eric W. Biederman
2007-05-31 11:56             ` Eric W. Biederman
2007-05-31 15:55               ` Andrew Morton
2007-05-31 16:40                 ` [PATCH] rd: Remove ramdisk_set_page_dirty Eric W. Biederman
2007-05-31 16:43                 ` [PATCH] buffer: Kill old incorrect? comment Eric W. Biederman
2007-05-28 13:52       ` [PATCH 1/3] Preserve the dirty bit in init_page_buffers Eric W. Biederman
2007-05-28  6:37     ` Nick Piggin
2007-05-28 13:58       ` Eric W. Biederman

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=m1zm3xh9do.fsf@ebiederm.dsl.xmission.com \
    --to=ebiederm@xmission.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nickpiggin@yahoo.com.au \
    --cc=torvalds@linux-foundation.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®