Received: by 2002:a5d:9c59:0:0:0:0:0 with SMTP id 25csp2179146iof; Tue, 7 Jun 2022 22:20:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzSfN7S8ifFrFB9n9cFs55aL1Q3T3CVprOZwAufCwfPobrZVc/nHRbObdpa+tgGgmChACta X-Received: by 2002:a17:90a:df14:b0:1e3:33ba:a94 with SMTP id gp20-20020a17090adf1400b001e333ba0a94mr35526282pjb.83.1654665635288; Tue, 07 Jun 2022 22:20:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1654665635; cv=none; d=google.com; s=arc-20160816; b=lsDIkB5c3NTUH8UnNWZnXRAWJCt488fnB2i8FQo6INW8wv1QvIUIiX8nU8IAILiXl0 iR+ce41SgW6nepTvoK0u3zjn2jHGoqAQaS4e01LwIpoOQ3QK9IYPWbX6xYlCXTnwcnla 0XYNmxa3djW42k6FbySgmEx8pG/J6bPfbB7aFXZ5kYBxpThUXPKH8UtauVDTWpom0uBK sDd/GtgwnI+C2Sb70o7NrQ13q4BCnRAAKlrGmdyEy2FRD7dRCNylu+GJc2DkuLqd7s0h fUu3xkk40pUEmksk1grXhFUWtzzrLzz+kjKi6HNkPyOa+GxSKhHT7aHtI4vjmzqKuFN7 c4Hg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=rHudMnkoqyi9bhERhYF/M0zz70FNuzlt2v+0ZIZPLNw=; b=oEYZofR4onYxlUig+IJlRSHfuSkhvh0iUqgeZXi9fs4AWeOvDD8H+Ifksk1bPF5lAA TPYSrz+3WkvF8DQcXInOX6Cn4H77iMTHoaF2TyAA5Fn45y2c/NVkyTUe7yl/k7wZH0tF c5e2Mle/yvHyhcg1HNyH9jMiD5+i5ZOg1iQTcSbKC3tUaXBBuzaxH9yhH2Ddq6u0AI4m ofZKErg1ew7Wn8aacvKgs1v2B0cd2L3mPagL99R1pzFJMIOsHSFSeCk9293JLws1HL3h 9Bfir9WaYOPJt1f4wmR8wueYGVlHIw2WY+Reb7+F4MQEBYN0xOS1PJgzvgojQbo2QMxO Mc7Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=oni0mrGm; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id d68-20020a636847000000b003fdb97d8757si11472090pgc.378.2022.06.07.22.20.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Jun 2022 22:20:35 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=oni0mrGm; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 6CF22485A88; Tue, 7 Jun 2022 21:56:54 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1380502AbiFGVfY (ORCPT + 99 others); Tue, 7 Jun 2022 17:35:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57204 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1376987AbiFGUlJ (ORCPT ); Tue, 7 Jun 2022 16:41:09 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C87DA1EEBB8; Tue, 7 Jun 2022 11:38:34 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id D036DB8237B; Tue, 7 Jun 2022 18:38:09 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 472F1C385A5; Tue, 7 Jun 2022 18:38:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1654627088; bh=2dVJx2msMCcVDlp01KKOdADVjXk0t+vIttGoDGeDQMY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oni0mrGmEyQ8cLhQN9pwmgQ2SAdc1kk95jcQP9KAUXmW12rK0FnOkSRlCk9hS5fYS JMhdt90pcNto3m7RqZxrBFJSj6TrOQlwIwOpH8/nqWxY8I+uWGvnpwcJtLVgqEOC9c d/9rBRuNLfXQQV/H21yhg1KufUDl98tvXeczaqwM= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ming Yan , Chao Yu , Jaegeuk Kim Subject: [PATCH 5.17 614/772] f2fs: fix to do sanity check on total_data_blocks Date: Tue, 7 Jun 2022 19:03:26 +0200 Message-Id: <20220607165007.031240311@linuxfoundation.org> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220607164948.980838585@linuxfoundation.org> References: <20220607164948.980838585@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-3.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Chao Yu commit 6b8beca0edd32075a769bfe4178ca00c0dcd22a9 upstream. As Yanming reported in bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=215916 The kernel message is shown below: kernel BUG at fs/f2fs/segment.c:2560! Call Trace: allocate_segment_by_default+0x228/0x440 f2fs_allocate_data_block+0x13d1/0x31f0 do_write_page+0x18d/0x710 f2fs_outplace_write_data+0x151/0x250 f2fs_do_write_data_page+0xef9/0x1980 move_data_page+0x6af/0xbc0 do_garbage_collect+0x312f/0x46f0 f2fs_gc+0x6b0/0x3bc0 f2fs_balance_fs+0x921/0x2260 f2fs_write_single_data_page+0x16be/0x2370 f2fs_write_cache_pages+0x428/0xd00 f2fs_write_data_pages+0x96e/0xd50 do_writepages+0x168/0x550 __writeback_single_inode+0x9f/0x870 writeback_sb_inodes+0x47d/0xb20 __writeback_inodes_wb+0xb2/0x200 wb_writeback+0x4bd/0x660 wb_workfn+0x5f3/0xab0 process_one_work+0x79f/0x13e0 worker_thread+0x89/0xf60 kthread+0x26a/0x300 ret_from_fork+0x22/0x30 RIP: 0010:new_curseg+0xe8d/0x15f0 The root cause is: ckpt.valid_block_count is inconsistent with SIT table, stat info indicates filesystem has free blocks, but SIT table indicates filesystem has no free segment. So that during garbage colloection, it triggers panic when LFS allocator fails to find free segment. This patch tries to fix this issue by checking consistency in between ckpt.valid_block_count and block accounted from SIT. Cc: stable@vger.kernel.org Reported-by: Ming Yan Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Greg Kroah-Hartman --- fs/f2fs/f2fs.h | 4 ++-- fs/f2fs/segment.c | 33 ++++++++++++++++++++++----------- fs/f2fs/segment.h | 1 + 3 files changed, 25 insertions(+), 13 deletions(-) --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1092,8 +1092,8 @@ enum count_type { */ #define PAGE_TYPE_OF_BIO(type) ((type) > META ? META : (type)) enum page_type { - DATA, - NODE, + DATA = 0, + NODE = 1, /* should not change this */ META, NR_PAGE_TYPE, META_FLUSH, --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -4553,7 +4553,7 @@ static int build_sit_entries(struct f2fs unsigned int i, start, end; unsigned int readed, start_blk = 0; int err = 0; - block_t total_node_blocks = 0; + block_t sit_valid_blocks[2] = {0, 0}; do { readed = f2fs_ra_meta_pages(sbi, start_blk, BIO_MAX_VECS, @@ -4578,8 +4578,8 @@ static int build_sit_entries(struct f2fs if (err) return err; seg_info_from_raw_sit(se, &sit); - if (IS_NODESEG(se->type)) - total_node_blocks += se->valid_blocks; + + sit_valid_blocks[SE_PAGETYPE(se)] += se->valid_blocks; if (f2fs_block_unit_discard(sbi)) { /* build discard map only one time */ @@ -4619,15 +4619,15 @@ static int build_sit_entries(struct f2fs sit = sit_in_journal(journal, i); old_valid_blocks = se->valid_blocks; - if (IS_NODESEG(se->type)) - total_node_blocks -= old_valid_blocks; + + sit_valid_blocks[SE_PAGETYPE(se)] -= old_valid_blocks; err = check_block_count(sbi, start, &sit); if (err) break; seg_info_from_raw_sit(se, &sit); - if (IS_NODESEG(se->type)) - total_node_blocks += se->valid_blocks; + + sit_valid_blocks[SE_PAGETYPE(se)] += se->valid_blocks; if (f2fs_block_unit_discard(sbi)) { if (is_set_ckpt_flags(sbi, CP_TRIMMED_FLAG)) { @@ -4649,13 +4649,24 @@ static int build_sit_entries(struct f2fs } up_read(&curseg->journal_rwsem); - if (!err && total_node_blocks != valid_node_count(sbi)) { + if (err) + return err; + + if (sit_valid_blocks[NODE] != valid_node_count(sbi)) { f2fs_err(sbi, "SIT is corrupted node# %u vs %u", - total_node_blocks, valid_node_count(sbi)); - err = -EFSCORRUPTED; + sit_valid_blocks[NODE], valid_node_count(sbi)); + return -EFSCORRUPTED; + } + + if (sit_valid_blocks[DATA] + sit_valid_blocks[NODE] > + valid_user_blocks(sbi)) { + f2fs_err(sbi, "SIT is corrupted data# %u %u vs %u", + sit_valid_blocks[DATA], sit_valid_blocks[NODE], + valid_user_blocks(sbi)); + return -EFSCORRUPTED; } - return err; + return 0; } static void init_free_segmap(struct f2fs_sb_info *sbi) --- a/fs/f2fs/segment.h +++ b/fs/f2fs/segment.h @@ -24,6 +24,7 @@ #define IS_DATASEG(t) ((t) <= CURSEG_COLD_DATA) #define IS_NODESEG(t) ((t) >= CURSEG_HOT_NODE && (t) <= CURSEG_COLD_NODE) +#define SE_PAGETYPE(se) ((IS_NODESEG((se)->type) ? NODE : DATA)) static inline void sanity_check_seg_type(struct f2fs_sb_info *sbi, unsigned short seg_type)