Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965450AbbLOWG3 (ORCPT ); Tue, 15 Dec 2015 17:06:29 -0500 Received: from mail.kernel.org ([198.145.29.136]:37813 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932800AbbLOWG1 (ORCPT ); Tue, 15 Dec 2015 17:06:27 -0500 Date: Tue, 15 Dec 2015 14:06:25 -0800 From: Jaegeuk Kim To: Chao Yu Cc: Yunlei He , linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/3] f2fs: backup raw_super in sbi Message-ID: <20151215220625.GD66113@jaegeuk.local> References: <010d01d1371c$c9954530$5cbfcf90$@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <010d01d1371c$c9954530$5cbfcf90$@samsung.com> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3931 Lines: 124 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.yu@samsung.com] > > Sent: Tuesday, December 15, 2015 5:17 PM > > To: Jaegeuk Kim (jaegeuk@kernel.org); Yunlei He (heyunlei@huawei.com) > > Cc: linux-f2fs-devel@lists.sourceforge.net; linux-kernel@vger.kernel.org > > Subject: [PATCH 1/3] f2fs: backup raw_super in sbi > > > > From: Yunlei He > > > > 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 > > Signed-off-by: Jaegeuk Kim > > Signed-off-by: Chao Yu > > --- > > 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 > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/