aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ocfs2
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ocfs2')
-rw-r--r--fs/ocfs2/alloc.c57
1 files changed, 41 insertions, 16 deletions
diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c
index ab4d2b59b472..75e65df34b69 100644
--- a/fs/ocfs2/alloc.c
+++ b/fs/ocfs2/alloc.c
@@ -52,7 +52,17 @@
52 52
53#include "buffer_head_io.h" 53#include "buffer_head_io.h"
54 54
55enum ocfs2_contig_type {
56 CONTIG_NONE = 0,
57 CONTIG_LEFT,
58 CONTIG_RIGHT,
59 CONTIG_LEFTRIGHT,
60};
55 61
62static enum ocfs2_contig_type
63 ocfs2_extent_rec_contig(struct super_block *sb,
64 struct ocfs2_extent_rec *ext,
65 struct ocfs2_extent_rec *insert_rec);
56/* 66/*
57 * Operations for a specific extent tree type. 67 * Operations for a specific extent tree type.
58 * 68 *
@@ -122,6 +132,16 @@ struct ocfs2_extent_tree_operations {
122 * to 0 (unlimited). Optional. 132 * to 0 (unlimited). Optional.
123 */ 133 */
124 void (*eo_fill_max_leaf_clusters)(struct ocfs2_extent_tree *et); 134 void (*eo_fill_max_leaf_clusters)(struct ocfs2_extent_tree *et);
135
136 /*
137 * ->eo_extent_contig test whether the 2 ocfs2_extent_rec
138 * are contiguous or not. Optional. Don't need to set it if use
139 * ocfs2_extent_rec as the tree leaf.
140 */
141 enum ocfs2_contig_type
142 (*eo_extent_contig)(struct ocfs2_extent_tree *et,
143 struct ocfs2_extent_rec *ext,
144 struct ocfs2_extent_rec *insert_rec);
125}; 145};
126 146
127 147
@@ -458,6 +478,19 @@ static inline int ocfs2_et_root_journal_access(handle_t *handle,
458 type); 478 type);
459} 479}
460 480
481static inline enum ocfs2_contig_type
482 ocfs2_et_extent_contig(struct ocfs2_extent_tree *et,
483 struct ocfs2_extent_rec *rec,
484 struct ocfs2_extent_rec *insert_rec)
485{
486 if (et->et_ops->eo_extent_contig)
487 return et->et_ops->eo_extent_contig(et, rec, insert_rec);
488
489 return ocfs2_extent_rec_contig(
490 ocfs2_metadata_cache_get_super(et->et_ci),
491 rec, insert_rec);
492}
493
461static inline int ocfs2_et_insert_check(struct ocfs2_extent_tree *et, 494static inline int ocfs2_et_insert_check(struct ocfs2_extent_tree *et,
462 struct ocfs2_extent_rec *rec) 495 struct ocfs2_extent_rec *rec)
463{ 496{
@@ -736,17 +769,9 @@ int ocfs2_search_extent_list(struct ocfs2_extent_list *el, u32 v_cluster)
736 return ret; 769 return ret;
737} 770}
738 771
739enum ocfs2_contig_type {
740 CONTIG_NONE = 0,
741 CONTIG_LEFT,
742 CONTIG_RIGHT,
743 CONTIG_LEFTRIGHT,
744};
745
746
747/* 772/*
748 * NOTE: ocfs2_block_extent_contig(), ocfs2_extents_adjacent() and 773 * NOTE: ocfs2_block_extent_contig(), ocfs2_extents_adjacent() and
749 * ocfs2_extent_contig only work properly against leaf nodes! 774 * ocfs2_extent_rec_contig only work properly against leaf nodes!
750 */ 775 */
751static int ocfs2_block_extent_contig(struct super_block *sb, 776static int ocfs2_block_extent_contig(struct super_block *sb,
752 struct ocfs2_extent_rec *ext, 777 struct ocfs2_extent_rec *ext,
@@ -772,9 +797,9 @@ static int ocfs2_extents_adjacent(struct ocfs2_extent_rec *left,
772} 797}
773 798
774static enum ocfs2_contig_type 799static enum ocfs2_contig_type
775 ocfs2_extent_contig(struct super_block *sb, 800 ocfs2_extent_rec_contig(struct super_block *sb,
776 struct ocfs2_extent_rec *ext, 801 struct ocfs2_extent_rec *ext,
777 struct ocfs2_extent_rec *insert_rec) 802 struct ocfs2_extent_rec *insert_rec)
778{ 803{
779 u64 blkno = le64_to_cpu(insert_rec->e_blkno); 804 u64 blkno = le64_to_cpu(insert_rec->e_blkno);
780 805
@@ -4400,7 +4425,7 @@ ocfs2_figure_merge_contig_type(struct ocfs2_extent_tree *et,
4400 if (split_rec->e_cpos == el->l_recs[index].e_cpos) 4425 if (split_rec->e_cpos == el->l_recs[index].e_cpos)
4401 ret = CONTIG_RIGHT; 4426 ret = CONTIG_RIGHT;
4402 } else { 4427 } else {
4403 ret = ocfs2_extent_contig(sb, rec, split_rec); 4428 ret = ocfs2_et_extent_contig(et, rec, split_rec);
4404 } 4429 }
4405 } 4430 }
4406 4431
@@ -4445,7 +4470,7 @@ ocfs2_figure_merge_contig_type(struct ocfs2_extent_tree *et,
4445 if (rec) { 4470 if (rec) {
4446 enum ocfs2_contig_type contig_type; 4471 enum ocfs2_contig_type contig_type;
4447 4472
4448 contig_type = ocfs2_extent_contig(sb, rec, split_rec); 4473 contig_type = ocfs2_et_extent_contig(et, rec, split_rec);
4449 4474
4450 if (contig_type == CONTIG_LEFT && ret == CONTIG_RIGHT) 4475 if (contig_type == CONTIG_LEFT && ret == CONTIG_RIGHT)
4451 ret = CONTIG_LEFTRIGHT; 4476 ret = CONTIG_LEFTRIGHT;
@@ -4473,8 +4498,8 @@ static void ocfs2_figure_contig_type(struct ocfs2_extent_tree *et,
4473 BUG_ON(le16_to_cpu(el->l_tree_depth) != 0); 4498 BUG_ON(le16_to_cpu(el->l_tree_depth) != 0);
4474 4499
4475 for(i = 0; i < le16_to_cpu(el->l_next_free_rec); i++) { 4500 for(i = 0; i < le16_to_cpu(el->l_next_free_rec); i++) {
4476 contig_type = ocfs2_extent_contig(ocfs2_metadata_cache_get_super(et->et_ci), 4501 contig_type = ocfs2_et_extent_contig(et, &el->l_recs[i],
4477 &el->l_recs[i], insert_rec); 4502 insert_rec);
4478 if (contig_type != CONTIG_NONE) { 4503 if (contig_type != CONTIG_NONE) {
4479 insert->ins_contig_index = i; 4504 insert->ins_contig_index = i;
4480 break; 4505 break;