diff options
author | Omar Sandoval <osandov@fb.com> | 2018-05-22 12:59:50 -0400 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2018-05-30 15:27:32 -0400 |
commit | ad7e1a740d940cf7da1beb332a1095bcda40c747 (patch) | |
tree | 61e67aefe0abc6f1d4a06e2d34b6dcad94edff71 | |
parent | c5794e51784a0a96dd82e8f955570a7eccf27e5d (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.c | 33 |
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 | } |
9169 | out: | 9167 | out: |
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 | /* |