diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ocfs2/refcounttree.c | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c index dc57d066f794..47df8c5cd3c5 100644 --- a/fs/ocfs2/refcounttree.c +++ b/fs/ocfs2/refcounttree.c | |||
@@ -1147,7 +1147,7 @@ static void ocfs2_refcount_rec_merge(struct ocfs2_refcount_block *rb, | |||
1147 | static int ocfs2_change_refcount_rec(handle_t *handle, | 1147 | static int ocfs2_change_refcount_rec(handle_t *handle, |
1148 | struct ocfs2_caching_info *ci, | 1148 | struct ocfs2_caching_info *ci, |
1149 | struct buffer_head *ref_leaf_bh, | 1149 | struct buffer_head *ref_leaf_bh, |
1150 | int index, int change) | 1150 | int index, int merge, int change) |
1151 | { | 1151 | { |
1152 | int ret; | 1152 | int ret; |
1153 | struct ocfs2_refcount_block *rb = | 1153 | struct ocfs2_refcount_block *rb = |
@@ -1176,7 +1176,7 @@ static int ocfs2_change_refcount_rec(handle_t *handle, | |||
1176 | } | 1176 | } |
1177 | 1177 | ||
1178 | le16_add_cpu(&rl->rl_used, -1); | 1178 | le16_add_cpu(&rl->rl_used, -1); |
1179 | } else | 1179 | } else if (merge) |
1180 | ocfs2_refcount_rec_merge(rb, index); | 1180 | ocfs2_refcount_rec_merge(rb, index); |
1181 | 1181 | ||
1182 | ret = ocfs2_journal_dirty(handle, ref_leaf_bh); | 1182 | ret = ocfs2_journal_dirty(handle, ref_leaf_bh); |
@@ -1652,7 +1652,7 @@ static int ocfs2_insert_refcount_rec(handle_t *handle, | |||
1652 | struct buffer_head *ref_root_bh, | 1652 | struct buffer_head *ref_root_bh, |
1653 | struct buffer_head *ref_leaf_bh, | 1653 | struct buffer_head *ref_leaf_bh, |
1654 | struct ocfs2_refcount_rec *rec, | 1654 | struct ocfs2_refcount_rec *rec, |
1655 | int index, | 1655 | int index, int merge, |
1656 | struct ocfs2_alloc_context *meta_ac) | 1656 | struct ocfs2_alloc_context *meta_ac) |
1657 | { | 1657 | { |
1658 | int ret; | 1658 | int ret; |
@@ -1710,7 +1710,8 @@ static int ocfs2_insert_refcount_rec(handle_t *handle, | |||
1710 | 1710 | ||
1711 | le16_add_cpu(&rf_list->rl_used, 1); | 1711 | le16_add_cpu(&rf_list->rl_used, 1); |
1712 | 1712 | ||
1713 | ocfs2_refcount_rec_merge(rb, index); | 1713 | if (merge) |
1714 | ocfs2_refcount_rec_merge(rb, index); | ||
1714 | 1715 | ||
1715 | ret = ocfs2_journal_dirty(handle, ref_leaf_bh); | 1716 | ret = ocfs2_journal_dirty(handle, ref_leaf_bh); |
1716 | if (ret) { | 1717 | if (ret) { |
@@ -1744,7 +1745,7 @@ static int ocfs2_split_refcount_rec(handle_t *handle, | |||
1744 | struct buffer_head *ref_root_bh, | 1745 | struct buffer_head *ref_root_bh, |
1745 | struct buffer_head *ref_leaf_bh, | 1746 | struct buffer_head *ref_leaf_bh, |
1746 | struct ocfs2_refcount_rec *split_rec, | 1747 | struct ocfs2_refcount_rec *split_rec, |
1747 | int index, | 1748 | int index, int merge, |
1748 | struct ocfs2_alloc_context *meta_ac, | 1749 | struct ocfs2_alloc_context *meta_ac, |
1749 | struct ocfs2_cached_dealloc_ctxt *dealloc) | 1750 | struct ocfs2_cached_dealloc_ctxt *dealloc) |
1750 | { | 1751 | { |
@@ -1882,7 +1883,8 @@ static int ocfs2_split_refcount_rec(handle_t *handle, | |||
1882 | le32_to_cpu(split_rec->r_refcount), | 1883 | le32_to_cpu(split_rec->r_refcount), |
1883 | (unsigned long long)ref_leaf_bh->b_blocknr, index); | 1884 | (unsigned long long)ref_leaf_bh->b_blocknr, index); |
1884 | 1885 | ||
1885 | ocfs2_refcount_rec_merge(rb, index); | 1886 | if (merge) |
1887 | ocfs2_refcount_rec_merge(rb, index); | ||
1886 | } | 1888 | } |
1887 | 1889 | ||
1888 | ret = ocfs2_journal_dirty(handle, ref_leaf_bh); | 1890 | ret = ocfs2_journal_dirty(handle, ref_leaf_bh); |
@@ -1894,12 +1896,12 @@ out: | |||
1894 | return ret; | 1896 | return ret; |
1895 | } | 1897 | } |
1896 | 1898 | ||
1897 | int ocfs2_increase_refcount(handle_t *handle, | 1899 | static int __ocfs2_increase_refcount(handle_t *handle, |
1898 | struct ocfs2_caching_info *ci, | 1900 | struct ocfs2_caching_info *ci, |
1899 | struct buffer_head *ref_root_bh, | 1901 | struct buffer_head *ref_root_bh, |
1900 | u64 cpos, u32 len, | 1902 | u64 cpos, u32 len, int merge, |
1901 | struct ocfs2_alloc_context *meta_ac, | 1903 | struct ocfs2_alloc_context *meta_ac, |
1902 | struct ocfs2_cached_dealloc_ctxt *dealloc) | 1904 | struct ocfs2_cached_dealloc_ctxt *dealloc) |
1903 | { | 1905 | { |
1904 | int ret = 0, index; | 1906 | int ret = 0, index; |
1905 | struct buffer_head *ref_leaf_bh = NULL; | 1907 | struct buffer_head *ref_leaf_bh = NULL; |
@@ -1937,7 +1939,8 @@ int ocfs2_increase_refcount(handle_t *handle, | |||
1937 | "count %u\n", (unsigned long long)cpos, set_len, | 1939 | "count %u\n", (unsigned long long)cpos, set_len, |
1938 | le32_to_cpu(rec.r_refcount)); | 1940 | le32_to_cpu(rec.r_refcount)); |
1939 | ret = ocfs2_change_refcount_rec(handle, ci, | 1941 | ret = ocfs2_change_refcount_rec(handle, ci, |
1940 | ref_leaf_bh, index, 1); | 1942 | ref_leaf_bh, index, |
1943 | merge, 1); | ||
1941 | if (ret) { | 1944 | if (ret) { |
1942 | mlog_errno(ret); | 1945 | mlog_errno(ret); |
1943 | goto out; | 1946 | goto out; |
@@ -1950,7 +1953,8 @@ int ocfs2_increase_refcount(handle_t *handle, | |||
1950 | set_len); | 1953 | set_len); |
1951 | ret = ocfs2_insert_refcount_rec(handle, ci, ref_root_bh, | 1954 | ret = ocfs2_insert_refcount_rec(handle, ci, ref_root_bh, |
1952 | ref_leaf_bh, | 1955 | ref_leaf_bh, |
1953 | &rec, index, meta_ac); | 1956 | &rec, index, |
1957 | merge, meta_ac); | ||
1954 | if (ret) { | 1958 | if (ret) { |
1955 | mlog_errno(ret); | 1959 | mlog_errno(ret); |
1956 | goto out; | 1960 | goto out; |
@@ -1968,7 +1972,7 @@ int ocfs2_increase_refcount(handle_t *handle, | |||
1968 | set_len, le32_to_cpu(rec.r_refcount)); | 1972 | set_len, le32_to_cpu(rec.r_refcount)); |
1969 | ret = ocfs2_split_refcount_rec(handle, ci, | 1973 | ret = ocfs2_split_refcount_rec(handle, ci, |
1970 | ref_root_bh, ref_leaf_bh, | 1974 | ref_root_bh, ref_leaf_bh, |
1971 | &rec, index, | 1975 | &rec, index, merge, |
1972 | meta_ac, dealloc); | 1976 | meta_ac, dealloc); |
1973 | if (ret) { | 1977 | if (ret) { |
1974 | mlog_errno(ret); | 1978 | mlog_errno(ret); |
@@ -2061,6 +2065,18 @@ out: | |||
2061 | return ret; | 2065 | return ret; |
2062 | } | 2066 | } |
2063 | 2067 | ||
2068 | int ocfs2_increase_refcount(handle_t *handle, | ||
2069 | struct ocfs2_caching_info *ci, | ||
2070 | struct buffer_head *ref_root_bh, | ||
2071 | u64 cpos, u32 len, | ||
2072 | struct ocfs2_alloc_context *meta_ac, | ||
2073 | struct ocfs2_cached_dealloc_ctxt *dealloc) | ||
2074 | { | ||
2075 | return __ocfs2_increase_refcount(handle, ci, ref_root_bh, | ||
2076 | cpos, len, 1, | ||
2077 | meta_ac, dealloc); | ||
2078 | } | ||
2079 | |||
2064 | static int ocfs2_decrease_refcount_rec(handle_t *handle, | 2080 | static int ocfs2_decrease_refcount_rec(handle_t *handle, |
2065 | struct ocfs2_caching_info *ci, | 2081 | struct ocfs2_caching_info *ci, |
2066 | struct buffer_head *ref_root_bh, | 2082 | struct buffer_head *ref_root_bh, |
@@ -2081,7 +2097,7 @@ static int ocfs2_decrease_refcount_rec(handle_t *handle, | |||
2081 | if (cpos == le64_to_cpu(rec->r_cpos) && | 2097 | if (cpos == le64_to_cpu(rec->r_cpos) && |
2082 | len == le32_to_cpu(rec->r_clusters)) | 2098 | len == le32_to_cpu(rec->r_clusters)) |
2083 | ret = ocfs2_change_refcount_rec(handle, ci, | 2099 | ret = ocfs2_change_refcount_rec(handle, ci, |
2084 | ref_leaf_bh, index, -1); | 2100 | ref_leaf_bh, index, 1, -1); |
2085 | else { | 2101 | else { |
2086 | struct ocfs2_refcount_rec split = *rec; | 2102 | struct ocfs2_refcount_rec split = *rec; |
2087 | split.r_cpos = cpu_to_le64(cpos); | 2103 | split.r_cpos = cpu_to_le64(cpos); |
@@ -2097,7 +2113,7 @@ static int ocfs2_decrease_refcount_rec(handle_t *handle, | |||
2097 | le32_to_cpu(rec->r_clusters)); | 2113 | le32_to_cpu(rec->r_clusters)); |
2098 | ret = ocfs2_split_refcount_rec(handle, ci, | 2114 | ret = ocfs2_split_refcount_rec(handle, ci, |
2099 | ref_root_bh, ref_leaf_bh, | 2115 | ref_root_bh, ref_leaf_bh, |
2100 | &split, index, | 2116 | &split, index, 1, |
2101 | meta_ac, dealloc); | 2117 | meta_ac, dealloc); |
2102 | } | 2118 | } |
2103 | 2119 | ||
@@ -3631,9 +3647,9 @@ int ocfs2_add_refcount_flag(struct inode *inode, | |||
3631 | goto out_commit; | 3647 | goto out_commit; |
3632 | } | 3648 | } |
3633 | 3649 | ||
3634 | ret = ocfs2_increase_refcount(handle, ref_ci, ref_root_bh, | 3650 | ret = __ocfs2_increase_refcount(handle, ref_ci, ref_root_bh, |
3635 | p_cluster, num_clusters, | 3651 | p_cluster, num_clusters, 0, |
3636 | meta_ac, dealloc); | 3652 | meta_ac, dealloc); |
3637 | if (ret) { | 3653 | if (ret) { |
3638 | mlog_errno(ret); | 3654 | mlog_errno(ret); |
3639 | goto out_commit; | 3655 | goto out_commit; |