From: Dmitry Monakhov <dmonakhov@openvz.org>
To: Jan Kara <jack@suse.cz>
Cc: Camille Moncelier <pix@devlife.org>,
"linux-fsdevel\@vger.kernel.org" <linux-fsdevel@vger.kernel.org>,
ext4 development <linux-ext4@vger.kernel.org>
Subject: Re: [ext3] Changes to block device after an ext3 mount point has been remounted readonly
Date: Wed, 24 Feb 2010 19:01:27 +0300 [thread overview]
Message-ID: <877hq2tyg8.fsf@openvz.org> (raw)
In-Reply-To: <20100223135531.GA7699@atrey.karlin.mff.cuni.cz> (Jan Kara's message of "Tue, 23 Feb 2010 16:55:31 +0300")
[-- Attachment #1: Type: text/plain, Size: 1123 bytes --]
Jan Kara <jack@suse.cz> writes:
>> The fact is that I've been able to reproduce the problem on LVM block
>> devices, and sd* block devices so it's definitely not a loop device
>> specific problem.
>>
>> By the way, I tried several other things other than "echo s
>> >/proc/sysrq_trigger" I tried multiple sync followed with a one minute
>> "sleep",
>>
>> "echo 3 >/proc/sys/vm/drop_caches" seems to lower the chances of "hash
>> changes" but doesn't stops them.
> Strange. When I use sync(1) in your script and use /dev/sda5 instead of a
> /dev/loop0, I cannot reproduce the problem (was running the script for
> something like an hour).
Theoretically some pages may exist after rw=>ro remount
because of generic race between write/sync, And they will be written
in by writepage if page already has buffers. This not happen in ext4
because. Each time it try to perform writepages it try to start_journal
and this result in EROFS.
The race bug will be closed some day but new one may appear again.
Let's be honest and change ext3 writepage like follows:
- check ROFS flag inside write page
- dump writepage's errors.
[-- Attachment #2: 0001-ext3-add-sanity-checks-to-writeback.patch --]
[-- Type: text/plain, Size: 3645 bytes --]
>From a7cadf8017626cd80fcd8ea5a0e4deff4f63e02e Mon Sep 17 00:00:00 2001
From: Dmitry Monakhov <dmonakhov@openvz.org>
Date: Wed, 24 Feb 2010 18:17:58 +0300
Subject: [PATCH] ext3: add sanity checks to writeback
There is theoretical possibility to perform writepage on
RO superblock. Add explicit check for what case.
In fact writepage may fail by a number of reasons.
This is really rare case but sill may result in data loss.
At least we have to dump a error message.
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
---
fs/ext3/inode.c | 40 +++++++++++++++++++++++++++++++++++-----
1 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c
index 455e6e6..cf0e3aa 100644
--- a/fs/ext3/inode.c
+++ b/fs/ext3/inode.c
@@ -1536,6 +1536,11 @@ static int ext3_ordered_writepage(struct page *page,
if (ext3_journal_current_handle())
goto out_fail;
+ if (inode->i_sb->s_flags & MS_RDONLY) {
+ err = -EROFS;
+ goto out_fail;
+ }
+
if (!page_has_buffers(page)) {
create_empty_buffers(page, inode->i_sb->s_blocksize,
(1 << BH_Dirty)|(1 << BH_Uptodate));
@@ -1546,7 +1551,8 @@ static int ext3_ordered_writepage(struct page *page,
NULL, buffer_unmapped)) {
/* Provide NULL get_block() to catch bugs if buffers
* weren't really mapped */
- return block_write_full_page(page, NULL, wbc);
+ ret = block_write_full_page(page, NULL, wbc);
+ goto out;
}
}
handle = ext3_journal_start(inode, ext3_writepage_trans_blocks(inode));
@@ -1584,12 +1590,17 @@ static int ext3_ordered_writepage(struct page *page,
err = ext3_journal_stop(handle);
if (!ret)
ret = err;
+out:
+ if (ret)
+ ext3_msg(inode->i_sb, KERN_CRIT, "%s: failed "
+ "%ld pages, ino %lu; err %d\n", __func__,
+ wbc->nr_to_write, inode->i_ino, ret);
return ret;
out_fail:
redirty_page_for_writepage(wbc, page);
unlock_page(page);
- return ret;
+ goto out;
}
static int ext3_writeback_writepage(struct page *page,
@@ -1603,12 +1614,18 @@ static int ext3_writeback_writepage(struct page *page,
if (ext3_journal_current_handle())
goto out_fail;
+ if (inode->i_sb->s_flags & MS_RDONLY) {
+ err = -EROFS;
+ goto out_fail;
+ }
+
if (page_has_buffers(page)) {
if (!walk_page_buffers(NULL, page_buffers(page), 0,
PAGE_CACHE_SIZE, NULL, buffer_unmapped)) {
/* Provide NULL get_block() to catch bugs if buffers
* weren't really mapped */
- return block_write_full_page(page, NULL, wbc);
+ ret = block_write_full_page(page, NULL, wbc);
+ goto out;
}
}
@@ -1626,12 +1643,17 @@ static int ext3_writeback_writepage(struct page *page,
err = ext3_journal_stop(handle);
if (!ret)
ret = err;
+out:
+ if (ret)
+ ext3_msg(inode->i_sb, KERN_CRIT, "%s: failed "
+ "%ld pages, ino %lu; err %d\n", __func__,
+ wbc->nr_to_write, inode->i_ino, ret);
return ret;
out_fail:
redirty_page_for_writepage(wbc, page);
unlock_page(page);
- return ret;
+ goto out;
}
static int ext3_journalled_writepage(struct page *page,
@@ -1645,6 +1667,11 @@ static int ext3_journalled_writepage(struct page *page,
if (ext3_journal_current_handle())
goto no_write;
+ if (inode->i_sb->s_flags & MS_RDONLY) {
+ err = -EROFS;
+ goto no_write;
+ }
+
handle = ext3_journal_start(inode, ext3_writepage_trans_blocks(inode));
if (IS_ERR(handle)) {
ret = PTR_ERR(handle);
@@ -1684,8 +1711,11 @@ static int ext3_journalled_writepage(struct page *page,
if (!ret)
ret = err;
out:
+ if (ret)
+ ext3_msg(inode->i_sb, KERN_CRIT, "%s: failed "
+ "%ld pages, ino %lu; err %d\n", __func__,
+ wbc->nr_to_write, inode->i_ino, ret);
return ret;
next prev parent reply other threads:[~2010-02-24 16:01 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-18 16:45 [ext3] Changes to block device after an ext3 mount point has been remounted readonly PiX
2010-02-18 16:50 ` Camille Moncelier
2010-02-18 21:41 ` Andreas Dilger
2010-02-19 7:38 ` Camille Moncelier
2010-02-22 22:32 ` Jan Kara
2010-02-22 23:05 ` Jan Kara
2010-02-22 23:09 ` Andreas Dilger
2010-02-23 8:42 ` Camille Moncelier
2010-02-23 13:55 ` Jan Kara
2010-02-24 16:01 ` Dmitry Monakhov [this message]
2010-02-24 16:26 ` Camille Moncelier
2010-02-24 16:59 ` Jan Kara
2010-02-24 16:56 ` Jan Kara
2010-03-02 9:34 ` Christoph Hellwig
2010-03-02 10:01 ` Dmitry Monakhov
2010-03-02 13:26 ` Jan Kara
2010-03-02 23:10 ` Joel Becker
2010-02-24 16:57 ` Eric Sandeen
2010-02-24 17:05 ` Jan Kara
2010-02-24 17:26 ` Dmitry Monakhov
2010-02-24 21:36 ` Jan Kara
2010-03-02 10:29 ` 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=877hq2tyg8.fsf@openvz.org \
--to=dmonakhov@openvz.org \
--cc=jack@suse.cz \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=pix@devlife.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 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.