Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp10789189imu; Thu, 6 Dec 2018 06:51:42 -0800 (PST) X-Google-Smtp-Source: AFSGD/Vm4+QqA2mYBKJO6SwoRZRRmiDG96es3jR0/XBAEuRJA2Nj3kPmgpzRyVbKqJlxhwJhAxiB X-Received: by 2002:a63:9712:: with SMTP id n18mr24060384pge.295.1544107902276; Thu, 06 Dec 2018 06:51:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544107902; cv=none; d=google.com; s=arc-20160816; b=kMM3zer6kCL1SHNrM5xByDvHVr+1E1osZnWbB7D8Z1CWOnc5ppugVZ3Nv2ZHjKZQgl Az5QAGLlLJoZ52IjGWOzl/ZufouiUBinYe95BldTyVzNapCVBNz5v11cYsDnQ3nc+7G4 8o76CETUnkQWsxKQ1sOM4J3TvBq1ZbwQiO0QL2r4Mt8UqChaMcZXW3GVPHBxShbgXZ1B 1C5+xX/U6ihDoN+Nj+yp3sdrmIxwQ5sGq9FKeKNen8IzEFDRwnJFDahsRyv7k8QToMK7 i3ujw6CW8YHuUqc9J1IIcMvRXB9l55GDyV8tATvQrUgELDbQ+5WL+6s7zFY5HcylccL8 LUKQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=1VDwXt3glbk5MmcZjquhUUbkYK9Es5ugJtkeRR8UPgQ=; b=flTz04MLdDZ1JZN+OGjsw0F9dQlLMo4w9SvAnojE0LbEPrWpQ59BRV7LvwxwqoAmoT lfo1pPnir1CB2ZDf70kX50JkKqAb0UVFcaSLr2ZmtE9wfcwzc7xdChObZuhn6ywiXD7j LiX2gv60UZu7vYfeEiYQR0Lbb/NSvcu+3VR9pVViAI74DXhGFXPLY1qco2eyUyp3FK4l 1leRSOTL8DUbkjZLnxV5OWYaC2oKvORCQ3uTxVT0V3Lkq68VuR4bv+fdQ09IEsFYUFlh XgmILntFXwQcztysWI6//frsS1CPJdzof4hASbkuw9QIwn0jrtZiIFtuYhxanDJrSNaj IB5g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=NT3w1WAJ; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u1si398625plr.96.2018.12.06.06.51.26; Thu, 06 Dec 2018 06:51:42 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=NT3w1WAJ; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730377AbeLFOuU (ORCPT + 99 others); Thu, 6 Dec 2018 09:50:20 -0500 Received: from mail.kernel.org ([198.145.29.99]:52494 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731408AbeLFOr2 (ORCPT ); Thu, 6 Dec 2018 09:47:28 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id A35722082B; Thu, 6 Dec 2018 14:47:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1544107647; bh=6PK/xrCNPwPoqh9EIF5yrbVeT5lNIC1f4xJfZgqsEmU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NT3w1WAJs4VhPCtSjXO3TwXvrG2iDvWe01T8UkUi78ycBda3VKhUFQdHFGu4i6SdL IJW9dnA8V6q5Mo5Zpwx/FHmT4SitmXpCn7dprw/MR/JDW4vpCb63dLdAP0UCgSYI0K hEKbwkBPfq/ZBm24DPowfi0OBxGRtxFM9NdY4QVY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Chao Yu , Jaegeuk Kim , Sudip Mukherjee , Ben Hutchings Subject: [PATCH 4.9 086/101] f2fs: return error during fill_super Date: Thu, 6 Dec 2018 15:39:25 +0100 Message-Id: <20181206143017.666919759@linuxfoundation.org> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20181206143011.174892052@linuxfoundation.org> References: <20181206143011.174892052@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.9-stable review patch. If anyone has any objections, please let me know. ------------------ From: Jaegeuk Kim commit c39a1b348c4fe172729eff77c533dabc3c7cdaa7 upstream. Let's avoid BUG_ON during fill_super, when on-disk was totall corrupted. Reviewed-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Sudip Mukherjee Signed-off-by: Greg Kroah-Hartman [bwh: Backported to 4.9: adjust context] Signed-off-by: Ben Hutchings Signed-off-by: Greg Kroah-Hartman --- fs/f2fs/segment.c | 16 ++++++++++++---- fs/f2fs/segment.h | 22 ++++++++++++++++++---- 2 files changed, 30 insertions(+), 8 deletions(-) --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -2322,7 +2322,7 @@ static int build_curseg(struct f2fs_sb_i return restore_curseg_summaries(sbi); } -static void build_sit_entries(struct f2fs_sb_info *sbi) +static int build_sit_entries(struct f2fs_sb_info *sbi) { struct sit_info *sit_i = SIT_I(sbi); struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA); @@ -2333,6 +2333,7 @@ static void build_sit_entries(struct f2f unsigned int i, start, end; unsigned int readed, start_blk = 0; int nrpages = MAX_BIO_BLOCKS(sbi) * 8; + int err = 0; do { readed = ra_meta_pages(sbi, start_blk, nrpages, META_SIT, true); @@ -2350,7 +2351,9 @@ static void build_sit_entries(struct f2f sit = sit_blk->entries[SIT_ENTRY_OFFSET(sit_i, start)]; f2fs_put_page(page, 1); - check_block_count(sbi, start, &sit); + err = check_block_count(sbi, start, &sit); + if (err) + return err; seg_info_from_raw_sit(se, &sit); /* build discard map only one time */ @@ -2378,7 +2381,9 @@ static void build_sit_entries(struct f2f old_valid_blocks = se->valid_blocks; - check_block_count(sbi, start, &sit); + err = check_block_count(sbi, start, &sit); + if (err) + break; seg_info_from_raw_sit(se, &sit); if (f2fs_discard_en(sbi)) { @@ -2393,6 +2398,7 @@ static void build_sit_entries(struct f2f se->valid_blocks - old_valid_blocks; } up_read(&curseg->journal_rwsem); + return err; } static void init_free_segmap(struct f2fs_sb_info *sbi) @@ -2559,7 +2565,9 @@ int build_segment_manager(struct f2fs_sb return err; /* reinit free segmap based on SIT */ - build_sit_entries(sbi); + err = build_sit_entries(sbi); + if (err) + return err; init_free_segmap(sbi); err = build_dirty_segmap(sbi); --- a/fs/f2fs/segment.h +++ b/fs/f2fs/segment.h @@ -600,7 +600,7 @@ static inline void verify_block_addr(str /* * Summary block is always treated as an invalid block */ -static inline void check_block_count(struct f2fs_sb_info *sbi, +static inline int check_block_count(struct f2fs_sb_info *sbi, int segno, struct f2fs_sit_entry *raw_sit) { #ifdef CONFIG_F2FS_CHECK_FS @@ -622,11 +622,25 @@ static inline void check_block_count(str cur_pos = next_pos; is_valid = !is_valid; } while (cur_pos < sbi->blocks_per_seg); - BUG_ON(GET_SIT_VBLOCKS(raw_sit) != valid_blocks); + + if (unlikely(GET_SIT_VBLOCKS(raw_sit) != valid_blocks)) { + f2fs_msg(sbi->sb, KERN_ERR, + "Mismatch valid blocks %d vs. %d", + GET_SIT_VBLOCKS(raw_sit), valid_blocks); + set_sbi_flag(sbi, SBI_NEED_FSCK); + return -EINVAL; + } #endif /* check segment usage, and check boundary of a given segment number */ - f2fs_bug_on(sbi, GET_SIT_VBLOCKS(raw_sit) > sbi->blocks_per_seg - || segno > TOTAL_SEGS(sbi) - 1); + if (unlikely(GET_SIT_VBLOCKS(raw_sit) > sbi->blocks_per_seg + || segno > TOTAL_SEGS(sbi) - 1)) { + f2fs_msg(sbi->sb, KERN_ERR, + "Wrong valid blocks %d or segno %u", + GET_SIT_VBLOCKS(raw_sit), segno); + set_sbi_flag(sbi, SBI_NEED_FSCK); + return -EINVAL; + } + return 0; } static inline pgoff_t current_sit_addr(struct f2fs_sb_info *sbi,