Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2410505imu; Thu, 24 Jan 2019 12:16:43 -0800 (PST) X-Google-Smtp-Source: ALg8bN6OlKZ7PJob1Kk2s4jooMniyE1wgw6bpWM6m7BsjAxRRwp0nt/gdzEHlHiEY99RvgU1eNPf X-Received: by 2002:a63:fd53:: with SMTP id m19mr7352247pgj.340.1548361003766; Thu, 24 Jan 2019 12:16:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548361003; cv=none; d=google.com; s=arc-20160816; b=eI8SfBNexJVdYDBuPL+wcUyQlLpUCd87hFnJaqPph2nJ06tLT8x19bHqbU9ONq5u5I 8x5Mn75G07smCDURLd3fe7jVw8tYLtUqqJa2FJSAmUztwdwoYw+D9LMf6bsWRinsxeFW 08rmoe0fJ53ErasZKoWxMO3LJXLxuRVvKzsgup7hUWOgFHD/HX7ky2qVMBH/L4CfhfkS H3rKEvbLLJnLxDUGnl6qY3IsnuKYawQ0Uk1PjH5MlV8JJmE6LcUNk/+MpK+EejQ6dhDH UIr1e5lxJJG3UpkZ0OCr7fqMi9TePyUXeqnXuPZGMqIdxIUtkLYSwdxelGLfruPa7OCe WIHg== 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=iF3Dl0c7Ei9ibKxcTQRTaMyZ+MEYiaT+PF2MOclew38=; b=znpACu0tJ/A1cRImqoPLMjbK7CNuSbO5U0AzqKszuRfMcCjWPQ3Jos/swopNqHR60V dEWJS+RbPUmPokP3uUu7w3TgTqt7Qi+hryR7gZE5D5vb2noa3x/6mH7cYfl+4ElfD2sM jGohPJvidw2cjK5lz3oe93rydwMX9u+A2MSf295sB2H42W2rifAWH4iORZvzyJaxqyDX /yNvCsm9PKuJqXvxd9LUJ4RZQVlmySXupYZd377b0mYMu6b8eHKP7VgYFN9KcyTCckvo 9EsswWYszmGnS5B11zNMlol4kk9cm3enz1xqNKDKhYTWICuAG7+WSEJ0MMgtpd0F98VP N5Ow== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Fyg5WWZ9; 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 33si21610246plt.228.2019.01.24.12.16.28; Thu, 24 Jan 2019 12:16:43 -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=Fyg5WWZ9; 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 S1730201AbfAXTYp (ORCPT + 99 others); Thu, 24 Jan 2019 14:24:45 -0500 Received: from mail.kernel.org ([198.145.29.99]:50028 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730193AbfAXTYm (ORCPT ); Thu, 24 Jan 2019 14:24:42 -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 2D25021906; Thu, 24 Jan 2019 19:24:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548357881; bh=deZgXEi7k3te50k0GkTI3cMUCasYyyFeJ2zj+3IaBLo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Fyg5WWZ9MQSKzN3jHcBoPU5uu9YaXtzDR6tLhpYFNFiwoecKNZELGywLDyyyTzrhh JT14xbewlPJIUuFOg6p47zaJ4lDukQT6YemJecCKn95gwKg3rziWR8n62dzqj467QX 57ivFO+gwHoZJFYQlN56Qirstv7hnRZJrgBaaEM0= 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.4 021/104] f2fs: return error during fill_super Date: Thu, 24 Jan 2019 20:19:10 +0100 Message-Id: <20190124190157.377827515@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190124190154.968308875@linuxfoundation.org> References: <20190124190154.968308875@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.4-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.4: 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 @@ -2101,7 +2101,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); @@ -2110,6 +2110,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); + int err = 0; do { readed = ra_meta_pages(sbi, start_blk, nrpages, META_SIT, true); @@ -2128,7 +2129,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 */ @@ -2154,7 +2157,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); memcpy(se->discard_map, se->cur_valid_map, SIT_VBLOCK_MAP_SIZE); @@ -2165,6 +2170,7 @@ static void build_sit_entries(struct f2f se->valid_blocks - old_valid_blocks; } mutex_unlock(&curseg->curseg_mutex); + return err; } static void init_free_segmap(struct f2fs_sb_info *sbi) @@ -2326,7 +2332,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 @@ -585,7 +585,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 @@ -607,11 +607,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,