diff options
| author | Wang Shilong <wangsl-fnst@cn.fujitsu.com> | 2013-03-01 06:36:01 -0500 |
|---|---|---|
| committer | Josef Bacik <jbacik@fusionio.com> | 2013-03-01 10:13:04 -0500 |
| commit | 88e081bf82ffcb9be3ad33d04c829051d66da564 (patch) | |
| tree | 32a05e25761a097e0cdbf0c6bf215c47ef9e96a1 | |
| parent | a9870c0e031527fbfa382019f30d2e9b98124a0d (diff) | |
Btrfs: cleanup to make the function btrfs_delalloc_reserve_metadata more logic
The original code is a little confusing and not clear, The right
way to deal with the kernel code like this:
[...]
if (ret)
goto out;
[...]
So i move the common clean_up code to the place labeled with
out_fail, this will be easier to maintain.
Signed-off-by: Wang Shilong <wangsl-fnst@cn.fujitsu.com>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
| -rw-r--r-- | fs/btrfs/extent-tree.c | 82 |
1 files changed, 38 insertions, 44 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 075854e7a044..aaee2b7fee78 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -4721,6 +4721,8 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
| 4721 | enum btrfs_reserve_flush_enum flush = BTRFS_RESERVE_FLUSH_ALL; | 4721 | enum btrfs_reserve_flush_enum flush = BTRFS_RESERVE_FLUSH_ALL; |
| 4722 | int ret = 0; | 4722 | int ret = 0; |
| 4723 | bool delalloc_lock = true; | 4723 | bool delalloc_lock = true; |
| 4724 | u64 to_free = 0; | ||
| 4725 | unsigned dropped; | ||
| 4724 | 4726 | ||
| 4725 | /* If we are a free space inode we need to not flush since we will be in | 4727 | /* If we are a free space inode we need to not flush since we will be in |
| 4726 | * the middle of a transaction commit. We also don't need the delalloc | 4728 | * the middle of a transaction commit. We also don't need the delalloc |
| @@ -4764,55 +4766,19 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
| 4764 | csum_bytes = BTRFS_I(inode)->csum_bytes; | 4766 | csum_bytes = BTRFS_I(inode)->csum_bytes; |
| 4765 | spin_unlock(&BTRFS_I(inode)->lock); | 4767 | spin_unlock(&BTRFS_I(inode)->lock); |
| 4766 | 4768 | ||
| 4767 | if (root->fs_info->quota_enabled) | 4769 | if (root->fs_info->quota_enabled) { |
| 4768 | ret = btrfs_qgroup_reserve(root, num_bytes + | 4770 | ret = btrfs_qgroup_reserve(root, num_bytes + |
| 4769 | nr_extents * root->leafsize); | 4771 | nr_extents * root->leafsize); |
| 4772 | if (ret) | ||
| 4773 | goto out_fail; | ||
| 4774 | } | ||
| 4770 | 4775 | ||
| 4771 | /* | 4776 | ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush); |
| 4772 | * ret != 0 here means the qgroup reservation failed, we go straight to | 4777 | if (unlikely(ret)) { |
| 4773 | * the shared error handling then. | 4778 | if (root->fs_info->quota_enabled) |
| 4774 | */ | ||
| 4775 | if (ret == 0) { | ||
| 4776 | ret = reserve_metadata_bytes(root, block_rsv, | ||
| 4777 | to_reserve, flush); | ||
| 4778 | if (ret && root->fs_info->quota_enabled) { | ||
| 4779 | btrfs_qgroup_free(root, num_bytes + | 4779 | btrfs_qgroup_free(root, num_bytes + |
| 4780 | nr_extents * root->leafsize); | 4780 | nr_extents * root->leafsize); |
| 4781 | } | 4781 | goto out_fail; |
| 4782 | } | ||
| 4783 | |||
| 4784 | if (ret) { | ||
| 4785 | u64 to_free = 0; | ||
| 4786 | unsigned dropped; | ||
| 4787 | |||
| 4788 | spin_lock(&BTRFS_I(inode)->lock); | ||
| 4789 | dropped = drop_outstanding_extent(inode); | ||
| 4790 | /* | ||
| 4791 | * If the inodes csum_bytes is the same as the original | ||
| 4792 | * csum_bytes then we know we haven't raced with any free()ers | ||
| 4793 | * so we can just reduce our inodes csum bytes and carry on. | ||
| 4794 | * Otherwise we have to do the normal free thing to account for | ||
| 4795 | * the case that the free side didn't free up its reserve | ||
| 4796 | * because of this outstanding reservation. | ||
| 4797 | */ | ||
| 4798 | if (BTRFS_I(inode)->csum_bytes == csum_bytes) | ||
| 4799 | calc_csum_metadata_size(inode, num_bytes, 0); | ||
| 4800 | else | ||
| 4801 | to_free = calc_csum_metadata_size(inode, num_bytes, 0); | ||
| 4802 | spin_unlock(&BTRFS_I(inode)->lock); | ||
| 4803 | if (dropped) | ||
| 4804 | to_free += btrfs_calc_trans_metadata_size(root, dropped); | ||
| 4805 | |||
| 4806 | if (to_free) { | ||
| 4807 | btrfs_block_rsv_release(root, block_rsv, to_free); | ||
| 4808 | trace_btrfs_space_reservation(root->fs_info, | ||
| 4809 | "delalloc", | ||
| 4810 | btrfs_ino(inode), | ||
| 4811 | to_free, 0); | ||
| 4812 | } | ||
| 4813 | if (delalloc_lock) | ||
| 4814 | mutex_unlock(&BTRFS_I(inode)->delalloc_mutex); | ||
| 4815 | return ret; | ||
| 4816 | } | 4782 | } |
| 4817 | 4783 | ||
| 4818 | spin_lock(&BTRFS_I(inode)->lock); | 4784 | spin_lock(&BTRFS_I(inode)->lock); |
| @@ -4833,6 +4799,34 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
| 4833 | block_rsv_add_bytes(block_rsv, to_reserve, 1); | 4799 | block_rsv_add_bytes(block_rsv, to_reserve, 1); |
| 4834 | 4800 | ||
| 4835 | return 0; | 4801 | return 0; |
| 4802 | |||
| 4803 | out_fail: | ||
| 4804 | spin_lock(&BTRFS_I(inode)->lock); | ||
| 4805 | dropped = drop_outstanding_extent(inode); | ||
| 4806 | /* | ||
| 4807 | * If the inodes csum_bytes is the same as the original | ||
| 4808 | * csum_bytes then we know we haven't raced with any free()ers | ||
| 4809 | * so we can just reduce our inodes csum bytes and carry on. | ||
| 4810 | * Otherwise we have to do the normal free thing to account for | ||
| 4811 | * the case that the free side didn't free up its reserve | ||
| 4812 | * because of this outstanding reservation. | ||
| 4813 | */ | ||
| 4814 | if (BTRFS_I(inode)->csum_bytes == csum_bytes) | ||
| 4815 | calc_csum_metadata_size(inode, num_bytes, 0); | ||
| 4816 | else | ||
| 4817 | to_free = calc_csum_metadata_size(inode, num_bytes, 0); | ||
| 4818 | spin_unlock(&BTRFS_I(inode)->lock); | ||
| 4819 | if (dropped) | ||
| 4820 | to_free += btrfs_calc_trans_metadata_size(root, dropped); | ||
| 4821 | |||
| 4822 | if (to_free) { | ||
| 4823 | btrfs_block_rsv_release(root, block_rsv, to_free); | ||
| 4824 | trace_btrfs_space_reservation(root->fs_info, "delalloc", | ||
| 4825 | btrfs_ino(inode), to_free, 0); | ||
| 4826 | } | ||
| 4827 | if (delalloc_lock) | ||
| 4828 | mutex_unlock(&BTRFS_I(inode)->delalloc_mutex); | ||
| 4829 | return ret; | ||
| 4836 | } | 4830 | } |
| 4837 | 4831 | ||
| 4838 | /** | 4832 | /** |
