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

Btrfs: clean up error handling in btrfs_truncate()

btrfs_truncate() uses two variables for error handling, ret and err (if
this sounds familiar, it's because btrfs_truncate_inode_items() did
something similar). This is error prone, as was made evident by "Btrfs:
fix error handling in btrfs_truncate()". We only have err because we
don't want to mask an error if we call btrfs_update_inode() and
btrfs_end_transaction(), so let's make that its own scoped return
variable and use ret everywhere else.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: David Sterba <dsterba@suse.com>

authored by

Omar Sandoval and committed by
David Sterba
ad7e1a74 c5794e51

+15 -20
+15 -20
fs/btrfs/inode.c
··· 9030 9030 struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); 9031 9031 struct btrfs_root *root = BTRFS_I(inode)->root; 9032 9032 struct btrfs_block_rsv *rsv; 9033 - int ret = 0; 9034 - int err = 0; 9033 + int ret; 9035 9034 struct btrfs_trans_handle *trans; 9036 9035 u64 mask = fs_info->sectorsize - 1; 9037 9036 u64 min_size = btrfs_calc_trunc_metadata_size(fs_info, 1); ··· 9082 9083 */ 9083 9084 trans = btrfs_start_transaction(root, 2); 9084 9085 if (IS_ERR(trans)) { 9085 - err = PTR_ERR(trans); 9086 + ret = PTR_ERR(trans); 9086 9087 goto out; 9087 9088 } 9088 9089 ··· 9106 9107 inode->i_size, 9107 9108 BTRFS_EXTENT_DATA_KEY); 9108 9109 trans->block_rsv = &fs_info->trans_block_rsv; 9109 - if (ret != -ENOSPC && ret != -EAGAIN) { 9110 - if (ret < 0) 9111 - err = ret; 9110 + if (ret != -ENOSPC && ret != -EAGAIN) 9112 9111 break; 9113 - } 9114 9112 9115 9113 ret = btrfs_update_inode(trans, root, inode); 9116 - if (ret) { 9117 - err = ret; 9114 + if (ret) 9118 9115 break; 9119 - } 9120 9116 9121 9117 btrfs_end_transaction(trans); 9122 9118 btrfs_btree_balance_dirty(fs_info); 9123 9119 9124 9120 trans = btrfs_start_transaction(root, 2); 9125 9121 if (IS_ERR(trans)) { 9126 - ret = err = PTR_ERR(trans); 9122 + ret = PTR_ERR(trans); 9127 9123 trans = NULL; 9128 9124 break; 9129 9125 } ··· 9152 9158 } 9153 9159 9154 9160 if (trans) { 9155 - trans->block_rsv = &fs_info->trans_block_rsv; 9156 - ret = btrfs_update_inode(trans, root, inode); 9157 - if (ret && !err) 9158 - err = ret; 9161 + int ret2; 9159 9162 9160 - ret = btrfs_end_transaction(trans); 9163 + trans->block_rsv = &fs_info->trans_block_rsv; 9164 + ret2 = btrfs_update_inode(trans, root, inode); 9165 + if (ret2 && !ret) 9166 + ret = ret2; 9167 + 9168 + ret2 = btrfs_end_transaction(trans); 9169 + if (ret2 && !ret) 9170 + ret = ret2; 9161 9171 btrfs_btree_balance_dirty(fs_info); 9162 9172 } 9163 9173 out: 9164 9174 btrfs_free_block_rsv(fs_info, rsv); 9165 9175 9166 - if (ret && !err) 9167 - err = ret; 9168 - 9169 - return err; 9176 + return ret; 9170 9177 } 9171 9178 9172 9179 /*