Message ID | 20230113100205.2987532-1-yebin@huaweicloud.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp178178wrt; Fri, 13 Jan 2023 01:50:54 -0800 (PST) X-Google-Smtp-Source: AMrXdXvwe3+3n7x5AlJfHzA23b0GPTMqy3imZZfpWZ2elp3fu+uQHw2HN8MxJMEVoQp3X36SyTuk X-Received: by 2002:a17:90a:db08:b0:226:ffe3:d189 with SMTP id g8-20020a17090adb0800b00226ffe3d189mr10731698pjv.20.1673603454124; Fri, 13 Jan 2023 01:50:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673603454; cv=none; d=google.com; s=arc-20160816; b=QTj4lQ+v5wrraB2NJ5c2jLh50wLOhXdlbPUXFNrjafh2eSQ78uh2hSMVE5fLFHeCZe tIdlxXVMBdRycRjHekazQX1DCZa1myES4nPW5riTpMSHu4Ft/IPg5QYp9wRf2CcvkR/p gsY/fsQEiK7hetaWOWo74YNYUdTLmewItQCPaq2pFUr4ep9WAQE31MY8zGZB4KNfpjg2 n/+fSqMM4hk/m8uQAdjDyrFlQenzXsD/9o3k6cSfvwm1ON/gR33b5kqSbup6LR8LgGhh KHfUW+KIdaflLNI2nILTZSHzSbxvr4XTmcjqCLcih7lJ7uGcRH56eG4q0FlAQTqzZyRo ePfg== 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 :message-id:date:subject:cc:to:from; bh=BpJ9nmlLsVKTIiQNP/dXeuaXTZQ2Yx6cdjNGj9/wmbk=; b=yW5Pwf06NCV+6nKn85NKIkOY7CPE83l9Pioh2tujCe2bThlA0VeiYdb1fCno+q+tbc yFMMNLEjdO5H5bnmFdNEsh2ymIespflAhJ7st3gmSg6GLIklm0sQ3UJUkOiZvVwkL2Hk wmHCPSKzSt1KqFZFCRQ6eKWf8rRXR/fNrdV1q8SwYiwlt9VMcltRaNro8eMS1SMrULvn +w31cx9CAw9sfegPHxUw73p3p4NDAmwDSFXzr49qIvQmhpC99yFpkNylWLtU1pfphtay i4cKK24tGRKih+m1TuD3Xz6Pqqcen5G+5rzubdKQmlkc7a/zkGSNNA/8dq9yuyzSEwTS tm3Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id i3-20020a6551c3000000b004ad1e917143si17757859pgq.386.2023.01.13.01.50.40; Fri, 13 Jan 2023 01:50:54 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240331AbjAMJtY (ORCPT <rfc822;callmefire3@gmail.com> + 99 others); Fri, 13 Jan 2023 04:49:24 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38782 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241087AbjAMJro (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Fri, 13 Jan 2023 04:47:44 -0500 Received: from dggsgout12.his.huawei.com (unknown [45.249.212.56]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3C64B43A39; Fri, 13 Jan 2023 01:37:49 -0800 (PST) Received: from mail02.huawei.com (unknown [172.30.67.169]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4NtbtZ4cbMz4f4M4w; Fri, 13 Jan 2023 17:37:42 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.127.227]) by APP1 (Coremail) with SMTP id cCh0CgBXxC5nJsFjJtAnBg--.32742S4; Fri, 13 Jan 2023 17:37:45 +0800 (CST) From: Ye Bin <yebin@huaweicloud.com> To: tytso@mit.edu, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org Cc: linux-kernel@vger.kernel.org, jack@suse.cz, Ye Bin <yebin10@huawei.com>, syzbot+68223fe9f6c95ad43bed@syzkaller.appspotmail.com Subject: [PATCH] ext4: fix WARNING in mb_find_extent Date: Fri, 13 Jan 2023 18:02:05 +0800 Message-Id: <20230113100205.2987532-1-yebin@huaweicloud.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID: cCh0CgBXxC5nJsFjJtAnBg--.32742S4 X-Coremail-Antispam: 1UD129KBjvJXoW3GFW8Wr17Xry8WF4xZFyrWFg_yoW7Zr1xp3 W3Ar15Gr4rWr1UuF4fJr1Fqw1rGw1xu3W8JrWfur1UXFy7Jw17GFyvyFy8XayvqFW7Ar13 XFn8G3yxKr15WaDanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUgKb4IE77IF4wAFF20E14v26r4j6ryUM7CY07I20VC2zVCF04k2 6cxKx2IYs7xG6rWj6s0DM7CIcVAFz4kK6r1j6r18M28lY4IEw2IIxxk0rwA2F7IY1VAKz4 vEj48ve4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7Cj xVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x 0267AKxVW0oVCq3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG 6I80ewAv7VC0I7IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFV Cjc4AY6r1j6r4UM4x0Y48IcxkI7VAKI48JMxAIw28IcxkI7VAKI48JMxC20s026xCaFVCj c4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4 CE17CEb7AF67AKxVWUAVWUtwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20xvE14v26r1j6r1x MIIF0xvE2Ix0cI8IcVCY1x0267AKxVWUJVW8JwCI42IY6xAIw20EY4v20xvaj40_WFyUJV Cq3wCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r1j6r4UYxBI daVFxhVjvjDU0xZFpf9x07UWE__UUUUU= X-CM-SenderInfo: p1hex046kxt4xhlfz01xgou0bp/ X-CFilter-Loop: Reflected X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,KHOP_HELO_FCRDNS, SPF_HELO_NONE,SPF_NONE autolearn=no 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: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754900415489525831?= X-GMAIL-MSGID: =?utf-8?q?1754900415489525831?= |
Series |
ext4: fix WARNING in mb_find_extent
|
|
Commit Message
Ye Bin
Jan. 13, 2023, 10:02 a.m. UTC
From: Ye Bin <yebin10@huawei.com> Syzbot found the following issue: EXT4-fs: Warning: mounting with data=journal disables delayed allocation, dioread_nolock, O_DIRECT and fast_commit support! EXT4-fs (loop0): orphan cleanup on readonly fs ------------[ cut here ]------------ WARNING: CPU: 1 PID: 5067 at fs/ext4/mballoc.c:1869 mb_find_extent+0x8a1/0xe30 Modules linked in: CPU: 1 PID: 5067 Comm: syz-executor307 Not tainted 6.2.0-rc1-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/26/2022 RIP: 0010:mb_find_extent+0x8a1/0xe30 fs/ext4/mballoc.c:1869 RSP: 0018:ffffc90003c9e098 EFLAGS: 00010293 RAX: ffffffff82405731 RBX: 0000000000000041 RCX: ffff8880783457c0 RDX: 0000000000000000 RSI: 0000000000000041 RDI: 0000000000000040 RBP: 0000000000000040 R08: ffffffff82405723 R09: ffffed10053c9402 R10: ffffed10053c9402 R11: 1ffff110053c9401 R12: 0000000000000000 R13: ffffc90003c9e538 R14: dffffc0000000000 R15: ffffc90003c9e2cc FS: 0000555556665300(0000) GS:ffff8880b9900000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000056312f6796f8 CR3: 0000000022437000 CR4: 00000000003506e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> ext4_mb_complex_scan_group+0x353/0x1100 fs/ext4/mballoc.c:2307 ext4_mb_regular_allocator+0x1533/0x3860 fs/ext4/mballoc.c:2735 ext4_mb_new_blocks+0xddf/0x3db0 fs/ext4/mballoc.c:5605 ext4_ext_map_blocks+0x1868/0x6880 fs/ext4/extents.c:4286 ext4_map_blocks+0xa49/0x1cc0 fs/ext4/inode.c:651 ext4_getblk+0x1b9/0x770 fs/ext4/inode.c:864 ext4_bread+0x2a/0x170 fs/ext4/inode.c:920 ext4_quota_write+0x225/0x570 fs/ext4/super.c:7105 write_blk fs/quota/quota_tree.c:64 [inline] get_free_dqblk+0x34a/0x6d0 fs/quota/quota_tree.c:130 do_insert_tree+0x26b/0x1aa0 fs/quota/quota_tree.c:340 do_insert_tree+0x722/0x1aa0 fs/quota/quota_tree.c:375 do_insert_tree+0x722/0x1aa0 fs/quota/quota_tree.c:375 do_insert_tree+0x722/0x1aa0 fs/quota/quota_tree.c:375 dq_insert_tree fs/quota/quota_tree.c:401 [inline] qtree_write_dquot+0x3b6/0x530 fs/quota/quota_tree.c:420 v2_write_dquot+0x11b/0x190 fs/quota/quota_v2.c:358 dquot_acquire+0x348/0x670 fs/quota/dquot.c:444 ext4_acquire_dquot+0x2dc/0x400 fs/ext4/super.c:6740 dqget+0x999/0xdc0 fs/quota/dquot.c:914 __dquot_initialize+0x3d0/0xcf0 fs/quota/dquot.c:1492 ext4_process_orphan+0x57/0x2d0 fs/ext4/orphan.c:329 ext4_orphan_cleanup+0xb60/0x1340 fs/ext4/orphan.c:474 __ext4_fill_super fs/ext4/super.c:5516 [inline] ext4_fill_super+0x81cd/0x8700 fs/ext4/super.c:5644 get_tree_bdev+0x400/0x620 fs/super.c:1282 vfs_get_tree+0x88/0x270 fs/super.c:1489 do_new_mount+0x289/0xad0 fs/namespace.c:3145 do_mount fs/namespace.c:3488 [inline] __do_sys_mount fs/namespace.c:3697 [inline] __se_sys_mount+0x2d3/0x3c0 fs/namespace.c:3674 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x3d/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd Add some debug information: mb_find_extent: mb_find_extent block=41, order=0 needed=64 next=0 ex=0/41/1@3735929054 64 64 7 block_bitmap: ff 3f 0c 00 fc 01 00 00 d2 3d 00 00 00 00 00 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff Acctually, blocks per group is 64, but block bitmap indicate at least has 128 blocks. Now, ext4_validate_block_bitmap() didn't check invalid block's bitmap if set. To resolve above issue, add check like fsck "Padding at end of block bitmap is not set". Reported-by: syzbot+68223fe9f6c95ad43bed@syzkaller.appspotmail.com Signed-off-by: Ye Bin <yebin10@huawei.com> --- fs/ext4/balloc.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)
Comments
On Fri 13-01-23 18:02:05, Ye Bin wrote: > From: Ye Bin <yebin10@huawei.com> > > Syzbot found the following issue: > > EXT4-fs: Warning: mounting with data=journal disables delayed allocation, dioread_nolock, O_DIRECT and fast_commit support! > EXT4-fs (loop0): orphan cleanup on readonly fs > ------------[ cut here ]------------ > WARNING: CPU: 1 PID: 5067 at fs/ext4/mballoc.c:1869 mb_find_extent+0x8a1/0xe30 > Modules linked in: > CPU: 1 PID: 5067 Comm: syz-executor307 Not tainted 6.2.0-rc1-syzkaller #0 > Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/26/2022 > RIP: 0010:mb_find_extent+0x8a1/0xe30 fs/ext4/mballoc.c:1869 > RSP: 0018:ffffc90003c9e098 EFLAGS: 00010293 > RAX: ffffffff82405731 RBX: 0000000000000041 RCX: ffff8880783457c0 > RDX: 0000000000000000 RSI: 0000000000000041 RDI: 0000000000000040 > RBP: 0000000000000040 R08: ffffffff82405723 R09: ffffed10053c9402 > R10: ffffed10053c9402 R11: 1ffff110053c9401 R12: 0000000000000000 > R13: ffffc90003c9e538 R14: dffffc0000000000 R15: ffffc90003c9e2cc > FS: 0000555556665300(0000) GS:ffff8880b9900000(0000) knlGS:0000000000000000 > CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > CR2: 000056312f6796f8 CR3: 0000000022437000 CR4: 00000000003506e0 > DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 > DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 > Call Trace: > <TASK> > ext4_mb_complex_scan_group+0x353/0x1100 fs/ext4/mballoc.c:2307 > ext4_mb_regular_allocator+0x1533/0x3860 fs/ext4/mballoc.c:2735 > ext4_mb_new_blocks+0xddf/0x3db0 fs/ext4/mballoc.c:5605 > ext4_ext_map_blocks+0x1868/0x6880 fs/ext4/extents.c:4286 > ext4_map_blocks+0xa49/0x1cc0 fs/ext4/inode.c:651 > ext4_getblk+0x1b9/0x770 fs/ext4/inode.c:864 > ext4_bread+0x2a/0x170 fs/ext4/inode.c:920 > ext4_quota_write+0x225/0x570 fs/ext4/super.c:7105 > write_blk fs/quota/quota_tree.c:64 [inline] > get_free_dqblk+0x34a/0x6d0 fs/quota/quota_tree.c:130 > do_insert_tree+0x26b/0x1aa0 fs/quota/quota_tree.c:340 > do_insert_tree+0x722/0x1aa0 fs/quota/quota_tree.c:375 > do_insert_tree+0x722/0x1aa0 fs/quota/quota_tree.c:375 > do_insert_tree+0x722/0x1aa0 fs/quota/quota_tree.c:375 > dq_insert_tree fs/quota/quota_tree.c:401 [inline] > qtree_write_dquot+0x3b6/0x530 fs/quota/quota_tree.c:420 > v2_write_dquot+0x11b/0x190 fs/quota/quota_v2.c:358 > dquot_acquire+0x348/0x670 fs/quota/dquot.c:444 > ext4_acquire_dquot+0x2dc/0x400 fs/ext4/super.c:6740 > dqget+0x999/0xdc0 fs/quota/dquot.c:914 > __dquot_initialize+0x3d0/0xcf0 fs/quota/dquot.c:1492 > ext4_process_orphan+0x57/0x2d0 fs/ext4/orphan.c:329 > ext4_orphan_cleanup+0xb60/0x1340 fs/ext4/orphan.c:474 > __ext4_fill_super fs/ext4/super.c:5516 [inline] > ext4_fill_super+0x81cd/0x8700 fs/ext4/super.c:5644 > get_tree_bdev+0x400/0x620 fs/super.c:1282 > vfs_get_tree+0x88/0x270 fs/super.c:1489 > do_new_mount+0x289/0xad0 fs/namespace.c:3145 > do_mount fs/namespace.c:3488 [inline] > __do_sys_mount fs/namespace.c:3697 [inline] > __se_sys_mount+0x2d3/0x3c0 fs/namespace.c:3674 > do_syscall_x64 arch/x86/entry/common.c:50 [inline] > do_syscall_64+0x3d/0xb0 arch/x86/entry/common.c:80 > entry_SYSCALL_64_after_hwframe+0x63/0xcd > > Add some debug information: > mb_find_extent: mb_find_extent block=41, order=0 needed=64 next=0 ex=0/41/1@3735929054 64 64 7 > block_bitmap: ff 3f 0c 00 fc 01 00 00 d2 3d 00 00 00 00 00 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > Acctually, blocks per group is 64, but block bitmap indicate at least has > 128 blocks. Now, ext4_validate_block_bitmap() didn't check invalid block's > bitmap if set. > To resolve above issue, add check like fsck "Padding at end of block bitmap is > not set". > > Reported-by: syzbot+68223fe9f6c95ad43bed@syzkaller.appspotmail.com > Signed-off-by: Ye Bin <yebin10@huawei.com> A few smaller comments below. > diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c > index 8ff4b9192a9f..8c9d3bc712c8 100644 > --- a/fs/ext4/balloc.c > +++ b/fs/ext4/balloc.c > @@ -303,6 +303,23 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block *sb, > return desc; > } > > +static ext4_fsblk_t ext4_valid_block_bitmap_padding(struct super_block *sb, > + ext4_group_t block_group, > + struct buffer_head *bh) > +{ > + ext4_grpblk_t next_zero_bit; > + unsigned long blocksize = EXT4_NUM_B2C(EXT4_SB(sb), > + (sb->s_blocksize * 8)); Maybe call this "bitmap_size" because that's the meaning of the variable AFAIU? Also shouldn't it be just sb->s_blocksize * 8? Because we want the block to be filled with 1's upto the end regardless of a possible cluster size? Honza > + unsigned int offset = num_clusters_in_group(sb, block_group); > + > + if (blocksize <= offset) > + return 0; > + > + next_zero_bit = ext4_find_next_zero_bit(bh->b_data, blocksize, offset); > + > + return (next_zero_bit < blocksize ? next_zero_bit : 0); > +} > + > /* > * Return the block number which was discovered to be invalid, or 0 if > * the block bitmap is valid. > @@ -401,6 +418,15 @@ static int ext4_validate_block_bitmap(struct super_block *sb, > EXT4_GROUP_INFO_BBITMAP_CORRUPT); > return -EFSCORRUPTED; > } > + blk = ext4_valid_block_bitmap_padding(sb, block_group, bh); > + if (unlikely(blk != 0)) { > + ext4_unlock_group(sb, block_group); > + ext4_error(sb, "bg %u: block %llu: padding at end of block bitmap is not set", > + block_group, blk); > + ext4_mark_group_bitmap_corrupted(sb, block_group, > + EXT4_GROUP_INFO_BBITMAP_CORRUPT); > + return -EFSCORRUPTED; > + } > set_buffer_verified(bh); > verified: > ext4_unlock_group(sb, block_group); > -- > 2.31.1 >
On 23/01/13 06:02PM, Ye Bin wrote: > From: Ye Bin <yebin10@huawei.com> > > Syzbot found the following issue: > > EXT4-fs: Warning: mounting with data=journal disables delayed allocation, dioread_nolock, O_DIRECT and fast_commit support! > EXT4-fs (loop0): orphan cleanup on readonly fs > ------------[ cut here ]------------ > WARNING: CPU: 1 PID: 5067 at fs/ext4/mballoc.c:1869 mb_find_extent+0x8a1/0xe30 > Modules linked in: > CPU: 1 PID: 5067 Comm: syz-executor307 Not tainted 6.2.0-rc1-syzkaller #0 > Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/26/2022 > RIP: 0010:mb_find_extent+0x8a1/0xe30 fs/ext4/mballoc.c:1869 > RSP: 0018:ffffc90003c9e098 EFLAGS: 00010293 > RAX: ffffffff82405731 RBX: 0000000000000041 RCX: ffff8880783457c0 > RDX: 0000000000000000 RSI: 0000000000000041 RDI: 0000000000000040 > RBP: 0000000000000040 R08: ffffffff82405723 R09: ffffed10053c9402 > R10: ffffed10053c9402 R11: 1ffff110053c9401 R12: 0000000000000000 > R13: ffffc90003c9e538 R14: dffffc0000000000 R15: ffffc90003c9e2cc > FS: 0000555556665300(0000) GS:ffff8880b9900000(0000) knlGS:0000000000000000 > CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > CR2: 000056312f6796f8 CR3: 0000000022437000 CR4: 00000000003506e0 > DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 > DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 > Call Trace: > <TASK> > ext4_mb_complex_scan_group+0x353/0x1100 fs/ext4/mballoc.c:2307 > ext4_mb_regular_allocator+0x1533/0x3860 fs/ext4/mballoc.c:2735 > ext4_mb_new_blocks+0xddf/0x3db0 fs/ext4/mballoc.c:5605 > ext4_ext_map_blocks+0x1868/0x6880 fs/ext4/extents.c:4286 > ext4_map_blocks+0xa49/0x1cc0 fs/ext4/inode.c:651 > ext4_getblk+0x1b9/0x770 fs/ext4/inode.c:864 > ext4_bread+0x2a/0x170 fs/ext4/inode.c:920 > ext4_quota_write+0x225/0x570 fs/ext4/super.c:7105 > write_blk fs/quota/quota_tree.c:64 [inline] > get_free_dqblk+0x34a/0x6d0 fs/quota/quota_tree.c:130 > do_insert_tree+0x26b/0x1aa0 fs/quota/quota_tree.c:340 > do_insert_tree+0x722/0x1aa0 fs/quota/quota_tree.c:375 > do_insert_tree+0x722/0x1aa0 fs/quota/quota_tree.c:375 > do_insert_tree+0x722/0x1aa0 fs/quota/quota_tree.c:375 > dq_insert_tree fs/quota/quota_tree.c:401 [inline] > qtree_write_dquot+0x3b6/0x530 fs/quota/quota_tree.c:420 > v2_write_dquot+0x11b/0x190 fs/quota/quota_v2.c:358 > dquot_acquire+0x348/0x670 fs/quota/dquot.c:444 > ext4_acquire_dquot+0x2dc/0x400 fs/ext4/super.c:6740 > dqget+0x999/0xdc0 fs/quota/dquot.c:914 > __dquot_initialize+0x3d0/0xcf0 fs/quota/dquot.c:1492 > ext4_process_orphan+0x57/0x2d0 fs/ext4/orphan.c:329 > ext4_orphan_cleanup+0xb60/0x1340 fs/ext4/orphan.c:474 > __ext4_fill_super fs/ext4/super.c:5516 [inline] > ext4_fill_super+0x81cd/0x8700 fs/ext4/super.c:5644 > get_tree_bdev+0x400/0x620 fs/super.c:1282 > vfs_get_tree+0x88/0x270 fs/super.c:1489 > do_new_mount+0x289/0xad0 fs/namespace.c:3145 > do_mount fs/namespace.c:3488 [inline] > __do_sys_mount fs/namespace.c:3697 [inline] > __se_sys_mount+0x2d3/0x3c0 fs/namespace.c:3674 > do_syscall_x64 arch/x86/entry/common.c:50 [inline] > do_syscall_64+0x3d/0xb0 arch/x86/entry/common.c:80 > entry_SYSCALL_64_after_hwframe+0x63/0xcd > So, IIUC from your logs what seems to be happening is, We have s_blocks_per_group = 64 and s_clusters_per_group = 64. That means (s_cluster_ratio = 1). But e4b->bd_blkbits is 12. Since blocksize is 4k. This makes the number of blocks available in a blockgroup as 32768. This is causing a problem in below loop, because when you reach 64th block, it's bitmap is not set and it's order is 0 so you end up adding that into the ex->fe_len. This is happening since we have 64th block bit as not set in e4b->bd_bitmap. mb_find_extent() { <...> while (needed > ex->fe_len && mb_find_buddy(e4b, order, &max)) { if (block + 1 >= max) break; next = (block + 1) * (1 << order); if (mb_test_bit(next, e4b->bd_bitmap)) break; order = mb_find_order_for_block(e4b, next); block = next >> order; ex->fe_len += 1 << order; } <...> Later when the loop exits and compared ex->fe_start + ex->fe_len against EXT4_CLUSTERS_PER_GROUP, it fails and causes the warning. So I think the idea behind -g blocks_per_group in mkfs.ext4 option also is that it will set the remaining blocks in the blockgroup bits to 1 as padded bits? Is this understanding correct? Based on that what you are trying to do here is, you are validating whether the block bitmap has all the padded bits set or not. If not then let's mark this block group as corrupted so that no allocation happens from here to avoid such warning. This was exactly what was hitting in this case due to ext4_quota_write() in the mount path. right? -ritesh > Add some debug information: > mb_find_extent: mb_find_extent block=41, order=0 needed=64 next=0 ex=0/41/1@3735929054 64 64 7 > block_bitmap: ff 3f 0c 00 fc 01 00 00 d2 3d 00 00 00 00 00 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > Acctually, blocks per group is 64, but block bitmap indicate at least has > 128 blocks. Now, ext4_validate_block_bitmap() didn't check invalid block's > bitmap if set. > To resolve above issue, add check like fsck "Padding at end of block bitmap is > not set". > > Reported-by: syzbot+68223fe9f6c95ad43bed@syzkaller.appspotmail.com > Signed-off-by: Ye Bin <yebin10@huawei.com> > --- > fs/ext4/balloc.c | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c > index 8ff4b9192a9f..8c9d3bc712c8 100644 > --- a/fs/ext4/balloc.c > +++ b/fs/ext4/balloc.c > @@ -303,6 +303,23 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block *sb, > return desc; > } > > +static ext4_fsblk_t ext4_valid_block_bitmap_padding(struct super_block *sb, > + ext4_group_t block_group, > + struct buffer_head *bh) > +{ > + ext4_grpblk_t next_zero_bit; > + unsigned long blocksize = EXT4_NUM_B2C(EXT4_SB(sb), > + (sb->s_blocksize * 8)); > + unsigned int offset = num_clusters_in_group(sb, block_group); > + > + if (blocksize <= offset) > + return 0; > + > + next_zero_bit = ext4_find_next_zero_bit(bh->b_data, blocksize, offset); > + > + return (next_zero_bit < blocksize ? next_zero_bit : 0); > +} > + > /* > * Return the block number which was discovered to be invalid, or 0 if > * the block bitmap is valid. > @@ -401,6 +418,15 @@ static int ext4_validate_block_bitmap(struct super_block *sb, > EXT4_GROUP_INFO_BBITMAP_CORRUPT); > return -EFSCORRUPTED; > } > + blk = ext4_valid_block_bitmap_padding(sb, block_group, bh); > + if (unlikely(blk != 0)) { > + ext4_unlock_group(sb, block_group); > + ext4_error(sb, "bg %u: block %llu: padding at end of block bitmap is not set", > + block_group, blk); > + ext4_mark_group_bitmap_corrupted(sb, block_group, > + EXT4_GROUP_INFO_BBITMAP_CORRUPT); > + return -EFSCORRUPTED; > + } > set_buffer_verified(bh); > verified: > ext4_unlock_group(sb, block_group); > -- > 2.31.1 >
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index 8ff4b9192a9f..8c9d3bc712c8 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c @@ -303,6 +303,23 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block *sb, return desc; } +static ext4_fsblk_t ext4_valid_block_bitmap_padding(struct super_block *sb, + ext4_group_t block_group, + struct buffer_head *bh) +{ + ext4_grpblk_t next_zero_bit; + unsigned long blocksize = EXT4_NUM_B2C(EXT4_SB(sb), + (sb->s_blocksize * 8)); + unsigned int offset = num_clusters_in_group(sb, block_group); + + if (blocksize <= offset) + return 0; + + next_zero_bit = ext4_find_next_zero_bit(bh->b_data, blocksize, offset); + + return (next_zero_bit < blocksize ? next_zero_bit : 0); +} + /* * Return the block number which was discovered to be invalid, or 0 if * the block bitmap is valid. @@ -401,6 +418,15 @@ static int ext4_validate_block_bitmap(struct super_block *sb, EXT4_GROUP_INFO_BBITMAP_CORRUPT); return -EFSCORRUPTED; } + blk = ext4_valid_block_bitmap_padding(sb, block_group, bh); + if (unlikely(blk != 0)) { + ext4_unlock_group(sb, block_group); + ext4_error(sb, "bg %u: block %llu: padding at end of block bitmap is not set", + block_group, blk); + ext4_mark_group_bitmap_corrupted(sb, block_group, + EXT4_GROUP_INFO_BBITMAP_CORRUPT); + return -EFSCORRUPTED; + } set_buffer_verified(bh); verified: ext4_unlock_group(sb, block_group);