mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Andrea Arcangeli <andrea@suse.de>
To: Andrew Morton <akpm@osdl.org>
Cc: linux-kernel@vger.kernel.org
Subject: writepages drops bh on not uptodate page
Date: Wed, 28 Jul 2004 06:51:56 +0200	[thread overview]
Message-ID: <20040728045156.GH15895@dualathlon.random> (raw)

Hi Andrew,

I think I understood why some ext2 fs corruption still happens even
after the last i_size fix.

what happened I believe is that the writepages layer got a not a fully
uptodate page (in turn with bh mapped on top of it), and then right
before unlocking the page and entering the writeback mode, it freed all
the bh. Without bh a not uptodate page will trigger a full readpage from
disk, that overwrites the pagecache before the multi-bio gets submitted,
generating fs corruption.

I believe the below patch should fix it (untested) against kernel CVS.

The testcases developed by Kurt showed the pagecache being overwritten
with on-disk data at block offsets, and Chris as well was wondering
about races between wait_on_page_writeback and readpage. the below fix
just explains everything we've seen since not-fully-uptodate pages must
have always bh on them and the below patch enforces just that invariant,
and it should fix our pagecache-overwritten-by-disk-data problem.

Signed-off-by: Andrea Arcangeli <andrea@suse.de>

Index: writepages-bh-race/fs/mpage.c
===================================================================
RCS file: /home/andrea/crypto/cvs/linux-2.5/fs/mpage.c,v
retrieving revision 1.55
diff -u -p -r1.55 mpage.c
--- writepages-bh-race/fs/mpage.c	11 Jul 2004 16:38:19 -0000	1.55
+++ writepages-bh-race/fs/mpage.c	28 Jul 2004 04:39:13 -0000
@@ -553,7 +553,12 @@ alloc_new:
 			bh = bh->b_this_page;
 		} while (bh != head);
 
-		if (buffer_heads_over_limit)
+		/*
+		 * we cannot drop the bh if the page is not uptodate
+		 * or a concurrent readpage would fail to serialize with the bh
+		 * and it would read from disk before we reach the platter.
+		 */
+		if (buffer_heads_over_limit && PageUptodate(page))
 			try_to_free_buffers(page);
 	}
 

             reply	other threads:[~2004-07-28  4:52 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-07-28  4:51 Andrea Arcangeli [this message]
2004-07-28  5:08 ` Andrew Morton
2004-07-28 13:03 ` Chris Mason
2004-07-28 13:46   ` Andrea Arcangeli

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=20040728045156.GH15895@dualathlon.random \
    --to=andrea@suse.de \
    --cc=akpm@osdl.org \
    --cc=linux-kernel@vger.kernel.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®