From nobody Sat Apr 11 05:40:29 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 45308C7EE2F for ; Thu, 2 Mar 2023 15:36:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229854AbjCBPgc (ORCPT ); Thu, 2 Mar 2023 10:36:32 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37376 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229836AbjCBPg2 (ORCPT ); Thu, 2 Mar 2023 10:36:28 -0500 Received: from mail-lj1-x22f.google.com (mail-lj1-x22f.google.com [IPv6:2a00:1450:4864:20::22f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EA25336693 for ; Thu, 2 Mar 2023 07:36:26 -0800 (PST) Received: by mail-lj1-x22f.google.com with SMTP id z5so18025133ljc.8 for ; Thu, 02 Mar 2023 07:36:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1677771385; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=DcHOXRPpYU7BjEJ0T+L+P0cPs7xnSChzurMMzz/0KLM=; b=YsijaPl5hJSqnOrWX2V5t5iqXNo5hiU1ra9yxk9scI5vj+AtQDEiF/7GwzX/mW2/9h 2O/meYwWnGZ9gEt6Iukz2sVfNYpL++b8HBhyVDsrZ1qujIOlXWEk7eMM6GGMCe4HKxP4 8y5YYeopa+fcuYktahi0r59H2y93LpAqWtazbsyzY09Uf24Ce7CYtmcb+BgmGd4fSdTw pzfZpzzkaH+jQm9and9CfQtbC4WUZVTlLD6qEJQ/vPbBC5nc13mzYuAgY3/4ZsoiAX4n K9hIwglmb25mlkhTk5BuOLd4WNJU8C35MTu8/wPwuhRHrqUM/SkO5/Fh3HPGTB1gbM55 Pv7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677771385; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=DcHOXRPpYU7BjEJ0T+L+P0cPs7xnSChzurMMzz/0KLM=; b=NpEOlEYKOBopKIf1qmTnuvrxmrMtfR+ZiZcRF9/ipGCPz578c9YdbTbYdCOv84hf2K JC4hTfkim1IpXIqu+n9UtDv/VWXVEB+jzIcc0TrTSPWWmRf/g1SqZtZmyeCv980ooj+g d/WzvuU0TKbQdUT+of8+Gkxi2b+ha6aR9iAlyjG36no+M/h3eJ6INT/UAWSkCOhi+GDg uDJgADlhRcCITYGNgohWxosJsjiEdzw75+F10mkkY+R+KF9P2vPLOD/zmvXPb8i/SG5J LQBh4ZvUw0rv4JVxtHIDvFz5++CrHf6gWjqG2+aW04L9Yy5faFWKNxz8SpuuDBKIdk/+ 2FOw== X-Gm-Message-State: AO0yUKUNvO0F10o8XGM7tHeNFnJbhiIvw1VtcDIHafqGQSYOeAVkHlMX CfWLxaJxrhbUDSF2wpuXwn/R0g== X-Google-Smtp-Source: AK7set+BtoYHcHvVekSXPN3wrbwma5Hkyt5u8iKsExYBJs41tuxq+msuj6HNAU/q4KQXaWgiTPp7FA== X-Received: by 2002:a2e:b60b:0:b0:290:6fa7:605a with SMTP id r11-20020a2eb60b000000b002906fa7605amr3304727ljn.45.1677771385220; Thu, 02 Mar 2023 07:36:25 -0800 (PST) Received: from ta1.c.googlers.com.com (61.215.228.35.bc.googleusercontent.com. [35.228.215.61]) by smtp.gmail.com with ESMTPSA id p17-20020a05651238d100b004db2978e330sm2170509lft.258.2023.03.02.07.36.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 07:36:24 -0800 (PST) From: Tudor Ambarus To: stable@vger.kernel.org, tytso@mit.edu, adilger.kernel@dilger.ca Cc: linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, joneslee@google.com, Ritesh Harjani , Jan Kara , Tudor Ambarus Subject: [PATCH][for stable 5.{15, 10} 1/4] ext4: refactor ext4_free_blocks() to pull out ext4_mb_clear_bb() Date: Thu, 2 Mar 2023 15:36:07 +0000 Message-Id: <20230302153610.1204653-2-tudor.ambarus@linaro.org> X-Mailer: git-send-email 2.40.0.rc0.216.gc4246ad0f0-goog In-Reply-To: <20230302153610.1204653-1-tudor.ambarus@linaro.org> References: <20230302153610.1204653-1-tudor.ambarus@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Ritesh Harjani [ Upstream commit 8ac3939db99f99667b8eb670cf4baf292896e72d ] ext4_free_blocks() function became too long and confusing, this patch just pulls out the ext4_mb_clear_bb() function logic from it which clears the block bitmap and frees it. No functionality change in this patch Signed-off-by: Ritesh Harjani Reviewed-by: Jan Kara Link: https://lore.kernel.org/r/22c30fbb26ba409cf8aa5f0c7912970272c459e8.16= 44992610.git.riteshh@linux.ibm.com Signed-off-by: Theodore Ts'o Signed-off-by: Tudor Ambarus --- fs/ext4/mballoc.c | 180 ++++++++++++++++++++++++++-------------------- 1 file changed, 102 insertions(+), 78 deletions(-) diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 0c7498a59943..4418d011a654 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -5888,7 +5888,8 @@ static void ext4_free_blocks_simple(struct inode *ino= de, ext4_fsblk_t block, } =20 /** - * ext4_free_blocks() -- Free given blocks and update quota + * ext4_mb_clear_bb() -- helper function for freeing blocks. + * Used by ext4_free_blocks() * @handle: handle for this transaction * @inode: inode * @bh: optional buffer of the block to be freed @@ -5896,9 +5897,9 @@ static void ext4_free_blocks_simple(struct inode *ino= de, ext4_fsblk_t block, * @count: number of blocks to be freed * @flags: flags used by ext4_free_blocks */ -void ext4_free_blocks(handle_t *handle, struct inode *inode, - struct buffer_head *bh, ext4_fsblk_t block, - unsigned long count, int flags) +static void ext4_mb_clear_bb(handle_t *handle, struct inode *inode, + ext4_fsblk_t block, unsigned long count, + int flags) { struct buffer_head *bitmap_bh =3D NULL; struct super_block *sb =3D inode->i_sb; @@ -5915,80 +5916,6 @@ void ext4_free_blocks(handle_t *handle, struct inode= *inode, =20 sbi =3D EXT4_SB(sb); =20 - if (sbi->s_mount_state & EXT4_FC_REPLAY) { - ext4_free_blocks_simple(inode, block, count); - return; - } - - might_sleep(); - if (bh) { - if (block) - BUG_ON(block !=3D bh->b_blocknr); - else - block =3D bh->b_blocknr; - } - - if (!(flags & EXT4_FREE_BLOCKS_VALIDATED) && - !ext4_inode_block_valid(inode, block, count)) { - ext4_error(sb, "Freeing blocks not in datazone - " - "block =3D %llu, count =3D %lu", block, count); - goto error_return; - } - - ext4_debug("freeing block %llu\n", block); - trace_ext4_free_blocks(inode, block, count, flags); - - if (bh && (flags & EXT4_FREE_BLOCKS_FORGET)) { - BUG_ON(count > 1); - - ext4_forget(handle, flags & EXT4_FREE_BLOCKS_METADATA, - inode, bh, block); - } - - /* - * If the extent to be freed does not begin on a cluster - * boundary, we need to deal with partial clusters at the - * beginning and end of the extent. Normally we will free - * blocks at the beginning or the end unless we are explicitly - * requested to avoid doing so. - */ - overflow =3D EXT4_PBLK_COFF(sbi, block); - if (overflow) { - if (flags & EXT4_FREE_BLOCKS_NOFREE_FIRST_CLUSTER) { - overflow =3D sbi->s_cluster_ratio - overflow; - block +=3D overflow; - if (count > overflow) - count -=3D overflow; - else - return; - } else { - block -=3D overflow; - count +=3D overflow; - } - } - overflow =3D EXT4_LBLK_COFF(sbi, count); - if (overflow) { - if (flags & EXT4_FREE_BLOCKS_NOFREE_LAST_CLUSTER) { - if (count > overflow) - count -=3D overflow; - else - return; - } else - count +=3D sbi->s_cluster_ratio - overflow; - } - - if (!bh && (flags & EXT4_FREE_BLOCKS_FORGET)) { - int i; - int is_metadata =3D flags & EXT4_FREE_BLOCKS_METADATA; - - for (i =3D 0; i < count; i++) { - cond_resched(); - if (is_metadata) - bh =3D sb_find_get_block(inode->i_sb, block + i); - ext4_forget(handle, is_metadata, inode, bh, block + i); - } - } - do_more: overflow =3D 0; ext4_get_group_no_and_offset(sb, block, &block_group, &bit); @@ -6156,6 +6083,103 @@ void ext4_free_blocks(handle_t *handle, struct inod= e *inode, return; } =20 +/** + * ext4_free_blocks() -- Free given blocks and update quota + * @handle: handle for this transaction + * @inode: inode + * @bh: optional buffer of the block to be freed + * @block: starting physical block to be freed + * @count: number of blocks to be freed + * @flags: flags used by ext4_free_blocks + */ +void ext4_free_blocks(handle_t *handle, struct inode *inode, + struct buffer_head *bh, ext4_fsblk_t block, + unsigned long count, int flags) +{ + struct super_block *sb =3D inode->i_sb; + unsigned int overflow; + struct ext4_sb_info *sbi; + + sbi =3D EXT4_SB(sb); + + if (sbi->s_mount_state & EXT4_FC_REPLAY) { + ext4_free_blocks_simple(inode, block, count); + return; + } + + might_sleep(); + if (bh) { + if (block) + BUG_ON(block !=3D bh->b_blocknr); + else + block =3D bh->b_blocknr; + } + + if (!(flags & EXT4_FREE_BLOCKS_VALIDATED) && + !ext4_inode_block_valid(inode, block, count)) { + ext4_error(sb, "Freeing blocks not in datazone - " + "block =3D %llu, count =3D %lu", block, count); + return; + } + + ext4_debug("freeing block %llu\n", block); + trace_ext4_free_blocks(inode, block, count, flags); + + if (bh && (flags & EXT4_FREE_BLOCKS_FORGET)) { + BUG_ON(count > 1); + + ext4_forget(handle, flags & EXT4_FREE_BLOCKS_METADATA, + inode, bh, block); + } + + /* + * If the extent to be freed does not begin on a cluster + * boundary, we need to deal with partial clusters at the + * beginning and end of the extent. Normally we will free + * blocks at the beginning or the end unless we are explicitly + * requested to avoid doing so. + */ + overflow =3D EXT4_PBLK_COFF(sbi, block); + if (overflow) { + if (flags & EXT4_FREE_BLOCKS_NOFREE_FIRST_CLUSTER) { + overflow =3D sbi->s_cluster_ratio - overflow; + block +=3D overflow; + if (count > overflow) + count -=3D overflow; + else + return; + } else { + block -=3D overflow; + count +=3D overflow; + } + } + overflow =3D EXT4_LBLK_COFF(sbi, count); + if (overflow) { + if (flags & EXT4_FREE_BLOCKS_NOFREE_LAST_CLUSTER) { + if (count > overflow) + count -=3D overflow; + else + return; + } else + count +=3D sbi->s_cluster_ratio - overflow; + } + + if (!bh && (flags & EXT4_FREE_BLOCKS_FORGET)) { + int i; + int is_metadata =3D flags & EXT4_FREE_BLOCKS_METADATA; + + for (i =3D 0; i < count; i++) { + cond_resched(); + if (is_metadata) + bh =3D sb_find_get_block(inode->i_sb, block + i); + ext4_forget(handle, is_metadata, inode, bh, block + i); + } + } + + ext4_mb_clear_bb(handle, inode, block, count, flags); + return; +} + /** * ext4_group_add_blocks() -- Add given blocks to an existing group * @handle: handle to this transaction --=20 2.40.0.rc0.216.gc4246ad0f0-goog From nobody Sat Apr 11 05:40:29 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4C377C7EE37 for ; Thu, 2 Mar 2023 15:36:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230139AbjCBPgl (ORCPT ); Thu, 2 Mar 2023 10:36:41 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37406 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229848AbjCBPga (ORCPT ); Thu, 2 Mar 2023 10:36:30 -0500 Received: from mail-lf1-x132.google.com (mail-lf1-x132.google.com [IPv6:2a00:1450:4864:20::132]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DC83D360BD for ; Thu, 2 Mar 2023 07:36:27 -0800 (PST) Received: by mail-lf1-x132.google.com with SMTP id t11so22676924lfr.1 for ; Thu, 02 Mar 2023 07:36:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1677771386; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2gdId53Dyw2GpHctsUcNS/lVxL2AmQmaS15K9tykDPs=; b=XdT166J/QndycjCUH2wF0qEwJV08gQQLP6JJWmMTO4zVyiH5rpasQ3Jca64N0jvjHk pDgmjZlP7ENS7xmC9K1oZAqv3VfM2jTYnqAzrxyZwhkjRMYQQewb7RDg5McUuaCuc3bz 0qEJYj3lm6TRk175jeCh1Z3RLpMra5CzzeifUV+nwUY9kx1msmd6JvvixTJ8WRwzp6xt xYIFK8Gae04geIxspLhYPvf9E9JBc7age6/LoIEqnBrXgxs535q+dbmwRyTzkTk/f9/T OKdAjIkfLto5U8fOxziqXvfh6PTYamJpyUGEcgSbUZ1YgoYgJMAYlEmTxwH2T60thAq1 l4Yw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677771386; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2gdId53Dyw2GpHctsUcNS/lVxL2AmQmaS15K9tykDPs=; b=L3hlTP08kuNlItkVe/xkP6ZJVXaLYcP1Hn4yxMATkFCJB0ecEr/CRRzvT4nKd43gep M9+OBtkneLTSnuf41nsNQm9q4LvDIrLkQLWBw0Fk2b29/ThPlbC3ba1J68z7ya0Ps6+/ NyRawUkOqXyMGylQt/4uPLDnqKfRXemZHmKc9aOOYzEqQsyuGo4U7TT/MiqTYjF6XF1C iuo0lt1RTnldgKuEhrTm9icU/1wVKfwHx6uCA+PRK6r1b5/jX0oP56fHUyxpKV6KjGKl pGUbexpSqxdo+FvU3EzGVuSVhwqlwLZPrk3Vtt5PvYRig9BDNpRmdsmz/JFDvSKwErfz VT5A== X-Gm-Message-State: AO0yUKUcOcPb9vKsDxC9A/k6uf1hyU/4Kk48WchHLACME+noO3bvUu2r zu2koBK1Biud0rcQGdC0y27CVg== X-Google-Smtp-Source: AK7set+4+8xAxb5SSt2w7KuJV3dOH53ByauHa3PtpPAtU+bO92ZOVYVojb/fOUxtOglsU/VZFd/tFg== X-Received: by 2002:ac2:4213:0:b0:4dd:ad4b:efd with SMTP id y19-20020ac24213000000b004ddad4b0efdmr2844820lfh.52.1677771386183; Thu, 02 Mar 2023 07:36:26 -0800 (PST) Received: from ta1.c.googlers.com.com (61.215.228.35.bc.googleusercontent.com. [35.228.215.61]) by smtp.gmail.com with ESMTPSA id p17-20020a05651238d100b004db2978e330sm2170509lft.258.2023.03.02.07.36.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 07:36:25 -0800 (PST) From: Tudor Ambarus To: stable@vger.kernel.org, tytso@mit.edu, adilger.kernel@dilger.ca Cc: linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, joneslee@google.com, Ritesh Harjani , Jan Kara , Tudor Ambarus Subject: [PATCH][for stable 5.{15, 10} 2/4] ext4: add ext4_sb_block_valid() refactored out of ext4_inode_block_valid() Date: Thu, 2 Mar 2023 15:36:08 +0000 Message-Id: <20230302153610.1204653-3-tudor.ambarus@linaro.org> X-Mailer: git-send-email 2.40.0.rc0.216.gc4246ad0f0-goog In-Reply-To: <20230302153610.1204653-1-tudor.ambarus@linaro.org> References: <20230302153610.1204653-1-tudor.ambarus@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Ritesh Harjani [ Upstream commit 6bc6c2bdf1baca6522b8d9ba976257d722423085 ] This API will be needed at places where we don't have an inode for e.g. while freeing blocks in ext4_group_add_blocks() Suggested-by: Jan Kara Signed-off-by: Ritesh Harjani Link: https://lore.kernel.org/r/dd34a236543ad5ae7123eeebe0cb69e6bdd44f34.16= 44992610.git.riteshh@linux.ibm.com Signed-off-by: Theodore Ts'o Signed-off-by: Tudor Ambarus --- fs/ext4/block_validity.c | 26 +++++++++++++++++--------- fs/ext4/ext4.h | 3 +++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/fs/ext4/block_validity.c b/fs/ext4/block_validity.c index 4666b55b736e..5504f72bbbbe 100644 --- a/fs/ext4/block_validity.c +++ b/fs/ext4/block_validity.c @@ -292,15 +292,10 @@ void ext4_release_system_zone(struct super_block *sb) call_rcu(&system_blks->rcu, ext4_destroy_system_zone); } =20 -/* - * Returns 1 if the passed-in block region (start_blk, - * start_blk+count) is valid; 0 if some part of the block region - * overlaps with some other filesystem metadata blocks. - */ -int ext4_inode_block_valid(struct inode *inode, ext4_fsblk_t start_blk, - unsigned int count) +int ext4_sb_block_valid(struct super_block *sb, struct inode *inode, + ext4_fsblk_t start_blk, unsigned int count) { - struct ext4_sb_info *sbi =3D EXT4_SB(inode->i_sb); + struct ext4_sb_info *sbi =3D EXT4_SB(sb); struct ext4_system_blocks *system_blks; struct ext4_system_zone *entry; struct rb_node *n; @@ -329,7 +324,9 @@ int ext4_inode_block_valid(struct inode *inode, ext4_fs= blk_t start_blk, else if (start_blk >=3D (entry->start_blk + entry->count)) n =3D n->rb_right; else { - ret =3D (entry->ino =3D=3D inode->i_ino); + ret =3D 0; + if (inode) + ret =3D (entry->ino =3D=3D inode->i_ino); break; } } @@ -338,6 +335,17 @@ int ext4_inode_block_valid(struct inode *inode, ext4_f= sblk_t start_blk, return ret; } =20 +/* + * Returns 1 if the passed-in block region (start_blk, + * start_blk+count) is valid; 0 if some part of the block region + * overlaps with some other filesystem metadata blocks. + */ +int ext4_inode_block_valid(struct inode *inode, ext4_fsblk_t start_blk, + unsigned int count) +{ + return ext4_sb_block_valid(inode->i_sb, inode, start_blk, count); +} + int ext4_check_blockref(const char *function, unsigned int line, struct inode *inode, __le32 *p, unsigned int max) { diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index bc209f303327..80f0942fa165 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -3698,6 +3698,9 @@ extern int ext4_inode_block_valid(struct inode *inode, unsigned int count); extern int ext4_check_blockref(const char *, unsigned int, struct inode *, __le32 *, unsigned int); +extern int ext4_sb_block_valid(struct super_block *sb, struct inode *inode, + ext4_fsblk_t start_blk, unsigned int count); + =20 /* extents.c */ struct ext4_ext_path; --=20 2.40.0.rc0.216.gc4246ad0f0-goog From nobody Sat Apr 11 05:40:29 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2E9BAC678D4 for ; Thu, 2 Mar 2023 15:36:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230007AbjCBPgs (ORCPT ); Thu, 2 Mar 2023 10:36:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37782 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229877AbjCBPgj (ORCPT ); Thu, 2 Mar 2023 10:36:39 -0500 Received: from mail-lf1-x133.google.com (mail-lf1-x133.google.com [IPv6:2a00:1450:4864:20::133]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CA4D037545 for ; Thu, 2 Mar 2023 07:36:28 -0800 (PST) Received: by mail-lf1-x133.google.com with SMTP id t11so22676985lfr.1 for ; Thu, 02 Mar 2023 07:36:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1677771387; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=tU1uRAhzsVoBdXD+RtSgjM2zLnzd5LFyExq7JwMSefY=; b=QkQLjOi8GvNhoAnYX+Jj2O5035sBaO3DVCqKuI/pUDUkZDES2L5FtLuLMh63HkVxYj NRKMWgDUQev3birx1DTgJU6DwmBeWl5eyayh6RyPZg8xsATSQeb4W8WT4WPSMFEb0kQM U5a4eC0ESRI7ep0FMYTBjb5gPus4COkoUh55yeysdynHfyXkO88XDa+PKUdipr9XneI4 scqMRSTfUD++K/CWy23E58hyegWlTDXm6I0yXr7cv9FeNaalKE4RlCZTpUfyWxYELWql A6FhaLyZYrfz2m/5clI4iUqtdDITEU23VX4aNZ1xA/j/a+x2UOJLFObjk7np3Tt8A+Ap jnWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677771387; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=tU1uRAhzsVoBdXD+RtSgjM2zLnzd5LFyExq7JwMSefY=; b=0zFcAQg7e7moa8g/VlBhHXMws09fi8fTh/iggiGrQ4qGQU1uiJWe3r1P2/odxThkWH SY5vesT8qgl/tp23jvXhy4Sespf7X5rCYyhOtENkE2tYaCzKSlBW5roO20B27KCa2IEQ ZMhocVkWjsg89lZ/XxRJuNa3Wzld0zyufzsCb7KbuUf9ifWehadQgTZQq6c1nMcEBiun 7xSu8ptf6KkPXfBv/UjPICr+1VMHc61SovCgMEbrvJoXg4zc+DehGOjNIYxnPPnajTAj Xwo0wwiu63HMv0pyeCW16CqB/wQrmX0uloaz08rwY1npvGHie1jmSbIGXI1jDiqZ47Sk Nm6Q== X-Gm-Message-State: AO0yUKXL6Ja4CcUhKTcMSwJwUBkHz7sEWDpXdwpEd9ExmtFoC+voYj0A FArh4ZKZIM/24xG8/UqnO8pUjg== X-Google-Smtp-Source: AK7set8sJTLO9CCSsJJRosOnAY+i38CiUycGIL2zq/K7T87fr0OtVM/49TCqf1Lz0ZaxySlQA4biaA== X-Received: by 2002:ac2:46f6:0:b0:4dd:cbf3:e981 with SMTP id q22-20020ac246f6000000b004ddcbf3e981mr2764196lfo.28.1677771387030; Thu, 02 Mar 2023 07:36:27 -0800 (PST) Received: from ta1.c.googlers.com.com (61.215.228.35.bc.googleusercontent.com. [35.228.215.61]) by smtp.gmail.com with ESMTPSA id p17-20020a05651238d100b004db2978e330sm2170509lft.258.2023.03.02.07.36.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 07:36:26 -0800 (PST) From: Tudor Ambarus To: stable@vger.kernel.org, tytso@mit.edu, adilger.kernel@dilger.ca Cc: linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, joneslee@google.com, Ritesh Harjani , Jan Kara , Tudor Ambarus Subject: [PATCH][for stable 5.{15, 10} 3/4] ext4: add strict range checks while freeing blocks Date: Thu, 2 Mar 2023 15:36:09 +0000 Message-Id: <20230302153610.1204653-4-tudor.ambarus@linaro.org> X-Mailer: git-send-email 2.40.0.rc0.216.gc4246ad0f0-goog In-Reply-To: <20230302153610.1204653-1-tudor.ambarus@linaro.org> References: <20230302153610.1204653-1-tudor.ambarus@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Ritesh Harjani [ Upstream commit a00b482b82fb098956a5bed22bd7873e56f152f1 ] Currently ext4_mb_clear_bb() & ext4_group_add_blocks() only checks whether the given block ranges (which is to be freed) belongs to any FS metadata blocks or not, of the block's respective block group. But to detect any FS error early, it is better to add more strict checkings in those functions which checks whether the given blocks belongs to any critical FS metadata or not within system-zone. Suggested-by: Jan Kara Signed-off-by: Ritesh Harjani Reviewed-by: Jan Kara Link: https://lore.kernel.org/r/ddd9143d064774e32d6364a99667817c6e8bfdc0.16= 44992610.git.riteshh@linux.ibm.com Signed-off-by: Theodore Ts'o Signed-off-by: Tudor Ambarus --- fs/ext4/mballoc.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 4418d011a654..7b4359862a60 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -5946,13 +5946,7 @@ static void ext4_mb_clear_bb(handle_t *handle, struc= t inode *inode, goto error_return; } =20 - if (in_range(ext4_block_bitmap(sb, gdp), block, count) || - in_range(ext4_inode_bitmap(sb, gdp), block, count) || - in_range(block, ext4_inode_table(sb, gdp), - sbi->s_itb_per_group) || - in_range(block + count - 1, ext4_inode_table(sb, gdp), - sbi->s_itb_per_group)) { - + if (!ext4_inode_block_valid(inode, block, count)) { ext4_error(sb, "Freeing blocks in system zone - " "Block =3D %llu, count =3D %lu", block, count); /* err =3D 0. ext4_std_error should be a no op */ @@ -6023,7 +6017,7 @@ static void ext4_mb_clear_bb(handle_t *handle, struct= inode *inode, NULL); if (err && err !=3D -EOPNOTSUPP) ext4_msg(sb, KERN_WARNING, "discard request in" - " group:%d block:%d count:%lu failed" + " group:%u block:%d count:%lu failed" " with %d", block_group, bit, count, err); } else @@ -6236,11 +6230,7 @@ int ext4_group_add_blocks(handle_t *handle, struct s= uper_block *sb, goto error_return; } =20 - if (in_range(ext4_block_bitmap(sb, desc), block, count) || - in_range(ext4_inode_bitmap(sb, desc), block, count) || - in_range(block, ext4_inode_table(sb, desc), sbi->s_itb_per_group) || - in_range(block + count - 1, ext4_inode_table(sb, desc), - sbi->s_itb_per_group)) { + if (!ext4_sb_block_valid(sb, NULL, block, count)) { ext4_error(sb, "Adding blocks in system zones - " "Block =3D %llu, count =3D %lu", block, count); --=20 2.40.0.rc0.216.gc4246ad0f0-goog From nobody Sat Apr 11 05:40:29 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 641D1C678D4 for ; Thu, 2 Mar 2023 15:36:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229689AbjCBPgp (ORCPT ); Thu, 2 Mar 2023 10:36:45 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37784 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229836AbjCBPgj (ORCPT ); Thu, 2 Mar 2023 10:36:39 -0500 Received: from mail-lf1-x130.google.com (mail-lf1-x130.google.com [IPv6:2a00:1450:4864:20::130]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9C45D36693 for ; Thu, 2 Mar 2023 07:36:29 -0800 (PST) Received: by mail-lf1-x130.google.com with SMTP id m7so22634166lfj.8 for ; Thu, 02 Mar 2023 07:36:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1677771388; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=xPP3HXcCysfTznKsDYThrcBwtl/yG8ZLYuAVSZJtJ+o=; b=xdv5/7ylluaW3v2WHm00b1OBIYqoIirvCXVySNdVpvERx7L9jAqYcDxPVx8FDDCBO0 fOtWyr9llberWp31txlJjjvV0GlGXeFFN6o3rszBGThkl/Qa6Et90HUAX5pZvBI7ABWY 8hDCjzIxf82i5tOGFzKndrK/uF7lJ9LQTcO8lapnOyOyhlUw00J0739fUp8iQR69J7Ch 8X0sMGCGb9S6Rk1jluOjLw6G8bT/zqQD4+FC/MOIRZvvW6XjNecX3UGlz7c1BTlvXZZn hj5S6GEMtQlJ1VHq0TC7Tdt4YuOWBg3yb93cLSH0zqdWafPKJcIAv/Gac7lJOOja72qL zFwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677771388; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xPP3HXcCysfTznKsDYThrcBwtl/yG8ZLYuAVSZJtJ+o=; b=TisxBwTiIwsCU+/EeZOQv2CUIKdBYTbeMpxkhSEc9jxbOdGw7xkhH3z8llO0jt5AJw /fipsJW/PejmsB5smQy1B0S0IewwFT8nbuvX3FLXbHxbDstpWQzyttFDtQwbRdshVSgs TvS6MTClOncO0+q1N1/IzAsxplv+JojH2KhJXgOFhMo5s3XjxGv6lJdRzDknxFAoUnRV NlR1XUUoF0/i1RYU4B4XuWO1NMGcySwmuS9/ftW6DMU25FxaEPk4gI2Un5Rnkp+sK+zb pAETRjQegTu2toyCBhrG21tKNkCGEszNecSA/ozfTd6gpJg5Ii3SheP6WCDaUTDYln0/ FMow== X-Gm-Message-State: AO0yUKW05/Ac1DOULTmft4zSaC/67YgstNbQ1DWuZ5h6MIMEnalv/voX GGe5GsWo9HiqedfDyTMfaAhnMg== X-Google-Smtp-Source: AK7set93ZYW1xBaJdP9TfUcpnqshkEhG0x6bOeCHFRSevglUZ/k28gZkEwXDaNLfG3E4qRUrgCVDEg== X-Received: by 2002:ac2:5330:0:b0:4e1:46e9:ec3e with SMTP id f16-20020ac25330000000b004e146e9ec3emr2826110lfh.61.1677771387836; Thu, 02 Mar 2023 07:36:27 -0800 (PST) Received: from ta1.c.googlers.com.com (61.215.228.35.bc.googleusercontent.com. [35.228.215.61]) by smtp.gmail.com with ESMTPSA id p17-20020a05651238d100b004db2978e330sm2170509lft.258.2023.03.02.07.36.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 07:36:27 -0800 (PST) From: Tudor Ambarus To: stable@vger.kernel.org, tytso@mit.edu, adilger.kernel@dilger.ca Cc: linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, joneslee@google.com, Lukas Czerner , syzbot+15cd994e273307bf5cfa@syzkaller.appspotmail.com, Tadeusz Struk , Tudor Ambarus Subject: [PATCH][for stable 5.{15, 10} 4/4] ext4: block range must be validated before use in ext4_mb_clear_bb() Date: Thu, 2 Mar 2023 15:36:10 +0000 Message-Id: <20230302153610.1204653-5-tudor.ambarus@linaro.org> X-Mailer: git-send-email 2.40.0.rc0.216.gc4246ad0f0-goog In-Reply-To: <20230302153610.1204653-1-tudor.ambarus@linaro.org> References: <20230302153610.1204653-1-tudor.ambarus@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Lukas Czerner [ Upstream commit 1e1c2b86ef86a8477fd9b9a4f48a6bfe235606f6 ] Block range to free is validated in ext4_free_blocks() using ext4_inode_block_valid() and then it's passed to ext4_mb_clear_bb(). However in some situations on bigalloc file system the range might be adjusted after the validation in ext4_free_blocks() which can lead to troubles on corrupted file systems such as one found by syzkaller that resulted in the following BUG kernel BUG at fs/ext4/ext4.h:3319! PREEMPT SMP NOPTI CPU: 28 PID: 4243 Comm: repro Kdump: loaded Not tainted 5.19.0-rc6+ #1 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.15.0-1.fc35 04/0= 1/2014 RIP: 0010:ext4_free_blocks+0x95e/0xa90 Call Trace: ? lock_timer_base+0x61/0x80 ? __es_remove_extent+0x5a/0x760 ? __mod_timer+0x256/0x380 ? ext4_ind_truncate_ensure_credits+0x90/0x220 ext4_clear_blocks+0x107/0x1b0 ext4_free_data+0x15b/0x170 ext4_ind_truncate+0x214/0x2c0 ? _raw_spin_unlock+0x15/0x30 ? ext4_discard_preallocations+0x15a/0x410 ? ext4_journal_check_start+0xe/0x90 ? __ext4_journal_start_sb+0x2f/0x110 ext4_truncate+0x1b5/0x460 ? __ext4_journal_start_sb+0x2f/0x110 ext4_evict_inode+0x2b4/0x6f0 evict+0xd0/0x1d0 ext4_enable_quotas+0x11f/0x1f0 ext4_orphan_cleanup+0x3de/0x430 ? proc_create_seq_private+0x43/0x50 ext4_fill_super+0x295f/0x3ae0 ? snprintf+0x39/0x40 ? sget_fc+0x19c/0x330 ? ext4_reconfigure+0x850/0x850 get_tree_bdev+0x16d/0x260 vfs_get_tree+0x25/0xb0 path_mount+0x431/0xa70 __x64_sys_mount+0xe2/0x120 do_syscall_64+0x5b/0x80 ? do_user_addr_fault+0x1e2/0x670 ? exc_page_fault+0x70/0x170 entry_SYSCALL_64_after_hwframe+0x46/0xb0 RIP: 0033:0x7fdf4e512ace Fix it by making sure that the block range is properly validated before used every time it changes in ext4_free_blocks() or ext4_mb_clear_bb(). Link: https://syzkaller.appspot.com/bug?id=3D5266d464285a03cee9dbfda7d2452a= 72c3c2ae7c Reported-by: syzbot+15cd994e273307bf5cfa@syzkaller.appspotmail.com Signed-off-by: Lukas Czerner Cc: Tadeusz Struk Tested-by: Tadeusz Struk Link: https://lore.kernel.org/r/20220714165903.58260-1-lczerner@redhat.com Signed-off-by: Theodore Ts'o Signed-off-by: Tudor Ambarus --- fs/ext4/mballoc.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 7b4359862a60..e6718bfc6c55 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -5916,6 +5916,15 @@ static void ext4_mb_clear_bb(handle_t *handle, struc= t inode *inode, =20 sbi =3D EXT4_SB(sb); =20 + if (!(flags & EXT4_FREE_BLOCKS_VALIDATED) && + !ext4_inode_block_valid(inode, block, count)) { + ext4_error(sb, "Freeing blocks in system zone - " + "Block =3D %llu, count =3D %lu", block, count); + /* err =3D 0. ext4_std_error should be a no op */ + goto error_return; + } + flags |=3D EXT4_FREE_BLOCKS_VALIDATED; + do_more: overflow =3D 0; ext4_get_group_no_and_offset(sb, block, &block_group, &bit); @@ -5932,6 +5941,8 @@ static void ext4_mb_clear_bb(handle_t *handle, struct= inode *inode, overflow =3D EXT4_C2B(sbi, bit) + count - EXT4_BLOCKS_PER_GROUP(sb); count -=3D overflow; + /* The range changed so it's no longer validated */ + flags &=3D ~EXT4_FREE_BLOCKS_VALIDATED; } count_clusters =3D EXT4_NUM_B2C(sbi, count); bitmap_bh =3D ext4_read_block_bitmap(sb, block_group); @@ -5946,7 +5957,8 @@ static void ext4_mb_clear_bb(handle_t *handle, struct= inode *inode, goto error_return; } =20 - if (!ext4_inode_block_valid(inode, block, count)) { + if (!(flags & EXT4_FREE_BLOCKS_VALIDATED) && + !ext4_inode_block_valid(inode, block, count)) { ext4_error(sb, "Freeing blocks in system zone - " "Block =3D %llu, count =3D %lu", block, count); /* err =3D 0. ext4_std_error should be a no op */ @@ -6069,6 +6081,8 @@ static void ext4_mb_clear_bb(handle_t *handle, struct= inode *inode, block +=3D count; count =3D overflow; put_bh(bitmap_bh); + /* The range changed so it's no longer validated */ + flags &=3D ~EXT4_FREE_BLOCKS_VALIDATED; goto do_more; } error_return: @@ -6115,6 +6129,7 @@ void ext4_free_blocks(handle_t *handle, struct inode = *inode, "block =3D %llu, count =3D %lu", block, count); return; } + flags |=3D EXT4_FREE_BLOCKS_VALIDATED; =20 ext4_debug("freeing block %llu\n", block); trace_ext4_free_blocks(inode, block, count, flags); @@ -6146,6 +6161,8 @@ void ext4_free_blocks(handle_t *handle, struct inode = *inode, block -=3D overflow; count +=3D overflow; } + /* The range changed so it's no longer validated */ + flags &=3D ~EXT4_FREE_BLOCKS_VALIDATED; } overflow =3D EXT4_LBLK_COFF(sbi, count); if (overflow) { @@ -6156,6 +6173,8 @@ void ext4_free_blocks(handle_t *handle, struct inode = *inode, return; } else count +=3D sbi->s_cluster_ratio - overflow; + /* The range changed so it's no longer validated */ + flags &=3D ~EXT4_FREE_BLOCKS_VALIDATED; } =20 if (!bh && (flags & EXT4_FREE_BLOCKS_FORGET)) { --=20 2.40.0.rc0.216.gc4246ad0f0-goog