Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752256AbeADG1k (ORCPT + 1 other); Thu, 4 Jan 2018 01:27:40 -0500 Received: from szxga04-in.huawei.com ([45.249.212.190]:3679 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752109AbeADG1j (ORCPT ); Thu, 4 Jan 2018 01:27:39 -0500 From: Yunlong Song To: , , , , CC: , , , , , , Subject: [PATCH v3] f2fs: check segment type in __f2fs_replace_block Date: Thu, 4 Jan 2018 14:24:36 +0800 Message-ID: <1515047076-27582-1-git-send-email-yunlong.song@huawei.com> X-Mailer: git-send-email 1.8.5.2 In-Reply-To: <1514619768-134531-1-git-send-email-yunlong.song@huawei.com> References: <1514619768-134531-1-git-send-email-yunlong.song@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.193.250] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: In some case, the node blocks has wrong blkaddr whose segment type is NODE, e.g., recover inode has missing xattr flag and the blkaddr is in the xattr range. Since fsck.f2fs does not check the recovery nodes, this will cause __f2fs_replace_block change the curseg of node and do the update_sit_entry(sbi, new_blkaddr, 1) with no next_blkoff refresh, as a result, when recovery process write checkpoint and sync nodes, the next_blkoff of curseg is used in the segment bit map, then it will cause f2fs_bug_on. So let's check segment type in __f2fs_replace_block. Signed-off-by: Yunlong Song --- fs/f2fs/segment.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 890d483..6c6d2dd 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -2719,6 +2719,8 @@ void __f2fs_replace_block(struct f2fs_sb_info *sbi, struct f2fs_summary *sum, se = get_seg_entry(sbi, segno); type = se->type; + f2fs_bug_on(sbi, se->valid_blocks && !IS_DATASEG(type)); + down_write(&SM_I(sbi)->curseg_lock); if (!recover_curseg) { -- 1.8.5.2