diff options
Diffstat (limited to 'fs/ocfs2/alloc.c')
-rw-r--r-- | fs/ocfs2/alloc.c | 908 |
1 files changed, 219 insertions, 689 deletions
diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c index 9f8bd913c51e..215e12ce1d85 100644 --- a/fs/ocfs2/alloc.c +++ b/fs/ocfs2/alloc.c | |||
@@ -1006,7 +1006,7 @@ static int ocfs2_create_new_meta_bhs(handle_t *handle, | |||
1006 | int count, status, i; | 1006 | int count, status, i; |
1007 | u16 suballoc_bit_start; | 1007 | u16 suballoc_bit_start; |
1008 | u32 num_got; | 1008 | u32 num_got; |
1009 | u64 first_blkno; | 1009 | u64 suballoc_loc, first_blkno; |
1010 | struct ocfs2_super *osb = | 1010 | struct ocfs2_super *osb = |
1011 | OCFS2_SB(ocfs2_metadata_cache_get_super(et->et_ci)); | 1011 | OCFS2_SB(ocfs2_metadata_cache_get_super(et->et_ci)); |
1012 | struct ocfs2_extent_block *eb; | 1012 | struct ocfs2_extent_block *eb; |
@@ -1015,10 +1015,10 @@ static int ocfs2_create_new_meta_bhs(handle_t *handle, | |||
1015 | 1015 | ||
1016 | count = 0; | 1016 | count = 0; |
1017 | while (count < wanted) { | 1017 | while (count < wanted) { |
1018 | status = ocfs2_claim_metadata(osb, | 1018 | status = ocfs2_claim_metadata(handle, |
1019 | handle, | ||
1020 | meta_ac, | 1019 | meta_ac, |
1021 | wanted - count, | 1020 | wanted - count, |
1021 | &suballoc_loc, | ||
1022 | &suballoc_bit_start, | 1022 | &suballoc_bit_start, |
1023 | &num_got, | 1023 | &num_got, |
1024 | &first_blkno); | 1024 | &first_blkno); |
@@ -1052,6 +1052,7 @@ static int ocfs2_create_new_meta_bhs(handle_t *handle, | |||
1052 | eb->h_fs_generation = cpu_to_le32(osb->fs_generation); | 1052 | eb->h_fs_generation = cpu_to_le32(osb->fs_generation); |
1053 | eb->h_suballoc_slot = | 1053 | eb->h_suballoc_slot = |
1054 | cpu_to_le16(meta_ac->ac_alloc_slot); | 1054 | cpu_to_le16(meta_ac->ac_alloc_slot); |
1055 | eb->h_suballoc_loc = cpu_to_le64(suballoc_loc); | ||
1055 | eb->h_suballoc_bit = cpu_to_le16(suballoc_bit_start); | 1056 | eb->h_suballoc_bit = cpu_to_le16(suballoc_bit_start); |
1056 | eb->h_list.l_count = | 1057 | eb->h_list.l_count = |
1057 | cpu_to_le16(ocfs2_extent_recs_per_eb(osb->sb)); | 1058 | cpu_to_le16(ocfs2_extent_recs_per_eb(osb->sb)); |
@@ -1061,11 +1062,7 @@ static int ocfs2_create_new_meta_bhs(handle_t *handle, | |||
1061 | 1062 | ||
1062 | /* We'll also be dirtied by the caller, so | 1063 | /* We'll also be dirtied by the caller, so |
1063 | * this isn't absolutely necessary. */ | 1064 | * this isn't absolutely necessary. */ |
1064 | status = ocfs2_journal_dirty(handle, bhs[i]); | 1065 | ocfs2_journal_dirty(handle, bhs[i]); |
1065 | if (status < 0) { | ||
1066 | mlog_errno(status); | ||
1067 | goto bail; | ||
1068 | } | ||
1069 | } | 1066 | } |
1070 | 1067 | ||
1071 | count += num_got; | 1068 | count += num_got; |
@@ -1129,8 +1126,7 @@ static int ocfs2_adjust_rightmost_branch(handle_t *handle, | |||
1129 | goto out; | 1126 | goto out; |
1130 | } | 1127 | } |
1131 | 1128 | ||
1132 | status = ocfs2_extend_trans(handle, path_num_items(path) + | 1129 | status = ocfs2_extend_trans(handle, path_num_items(path)); |
1133 | handle->h_buffer_credits); | ||
1134 | if (status < 0) { | 1130 | if (status < 0) { |
1135 | mlog_errno(status); | 1131 | mlog_errno(status); |
1136 | goto out; | 1132 | goto out; |
@@ -1270,12 +1266,7 @@ static int ocfs2_add_branch(handle_t *handle, | |||
1270 | if (!eb_el->l_tree_depth) | 1266 | if (!eb_el->l_tree_depth) |
1271 | new_last_eb_blk = le64_to_cpu(eb->h_blkno); | 1267 | new_last_eb_blk = le64_to_cpu(eb->h_blkno); |
1272 | 1268 | ||
1273 | status = ocfs2_journal_dirty(handle, bh); | 1269 | ocfs2_journal_dirty(handle, bh); |
1274 | if (status < 0) { | ||
1275 | mlog_errno(status); | ||
1276 | goto bail; | ||
1277 | } | ||
1278 | |||
1279 | next_blkno = le64_to_cpu(eb->h_blkno); | 1270 | next_blkno = le64_to_cpu(eb->h_blkno); |
1280 | } | 1271 | } |
1281 | 1272 | ||
@@ -1321,17 +1312,10 @@ static int ocfs2_add_branch(handle_t *handle, | |||
1321 | eb = (struct ocfs2_extent_block *) (*last_eb_bh)->b_data; | 1312 | eb = (struct ocfs2_extent_block *) (*last_eb_bh)->b_data; |
1322 | eb->h_next_leaf_blk = cpu_to_le64(new_last_eb_blk); | 1313 | eb->h_next_leaf_blk = cpu_to_le64(new_last_eb_blk); |
1323 | 1314 | ||
1324 | status = ocfs2_journal_dirty(handle, *last_eb_bh); | 1315 | ocfs2_journal_dirty(handle, *last_eb_bh); |
1325 | if (status < 0) | 1316 | ocfs2_journal_dirty(handle, et->et_root_bh); |
1326 | mlog_errno(status); | 1317 | if (eb_bh) |
1327 | status = ocfs2_journal_dirty(handle, et->et_root_bh); | 1318 | ocfs2_journal_dirty(handle, eb_bh); |
1328 | if (status < 0) | ||
1329 | mlog_errno(status); | ||
1330 | if (eb_bh) { | ||
1331 | status = ocfs2_journal_dirty(handle, eb_bh); | ||
1332 | if (status < 0) | ||
1333 | mlog_errno(status); | ||
1334 | } | ||
1335 | 1319 | ||
1336 | /* | 1320 | /* |
1337 | * Some callers want to track the rightmost leaf so pass it | 1321 | * Some callers want to track the rightmost leaf so pass it |
@@ -1399,11 +1383,7 @@ static int ocfs2_shift_tree_depth(handle_t *handle, | |||
1399 | for (i = 0; i < le16_to_cpu(root_el->l_next_free_rec); i++) | 1383 | for (i = 0; i < le16_to_cpu(root_el->l_next_free_rec); i++) |
1400 | eb_el->l_recs[i] = root_el->l_recs[i]; | 1384 | eb_el->l_recs[i] = root_el->l_recs[i]; |
1401 | 1385 | ||
1402 | status = ocfs2_journal_dirty(handle, new_eb_bh); | 1386 | ocfs2_journal_dirty(handle, new_eb_bh); |
1403 | if (status < 0) { | ||
1404 | mlog_errno(status); | ||
1405 | goto bail; | ||
1406 | } | ||
1407 | 1387 | ||
1408 | status = ocfs2_et_root_journal_access(handle, et, | 1388 | status = ocfs2_et_root_journal_access(handle, et, |
1409 | OCFS2_JOURNAL_ACCESS_WRITE); | 1389 | OCFS2_JOURNAL_ACCESS_WRITE); |
@@ -1428,11 +1408,7 @@ static int ocfs2_shift_tree_depth(handle_t *handle, | |||
1428 | if (root_el->l_tree_depth == cpu_to_le16(1)) | 1408 | if (root_el->l_tree_depth == cpu_to_le16(1)) |
1429 | ocfs2_et_set_last_eb_blk(et, le64_to_cpu(eb->h_blkno)); | 1409 | ocfs2_et_set_last_eb_blk(et, le64_to_cpu(eb->h_blkno)); |
1430 | 1410 | ||
1431 | status = ocfs2_journal_dirty(handle, et->et_root_bh); | 1411 | ocfs2_journal_dirty(handle, et->et_root_bh); |
1432 | if (status < 0) { | ||
1433 | mlog_errno(status); | ||
1434 | goto bail; | ||
1435 | } | ||
1436 | 1412 | ||
1437 | *ret_new_eb_bh = new_eb_bh; | 1413 | *ret_new_eb_bh = new_eb_bh; |
1438 | new_eb_bh = NULL; | 1414 | new_eb_bh = NULL; |
@@ -2064,7 +2040,7 @@ static void ocfs2_complete_edge_insert(handle_t *handle, | |||
2064 | struct ocfs2_path *right_path, | 2040 | struct ocfs2_path *right_path, |
2065 | int subtree_index) | 2041 | int subtree_index) |
2066 | { | 2042 | { |
2067 | int ret, i, idx; | 2043 | int i, idx; |
2068 | struct ocfs2_extent_list *el, *left_el, *right_el; | 2044 | struct ocfs2_extent_list *el, *left_el, *right_el; |
2069 | struct ocfs2_extent_rec *left_rec, *right_rec; | 2045 | struct ocfs2_extent_rec *left_rec, *right_rec; |
2070 | struct buffer_head *root_bh = left_path->p_node[subtree_index].bh; | 2046 | struct buffer_head *root_bh = left_path->p_node[subtree_index].bh; |
@@ -2102,13 +2078,8 @@ static void ocfs2_complete_edge_insert(handle_t *handle, | |||
2102 | ocfs2_adjust_adjacent_records(left_rec, left_el, right_rec, | 2078 | ocfs2_adjust_adjacent_records(left_rec, left_el, right_rec, |
2103 | right_el); | 2079 | right_el); |
2104 | 2080 | ||
2105 | ret = ocfs2_journal_dirty(handle, left_path->p_node[i].bh); | 2081 | ocfs2_journal_dirty(handle, left_path->p_node[i].bh); |
2106 | if (ret) | 2082 | ocfs2_journal_dirty(handle, right_path->p_node[i].bh); |
2107 | mlog_errno(ret); | ||
2108 | |||
2109 | ret = ocfs2_journal_dirty(handle, right_path->p_node[i].bh); | ||
2110 | if (ret) | ||
2111 | mlog_errno(ret); | ||
2112 | 2083 | ||
2113 | /* | 2084 | /* |
2114 | * Setup our list pointers now so that the current | 2085 | * Setup our list pointers now so that the current |
@@ -2132,9 +2103,7 @@ static void ocfs2_complete_edge_insert(handle_t *handle, | |||
2132 | 2103 | ||
2133 | root_bh = left_path->p_node[subtree_index].bh; | 2104 | root_bh = left_path->p_node[subtree_index].bh; |
2134 | 2105 | ||
2135 | ret = ocfs2_journal_dirty(handle, root_bh); | 2106 | ocfs2_journal_dirty(handle, root_bh); |
2136 | if (ret) | ||
2137 | mlog_errno(ret); | ||
2138 | } | 2107 | } |
2139 | 2108 | ||
2140 | static int ocfs2_rotate_subtree_right(handle_t *handle, | 2109 | static int ocfs2_rotate_subtree_right(handle_t *handle, |
@@ -2207,11 +2176,7 @@ static int ocfs2_rotate_subtree_right(handle_t *handle, | |||
2207 | 2176 | ||
2208 | ocfs2_create_empty_extent(right_el); | 2177 | ocfs2_create_empty_extent(right_el); |
2209 | 2178 | ||
2210 | ret = ocfs2_journal_dirty(handle, right_leaf_bh); | 2179 | ocfs2_journal_dirty(handle, right_leaf_bh); |
2211 | if (ret) { | ||
2212 | mlog_errno(ret); | ||
2213 | goto out; | ||
2214 | } | ||
2215 | 2180 | ||
2216 | /* Do the copy now. */ | 2181 | /* Do the copy now. */ |
2217 | i = le16_to_cpu(left_el->l_next_free_rec) - 1; | 2182 | i = le16_to_cpu(left_el->l_next_free_rec) - 1; |
@@ -2230,11 +2195,7 @@ static int ocfs2_rotate_subtree_right(handle_t *handle, | |||
2230 | memset(&left_el->l_recs[0], 0, sizeof(struct ocfs2_extent_rec)); | 2195 | memset(&left_el->l_recs[0], 0, sizeof(struct ocfs2_extent_rec)); |
2231 | le16_add_cpu(&left_el->l_next_free_rec, 1); | 2196 | le16_add_cpu(&left_el->l_next_free_rec, 1); |
2232 | 2197 | ||
2233 | ret = ocfs2_journal_dirty(handle, left_leaf_bh); | 2198 | ocfs2_journal_dirty(handle, left_leaf_bh); |
2234 | if (ret) { | ||
2235 | mlog_errno(ret); | ||
2236 | goto out; | ||
2237 | } | ||
2238 | 2199 | ||
2239 | ocfs2_complete_edge_insert(handle, left_path, right_path, | 2200 | ocfs2_complete_edge_insert(handle, left_path, right_path, |
2240 | subtree_index); | 2201 | subtree_index); |
@@ -2249,8 +2210,8 @@ out: | |||
2249 | * | 2210 | * |
2250 | * Will return zero if the path passed in is already the leftmost path. | 2211 | * Will return zero if the path passed in is already the leftmost path. |
2251 | */ | 2212 | */ |
2252 | static int ocfs2_find_cpos_for_left_leaf(struct super_block *sb, | 2213 | int ocfs2_find_cpos_for_left_leaf(struct super_block *sb, |
2253 | struct ocfs2_path *path, u32 *cpos) | 2214 | struct ocfs2_path *path, u32 *cpos) |
2254 | { | 2215 | { |
2255 | int i, j, ret = 0; | 2216 | int i, j, ret = 0; |
2256 | u64 blkno; | 2217 | u64 blkno; |
@@ -2327,20 +2288,14 @@ static int ocfs2_extend_rotate_transaction(handle_t *handle, int subtree_depth, | |||
2327 | int op_credits, | 2288 | int op_credits, |
2328 | struct ocfs2_path *path) | 2289 | struct ocfs2_path *path) |
2329 | { | 2290 | { |
2330 | int ret; | 2291 | int ret = 0; |
2331 | int credits = (path->p_tree_depth - subtree_depth) * 2 + 1 + op_credits; | 2292 | int credits = (path->p_tree_depth - subtree_depth) * 2 + 1 + op_credits; |
2332 | 2293 | ||
2333 | if (handle->h_buffer_credits < credits) { | 2294 | if (handle->h_buffer_credits < credits) |
2334 | ret = ocfs2_extend_trans(handle, | 2295 | ret = ocfs2_extend_trans(handle, |
2335 | credits - handle->h_buffer_credits); | 2296 | credits - handle->h_buffer_credits); |
2336 | if (ret) | ||
2337 | return ret; | ||
2338 | 2297 | ||
2339 | if (unlikely(handle->h_buffer_credits < credits)) | 2298 | return ret; |
2340 | return ocfs2_extend_trans(handle, credits); | ||
2341 | } | ||
2342 | |||
2343 | return 0; | ||
2344 | } | 2299 | } |
2345 | 2300 | ||
2346 | /* | 2301 | /* |
@@ -2584,8 +2539,7 @@ static int ocfs2_update_edge_lengths(handle_t *handle, | |||
2584 | * records for all the bh in the path. | 2539 | * records for all the bh in the path. |
2585 | * So we have to allocate extra credits and access them. | 2540 | * So we have to allocate extra credits and access them. |
2586 | */ | 2541 | */ |
2587 | ret = ocfs2_extend_trans(handle, | 2542 | ret = ocfs2_extend_trans(handle, subtree_index); |
2588 | handle->h_buffer_credits + subtree_index); | ||
2589 | if (ret) { | 2543 | if (ret) { |
2590 | mlog_errno(ret); | 2544 | mlog_errno(ret); |
2591 | goto out; | 2545 | goto out; |
@@ -2823,12 +2777,8 @@ static int ocfs2_rotate_subtree_left(handle_t *handle, | |||
2823 | ocfs2_remove_empty_extent(right_leaf_el); | 2777 | ocfs2_remove_empty_extent(right_leaf_el); |
2824 | } | 2778 | } |
2825 | 2779 | ||
2826 | ret = ocfs2_journal_dirty(handle, path_leaf_bh(left_path)); | 2780 | ocfs2_journal_dirty(handle, path_leaf_bh(left_path)); |
2827 | if (ret) | 2781 | ocfs2_journal_dirty(handle, path_leaf_bh(right_path)); |
2828 | mlog_errno(ret); | ||
2829 | ret = ocfs2_journal_dirty(handle, path_leaf_bh(right_path)); | ||
2830 | if (ret) | ||
2831 | mlog_errno(ret); | ||
2832 | 2782 | ||
2833 | if (del_right_subtree) { | 2783 | if (del_right_subtree) { |
2834 | ocfs2_unlink_subtree(handle, et, left_path, right_path, | 2784 | ocfs2_unlink_subtree(handle, et, left_path, right_path, |
@@ -2851,9 +2801,7 @@ static int ocfs2_rotate_subtree_left(handle_t *handle, | |||
2851 | if (right_has_empty) | 2801 | if (right_has_empty) |
2852 | ocfs2_remove_empty_extent(left_leaf_el); | 2802 | ocfs2_remove_empty_extent(left_leaf_el); |
2853 | 2803 | ||
2854 | ret = ocfs2_journal_dirty(handle, et_root_bh); | 2804 | ocfs2_journal_dirty(handle, et_root_bh); |
2855 | if (ret) | ||
2856 | mlog_errno(ret); | ||
2857 | 2805 | ||
2858 | *deleted = 1; | 2806 | *deleted = 1; |
2859 | } else | 2807 | } else |
@@ -2962,10 +2910,7 @@ static int ocfs2_rotate_rightmost_leaf_left(handle_t *handle, | |||
2962 | } | 2910 | } |
2963 | 2911 | ||
2964 | ocfs2_remove_empty_extent(el); | 2912 | ocfs2_remove_empty_extent(el); |
2965 | 2913 | ocfs2_journal_dirty(handle, bh); | |
2966 | ret = ocfs2_journal_dirty(handle, bh); | ||
2967 | if (ret) | ||
2968 | mlog_errno(ret); | ||
2969 | 2914 | ||
2970 | out: | 2915 | out: |
2971 | return ret; | 2916 | return ret; |
@@ -3506,15 +3451,9 @@ static int ocfs2_merge_rec_right(struct ocfs2_path *left_path, | |||
3506 | 3451 | ||
3507 | ocfs2_cleanup_merge(el, index); | 3452 | ocfs2_cleanup_merge(el, index); |
3508 | 3453 | ||
3509 | ret = ocfs2_journal_dirty(handle, bh); | 3454 | ocfs2_journal_dirty(handle, bh); |
3510 | if (ret) | ||
3511 | mlog_errno(ret); | ||
3512 | |||
3513 | if (right_path) { | 3455 | if (right_path) { |
3514 | ret = ocfs2_journal_dirty(handle, path_leaf_bh(right_path)); | 3456 | ocfs2_journal_dirty(handle, path_leaf_bh(right_path)); |
3515 | if (ret) | ||
3516 | mlog_errno(ret); | ||
3517 | |||
3518 | ocfs2_complete_edge_insert(handle, left_path, right_path, | 3457 | ocfs2_complete_edge_insert(handle, left_path, right_path, |
3519 | subtree_index); | 3458 | subtree_index); |
3520 | } | 3459 | } |
@@ -3683,14 +3622,9 @@ static int ocfs2_merge_rec_left(struct ocfs2_path *right_path, | |||
3683 | 3622 | ||
3684 | ocfs2_cleanup_merge(el, index); | 3623 | ocfs2_cleanup_merge(el, index); |
3685 | 3624 | ||
3686 | ret = ocfs2_journal_dirty(handle, bh); | 3625 | ocfs2_journal_dirty(handle, bh); |
3687 | if (ret) | ||
3688 | mlog_errno(ret); | ||
3689 | |||
3690 | if (left_path) { | 3626 | if (left_path) { |
3691 | ret = ocfs2_journal_dirty(handle, path_leaf_bh(left_path)); | 3627 | ocfs2_journal_dirty(handle, path_leaf_bh(left_path)); |
3692 | if (ret) | ||
3693 | mlog_errno(ret); | ||
3694 | 3628 | ||
3695 | /* | 3629 | /* |
3696 | * In the situation that the right_rec is empty and the extent | 3630 | * In the situation that the right_rec is empty and the extent |
@@ -4016,10 +3950,7 @@ static void ocfs2_adjust_rightmost_records(handle_t *handle, | |||
4016 | le32_add_cpu(&rec->e_int_clusters, | 3950 | le32_add_cpu(&rec->e_int_clusters, |
4017 | -le32_to_cpu(rec->e_cpos)); | 3951 | -le32_to_cpu(rec->e_cpos)); |
4018 | 3952 | ||
4019 | ret = ocfs2_journal_dirty(handle, bh); | 3953 | ocfs2_journal_dirty(handle, bh); |
4020 | if (ret) | ||
4021 | mlog_errno(ret); | ||
4022 | |||
4023 | } | 3954 | } |
4024 | } | 3955 | } |
4025 | 3956 | ||
@@ -4203,17 +4134,13 @@ static int ocfs2_insert_path(handle_t *handle, | |||
4203 | struct buffer_head *leaf_bh = path_leaf_bh(right_path); | 4134 | struct buffer_head *leaf_bh = path_leaf_bh(right_path); |
4204 | 4135 | ||
4205 | if (left_path) { | 4136 | if (left_path) { |
4206 | int credits = handle->h_buffer_credits; | ||
4207 | |||
4208 | /* | 4137 | /* |
4209 | * There's a chance that left_path got passed back to | 4138 | * There's a chance that left_path got passed back to |
4210 | * us without being accounted for in the | 4139 | * us without being accounted for in the |
4211 | * journal. Extend our transaction here to be sure we | 4140 | * journal. Extend our transaction here to be sure we |
4212 | * can change those blocks. | 4141 | * can change those blocks. |
4213 | */ | 4142 | */ |
4214 | credits += left_path->p_tree_depth; | 4143 | ret = ocfs2_extend_trans(handle, left_path->p_tree_depth); |
4215 | |||
4216 | ret = ocfs2_extend_trans(handle, credits); | ||
4217 | if (ret < 0) { | 4144 | if (ret < 0) { |
4218 | mlog_errno(ret); | 4145 | mlog_errno(ret); |
4219 | goto out; | 4146 | goto out; |
@@ -4251,17 +4178,13 @@ static int ocfs2_insert_path(handle_t *handle, | |||
4251 | * dirty this for us. | 4178 | * dirty this for us. |
4252 | */ | 4179 | */ |
4253 | if (left_path) | 4180 | if (left_path) |
4254 | ret = ocfs2_journal_dirty(handle, | 4181 | ocfs2_journal_dirty(handle, |
4255 | path_leaf_bh(left_path)); | 4182 | path_leaf_bh(left_path)); |
4256 | if (ret) | ||
4257 | mlog_errno(ret); | ||
4258 | } else | 4183 | } else |
4259 | ocfs2_insert_at_leaf(et, insert_rec, path_leaf_el(right_path), | 4184 | ocfs2_insert_at_leaf(et, insert_rec, path_leaf_el(right_path), |
4260 | insert); | 4185 | insert); |
4261 | 4186 | ||
4262 | ret = ocfs2_journal_dirty(handle, leaf_bh); | 4187 | ocfs2_journal_dirty(handle, leaf_bh); |
4263 | if (ret) | ||
4264 | mlog_errno(ret); | ||
4265 | 4188 | ||
4266 | if (left_path) { | 4189 | if (left_path) { |
4267 | /* | 4190 | /* |
@@ -4384,9 +4307,7 @@ out_update_clusters: | |||
4384 | ocfs2_et_update_clusters(et, | 4307 | ocfs2_et_update_clusters(et, |
4385 | le16_to_cpu(insert_rec->e_leaf_clusters)); | 4308 | le16_to_cpu(insert_rec->e_leaf_clusters)); |
4386 | 4309 | ||
4387 | ret = ocfs2_journal_dirty(handle, et->et_root_bh); | 4310 | ocfs2_journal_dirty(handle, et->et_root_bh); |
4388 | if (ret) | ||
4389 | mlog_errno(ret); | ||
4390 | 4311 | ||
4391 | out: | 4312 | out: |
4392 | ocfs2_free_path(left_path); | 4313 | ocfs2_free_path(left_path); |
@@ -4866,7 +4787,7 @@ int ocfs2_add_clusters_in_btree(handle_t *handle, | |||
4866 | goto leave; | 4787 | goto leave; |
4867 | } | 4788 | } |
4868 | 4789 | ||
4869 | status = __ocfs2_claim_clusters(osb, handle, data_ac, 1, | 4790 | status = __ocfs2_claim_clusters(handle, data_ac, 1, |
4870 | clusters_to_add, &bit_off, &num_bits); | 4791 | clusters_to_add, &bit_off, &num_bits); |
4871 | if (status < 0) { | 4792 | if (status < 0) { |
4872 | if (status != -ENOSPC) | 4793 | if (status != -ENOSPC) |
@@ -4895,11 +4816,7 @@ int ocfs2_add_clusters_in_btree(handle_t *handle, | |||
4895 | goto leave; | 4816 | goto leave; |
4896 | } | 4817 | } |
4897 | 4818 | ||
4898 | status = ocfs2_journal_dirty(handle, et->et_root_bh); | 4819 | ocfs2_journal_dirty(handle, et->et_root_bh); |
4899 | if (status < 0) { | ||
4900 | mlog_errno(status); | ||
4901 | goto leave; | ||
4902 | } | ||
4903 | 4820 | ||
4904 | clusters_to_add -= num_bits; | 4821 | clusters_to_add -= num_bits; |
4905 | *logical_offset += num_bits; | 4822 | *logical_offset += num_bits; |
@@ -5309,7 +5226,7 @@ static int ocfs2_split_tree(handle_t *handle, struct ocfs2_extent_tree *et, | |||
5309 | int index, u32 new_range, | 5226 | int index, u32 new_range, |
5310 | struct ocfs2_alloc_context *meta_ac) | 5227 | struct ocfs2_alloc_context *meta_ac) |
5311 | { | 5228 | { |
5312 | int ret, depth, credits = handle->h_buffer_credits; | 5229 | int ret, depth, credits; |
5313 | struct buffer_head *last_eb_bh = NULL; | 5230 | struct buffer_head *last_eb_bh = NULL; |
5314 | struct ocfs2_extent_block *eb; | 5231 | struct ocfs2_extent_block *eb; |
5315 | struct ocfs2_extent_list *rightmost_el, *el; | 5232 | struct ocfs2_extent_list *rightmost_el, *el; |
@@ -5340,8 +5257,8 @@ static int ocfs2_split_tree(handle_t *handle, struct ocfs2_extent_tree *et, | |||
5340 | } else | 5257 | } else |
5341 | rightmost_el = path_leaf_el(path); | 5258 | rightmost_el = path_leaf_el(path); |
5342 | 5259 | ||
5343 | credits += path->p_tree_depth + | 5260 | credits = path->p_tree_depth + |
5344 | ocfs2_extend_meta_needed(et->et_root_el); | 5261 | ocfs2_extend_meta_needed(et->et_root_el); |
5345 | ret = ocfs2_extend_trans(handle, credits); | 5262 | ret = ocfs2_extend_trans(handle, credits); |
5346 | if (ret) { | 5263 | if (ret) { |
5347 | mlog_errno(ret); | 5264 | mlog_errno(ret); |
@@ -5671,19 +5588,97 @@ out: | |||
5671 | return ret; | 5588 | return ret; |
5672 | } | 5589 | } |
5673 | 5590 | ||
5591 | /* | ||
5592 | * ocfs2_reserve_blocks_for_rec_trunc() would look basically the | ||
5593 | * same as ocfs2_lock_alloctors(), except for it accepts a blocks | ||
5594 | * number to reserve some extra blocks, and it only handles meta | ||
5595 | * data allocations. | ||
5596 | * | ||
5597 | * Currently, only ocfs2_remove_btree_range() uses it for truncating | ||
5598 | * and punching holes. | ||
5599 | */ | ||
5600 | static int ocfs2_reserve_blocks_for_rec_trunc(struct inode *inode, | ||
5601 | struct ocfs2_extent_tree *et, | ||
5602 | u32 extents_to_split, | ||
5603 | struct ocfs2_alloc_context **ac, | ||
5604 | int extra_blocks) | ||
5605 | { | ||
5606 | int ret = 0, num_free_extents; | ||
5607 | unsigned int max_recs_needed = 2 * extents_to_split; | ||
5608 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
5609 | |||
5610 | *ac = NULL; | ||
5611 | |||
5612 | num_free_extents = ocfs2_num_free_extents(osb, et); | ||
5613 | if (num_free_extents < 0) { | ||
5614 | ret = num_free_extents; | ||
5615 | mlog_errno(ret); | ||
5616 | goto out; | ||
5617 | } | ||
5618 | |||
5619 | if (!num_free_extents || | ||
5620 | (ocfs2_sparse_alloc(osb) && num_free_extents < max_recs_needed)) | ||
5621 | extra_blocks += ocfs2_extend_meta_needed(et->et_root_el); | ||
5622 | |||
5623 | if (extra_blocks) { | ||
5624 | ret = ocfs2_reserve_new_metadata_blocks(osb, extra_blocks, ac); | ||
5625 | if (ret < 0) { | ||
5626 | if (ret != -ENOSPC) | ||
5627 | mlog_errno(ret); | ||
5628 | goto out; | ||
5629 | } | ||
5630 | } | ||
5631 | |||
5632 | out: | ||
5633 | if (ret) { | ||
5634 | if (*ac) { | ||
5635 | ocfs2_free_alloc_context(*ac); | ||
5636 | *ac = NULL; | ||
5637 | } | ||
5638 | } | ||
5639 | |||
5640 | return ret; | ||
5641 | } | ||
5642 | |||
5674 | int ocfs2_remove_btree_range(struct inode *inode, | 5643 | int ocfs2_remove_btree_range(struct inode *inode, |
5675 | struct ocfs2_extent_tree *et, | 5644 | struct ocfs2_extent_tree *et, |
5676 | u32 cpos, u32 phys_cpos, u32 len, | 5645 | u32 cpos, u32 phys_cpos, u32 len, int flags, |
5677 | struct ocfs2_cached_dealloc_ctxt *dealloc) | 5646 | struct ocfs2_cached_dealloc_ctxt *dealloc, |
5647 | u64 refcount_loc) | ||
5678 | { | 5648 | { |
5679 | int ret; | 5649 | int ret, credits = 0, extra_blocks = 0; |
5680 | u64 phys_blkno = ocfs2_clusters_to_blocks(inode->i_sb, phys_cpos); | 5650 | u64 phys_blkno = ocfs2_clusters_to_blocks(inode->i_sb, phys_cpos); |
5681 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | 5651 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); |
5682 | struct inode *tl_inode = osb->osb_tl_inode; | 5652 | struct inode *tl_inode = osb->osb_tl_inode; |
5683 | handle_t *handle; | 5653 | handle_t *handle; |
5684 | struct ocfs2_alloc_context *meta_ac = NULL; | 5654 | struct ocfs2_alloc_context *meta_ac = NULL; |
5655 | struct ocfs2_refcount_tree *ref_tree = NULL; | ||
5656 | |||
5657 | if ((flags & OCFS2_EXT_REFCOUNTED) && len) { | ||
5658 | BUG_ON(!(OCFS2_I(inode)->ip_dyn_features & | ||
5659 | OCFS2_HAS_REFCOUNT_FL)); | ||
5660 | |||
5661 | ret = ocfs2_lock_refcount_tree(osb, refcount_loc, 1, | ||
5662 | &ref_tree, NULL); | ||
5663 | if (ret) { | ||
5664 | mlog_errno(ret); | ||
5665 | goto out; | ||
5666 | } | ||
5685 | 5667 | ||
5686 | ret = ocfs2_lock_allocators(inode, et, 0, 1, NULL, &meta_ac); | 5668 | ret = ocfs2_prepare_refcount_change_for_del(inode, |
5669 | refcount_loc, | ||
5670 | phys_blkno, | ||
5671 | len, | ||
5672 | &credits, | ||
5673 | &extra_blocks); | ||
5674 | if (ret < 0) { | ||
5675 | mlog_errno(ret); | ||
5676 | goto out; | ||
5677 | } | ||
5678 | } | ||
5679 | |||
5680 | ret = ocfs2_reserve_blocks_for_rec_trunc(inode, et, 1, &meta_ac, | ||
5681 | extra_blocks); | ||
5687 | if (ret) { | 5682 | if (ret) { |
5688 | mlog_errno(ret); | 5683 | mlog_errno(ret); |
5689 | return ret; | 5684 | return ret; |
@@ -5699,7 +5694,8 @@ int ocfs2_remove_btree_range(struct inode *inode, | |||
5699 | } | 5694 | } |
5700 | } | 5695 | } |
5701 | 5696 | ||
5702 | handle = ocfs2_start_trans(osb, ocfs2_remove_extent_credits(osb->sb)); | 5697 | handle = ocfs2_start_trans(osb, |
5698 | ocfs2_remove_extent_credits(osb->sb) + credits); | ||
5703 | if (IS_ERR(handle)) { | 5699 | if (IS_ERR(handle)) { |
5704 | ret = PTR_ERR(handle); | 5700 | ret = PTR_ERR(handle); |
5705 | mlog_errno(ret); | 5701 | mlog_errno(ret); |
@@ -5724,15 +5720,22 @@ int ocfs2_remove_btree_range(struct inode *inode, | |||
5724 | 5720 | ||
5725 | ocfs2_et_update_clusters(et, -len); | 5721 | ocfs2_et_update_clusters(et, -len); |
5726 | 5722 | ||
5727 | ret = ocfs2_journal_dirty(handle, et->et_root_bh); | 5723 | ocfs2_journal_dirty(handle, et->et_root_bh); |
5728 | if (ret) { | ||
5729 | mlog_errno(ret); | ||
5730 | goto out_commit; | ||
5731 | } | ||
5732 | 5724 | ||
5733 | ret = ocfs2_truncate_log_append(osb, handle, phys_blkno, len); | 5725 | if (phys_blkno) { |
5734 | if (ret) | 5726 | if (flags & OCFS2_EXT_REFCOUNTED) |
5735 | mlog_errno(ret); | 5727 | ret = ocfs2_decrease_refcount(inode, handle, |
5728 | ocfs2_blocks_to_clusters(osb->sb, | ||
5729 | phys_blkno), | ||
5730 | len, meta_ac, | ||
5731 | dealloc, 1); | ||
5732 | else | ||
5733 | ret = ocfs2_truncate_log_append(osb, handle, | ||
5734 | phys_blkno, len); | ||
5735 | if (ret) | ||
5736 | mlog_errno(ret); | ||
5737 | |||
5738 | } | ||
5736 | 5739 | ||
5737 | out_commit: | 5740 | out_commit: |
5738 | ocfs2_commit_trans(osb, handle); | 5741 | ocfs2_commit_trans(osb, handle); |
@@ -5742,6 +5745,9 @@ out: | |||
5742 | if (meta_ac) | 5745 | if (meta_ac) |
5743 | ocfs2_free_alloc_context(meta_ac); | 5746 | ocfs2_free_alloc_context(meta_ac); |
5744 | 5747 | ||
5748 | if (ref_tree) | ||
5749 | ocfs2_unlock_refcount_tree(osb, ref_tree, 1); | ||
5750 | |||
5745 | return ret; | 5751 | return ret; |
5746 | } | 5752 | } |
5747 | 5753 | ||
@@ -5850,11 +5856,7 @@ int ocfs2_truncate_log_append(struct ocfs2_super *osb, | |||
5850 | } | 5856 | } |
5851 | tl->tl_recs[index].t_clusters = cpu_to_le32(num_clusters); | 5857 | tl->tl_recs[index].t_clusters = cpu_to_le32(num_clusters); |
5852 | 5858 | ||
5853 | status = ocfs2_journal_dirty(handle, tl_bh); | 5859 | ocfs2_journal_dirty(handle, tl_bh); |
5854 | if (status < 0) { | ||
5855 | mlog_errno(status); | ||
5856 | goto bail; | ||
5857 | } | ||
5858 | 5860 | ||
5859 | bail: | 5861 | bail: |
5860 | mlog_exit(status); | 5862 | mlog_exit(status); |
@@ -5893,11 +5895,7 @@ static int ocfs2_replay_truncate_records(struct ocfs2_super *osb, | |||
5893 | 5895 | ||
5894 | tl->tl_used = cpu_to_le16(i); | 5896 | tl->tl_used = cpu_to_le16(i); |
5895 | 5897 | ||
5896 | status = ocfs2_journal_dirty(handle, tl_bh); | 5898 | ocfs2_journal_dirty(handle, tl_bh); |
5897 | if (status < 0) { | ||
5898 | mlog_errno(status); | ||
5899 | goto bail; | ||
5900 | } | ||
5901 | 5899 | ||
5902 | /* TODO: Perhaps we can calculate the bulk of the | 5900 | /* TODO: Perhaps we can calculate the bulk of the |
5903 | * credits up front rather than extending like | 5901 | * credits up front rather than extending like |
@@ -6298,6 +6296,7 @@ int ocfs2_truncate_log_init(struct ocfs2_super *osb) | |||
6298 | */ | 6296 | */ |
6299 | struct ocfs2_cached_block_free { | 6297 | struct ocfs2_cached_block_free { |
6300 | struct ocfs2_cached_block_free *free_next; | 6298 | struct ocfs2_cached_block_free *free_next; |
6299 | u64 free_bg; | ||
6301 | u64 free_blk; | 6300 | u64 free_blk; |
6302 | unsigned int free_bit; | 6301 | unsigned int free_bit; |
6303 | }; | 6302 | }; |
@@ -6344,8 +6343,11 @@ static int ocfs2_free_cached_blocks(struct ocfs2_super *osb, | |||
6344 | } | 6343 | } |
6345 | 6344 | ||
6346 | while (head) { | 6345 | while (head) { |
6347 | bg_blkno = ocfs2_which_suballoc_group(head->free_blk, | 6346 | if (head->free_bg) |
6348 | head->free_bit); | 6347 | bg_blkno = head->free_bg; |
6348 | else | ||
6349 | bg_blkno = ocfs2_which_suballoc_group(head->free_blk, | ||
6350 | head->free_bit); | ||
6349 | mlog(0, "Free bit: (bit %u, blkno %llu)\n", | 6351 | mlog(0, "Free bit: (bit %u, blkno %llu)\n", |
6350 | head->free_bit, (unsigned long long)head->free_blk); | 6352 | head->free_bit, (unsigned long long)head->free_blk); |
6351 | 6353 | ||
@@ -6393,7 +6395,7 @@ int ocfs2_cache_cluster_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt, | |||
6393 | int ret = 0; | 6395 | int ret = 0; |
6394 | struct ocfs2_cached_block_free *item; | 6396 | struct ocfs2_cached_block_free *item; |
6395 | 6397 | ||
6396 | item = kmalloc(sizeof(*item), GFP_NOFS); | 6398 | item = kzalloc(sizeof(*item), GFP_NOFS); |
6397 | if (item == NULL) { | 6399 | if (item == NULL) { |
6398 | ret = -ENOMEM; | 6400 | ret = -ENOMEM; |
6399 | mlog_errno(ret); | 6401 | mlog_errno(ret); |
@@ -6533,8 +6535,8 @@ ocfs2_find_per_slot_free_list(int type, | |||
6533 | } | 6535 | } |
6534 | 6536 | ||
6535 | int ocfs2_cache_block_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt, | 6537 | int ocfs2_cache_block_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt, |
6536 | int type, int slot, u64 blkno, | 6538 | int type, int slot, u64 suballoc, |
6537 | unsigned int bit) | 6539 | u64 blkno, unsigned int bit) |
6538 | { | 6540 | { |
6539 | int ret; | 6541 | int ret; |
6540 | struct ocfs2_per_slot_free_list *fl; | 6542 | struct ocfs2_per_slot_free_list *fl; |
@@ -6547,7 +6549,7 @@ int ocfs2_cache_block_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt, | |||
6547 | goto out; | 6549 | goto out; |
6548 | } | 6550 | } |
6549 | 6551 | ||
6550 | item = kmalloc(sizeof(*item), GFP_NOFS); | 6552 | item = kzalloc(sizeof(*item), GFP_NOFS); |
6551 | if (item == NULL) { | 6553 | if (item == NULL) { |
6552 | ret = -ENOMEM; | 6554 | ret = -ENOMEM; |
6553 | mlog_errno(ret); | 6555 | mlog_errno(ret); |
@@ -6557,6 +6559,7 @@ int ocfs2_cache_block_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt, | |||
6557 | mlog(0, "Insert: (type %d, slot %u, bit %u, blk %llu)\n", | 6559 | mlog(0, "Insert: (type %d, slot %u, bit %u, blk %llu)\n", |
6558 | type, slot, bit, (unsigned long long)blkno); | 6560 | type, slot, bit, (unsigned long long)blkno); |
6559 | 6561 | ||
6562 | item->free_bg = suballoc; | ||
6560 | item->free_blk = blkno; | 6563 | item->free_blk = blkno; |
6561 | item->free_bit = bit; | 6564 | item->free_bit = bit; |
6562 | item->free_next = fl->f_first; | 6565 | item->free_next = fl->f_first; |
@@ -6573,433 +6576,11 @@ static int ocfs2_cache_extent_block_free(struct ocfs2_cached_dealloc_ctxt *ctxt, | |||
6573 | { | 6576 | { |
6574 | return ocfs2_cache_block_dealloc(ctxt, EXTENT_ALLOC_SYSTEM_INODE, | 6577 | return ocfs2_cache_block_dealloc(ctxt, EXTENT_ALLOC_SYSTEM_INODE, |
6575 | le16_to_cpu(eb->h_suballoc_slot), | 6578 | le16_to_cpu(eb->h_suballoc_slot), |
6579 | le64_to_cpu(eb->h_suballoc_loc), | ||
6576 | le64_to_cpu(eb->h_blkno), | 6580 | le64_to_cpu(eb->h_blkno), |
6577 | le16_to_cpu(eb->h_suballoc_bit)); | 6581 | le16_to_cpu(eb->h_suballoc_bit)); |
6578 | } | 6582 | } |
6579 | 6583 | ||
6580 | /* This function will figure out whether the currently last extent | ||
6581 | * block will be deleted, and if it will, what the new last extent | ||
6582 | * block will be so we can update his h_next_leaf_blk field, as well | ||
6583 | * as the dinodes i_last_eb_blk */ | ||
6584 | static int ocfs2_find_new_last_ext_blk(struct inode *inode, | ||
6585 | unsigned int clusters_to_del, | ||
6586 | struct ocfs2_path *path, | ||
6587 | struct buffer_head **new_last_eb) | ||
6588 | { | ||
6589 | int next_free, ret = 0; | ||
6590 | u32 cpos; | ||
6591 | struct ocfs2_extent_rec *rec; | ||
6592 | struct ocfs2_extent_block *eb; | ||
6593 | struct ocfs2_extent_list *el; | ||
6594 | struct buffer_head *bh = NULL; | ||
6595 | |||
6596 | *new_last_eb = NULL; | ||
6597 | |||
6598 | /* we have no tree, so of course, no last_eb. */ | ||
6599 | if (!path->p_tree_depth) | ||
6600 | goto out; | ||
6601 | |||
6602 | /* trunc to zero special case - this makes tree_depth = 0 | ||
6603 | * regardless of what it is. */ | ||
6604 | if (OCFS2_I(inode)->ip_clusters == clusters_to_del) | ||
6605 | goto out; | ||
6606 | |||
6607 | el = path_leaf_el(path); | ||
6608 | BUG_ON(!el->l_next_free_rec); | ||
6609 | |||
6610 | /* | ||
6611 | * Make sure that this extent list will actually be empty | ||
6612 | * after we clear away the data. We can shortcut out if | ||
6613 | * there's more than one non-empty extent in the | ||
6614 | * list. Otherwise, a check of the remaining extent is | ||
6615 | * necessary. | ||
6616 | */ | ||
6617 | next_free = le16_to_cpu(el->l_next_free_rec); | ||
6618 | rec = NULL; | ||
6619 | if (ocfs2_is_empty_extent(&el->l_recs[0])) { | ||
6620 | if (next_free > 2) | ||
6621 | goto out; | ||
6622 | |||
6623 | /* We may have a valid extent in index 1, check it. */ | ||
6624 | if (next_free == 2) | ||
6625 | rec = &el->l_recs[1]; | ||
6626 | |||
6627 | /* | ||
6628 | * Fall through - no more nonempty extents, so we want | ||
6629 | * to delete this leaf. | ||
6630 | */ | ||
6631 | } else { | ||
6632 | if (next_free > 1) | ||
6633 | goto out; | ||
6634 | |||
6635 | rec = &el->l_recs[0]; | ||
6636 | } | ||
6637 | |||
6638 | if (rec) { | ||
6639 | /* | ||
6640 | * Check it we'll only be trimming off the end of this | ||
6641 | * cluster. | ||
6642 | */ | ||
6643 | if (le16_to_cpu(rec->e_leaf_clusters) > clusters_to_del) | ||
6644 | goto out; | ||
6645 | } | ||
6646 | |||
6647 | ret = ocfs2_find_cpos_for_left_leaf(inode->i_sb, path, &cpos); | ||
6648 | if (ret) { | ||
6649 | mlog_errno(ret); | ||
6650 | goto out; | ||
6651 | } | ||
6652 | |||
6653 | ret = ocfs2_find_leaf(INODE_CACHE(inode), path_root_el(path), cpos, &bh); | ||
6654 | if (ret) { | ||
6655 | mlog_errno(ret); | ||
6656 | goto out; | ||
6657 | } | ||
6658 | |||
6659 | eb = (struct ocfs2_extent_block *) bh->b_data; | ||
6660 | el = &eb->h_list; | ||
6661 | |||
6662 | /* ocfs2_find_leaf() gets the eb from ocfs2_read_extent_block(). | ||
6663 | * Any corruption is a code bug. */ | ||
6664 | BUG_ON(!OCFS2_IS_VALID_EXTENT_BLOCK(eb)); | ||
6665 | |||
6666 | *new_last_eb = bh; | ||
6667 | get_bh(*new_last_eb); | ||
6668 | mlog(0, "returning block %llu, (cpos: %u)\n", | ||
6669 | (unsigned long long)le64_to_cpu(eb->h_blkno), cpos); | ||
6670 | out: | ||
6671 | brelse(bh); | ||
6672 | |||
6673 | return ret; | ||
6674 | } | ||
6675 | |||
6676 | /* | ||
6677 | * Trim some clusters off the rightmost edge of a tree. Only called | ||
6678 | * during truncate. | ||
6679 | * | ||
6680 | * The caller needs to: | ||
6681 | * - start journaling of each path component. | ||
6682 | * - compute and fully set up any new last ext block | ||
6683 | */ | ||
6684 | static int ocfs2_trim_tree(struct inode *inode, struct ocfs2_path *path, | ||
6685 | handle_t *handle, struct ocfs2_truncate_context *tc, | ||
6686 | u32 clusters_to_del, u64 *delete_start, u8 *flags) | ||
6687 | { | ||
6688 | int ret, i, index = path->p_tree_depth; | ||
6689 | u32 new_edge = 0; | ||
6690 | u64 deleted_eb = 0; | ||
6691 | struct buffer_head *bh; | ||
6692 | struct ocfs2_extent_list *el; | ||
6693 | struct ocfs2_extent_rec *rec; | ||
6694 | |||
6695 | *delete_start = 0; | ||
6696 | *flags = 0; | ||
6697 | |||
6698 | while (index >= 0) { | ||
6699 | bh = path->p_node[index].bh; | ||
6700 | el = path->p_node[index].el; | ||
6701 | |||
6702 | mlog(0, "traveling tree (index = %d, block = %llu)\n", | ||
6703 | index, (unsigned long long)bh->b_blocknr); | ||
6704 | |||
6705 | BUG_ON(le16_to_cpu(el->l_next_free_rec) == 0); | ||
6706 | |||
6707 | if (index != | ||
6708 | (path->p_tree_depth - le16_to_cpu(el->l_tree_depth))) { | ||
6709 | ocfs2_error(inode->i_sb, | ||
6710 | "Inode %lu has invalid ext. block %llu", | ||
6711 | inode->i_ino, | ||
6712 | (unsigned long long)bh->b_blocknr); | ||
6713 | ret = -EROFS; | ||
6714 | goto out; | ||
6715 | } | ||
6716 | |||
6717 | find_tail_record: | ||
6718 | i = le16_to_cpu(el->l_next_free_rec) - 1; | ||
6719 | rec = &el->l_recs[i]; | ||
6720 | |||
6721 | mlog(0, "Extent list before: record %d: (%u, %u, %llu), " | ||
6722 | "next = %u\n", i, le32_to_cpu(rec->e_cpos), | ||
6723 | ocfs2_rec_clusters(el, rec), | ||
6724 | (unsigned long long)le64_to_cpu(rec->e_blkno), | ||
6725 | le16_to_cpu(el->l_next_free_rec)); | ||
6726 | |||
6727 | BUG_ON(ocfs2_rec_clusters(el, rec) < clusters_to_del); | ||
6728 | |||
6729 | if (le16_to_cpu(el->l_tree_depth) == 0) { | ||
6730 | /* | ||
6731 | * If the leaf block contains a single empty | ||
6732 | * extent and no records, we can just remove | ||
6733 | * the block. | ||
6734 | */ | ||
6735 | if (i == 0 && ocfs2_is_empty_extent(rec)) { | ||
6736 | memset(rec, 0, | ||
6737 | sizeof(struct ocfs2_extent_rec)); | ||
6738 | el->l_next_free_rec = cpu_to_le16(0); | ||
6739 | |||
6740 | goto delete; | ||
6741 | } | ||
6742 | |||
6743 | /* | ||
6744 | * Remove any empty extents by shifting things | ||
6745 | * left. That should make life much easier on | ||
6746 | * the code below. This condition is rare | ||
6747 | * enough that we shouldn't see a performance | ||
6748 | * hit. | ||
6749 | */ | ||
6750 | if (ocfs2_is_empty_extent(&el->l_recs[0])) { | ||
6751 | le16_add_cpu(&el->l_next_free_rec, -1); | ||
6752 | |||
6753 | for(i = 0; | ||
6754 | i < le16_to_cpu(el->l_next_free_rec); i++) | ||
6755 | el->l_recs[i] = el->l_recs[i + 1]; | ||
6756 | |||
6757 | memset(&el->l_recs[i], 0, | ||
6758 | sizeof(struct ocfs2_extent_rec)); | ||
6759 | |||
6760 | /* | ||
6761 | * We've modified our extent list. The | ||
6762 | * simplest way to handle this change | ||
6763 | * is to being the search from the | ||
6764 | * start again. | ||
6765 | */ | ||
6766 | goto find_tail_record; | ||
6767 | } | ||
6768 | |||
6769 | le16_add_cpu(&rec->e_leaf_clusters, -clusters_to_del); | ||
6770 | |||
6771 | /* | ||
6772 | * We'll use "new_edge" on our way back up the | ||
6773 | * tree to know what our rightmost cpos is. | ||
6774 | */ | ||
6775 | new_edge = le16_to_cpu(rec->e_leaf_clusters); | ||
6776 | new_edge += le32_to_cpu(rec->e_cpos); | ||
6777 | |||
6778 | /* | ||
6779 | * The caller will use this to delete data blocks. | ||
6780 | */ | ||
6781 | *delete_start = le64_to_cpu(rec->e_blkno) | ||
6782 | + ocfs2_clusters_to_blocks(inode->i_sb, | ||
6783 | le16_to_cpu(rec->e_leaf_clusters)); | ||
6784 | *flags = rec->e_flags; | ||
6785 | |||
6786 | /* | ||
6787 | * If it's now empty, remove this record. | ||
6788 | */ | ||
6789 | if (le16_to_cpu(rec->e_leaf_clusters) == 0) { | ||
6790 | memset(rec, 0, | ||
6791 | sizeof(struct ocfs2_extent_rec)); | ||
6792 | le16_add_cpu(&el->l_next_free_rec, -1); | ||
6793 | } | ||
6794 | } else { | ||
6795 | if (le64_to_cpu(rec->e_blkno) == deleted_eb) { | ||
6796 | memset(rec, 0, | ||
6797 | sizeof(struct ocfs2_extent_rec)); | ||
6798 | le16_add_cpu(&el->l_next_free_rec, -1); | ||
6799 | |||
6800 | goto delete; | ||
6801 | } | ||
6802 | |||
6803 | /* Can this actually happen? */ | ||
6804 | if (le16_to_cpu(el->l_next_free_rec) == 0) | ||
6805 | goto delete; | ||
6806 | |||
6807 | /* | ||
6808 | * We never actually deleted any clusters | ||
6809 | * because our leaf was empty. There's no | ||
6810 | * reason to adjust the rightmost edge then. | ||
6811 | */ | ||
6812 | if (new_edge == 0) | ||
6813 | goto delete; | ||
6814 | |||
6815 | rec->e_int_clusters = cpu_to_le32(new_edge); | ||
6816 | le32_add_cpu(&rec->e_int_clusters, | ||
6817 | -le32_to_cpu(rec->e_cpos)); | ||
6818 | |||
6819 | /* | ||
6820 | * A deleted child record should have been | ||
6821 | * caught above. | ||
6822 | */ | ||
6823 | BUG_ON(le32_to_cpu(rec->e_int_clusters) == 0); | ||
6824 | } | ||
6825 | |||
6826 | delete: | ||
6827 | ret = ocfs2_journal_dirty(handle, bh); | ||
6828 | if (ret) { | ||
6829 | mlog_errno(ret); | ||
6830 | goto out; | ||
6831 | } | ||
6832 | |||
6833 | mlog(0, "extent list container %llu, after: record %d: " | ||
6834 | "(%u, %u, %llu), next = %u.\n", | ||
6835 | (unsigned long long)bh->b_blocknr, i, | ||
6836 | le32_to_cpu(rec->e_cpos), ocfs2_rec_clusters(el, rec), | ||
6837 | (unsigned long long)le64_to_cpu(rec->e_blkno), | ||
6838 | le16_to_cpu(el->l_next_free_rec)); | ||
6839 | |||
6840 | /* | ||
6841 | * We must be careful to only attempt delete of an | ||
6842 | * extent block (and not the root inode block). | ||
6843 | */ | ||
6844 | if (index > 0 && le16_to_cpu(el->l_next_free_rec) == 0) { | ||
6845 | struct ocfs2_extent_block *eb = | ||
6846 | (struct ocfs2_extent_block *)bh->b_data; | ||
6847 | |||
6848 | /* | ||
6849 | * Save this for use when processing the | ||
6850 | * parent block. | ||
6851 | */ | ||
6852 | deleted_eb = le64_to_cpu(eb->h_blkno); | ||
6853 | |||
6854 | mlog(0, "deleting this extent block.\n"); | ||
6855 | |||
6856 | ocfs2_remove_from_cache(INODE_CACHE(inode), bh); | ||
6857 | |||
6858 | BUG_ON(ocfs2_rec_clusters(el, &el->l_recs[0])); | ||
6859 | BUG_ON(le32_to_cpu(el->l_recs[0].e_cpos)); | ||
6860 | BUG_ON(le64_to_cpu(el->l_recs[0].e_blkno)); | ||
6861 | |||
6862 | ret = ocfs2_cache_extent_block_free(&tc->tc_dealloc, eb); | ||
6863 | /* An error here is not fatal. */ | ||
6864 | if (ret < 0) | ||
6865 | mlog_errno(ret); | ||
6866 | } else { | ||
6867 | deleted_eb = 0; | ||
6868 | } | ||
6869 | |||
6870 | index--; | ||
6871 | } | ||
6872 | |||
6873 | ret = 0; | ||
6874 | out: | ||
6875 | return ret; | ||
6876 | } | ||
6877 | |||
6878 | static int ocfs2_do_truncate(struct ocfs2_super *osb, | ||
6879 | unsigned int clusters_to_del, | ||
6880 | struct inode *inode, | ||
6881 | struct buffer_head *fe_bh, | ||
6882 | handle_t *handle, | ||
6883 | struct ocfs2_truncate_context *tc, | ||
6884 | struct ocfs2_path *path, | ||
6885 | struct ocfs2_alloc_context *meta_ac) | ||
6886 | { | ||
6887 | int status; | ||
6888 | struct ocfs2_dinode *fe; | ||
6889 | struct ocfs2_extent_block *last_eb = NULL; | ||
6890 | struct ocfs2_extent_list *el; | ||
6891 | struct buffer_head *last_eb_bh = NULL; | ||
6892 | u64 delete_blk = 0; | ||
6893 | u8 rec_flags; | ||
6894 | |||
6895 | fe = (struct ocfs2_dinode *) fe_bh->b_data; | ||
6896 | |||
6897 | status = ocfs2_find_new_last_ext_blk(inode, clusters_to_del, | ||
6898 | path, &last_eb_bh); | ||
6899 | if (status < 0) { | ||
6900 | mlog_errno(status); | ||
6901 | goto bail; | ||
6902 | } | ||
6903 | |||
6904 | /* | ||
6905 | * Each component will be touched, so we might as well journal | ||
6906 | * here to avoid having to handle errors later. | ||
6907 | */ | ||
6908 | status = ocfs2_journal_access_path(INODE_CACHE(inode), handle, path); | ||
6909 | if (status < 0) { | ||
6910 | mlog_errno(status); | ||
6911 | goto bail; | ||
6912 | } | ||
6913 | |||
6914 | if (last_eb_bh) { | ||
6915 | status = ocfs2_journal_access_eb(handle, INODE_CACHE(inode), last_eb_bh, | ||
6916 | OCFS2_JOURNAL_ACCESS_WRITE); | ||
6917 | if (status < 0) { | ||
6918 | mlog_errno(status); | ||
6919 | goto bail; | ||
6920 | } | ||
6921 | |||
6922 | last_eb = (struct ocfs2_extent_block *) last_eb_bh->b_data; | ||
6923 | } | ||
6924 | |||
6925 | el = &(fe->id2.i_list); | ||
6926 | |||
6927 | /* | ||
6928 | * Lower levels depend on this never happening, but it's best | ||
6929 | * to check it up here before changing the tree. | ||
6930 | */ | ||
6931 | if (el->l_tree_depth && el->l_recs[0].e_int_clusters == 0) { | ||
6932 | ocfs2_error(inode->i_sb, | ||
6933 | "Inode %lu has an empty extent record, depth %u\n", | ||
6934 | inode->i_ino, le16_to_cpu(el->l_tree_depth)); | ||
6935 | status = -EROFS; | ||
6936 | goto bail; | ||
6937 | } | ||
6938 | |||
6939 | dquot_free_space_nodirty(inode, | ||
6940 | ocfs2_clusters_to_bytes(osb->sb, clusters_to_del)); | ||
6941 | spin_lock(&OCFS2_I(inode)->ip_lock); | ||
6942 | OCFS2_I(inode)->ip_clusters = le32_to_cpu(fe->i_clusters) - | ||
6943 | clusters_to_del; | ||
6944 | spin_unlock(&OCFS2_I(inode)->ip_lock); | ||
6945 | le32_add_cpu(&fe->i_clusters, -clusters_to_del); | ||
6946 | inode->i_blocks = ocfs2_inode_sector_count(inode); | ||
6947 | |||
6948 | status = ocfs2_trim_tree(inode, path, handle, tc, | ||
6949 | clusters_to_del, &delete_blk, &rec_flags); | ||
6950 | if (status) { | ||
6951 | mlog_errno(status); | ||
6952 | goto bail; | ||
6953 | } | ||
6954 | |||
6955 | if (le32_to_cpu(fe->i_clusters) == 0) { | ||
6956 | /* trunc to zero is a special case. */ | ||
6957 | el->l_tree_depth = 0; | ||
6958 | fe->i_last_eb_blk = 0; | ||
6959 | } else if (last_eb) | ||
6960 | fe->i_last_eb_blk = last_eb->h_blkno; | ||
6961 | |||
6962 | status = ocfs2_journal_dirty(handle, fe_bh); | ||
6963 | if (status < 0) { | ||
6964 | mlog_errno(status); | ||
6965 | goto bail; | ||
6966 | } | ||
6967 | |||
6968 | if (last_eb) { | ||
6969 | /* If there will be a new last extent block, then by | ||
6970 | * definition, there cannot be any leaves to the right of | ||
6971 | * him. */ | ||
6972 | last_eb->h_next_leaf_blk = 0; | ||
6973 | status = ocfs2_journal_dirty(handle, last_eb_bh); | ||
6974 | if (status < 0) { | ||
6975 | mlog_errno(status); | ||
6976 | goto bail; | ||
6977 | } | ||
6978 | } | ||
6979 | |||
6980 | if (delete_blk) { | ||
6981 | if (rec_flags & OCFS2_EXT_REFCOUNTED) | ||
6982 | status = ocfs2_decrease_refcount(inode, handle, | ||
6983 | ocfs2_blocks_to_clusters(osb->sb, | ||
6984 | delete_blk), | ||
6985 | clusters_to_del, meta_ac, | ||
6986 | &tc->tc_dealloc, 1); | ||
6987 | else | ||
6988 | status = ocfs2_truncate_log_append(osb, handle, | ||
6989 | delete_blk, | ||
6990 | clusters_to_del); | ||
6991 | if (status < 0) { | ||
6992 | mlog_errno(status); | ||
6993 | goto bail; | ||
6994 | } | ||
6995 | } | ||
6996 | status = 0; | ||
6997 | bail: | ||
6998 | brelse(last_eb_bh); | ||
6999 | mlog_exit(status); | ||
7000 | return status; | ||
7001 | } | ||
7002 | |||
7003 | static int ocfs2_zero_func(handle_t *handle, struct buffer_head *bh) | 6584 | static int ocfs2_zero_func(handle_t *handle, struct buffer_head *bh) |
7004 | { | 6585 | { |
7005 | set_buffer_uptodate(bh); | 6586 | set_buffer_uptodate(bh); |
@@ -7307,7 +6888,9 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode, | |||
7307 | goto out_commit; | 6888 | goto out_commit; |
7308 | did_quota = 1; | 6889 | did_quota = 1; |
7309 | 6890 | ||
7310 | ret = ocfs2_claim_clusters(osb, handle, data_ac, 1, &bit_off, | 6891 | data_ac->ac_resv = &OCFS2_I(inode)->ip_la_data_resv; |
6892 | |||
6893 | ret = ocfs2_claim_clusters(handle, data_ac, 1, &bit_off, | ||
7311 | &num); | 6894 | &num); |
7312 | if (ret) { | 6895 | if (ret) { |
7313 | mlog_errno(ret); | 6896 | mlog_errno(ret); |
@@ -7406,26 +6989,29 @@ out: | |||
7406 | */ | 6989 | */ |
7407 | int ocfs2_commit_truncate(struct ocfs2_super *osb, | 6990 | int ocfs2_commit_truncate(struct ocfs2_super *osb, |
7408 | struct inode *inode, | 6991 | struct inode *inode, |
7409 | struct buffer_head *fe_bh, | 6992 | struct buffer_head *di_bh) |
7410 | struct ocfs2_truncate_context *tc) | ||
7411 | { | 6993 | { |
7412 | int status, i, credits, tl_sem = 0; | 6994 | int status = 0, i, flags = 0; |
7413 | u32 clusters_to_del, new_highest_cpos, range; | 6995 | u32 new_highest_cpos, range, trunc_cpos, trunc_len, phys_cpos, coff; |
7414 | u64 blkno = 0; | 6996 | u64 blkno = 0; |
7415 | struct ocfs2_extent_list *el; | 6997 | struct ocfs2_extent_list *el; |
7416 | handle_t *handle = NULL; | 6998 | struct ocfs2_extent_rec *rec; |
7417 | struct inode *tl_inode = osb->osb_tl_inode; | ||
7418 | struct ocfs2_path *path = NULL; | 6999 | struct ocfs2_path *path = NULL; |
7419 | struct ocfs2_dinode *di = (struct ocfs2_dinode *)fe_bh->b_data; | 7000 | struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; |
7420 | struct ocfs2_alloc_context *meta_ac = NULL; | 7001 | struct ocfs2_extent_list *root_el = &(di->id2.i_list); |
7421 | struct ocfs2_refcount_tree *ref_tree = NULL; | 7002 | u64 refcount_loc = le64_to_cpu(di->i_refcount_loc); |
7003 | struct ocfs2_extent_tree et; | ||
7004 | struct ocfs2_cached_dealloc_ctxt dealloc; | ||
7422 | 7005 | ||
7423 | mlog_entry_void(); | 7006 | mlog_entry_void(); |
7424 | 7007 | ||
7008 | ocfs2_init_dinode_extent_tree(&et, INODE_CACHE(inode), di_bh); | ||
7009 | ocfs2_init_dealloc_ctxt(&dealloc); | ||
7010 | |||
7425 | new_highest_cpos = ocfs2_clusters_for_bytes(osb->sb, | 7011 | new_highest_cpos = ocfs2_clusters_for_bytes(osb->sb, |
7426 | i_size_read(inode)); | 7012 | i_size_read(inode)); |
7427 | 7013 | ||
7428 | path = ocfs2_new_path(fe_bh, &di->id2.i_list, | 7014 | path = ocfs2_new_path(di_bh, &di->id2.i_list, |
7429 | ocfs2_journal_access_di); | 7015 | ocfs2_journal_access_di); |
7430 | if (!path) { | 7016 | if (!path) { |
7431 | status = -ENOMEM; | 7017 | status = -ENOMEM; |
@@ -7444,8 +7030,6 @@ start: | |||
7444 | goto bail; | 7030 | goto bail; |
7445 | } | 7031 | } |
7446 | 7032 | ||
7447 | credits = 0; | ||
7448 | |||
7449 | /* | 7033 | /* |
7450 | * Truncate always works against the rightmost tree branch. | 7034 | * Truncate always works against the rightmost tree branch. |
7451 | */ | 7035 | */ |
@@ -7480,101 +7064,62 @@ start: | |||
7480 | } | 7064 | } |
7481 | 7065 | ||
7482 | i = le16_to_cpu(el->l_next_free_rec) - 1; | 7066 | i = le16_to_cpu(el->l_next_free_rec) - 1; |
7483 | range = le32_to_cpu(el->l_recs[i].e_cpos) + | 7067 | rec = &el->l_recs[i]; |
7484 | ocfs2_rec_clusters(el, &el->l_recs[i]); | 7068 | flags = rec->e_flags; |
7485 | if (i == 0 && ocfs2_is_empty_extent(&el->l_recs[i])) { | 7069 | range = le32_to_cpu(rec->e_cpos) + ocfs2_rec_clusters(el, rec); |
7486 | clusters_to_del = 0; | 7070 | |
7487 | } else if (le32_to_cpu(el->l_recs[i].e_cpos) >= new_highest_cpos) { | 7071 | if (i == 0 && ocfs2_is_empty_extent(rec)) { |
7488 | clusters_to_del = ocfs2_rec_clusters(el, &el->l_recs[i]); | 7072 | /* |
7489 | blkno = le64_to_cpu(el->l_recs[i].e_blkno); | 7073 | * Lower levels depend on this never happening, but it's best |
7074 | * to check it up here before changing the tree. | ||
7075 | */ | ||
7076 | if (root_el->l_tree_depth && rec->e_int_clusters == 0) { | ||
7077 | ocfs2_error(inode->i_sb, "Inode %lu has an empty " | ||
7078 | "extent record, depth %u\n", inode->i_ino, | ||
7079 | le16_to_cpu(root_el->l_tree_depth)); | ||
7080 | status = -EROFS; | ||
7081 | goto bail; | ||
7082 | } | ||
7083 | trunc_cpos = le32_to_cpu(rec->e_cpos); | ||
7084 | trunc_len = 0; | ||
7085 | blkno = 0; | ||
7086 | } else if (le32_to_cpu(rec->e_cpos) >= new_highest_cpos) { | ||
7087 | /* | ||
7088 | * Truncate entire record. | ||
7089 | */ | ||
7090 | trunc_cpos = le32_to_cpu(rec->e_cpos); | ||
7091 | trunc_len = ocfs2_rec_clusters(el, rec); | ||
7092 | blkno = le64_to_cpu(rec->e_blkno); | ||
7490 | } else if (range > new_highest_cpos) { | 7093 | } else if (range > new_highest_cpos) { |
7491 | clusters_to_del = (ocfs2_rec_clusters(el, &el->l_recs[i]) + | 7094 | /* |
7492 | le32_to_cpu(el->l_recs[i].e_cpos)) - | 7095 | * Partial truncate. it also should be |
7493 | new_highest_cpos; | 7096 | * the last truncate we're doing. |
7494 | blkno = le64_to_cpu(el->l_recs[i].e_blkno) + | 7097 | */ |
7495 | ocfs2_clusters_to_blocks(inode->i_sb, | 7098 | trunc_cpos = new_highest_cpos; |
7496 | ocfs2_rec_clusters(el, &el->l_recs[i]) - | 7099 | trunc_len = range - new_highest_cpos; |
7497 | clusters_to_del); | 7100 | coff = new_highest_cpos - le32_to_cpu(rec->e_cpos); |
7101 | blkno = le64_to_cpu(rec->e_blkno) + | ||
7102 | ocfs2_clusters_to_blocks(inode->i_sb, coff); | ||
7498 | } else { | 7103 | } else { |
7104 | /* | ||
7105 | * Truncate completed, leave happily. | ||
7106 | */ | ||
7499 | status = 0; | 7107 | status = 0; |
7500 | goto bail; | 7108 | goto bail; |
7501 | } | 7109 | } |
7502 | 7110 | ||
7503 | mlog(0, "clusters_to_del = %u in this pass, tail blk=%llu\n", | 7111 | phys_cpos = ocfs2_blocks_to_clusters(inode->i_sb, blkno); |
7504 | clusters_to_del, (unsigned long long)path_leaf_bh(path)->b_blocknr); | ||
7505 | |||
7506 | if (el->l_recs[i].e_flags & OCFS2_EXT_REFCOUNTED && clusters_to_del) { | ||
7507 | BUG_ON(!(OCFS2_I(inode)->ip_dyn_features & | ||
7508 | OCFS2_HAS_REFCOUNT_FL)); | ||
7509 | |||
7510 | status = ocfs2_lock_refcount_tree(osb, | ||
7511 | le64_to_cpu(di->i_refcount_loc), | ||
7512 | 1, &ref_tree, NULL); | ||
7513 | if (status) { | ||
7514 | mlog_errno(status); | ||
7515 | goto bail; | ||
7516 | } | ||
7517 | |||
7518 | status = ocfs2_prepare_refcount_change_for_del(inode, fe_bh, | ||
7519 | blkno, | ||
7520 | clusters_to_del, | ||
7521 | &credits, | ||
7522 | &meta_ac); | ||
7523 | if (status < 0) { | ||
7524 | mlog_errno(status); | ||
7525 | goto bail; | ||
7526 | } | ||
7527 | } | ||
7528 | |||
7529 | mutex_lock(&tl_inode->i_mutex); | ||
7530 | tl_sem = 1; | ||
7531 | /* ocfs2_truncate_log_needs_flush guarantees us at least one | ||
7532 | * record is free for use. If there isn't any, we flush to get | ||
7533 | * an empty truncate log. */ | ||
7534 | if (ocfs2_truncate_log_needs_flush(osb)) { | ||
7535 | status = __ocfs2_flush_truncate_log(osb); | ||
7536 | if (status < 0) { | ||
7537 | mlog_errno(status); | ||
7538 | goto bail; | ||
7539 | } | ||
7540 | } | ||
7541 | 7112 | ||
7542 | credits += ocfs2_calc_tree_trunc_credits(osb->sb, clusters_to_del, | 7113 | status = ocfs2_remove_btree_range(inode, &et, trunc_cpos, |
7543 | (struct ocfs2_dinode *)fe_bh->b_data, | 7114 | phys_cpos, trunc_len, flags, &dealloc, |
7544 | el); | 7115 | refcount_loc); |
7545 | handle = ocfs2_start_trans(osb, credits); | ||
7546 | if (IS_ERR(handle)) { | ||
7547 | status = PTR_ERR(handle); | ||
7548 | handle = NULL; | ||
7549 | mlog_errno(status); | ||
7550 | goto bail; | ||
7551 | } | ||
7552 | |||
7553 | status = ocfs2_do_truncate(osb, clusters_to_del, inode, fe_bh, handle, | ||
7554 | tc, path, meta_ac); | ||
7555 | if (status < 0) { | 7116 | if (status < 0) { |
7556 | mlog_errno(status); | 7117 | mlog_errno(status); |
7557 | goto bail; | 7118 | goto bail; |
7558 | } | 7119 | } |
7559 | 7120 | ||
7560 | mutex_unlock(&tl_inode->i_mutex); | ||
7561 | tl_sem = 0; | ||
7562 | |||
7563 | ocfs2_commit_trans(osb, handle); | ||
7564 | handle = NULL; | ||
7565 | |||
7566 | ocfs2_reinit_path(path, 1); | 7121 | ocfs2_reinit_path(path, 1); |
7567 | 7122 | ||
7568 | if (meta_ac) { | ||
7569 | ocfs2_free_alloc_context(meta_ac); | ||
7570 | meta_ac = NULL; | ||
7571 | } | ||
7572 | |||
7573 | if (ref_tree) { | ||
7574 | ocfs2_unlock_refcount_tree(osb, ref_tree, 1); | ||
7575 | ref_tree = NULL; | ||
7576 | } | ||
7577 | |||
7578 | /* | 7123 | /* |
7579 | * The check above will catch the case where we've truncated | 7124 | * The check above will catch the case where we've truncated |
7580 | * away all allocation. | 7125 | * away all allocation. |
@@ -7585,25 +7130,10 @@ bail: | |||
7585 | 7130 | ||
7586 | ocfs2_schedule_truncate_log_flush(osb, 1); | 7131 | ocfs2_schedule_truncate_log_flush(osb, 1); |
7587 | 7132 | ||
7588 | if (tl_sem) | 7133 | ocfs2_run_deallocs(osb, &dealloc); |
7589 | mutex_unlock(&tl_inode->i_mutex); | ||
7590 | |||
7591 | if (handle) | ||
7592 | ocfs2_commit_trans(osb, handle); | ||
7593 | |||
7594 | if (meta_ac) | ||
7595 | ocfs2_free_alloc_context(meta_ac); | ||
7596 | |||
7597 | if (ref_tree) | ||
7598 | ocfs2_unlock_refcount_tree(osb, ref_tree, 1); | ||
7599 | |||
7600 | ocfs2_run_deallocs(osb, &tc->tc_dealloc); | ||
7601 | 7134 | ||
7602 | ocfs2_free_path(path); | 7135 | ocfs2_free_path(path); |
7603 | 7136 | ||
7604 | /* This will drop the ext_alloc cluster lock for us */ | ||
7605 | ocfs2_free_truncate_context(tc); | ||
7606 | |||
7607 | mlog_exit(status); | 7137 | mlog_exit(status); |
7608 | return status; | 7138 | return status; |
7609 | } | 7139 | } |