Received: by 2002:a05:6520:4211:b029:f4:110d:56bc with SMTP id o17csp2109316lkv; Thu, 20 May 2021 03:37:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzvWMniIN8D/KrOS2SLFcmdKndvEWqxzQf3rSllrIecn6F3lV+B4KhY99A5zIAw9pInXBcg X-Received: by 2002:a05:6e02:1393:: with SMTP id d19mr4398912ilo.90.1621507070027; Thu, 20 May 2021 03:37:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621507070; cv=none; d=google.com; s=arc-20160816; b=0f/28ChIYHWeNuvjxZu1hUCZo5KgxJCz5KNq8k94ByJE/DzEEXoce/qPQjhktvT2oJ ixODlrrl3wmvZGdF1pFfIaryO8wXeWOMgdlR6xGBj7RDP5up4JvMM48UP9SkGDNRhGU3 Lgl7I5XyK4cTmXvUztEO0/Idn5aP0CihpS45Ou0YaHkaYyhw0J1oTNOqiz+2hQYMJAO3 pOOCQAnOr5kK0v9wJB7DfjhovMAlyv2giiEhwkzclrn42RmUSVIC0KvDOsaJOfarulMj ykrucdq6oBzQYWyXi/mWGiRs2ZAtKA0EhFUNj9dyYJUtEwCN+9ZPBDSwSOwQfcJDCcLs oBwA== 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=eK6z85gDSUZcHoZcvr6JNhmiJJbzDB38O/xAlKlerHI=; b=TZzftCftGhf66ozyYisvyUBUk8+GYNkT/sAi6xSaMb4mjQ3ZmrnhC5u4cG45GRlB4Y bwuP06iQjPXD3tGYoYcemDoUOe1ZJWiFJlxC/iFSPXTdfXdCo23Ko6meWFIBnxz+7BPO Q7tDAu2dIBXT3EFvA+pt3GFSLilcfyJGdWrXaDnrjfiiFfHqeqdfaYyimTtUjuQNFk4M pToTYw0cpkeuLI2LESHFf792IOY/qiCvOxr3BMq50R02xech4owGHkeMwqjZ5rS3XlaV JJpceX4wmzc9trf1lJnU+fPV4ItPjTO6WLR+ON7D5HUZe++Tmj0A+S+cGFfpeA8py7V7 RdTg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=qAS+YdGW; 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 s18si956097ilp.146.2021.05.20.03.37.36; Thu, 20 May 2021 03:37:50 -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=qAS+YdGW; 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 S237988AbhETKgM (ORCPT + 99 others); Thu, 20 May 2021 06:36:12 -0400 Received: from mail.kernel.org ([198.145.29.99]:51950 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234712AbhETKXF (ORCPT ); Thu, 20 May 2021 06:23:05 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id C786A613F9; Thu, 20 May 2021 09:48:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1621504116; bh=txdXFmtW+Of6WHTXv1lzpAH2FmjbBsKDnfOAiIHbhh8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qAS+YdGWmgtWXTPey6njxHB7lM1NjIhivfdCDobI0TSqQp7aN8+8lnawKBN2KFQKT CSIZU6z7OzcO8+aJY10ECdYR5qs5Ia3Vwigz64G5idOxxOuYs1SZyQ4b+E4EiL9b+J d06CZn8zjLh//K95hCM0SdT2Ft87PvS3tfxyZZDI= 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 4.14 092/323] ext4: fix check to prevent false positive report of incorrect used inodes Date: Thu, 20 May 2021 11:19:44 +0200 Message-Id: <20210520092123.247942527@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210520092120.115153432@linuxfoundation.org> References: <20210520092120.115153432@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 @@ -1367,6 +1367,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)) { @@ -1397,22 +1398,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;