提交 14d7e9de 编写于 作者: M majianpeng 提交者: Jaegeuk Kim

f2fs: when check superblock failed, try to check another superblock

In f2fs, there are two superblocks. So when the first superblock was
invalidate, it should try to check another.

By Jaegeuk Kim:
 o Remove a white space for coding style
 o Clean up for code readability
 o Fix a typo
Signed-off-by: NJianpeng Ma <majianpeng@gmail.com>
Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
上级 5c9b4692
...@@ -387,7 +387,7 @@ static int sanity_check_raw_super(struct super_block *sb, ...@@ -387,7 +387,7 @@ static int sanity_check_raw_super(struct super_block *sb,
/* Currently, support only 4KB page cache size */ /* Currently, support only 4KB page cache size */
if (F2FS_BLKSIZE != PAGE_CACHE_SIZE) { if (F2FS_BLKSIZE != PAGE_CACHE_SIZE) {
f2fs_msg(sb, KERN_INFO, f2fs_msg(sb, KERN_INFO,
"Invalid page_cache_size (%u), supports only 4KB\n", "Invalid page_cache_size (%lu), supports only 4KB\n",
PAGE_CACHE_SIZE); PAGE_CACHE_SIZE);
return 1; return 1;
} }
...@@ -462,6 +462,32 @@ static void init_sb_info(struct f2fs_sb_info *sbi) ...@@ -462,6 +462,32 @@ static void init_sb_info(struct f2fs_sb_info *sbi)
atomic_set(&sbi->nr_pages[i], 0); atomic_set(&sbi->nr_pages[i], 0);
} }
static int validate_superblock(struct super_block *sb,
struct f2fs_super_block **raw_super,
struct buffer_head **raw_super_buf, sector_t block)
{
const char *super = (block == 0 ? "first" : "second");
/* read f2fs raw super block */
*raw_super_buf = sb_bread(sb, block);
if (!*raw_super_buf) {
f2fs_msg(sb, KERN_ERR, "unable to read %s superblock",
super);
return 1;
}
*raw_super = (struct f2fs_super_block *)
((char *)(*raw_super_buf)->b_data + F2FS_SUPER_OFFSET);
/* sanity checking of raw super */
if (!sanity_check_raw_super(sb, *raw_super))
return 0;
f2fs_msg(sb, KERN_ERR, "Can't find a valid F2FS filesystem "
"in %s superblock", super);
return 1;
}
static int f2fs_fill_super(struct super_block *sb, void *data, int silent) static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
{ {
struct f2fs_sb_info *sbi; struct f2fs_sb_info *sbi;
...@@ -482,16 +508,11 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -482,16 +508,11 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
goto free_sbi; goto free_sbi;
} }
/* read f2fs raw super block */ if (validate_superblock(sb, &raw_super, &raw_super_buf, 0)) {
raw_super_buf = sb_bread(sb, 0); brelse(raw_super_buf);
if (!raw_super_buf) { if (validate_superblock(sb, &raw_super, &raw_super_buf, 1))
err = -EIO; goto free_sb_buf;
f2fs_msg(sb, KERN_ERR, "unable to read superblock");
goto free_sbi;
} }
raw_super = (struct f2fs_super_block *)
((char *)raw_super_buf->b_data + F2FS_SUPER_OFFSET);
/* init some FS parameters */ /* init some FS parameters */
sbi->active_logs = NR_CURSEG_TYPE; sbi->active_logs = NR_CURSEG_TYPE;
...@@ -507,12 +528,6 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -507,12 +528,6 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
if (parse_options(sb, sbi, (char *)data)) if (parse_options(sb, sbi, (char *)data))
goto free_sb_buf; goto free_sb_buf;
/* sanity checking of raw super */
if (sanity_check_raw_super(sb, raw_super)) {
f2fs_msg(sb, KERN_ERR, "Can't find a valid F2FS filesystem");
goto free_sb_buf;
}
sb->s_maxbytes = max_file_size(le32_to_cpu(raw_super->log_blocksize)); sb->s_maxbytes = max_file_size(le32_to_cpu(raw_super->log_blocksize));
sb->s_max_links = F2FS_LINK_MAX; sb->s_max_links = F2FS_LINK_MAX;
get_random_bytes(&sbi->s_next_generation, sizeof(u32)); get_random_bytes(&sbi->s_next_generation, sizeof(u32));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册