From: hujianyang <hujianyang@huawei.com>
To: Jaegeuk Kim <jaegeuk@kernel.org>
Cc: linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [PATCH RFC] f2fs: recovering broken superblock during mount
Date: Thu, 21 May 2015 14:42:53 +0800 [thread overview]
Message-ID: <555D7E6D.2050103@huawei.com> (raw)
In-Reply-To: <20150521010635.GA63442@jaegeuk-mac02.mot.com>
On 2015/5/21 9:07, Jaegeuk Kim wrote:
> Hi Hu,
>
> On Wed, May 20, 2015 at 03:01:04PM +0800, hujianyang wrote:
>> Hi Jaegeuk,
>>
>> There are two superblocks in f2fs. I wrapped one of them by 'dd' in
>> a reliability test. After this, the polluted f2fs partition can be
>> mounted with an error message:
>>
>> F2FS-fs (sdd3): Magic Mismatch, valid(0xf2f52010) - read(0x0)
>> F2FS-fs (sdd3): Can't find valid F2FS filesystem in 1th superblock
>>
>> Seems the broken superblock can't be recovered by f2fs driver or
>> fsck.f2fs. Tell me how to recover if I was wrong.:)
>>
>> So I'd like to provide a patch to recover broken f2fs superblock
>> during mount. But I'm not pleased with my patch. I wish you and
>> others could give me some suggestions.
>>
>> Do you think it's necessary to recover the superblock? and can
>> we change 'f2fs_commit_super' a little to reuse this function
>> during superblock recovery?
>
> What is the real problem in the original code?
> It's the message problem, isn't it?
> Even though the first superblock is missing with that message, mount must be
> done with the second superblock, right?
>
> If so, it would be good to use f2fs_commit_super to recover that and leave some
> messages.
>
> Thanks,
>
Hi Jaegeuk,
Thanks for your suggestions. I've reworked the patch, how do you feel
about the following one?
Current f2fs doesn't check the 2th superblock if the first one is
valid, my patch changes to check both of superblocks during mount
because I think either of them may corrupted and we should detect the
corruption at once, then recover it.
Thanks,
Hu
Signed-off-by: hujianyang <hujianyang@huawei.com>
---
fs/f2fs/super.c | 56 ++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 45 insertions(+), 11 deletions(-)
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index ae14fc4..8e5cd83 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -972,29 +972,36 @@ static void init_sb_info(struct f2fs_sb_info *sbi)
*/
static int read_raw_super_block(struct super_block *sb,
struct f2fs_super_block **raw_super,
- struct buffer_head **raw_super_buf)
+ struct buffer_head **raw_super_buf,
+ int *recovery)
{
int block = 0;
+ struct buffer_head *buffer;
+ struct f2fs_super_block *super;
+ int err = 0;
retry:
- *raw_super_buf = sb_bread(sb, block);
- if (!*raw_super_buf) {
+ buffer = sb_bread(sb, block);
+ if (!buffer) {
+ *recovery = 1;
f2fs_msg(sb, KERN_ERR, "Unable to read %dth superblock",
block + 1);
if (block == 0) {
block++;
goto retry;
} else {
- return -EIO;
+ err = -EIO;
+ goto out;
}
}
- *raw_super = (struct f2fs_super_block *)
- ((char *)(*raw_super_buf)->b_data + F2FS_SUPER_OFFSET);
+ super = (struct f2fs_super_block *)
+ ((char *)(buffer)->b_data + F2FS_SUPER_OFFSET);
/* sanity checking of raw super */
- if (sanity_check_raw_super(sb, *raw_super)) {
- brelse(*raw_super_buf);
+ if (sanity_check_raw_super(sb, super)) {
+ brelse(buffer);
+ *recovery = 1;
f2fs_msg(sb, KERN_ERR,
"Can't find valid F2FS filesystem in %dth superblock",
block + 1);
@@ -1002,10 +1009,30 @@ retry:
block++;
goto retry;
} else {
- return -EINVAL;
+ err = -EINVAL;
+ goto out;
}
}
+ if (!*raw_super) {
+ *raw_super_buf = buffer;
+ *raw_super = super;
+ } else {
+ /* already have a valid superblock */
+ brelse(buffer);
+ }
+
+ /* check the validity of the second superblock */
+ if (block == 0) {
+ block++;
+ goto retry;
+ }
+
+out:
+ /* No valid superblock */
+ if (!*raw_super)
+ return err;
+
return 0;
}
@@ -1042,7 +1069,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
long err = -EINVAL;
bool retry = true, need_fsck = false;
char *options = NULL;
- int i;
+ int recovery = 0, i;
try_onemore:
/* allocate memory for f2fs-specific super block info */
@@ -1056,7 +1083,7 @@ try_onemore:
goto free_sbi;
}
- err = read_raw_super_block(sb, &raw_super, &raw_super_buf);
+ err = read_raw_super_block(sb, &raw_super, &raw_super_buf, &recovery);
if (err)
goto free_sbi;
@@ -1255,6 +1282,13 @@ try_onemore:
goto free_kobj;
}
kfree(options);
+
+ /* recover broken superblock */
+ if (recovery && !f2fs_readonly(sb) && !bdev_read_only(sb->s_bdev)) {
+ f2fs_msg(sb, KERN_INFO, "Superblock recovery");
+ f2fs_commit_super(sbi);
+ }
+
return 0;
free_kobj:
--
1.6.0.2
------------------------------------------------------------------------------
One dashboard for servers and applications across Physical-Virtual-Cloud
Widest out-of-the-box monitoring support with 50+ applications
Performance metrics, stats and reports that give you Actionable Insights
Deep dive visibility with transaction tracing using APM Insight.
http://ad.doubleclick.net/ddm/clk/290420510;117567292;y
next prev parent reply other threads:[~2015-05-21 6:43 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-20 7:01 [PATCH RFC] f2fs: recovering broken superblock during mount hujianyang
2015-05-21 1:07 ` Jaegeuk Kim
2015-05-21 6:42 ` hujianyang [this message]
2015-05-21 22:44 ` Jaegeuk Kim
2015-05-22 0:19 ` hujianyang
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=555D7E6D.2050103@huawei.com \
--to=hujianyang@huawei.com \
--cc=jaegeuk@kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
/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.