aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOmar Sandoval <osandov@fb.com>2018-05-22 12:59:50 -0400
committerDavid Sterba <dsterba@suse.com>2018-05-30 15:27:32 -0400
commitad7e1a740d940cf7da1beb332a1095bcda40c747 (patch)
tree61e67aefe0abc6f1d4a06e2d34b6dcad94edff71
parentc5794e51784a0a96dd82e8f955570a7eccf27e5d (diff)
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>
-rw-r--r--fs/btrfs/inode.c33
1 files changed, 14 insertions, 19 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 880431ae5e59..89b208201783 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -9030,8 +9030,7 @@ static int btrfs_truncate(struct inode *inode, bool skip_writeback)
9030 struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); 9030 struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
9031 struct btrfs_root *root = BTRFS_I(inode)->root; 9031 struct btrfs_root *root = BTRFS_I(inode)->root;
9032 struct btrfs_block_rsv *rsv; 9032 struct btrfs_block_rsv *rsv;
9033 int ret = 0; 9033 int ret;
9034 int err = 0;
9035 struct btrfs_trans_handle *trans; 9034 struct btrfs_trans_handle *trans;
9036 u64 mask = fs_info->sectorsize - 1; 9035 u64 mask = fs_info->sectorsize - 1;
9037 u64 min_size = btrfs_calc_trunc_metadata_size(fs_info, 1); 9036 u64 min_size = btrfs_calc_trunc_metadata_size(fs_info, 1);
@@ -9083,7 +9082,7 @@ static int btrfs_truncate(struct inode *inode, bool skip_writeback)
9083 */ 9082 */
9084 trans = btrfs_start_transaction(root, 2); 9083 trans = btrfs_start_transaction(root, 2);
9085 if (IS_ERR(trans)) { 9084 if (IS_ERR(trans)) {
9086 err = PTR_ERR(trans); 9085 ret = PTR_ERR(trans);
9087 goto out; 9086 goto out;
9088 } 9087 }
9089 9088
@@ -9107,24 +9106,19 @@ static int btrfs_truncate(struct inode *inode, bool skip_writeback)
9107 inode->i_size, 9106 inode->i_size,
9108 BTRFS_EXTENT_DATA_KEY); 9107 BTRFS_EXTENT_DATA_KEY);
9109 trans->block_rsv = &fs_info->trans_block_rsv; 9108 trans->block_rsv = &fs_info->trans_block_rsv;
9110 if (ret != -ENOSPC && ret != -EAGAIN) { 9109 if (ret != -ENOSPC && ret != -EAGAIN)
9111 if (ret < 0)
9112 err = ret;
9113 break; 9110 break;
9114 }
9115 9111
9116 ret = btrfs_update_inode(trans, root, inode); 9112 ret = btrfs_update_inode(trans, root, inode);
9117 if (ret) { 9113 if (ret)
9118 err = ret;
9119 break; 9114 break;
9120 }
9121 9115
9122 btrfs_end_transaction(trans); 9116 btrfs_end_transaction(trans);
9123 btrfs_btree_balance_dirty(fs_info); 9117 btrfs_btree_balance_dirty(fs_info);
9124 9118
9125 trans = btrfs_start_transaction(root, 2); 9119 trans = btrfs_start_transaction(root, 2);
9126 if (IS_ERR(trans)) { 9120 if (IS_ERR(trans)) {
9127 ret = err = PTR_ERR(trans); 9121 ret = PTR_ERR(trans);
9128 trans = NULL; 9122 trans = NULL;
9129 break; 9123 break;
9130 } 9124 }
@@ -9158,21 +9152,22 @@ static int btrfs_truncate(struct inode *inode, bool skip_writeback)
9158 } 9152 }
9159 9153
9160 if (trans) { 9154 if (trans) {
9155 int ret2;
9156
9161 trans->block_rsv = &fs_info->trans_block_rsv; 9157 trans->block_rsv = &fs_info->trans_block_rsv;
9162 ret = btrfs_update_inode(trans, root, inode); 9158 ret2 = btrfs_update_inode(trans, root, inode);
9163 if (ret && !err) 9159 if (ret2 && !ret)
9164 err = ret; 9160 ret = ret2;
9165 9161
9166 ret = btrfs_end_transaction(trans); 9162 ret2 = btrfs_end_transaction(trans);
9163 if (ret2 && !ret)
9164 ret = ret2;
9167 btrfs_btree_balance_dirty(fs_info); 9165 btrfs_btree_balance_dirty(fs_info);
9168 } 9166 }
9169out: 9167out:
9170 btrfs_free_block_rsv(fs_info, rsv); 9168 btrfs_free_block_rsv(fs_info, rsv);
9171 9169
9172 if (ret && !err) 9170 return ret;
9173 err = ret;
9174
9175 return err;
9176} 9171}
9177 9172
9178/* 9173/*