From: Nick Piggin <npiggin@suse.de>
To: "Jorge Boncompte [DTI2]" <jorge@dti2.net>
Cc: ext-adrian.hunter@nokia.com, LKML <linux-kernel@vger.kernel.org>
Subject: Re: Error testing ext3 on brd ramdisk
Date: Thu, 5 Mar 2009 11:45:23 +0100 [thread overview]
Message-ID: <20090305104523.GC17815@wotan.suse.de> (raw)
In-Reply-To: <49AF9932.2040301@dti2.net>
On Thu, Mar 05, 2009 at 10:19:46AM +0100, Jorge Boncompte [DTI2] wrote:
> -----------
> umount /etc (/etc is what is mounted from /dev/ram0)
> dd if=/dev/zero of=/dev/ram0 bs=1k count=1000
> mount /dev/ram0 /etc -t minix -o rw
> -----------
> ...succeds and mounts a corrupted filesystem with the old content. Doing
> the same with the all ramdisk driver fails on mount with "no filesystem
> found".
>
> If I do...
> -----------
> umount /etc (/etc is what is mounted from /dev/ram0)
> echo 3 > /proc/sys/vm/drop_caches
> dd if=/dev/zero of=/dev/ram0 bs=1k count=1000
> mount /dev/ram0 /etc -t minix -o rw
> ----------
> ... then the mount fails with no filesystem found as it should.
I can't reproduce this. Is the filesystem definitely being
unmounted and nothing else is holding the bdev inode open?
I can only imagine something like this happening if the fs
is still mounted, in which case it will write back some
superblock over the zeroed bdev, possibly allowing it to mount
again, or if the zeroed writes somehow get lost, which would
seem like a problem with the buffer cache.
Actually, the 2nd scenario is more likely, because you wouldn't
see it with the old rd driver because it never allows the buffer
cache to be freed.
Are you getting any errors in your dmesg or anything like that?
What happens when you run the following patch? Can you run the
test case then when you reproduce the problem, see if anything is
in dmesg?
Thanks,
Nick
---
fs/block_dev.c | 3 +++
fs/buffer.c | 4 +++-
mm/filemap.c | 29 ++++++++++++-----------------
3 files changed, 18 insertions(+), 18 deletions(-)
Index: linux-2.6/mm/filemap.c
===================================================================
--- linux-2.6.orig/mm/filemap.c
+++ linux-2.6/mm/filemap.c
@@ -394,18 +394,14 @@ int filemap_write_and_wait(struct addres
int err = 0;
if (mapping->nrpages) {
+ int err2;
+
err = filemap_fdatawrite(mapping);
- /*
- * Even if the above returned error, the pages may be
- * written partially (e.g. -ENOSPC), so we wait for it.
- * But the -EIO is special case, it may indicate the worst
- * thing (e.g. bug) happened, so we avoid waiting for it.
- */
- if (err != -EIO) {
- int err2 = filemap_fdatawait(mapping);
- if (!err)
- err = err2;
- }
+ WARN_ON(err);
+ err2 = filemap_fdatawait(mapping);
+ WARN_ON(err2);
+ if (!err)
+ err = err2;
}
return err;
}
@@ -428,16 +424,15 @@ int filemap_write_and_wait_range(struct
int err = 0;
if (mapping->nrpages) {
+ int err2;
+
err = __filemap_fdatawrite_range(mapping, lstart, lend,
WB_SYNC_ALL);
- /* See comment of filemap_write_and_wait() */
- if (err != -EIO) {
- int err2 = wait_on_page_writeback_range(mapping,
+ err2 = wait_on_page_writeback_range(mapping,
lstart >> PAGE_CACHE_SHIFT,
lend >> PAGE_CACHE_SHIFT);
- if (!err)
- err = err2;
- }
+ if (!err)
+ err = err2;
}
return err;
}
Index: linux-2.6/fs/block_dev.c
===================================================================
--- linux-2.6.orig/fs/block_dev.c
+++ linux-2.6/fs/block_dev.c
@@ -66,6 +66,7 @@ static void kill_bdev(struct block_devic
return;
invalidate_bh_lrus();
truncate_inode_pages(bdev->bd_inode->i_mapping, 0);
+ printk("truncated bdev\n");
}
int set_blocksize(struct block_device *bdev, int size)
@@ -80,6 +81,7 @@ int set_blocksize(struct block_device *b
/* Don't change the size if it is same as current */
if (bdev->bd_block_size != size) {
+ printk("killing bdev\n");
sync_blockdev(bdev);
bdev->bd_block_size = size;
bdev->bd_inode->i_blkbits = blksize_bits(size);
@@ -1177,6 +1179,7 @@ static int __blkdev_put(struct block_dev
bdev->bd_part_count--;
if (!--bdev->bd_openers) {
+ printk("killing bdev\n");
sync_blockdev(bdev);
kill_bdev(bdev);
}
Index: linux-2.6/fs/buffer.c
===================================================================
--- linux-2.6.orig/fs/buffer.c
+++ linux-2.6/fs/buffer.c
@@ -173,8 +173,10 @@ int sync_blockdev(struct block_device *b
{
int ret = 0;
- if (bdev)
+ if (bdev) {
+ printk("syncing bdev\n");
ret = filemap_write_and_wait(bdev->bd_inode->i_mapping);
+ }
return ret;
}
EXPORT_SYMBOL(sync_blockdev);
next prev parent reply other threads:[~2009-03-05 10:45 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-11-14 13:25 Adrian Hunter
2009-02-27 18:08 ` Jorge Boncompte [DTI2]
2009-02-28 5:58 ` Nick Piggin
2009-03-02 17:42 ` Jorge Boncompte [DTI2]
2009-03-05 6:55 ` Nick Piggin
2009-03-05 9:19 ` Jorge Boncompte [DTI2]
2009-03-05 9:46 ` Nick Piggin
2009-03-05 10:56 ` Jorge Boncompte [DTI2]
2009-03-05 12:12 ` Jorge Boncompte [DTI2]
2009-03-10 16:12 ` Nick Piggin
2009-03-10 16:30 ` Nick Piggin
2009-03-10 16:49 ` Jorge Boncompte [DTI2]
2009-03-11 2:19 ` Nick Piggin
2009-03-13 17:06 ` Jorge Boncompte [DTI2]
2009-03-17 9:40 ` Denis Karpov
2009-03-18 12:11 ` Nick Piggin
2009-03-18 13:42 ` Jan Kara
2009-03-20 12:24 ` Denis Karpov
2009-03-20 12:49 ` Denis Karpov
2009-03-20 13:35 ` Denis Karpov
2009-03-05 10:45 ` Nick Piggin [this message]
2009-03-05 11:54 ` Jorge Boncompte [DTI2]
2009-03-06 7:47 ` Adrian Hunter
2009-03-10 11:03 ` Nick Piggin
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=20090305104523.GC17815@wotan.suse.de \
--to=npiggin@suse.de \
--cc=ext-adrian.hunter@nokia.com \
--cc=jorge@dti2.net \
--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
Powered by JetHome