From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S936464AbdAHFC0 (ORCPT ); Sun, 8 Jan 2017 00:02:26 -0500 Received: from mail.kernel.org ([198.145.29.136]:38170 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934460AbdAHFCN (ORCPT ); Sun, 8 Jan 2017 00:02:13 -0500 Date: Sat, 7 Jan 2017 21:02:08 -0800 From: Jaegeuk Kim To: Chao Yu Cc: Chao Yu , linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net Subject: Re: [f2fs-dev] [PATCH 3/5] f2fs: check in-memory block bitmap Message-ID: <20170108050208.GA16864@jaegeuk.local> References: <83098918-d882-8743-51bc-1e96038d6ad2@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <83098918-d882-8743-51bc-1e96038d6ad2@huawei.com> User-Agent: Mutt/1.7.0 (2016-08-17) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Chao, On 01/07, Chao Yu wrote: > This patch adds a mirror for valid block bitmap, and use it to detect > in-memory bitmap corruption which may be caused by bit-transition of > cache or memory overflow. > > Signed-off-by: Chao Yu > --- > fs/f2fs/segment.c | 30 ++++++++++++++++++++++++++++-- > fs/f2fs/segment.h | 6 ++++++ > 2 files changed, 34 insertions(+), 2 deletions(-) > > diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c > index fa8c0ae87d47..ec21ee1c61cd 100644 > --- a/fs/f2fs/segment.c > +++ b/fs/f2fs/segment.c > @@ -1026,14 +1026,32 @@ static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del) > > /* Update valid block bitmap */ > if (del > 0) { > - if (f2fs_test_and_set_bit(offset, se->cur_valid_map)) > + if (f2fs_test_and_set_bit(offset, se->cur_valid_map)) { > +#ifdef CONFIG_F2FS_CHECK_FS > + if (f2fs_test_and_set_bit(offset, > + se->cur_valid_map_mir)) > + f2fs_bug_on(sbi, 1); > + else > + WARN_ON(1); > +#else > f2fs_bug_on(sbi, 1); > +#endif > + } > if (f2fs_discard_en(sbi) && > !f2fs_test_and_set_bit(offset, se->discard_map)) > sbi->discard_blks--; > } else { > - if (!f2fs_test_and_clear_bit(offset, se->cur_valid_map)) > + if (!f2fs_test_and_clear_bit(offset, se->cur_valid_map)) { > +#ifdef CONFIG_F2FS_CHECK_FS > + if (!f2fs_test_and_clear_bit(offset, > + se->cur_valid_map_mir)) > + f2fs_bug_on(sbi, 1); > + else > + WARN_ON(1); > +#else > f2fs_bug_on(sbi, 1); > +#endif > + } > if (f2fs_discard_en(sbi) && > f2fs_test_and_clear_bit(offset, se->discard_map)) > sbi->discard_blks++; > @@ -2357,6 +2375,13 @@ static int build_sit_info(struct f2fs_sb_info *sbi) > !sit_i->sentries[start].ckpt_valid_map) > return -ENOMEM; > > +#ifdef CONFIG_F2FS_CHECK_FS > + sit_i->sentries[start].cur_valid_map_mir > + = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); > + if (!sit_i->sentries[start].cur_valid_map_mir) > + return -ENOMEM; > +#endif > + > if (f2fs_discard_en(sbi)) { > sit_i->sentries[start].discard_map > = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); > @@ -2786,6 +2811,7 @@ static void destroy_sit_info(struct f2fs_sb_info *sbi) > if (sit_i->sentries) { > for (start = 0; start < MAIN_SEGS(sbi); start++) { > kfree(sit_i->sentries[start].cur_valid_map); I added: #ifdef CONFIG_F2FS_CHECK_FS > + kfree(sit_i->sentries[start].cur_valid_map_mir); #endif Thanks,