Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2519712pxj; Mon, 10 May 2021 05:05:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJza/FWA2jFSNQ5PYCUYHSiszVo9th3jkG3z4j8R5Uo88ebrKGB7LJfVHJJj1KHPWtx0FuY4 X-Received: by 2002:a5e:d907:: with SMTP id n7mr18459446iop.177.1620648325608; Mon, 10 May 2021 05:05:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620648325; cv=none; d=google.com; s=arc-20160816; b=J/pr0A/O09N0AYSJ+m6NP6my5ZIWXg/DdFJw+KurpIuoUsmtTxzBPEXvGBaUOQDUhX Re/fzpOlW7dOwsyP0NuJnKft+bvxdKgEsHnpK461ua4K2qjV/1473KHTF6X3HRYkdGtG TIoMSkDCJuhYOnSG0zUOR0jW8L3ka32DXEgxwICzmV7xhObDvMj4K54hpSjRfgMiW+6p X/OQE4u7JgumDhzyR5ZIEE0L+7SOKYU/FeQPzUYiWep12U+hocBFQYpagQDR2X9qnuN3 jvtSSHh5lfwIlysZH1U5x8XioC3sIYDEvQEOgn5yk2qMDxtenUSfV2kmPcxt+08AOpWT e4iA== 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=B8pQyLGAuZH05UD2qDI2UlyV7IUc48Un3AEOlRWhmQw=; b=pcv0Js65n0J0rBYm7D9aTmaLHsZTz24zlYCRuGjzfzOazjU4yLlbuJUX6IgXuyiM/z +2mvJVLlivz2lxvQbzIYxnemO+LrJT3FjcVrAAIavkECi5eNSRUSfhqZmEwfte3phMc1 ar1c+bR2FmGWIq6G5ph1UEk1cFOyeMm4b2ROR3GjdLs07m3cxu9TmsX8RmnRsmsvvPxs faWxZ5QkpIln1YEDsJ12zUEZTYyfPLBLp53n+m8R/Wi7RQd+j3n3L4rs15H8S3VSEKeQ GGxEt7m1mAgyczzS5sR0gQyTvre514hmDDVT3cCB6FpolzYO2hPzIbXmcKb39frnLUbX n6pg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="PCmy/WAk"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id z13si9365111ilu.28.2021.05.10.05.05.12; Mon, 10 May 2021 05:05:25 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="PCmy/WAk"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243621AbhEJL4m (ORCPT + 99 others); Mon, 10 May 2021 07:56:42 -0400 Received: from mail.kernel.org ([198.145.29.99]:44226 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235672AbhEJLFv (ORCPT ); Mon, 10 May 2021 07:05:51 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 8C3AB613C5; Mon, 10 May 2021 10:55:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1620644144; bh=MdD+feZjH3L/WubtpNdfOOSb0CymylYxkHRfQCg24i4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PCmy/WAk9BVxQnLcclvVuKxwDyLqmHsPACdzdL99VnCmLhKE3l50eF4TcA0eo3kn8 QI4eQVdWarvy3PUzigq7FJs6XRCZBqCE6+3nTRd2rJKuJE0sGRBMKDZLRJGVXFVlro Lxt0BTFlaOWoQyb2yUfYLOEUs1M2elETz3oGVVP0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, stable@kernel.org, Zhang Yi , Jan Kara , Theodore Tso Subject: [PATCH 5.11 305/342] ext4: fix check to prevent false positive report of incorrect used inodes Date: Mon, 10 May 2021 12:21:35 +0200 Message-Id: <20210510102020.184369973@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210510102010.096403571@linuxfoundation.org> References: <20210510102010.096403571@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Zhang Yi commit a149d2a5cabbf6507a7832a1c4fd2593c55fd450 upstream. Commit <50122847007> ("ext4: fix check to prevent initializing reserved inodes") check the block group zero and prevent initializing reserved inodes. But in some special cases, the reserved inode may not all belong to the group zero, it may exist into the second group if we format filesystem below. mkfs.ext4 -b 4096 -g 8192 -N 1024 -I 4096 /dev/sda So, it will end up triggering a false positive report of a corrupted file system. This patch fix it by avoid check reserved inodes if no free inode blocks will be zeroed. Cc: stable@kernel.org Fixes: 50122847007 ("ext4: fix check to prevent initializing reserved inodes") Signed-off-by: Zhang Yi Suggested-by: Jan Kara Link: https://lore.kernel.org/r/20210331121516.2243099-1-yi.zhang@huawei.com Signed-off-by: Theodore Ts'o Signed-off-by: Greg Kroah-Hartman --- fs/ext4/ialloc.c | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -1512,6 +1512,7 @@ int ext4_init_inode_table(struct super_b handle_t *handle; ext4_fsblk_t blk; int num, ret = 0, used_blks = 0; + unsigned long used_inos = 0; /* This should not happen, but just to be sure check this */ if (sb_rdonly(sb)) { @@ -1542,22 +1543,37 @@ int ext4_init_inode_table(struct super_b * used inodes so we need to skip blocks with used inodes in * inode table. */ - if (!(gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_UNINIT))) - used_blks = DIV_ROUND_UP((EXT4_INODES_PER_GROUP(sb) - - ext4_itable_unused_count(sb, gdp)), - sbi->s_inodes_per_block); - - if ((used_blks < 0) || (used_blks > sbi->s_itb_per_group) || - ((group == 0) && ((EXT4_INODES_PER_GROUP(sb) - - ext4_itable_unused_count(sb, gdp)) < - EXT4_FIRST_INO(sb)))) { - ext4_error(sb, "Something is wrong with group %u: " - "used itable blocks: %d; " - "itable unused count: %u", - group, used_blks, - ext4_itable_unused_count(sb, gdp)); - ret = 1; - goto err_out; + if (!(gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_UNINIT))) { + used_inos = EXT4_INODES_PER_GROUP(sb) - + ext4_itable_unused_count(sb, gdp); + used_blks = DIV_ROUND_UP(used_inos, sbi->s_inodes_per_block); + + /* Bogus inode unused count? */ + if (used_blks < 0 || used_blks > sbi->s_itb_per_group) { + ext4_error(sb, "Something is wrong with group %u: " + "used itable blocks: %d; " + "itable unused count: %u", + group, used_blks, + ext4_itable_unused_count(sb, gdp)); + ret = 1; + goto err_out; + } + + used_inos += group * EXT4_INODES_PER_GROUP(sb); + /* + * Are there some uninitialized inodes in the inode table + * before the first normal inode? + */ + if ((used_blks != sbi->s_itb_per_group) && + (used_inos < EXT4_FIRST_INO(sb))) { + ext4_error(sb, "Something is wrong with group %u: " + "itable unused count: %u; " + "itables initialized count: %ld", + group, ext4_itable_unused_count(sb, gdp), + used_inos); + ret = 1; + goto err_out; + } } blk = ext4_inode_table(sb, gdp) + used_blks;