Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ext4: make ext4_es_insert_delayed_block() return void

Now it never fails when inserting a delay extent, so the return value in
ext4_es_insert_delayed_block is no longer necessary, let it return void.

[ Fixed bug which caused system hangs during bigalloc test runs. See
https://lore.kernel.org/r/20230612030405.GH1436857@mit.edu for more
details. -- TYT ]

Signed-off-by: Baokun Li <libaokun1@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20230424033846.4732-11-libaokun1@huawei.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>

authored by

Baokun Li and committed by
Theodore Ts'o
8782b020 ed5d285b

+11 -20
+4 -6
fs/ext4/extents_status.c
··· 2016 2016 * @lblk - logical block to be added 2017 2017 * @allocated - indicates whether a physical cluster has been allocated for 2018 2018 * the logical cluster that contains the block 2019 - * 2020 - * Returns 0 on success, negative error code on failure. 2021 2019 */ 2022 - int ext4_es_insert_delayed_block(struct inode *inode, ext4_lblk_t lblk, 2023 - bool allocated) 2020 + void ext4_es_insert_delayed_block(struct inode *inode, ext4_lblk_t lblk, 2021 + bool allocated) 2024 2022 { 2025 2023 struct extent_status newes; 2026 2024 int err1 = 0; ··· 2027 2029 struct extent_status *es2 = NULL; 2028 2030 2029 2031 if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY) 2030 - return 0; 2032 + return; 2031 2033 2032 2034 es_debug("add [%u/1) delayed to extent status tree of inode %lu\n", 2033 2035 lblk, inode->i_ino); ··· 2069 2071 2070 2072 ext4_es_print_tree(inode); 2071 2073 ext4_print_pending_tree(inode); 2072 - return 0; 2074 + return; 2073 2075 } 2074 2076 2075 2077 /*
+2 -2
fs/ext4/extents_status.h
··· 249 249 extern void ext4_init_pending_tree(struct ext4_pending_tree *tree); 250 250 extern void ext4_remove_pending(struct inode *inode, ext4_lblk_t lblk); 251 251 extern bool ext4_is_pending(struct inode *inode, ext4_lblk_t lblk); 252 - extern int ext4_es_insert_delayed_block(struct inode *inode, ext4_lblk_t lblk, 253 - bool allocated); 252 + extern void ext4_es_insert_delayed_block(struct inode *inode, ext4_lblk_t lblk, 253 + bool allocated); 254 254 extern unsigned int ext4_es_delayed_clu(struct inode *inode, ext4_lblk_t lblk, 255 255 ext4_lblk_t len); 256 256 extern void ext4_clear_inode_es(struct inode *inode);
+5 -12
fs/ext4/inode.c
··· 1630 1630 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); 1631 1631 int ret; 1632 1632 bool allocated = false; 1633 - bool reserved = false; 1634 1633 1635 1634 /* 1636 1635 * If the cluster containing lblk is shared with a delayed, ··· 1645 1646 if (sbi->s_cluster_ratio == 1) { 1646 1647 ret = ext4_da_reserve_space(inode); 1647 1648 if (ret != 0) /* ENOSPC */ 1648 - goto errout; 1649 - reserved = true; 1649 + return ret; 1650 1650 } else { /* bigalloc */ 1651 1651 if (!ext4_es_scan_clu(inode, &ext4_es_is_delonly, lblk)) { 1652 1652 if (!ext4_es_scan_clu(inode, ··· 1653 1655 ret = ext4_clu_mapped(inode, 1654 1656 EXT4_B2C(sbi, lblk)); 1655 1657 if (ret < 0) 1656 - goto errout; 1658 + return ret; 1657 1659 if (ret == 0) { 1658 1660 ret = ext4_da_reserve_space(inode); 1659 1661 if (ret != 0) /* ENOSPC */ 1660 - goto errout; 1661 - reserved = true; 1662 + return ret; 1662 1663 } else { 1663 1664 allocated = true; 1664 1665 } ··· 1667 1670 } 1668 1671 } 1669 1672 1670 - ret = ext4_es_insert_delayed_block(inode, lblk, allocated); 1671 - if (ret && reserved) 1672 - ext4_da_release_space(inode, 1); 1673 - 1674 - errout: 1675 - return ret; 1673 + ext4_es_insert_delayed_block(inode, lblk, allocated); 1674 + return 0; 1676 1675 } 1677 1676 1678 1677 /*