On Tue, Dec 15, 2015 at 05:40:51PM +0800, Chao Yu wrote: > Hi Jaegeuk, Yunlei, > > I help do some edits and send it out as my patch's base. :) > > But if you want to send patch by yourself, please ignore this patch.
No problem to merge this patch. Thanks Chao. > > Thanks, > > > -----Original Message----- > > From: Chao Yu [mailto:chao2...@samsung.com] > > Sent: Tuesday, December 15, 2015 5:17 PM > > To: Jaegeuk Kim (jaeg...@kernel.org); Yunlei He (heyun...@huawei.com) > > Cc: linux-f2fs-devel@lists.sourceforge.net; linux-ker...@vger.kernel.org > > Subject: [PATCH 1/3] f2fs: backup raw_super in sbi > > > > From: Yunlei He <heyun...@huawei.com> > > > > f2fs use fields of f2fs_super_block struct directly in a grabbed buffer. > > > > Once the buffer happen to be destroyed (e.g. through dd), it may bring > > in unpredictable effect on f2fs. > > > > This patch fixes to allocate additional buffer to store datas of super > > block rather than using grabbed block buffer directly. > > > > Signed-off-by: Yunlei He <heyun...@huawei.com> > > Signed-off-by: Jaegeuk Kim <jaeg...@kernel.org> > > Signed-off-by: Chao Yu <chao2...@samsung.com> > > --- > > fs/f2fs/super.c | 19 +++++++++++++++---- > > 1 file changed, 15 insertions(+), 4 deletions(-) > > > > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c > > index 694e092..a6eb79a 100644 > > --- a/fs/f2fs/super.c > > +++ b/fs/f2fs/super.c > > @@ -578,6 +578,7 @@ static void f2fs_put_super(struct super_block *sb) > > > > sb->s_fs_info = NULL; > > brelse(sbi->raw_super_buf); > > + kfree(sbi->raw_super); > > kfree(sbi); > > } > > > > @@ -1153,6 +1154,9 @@ static int read_raw_super_block(struct super_block > > *sb, > > struct f2fs_super_block *super; > > int err = 0; > > > > + super = kzalloc(sizeof(struct f2fs_super_block), GFP_KERNEL); > > + if (!super) > > + return -ENOMEM; > > retry: > > buffer = sb_bread(sb, block); > > if (!buffer) { > > @@ -1168,8 +1172,7 @@ retry: > > } > > } > > > > - super = (struct f2fs_super_block *) > > - ((char *)(buffer)->b_data + F2FS_SUPER_OFFSET); > > + memcpy(super, buffer->b_data + F2FS_SUPER_OFFSET, sizeof(*super)); > > > > /* sanity checking of raw super */ > > if (sanity_check_raw_super(sb, super)) { > > @@ -1203,14 +1206,17 @@ retry: > > > > out: > > /* No valid superblock */ > > - if (!*raw_super) > > + if (!*raw_super) { > > + kfree(super); > > return err; > > + } > > > > return 0; > > } > > > > int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover) > > { > > + struct f2fs_super_block *super = F2FS_RAW_SUPER(sbi); > > struct buffer_head *sbh = sbi->raw_super_buf; > > struct buffer_head *bh; > > int err; > > @@ -1221,7 +1227,7 @@ int f2fs_commit_super(struct f2fs_sb_info *sbi, bool > > recover) > > return -EIO; > > > > lock_buffer(bh); > > - memcpy(bh->b_data, sbh->b_data, sbh->b_size); > > + memcpy(bh->b_data + F2FS_SUPER_OFFSET, super, sizeof(*super)); > > WARN_ON(sbh->b_size != F2FS_BLKSIZE); > > set_buffer_uptodate(bh); > > set_buffer_dirty(bh); > > @@ -1237,6 +1243,10 @@ int f2fs_commit_super(struct f2fs_sb_info *sbi, bool > > recover) > > > > /* write current valid superblock */ > > lock_buffer(sbh); > > + if (memcmp(sbh->b_data + F2FS_SUPER_OFFSET, super, sizeof(*super))) { > > + f2fs_msg(sbi->sb, KERN_INFO, "Write modified valid superblock"); > > + memcpy(sbh->b_data + F2FS_SUPER_OFFSET, super, sizeof(*super)); > > + } > > set_buffer_dirty(sbh); > > unlock_buffer(sbh); > > > > @@ -1513,6 +1523,7 @@ free_options: > > kfree(options); > > free_sb_buf: > > brelse(raw_super_buf); > > + kfree(raw_super); > > free_sbi: > > kfree(sbi); > > > > -- > > 2.6.3 > ------------------------------------------------------------------------------ _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel