aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ocfs2/alloc.c
diff options
context:
space:
mode:
authorTao Ma <tao.ma@oracle.com>2009-08-17 23:22:34 -0400
committerJoel Becker <joel.becker@oracle.com>2009-09-22 23:09:32 -0400
commite2e9f6082b5ff099978774d5c0148e062344c2f9 (patch)
tree1da7dc993c77ca08cb83aba8f21e0da9fd055044 /fs/ocfs2/alloc.c
parentfe924415957e60471536762172d127e85519ef78 (diff)
ocfs2: move tree path functions to alloc.h.
Now fs/ocfs2/alloc.c has more than 7000 lines. It contains our basic b-tree operation. Although we have already make our b-tree operation generic, the basic structrue ocfs2_path which is used to iterate one b-tree branch is still static and limited to only used in alloc.c. As refcount tree need them and I don't want to add any more b-tree unrelated code to alloc.c, export them out. Signed-off-by: Tao Ma <tao.ma@oracle.com>
Diffstat (limited to 'fs/ocfs2/alloc.c')
-rw-r--r--fs/ocfs2/alloc.c76
1 files changed, 23 insertions, 53 deletions
diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c
index a6296560a5cb..2c8ce32adf01 100644
--- a/fs/ocfs2/alloc.c
+++ b/fs/ocfs2/alloc.c
@@ -567,36 +567,6 @@ static inline int ocfs2_et_sanity_check(struct ocfs2_extent_tree *et)
567static void ocfs2_free_truncate_context(struct ocfs2_truncate_context *tc); 567static void ocfs2_free_truncate_context(struct ocfs2_truncate_context *tc);
568static int ocfs2_cache_extent_block_free(struct ocfs2_cached_dealloc_ctxt *ctxt, 568static int ocfs2_cache_extent_block_free(struct ocfs2_cached_dealloc_ctxt *ctxt,
569 struct ocfs2_extent_block *eb); 569 struct ocfs2_extent_block *eb);
570
571/*
572 * Structures which describe a path through a btree, and functions to
573 * manipulate them.
574 *
575 * The idea here is to be as generic as possible with the tree
576 * manipulation code.
577 */
578struct ocfs2_path_item {
579 struct buffer_head *bh;
580 struct ocfs2_extent_list *el;
581};
582
583#define OCFS2_MAX_PATH_DEPTH 5
584
585struct ocfs2_path {
586 int p_tree_depth;
587 ocfs2_journal_access_func p_root_access;
588 struct ocfs2_path_item p_node[OCFS2_MAX_PATH_DEPTH];
589};
590
591#define path_root_bh(_path) ((_path)->p_node[0].bh)
592#define path_root_el(_path) ((_path)->p_node[0].el)
593#define path_root_access(_path)((_path)->p_root_access)
594#define path_leaf_bh(_path) ((_path)->p_node[(_path)->p_tree_depth].bh)
595#define path_leaf_el(_path) ((_path)->p_node[(_path)->p_tree_depth].el)
596#define path_num_items(_path) ((_path)->p_tree_depth + 1)
597
598static int ocfs2_find_path(struct ocfs2_caching_info *ci,
599 struct ocfs2_path *path, u32 cpos);
600static void ocfs2_adjust_rightmost_records(handle_t *handle, 570static void ocfs2_adjust_rightmost_records(handle_t *handle,
601 struct ocfs2_extent_tree *et, 571 struct ocfs2_extent_tree *et,
602 struct ocfs2_path *path, 572 struct ocfs2_path *path,
@@ -606,7 +576,7 @@ static void ocfs2_adjust_rightmost_records(handle_t *handle,
606 * to build another path. Generally, this involves freeing the buffer 576 * to build another path. Generally, this involves freeing the buffer
607 * heads. 577 * heads.
608 */ 578 */
609static void ocfs2_reinit_path(struct ocfs2_path *path, int keep_root) 579void ocfs2_reinit_path(struct ocfs2_path *path, int keep_root)
610{ 580{
611 int i, start = 0, depth = 0; 581 int i, start = 0, depth = 0;
612 struct ocfs2_path_item *node; 582 struct ocfs2_path_item *node;
@@ -635,7 +605,7 @@ static void ocfs2_reinit_path(struct ocfs2_path *path, int keep_root)
635 path->p_tree_depth = depth; 605 path->p_tree_depth = depth;
636} 606}
637 607
638static void ocfs2_free_path(struct ocfs2_path *path) 608void ocfs2_free_path(struct ocfs2_path *path)
639{ 609{
640 if (path) { 610 if (path) {
641 ocfs2_reinit_path(path, 0); 611 ocfs2_reinit_path(path, 0);
@@ -733,13 +703,13 @@ static struct ocfs2_path *ocfs2_new_path(struct buffer_head *root_bh,
733 return path; 703 return path;
734} 704}
735 705
736static struct ocfs2_path *ocfs2_new_path_from_path(struct ocfs2_path *path) 706struct ocfs2_path *ocfs2_new_path_from_path(struct ocfs2_path *path)
737{ 707{
738 return ocfs2_new_path(path_root_bh(path), path_root_el(path), 708 return ocfs2_new_path(path_root_bh(path), path_root_el(path),
739 path_root_access(path)); 709 path_root_access(path));
740} 710}
741 711
742static struct ocfs2_path *ocfs2_new_path_from_et(struct ocfs2_extent_tree *et) 712struct ocfs2_path *ocfs2_new_path_from_et(struct ocfs2_extent_tree *et)
743{ 713{
744 return ocfs2_new_path(et->et_root_bh, et->et_root_el, 714 return ocfs2_new_path(et->et_root_bh, et->et_root_el,
745 et->et_root_journal_access); 715 et->et_root_journal_access);
@@ -752,10 +722,10 @@ static struct ocfs2_path *ocfs2_new_path_from_et(struct ocfs2_extent_tree *et)
752 * I don't like the way this function's name looks next to 722 * I don't like the way this function's name looks next to
753 * ocfs2_journal_access_path(), but I don't have a better one. 723 * ocfs2_journal_access_path(), but I don't have a better one.
754 */ 724 */
755static int ocfs2_path_bh_journal_access(handle_t *handle, 725int ocfs2_path_bh_journal_access(handle_t *handle,
756 struct ocfs2_caching_info *ci, 726 struct ocfs2_caching_info *ci,
757 struct ocfs2_path *path, 727 struct ocfs2_path *path,
758 int idx) 728 int idx)
759{ 729{
760 ocfs2_journal_access_func access = path_root_access(path); 730 ocfs2_journal_access_func access = path_root_access(path);
761 731
@@ -772,9 +742,9 @@ static int ocfs2_path_bh_journal_access(handle_t *handle,
772/* 742/*
773 * Convenience function to journal all components in a path. 743 * Convenience function to journal all components in a path.
774 */ 744 */
775static int ocfs2_journal_access_path(struct ocfs2_caching_info *ci, 745int ocfs2_journal_access_path(struct ocfs2_caching_info *ci,
776 handle_t *handle, 746 handle_t *handle,
777 struct ocfs2_path *path) 747 struct ocfs2_path *path)
778{ 748{
779 int i, ret = 0; 749 int i, ret = 0;
780 750
@@ -1942,8 +1912,8 @@ static void find_path_ins(void *data, struct buffer_head *bh)
1942 ocfs2_path_insert_eb(fp->path, fp->index, bh); 1912 ocfs2_path_insert_eb(fp->path, fp->index, bh);
1943 fp->index++; 1913 fp->index++;
1944} 1914}
1945static int ocfs2_find_path(struct ocfs2_caching_info *ci, 1915int ocfs2_find_path(struct ocfs2_caching_info *ci,
1946 struct ocfs2_path *path, u32 cpos) 1916 struct ocfs2_path *path, u32 cpos)
1947{ 1917{
1948 struct find_path_data data; 1918 struct find_path_data data;
1949 1919
@@ -5104,13 +5074,13 @@ out:
5104 * have been brought into cache (and pinned via the journal), so the 5074 * have been brought into cache (and pinned via the journal), so the
5105 * extra overhead is not expressed in terms of disk reads. 5075 * extra overhead is not expressed in terms of disk reads.
5106 */ 5076 */
5107static int __ocfs2_split_extent(handle_t *handle, 5077int ocfs2_split_extent(handle_t *handle,
5108 struct ocfs2_extent_tree *et, 5078 struct ocfs2_extent_tree *et,
5109 struct ocfs2_path *path, 5079 struct ocfs2_path *path,
5110 int split_index, 5080 int split_index,
5111 struct ocfs2_extent_rec *split_rec, 5081 struct ocfs2_extent_rec *split_rec,
5112 struct ocfs2_alloc_context *meta_ac, 5082 struct ocfs2_alloc_context *meta_ac,
5113 struct ocfs2_cached_dealloc_ctxt *dealloc) 5083 struct ocfs2_cached_dealloc_ctxt *dealloc)
5114{ 5084{
5115 int ret = 0; 5085 int ret = 0;
5116 struct ocfs2_extent_list *el = path_leaf_el(path); 5086 struct ocfs2_extent_list *el = path_leaf_el(path);
@@ -5267,9 +5237,9 @@ static int ocfs2_change_extent_flag(handle_t *handle,
5267 if (clear_flags) 5237 if (clear_flags)
5268 split_rec.e_flags &= ~clear_flags; 5238 split_rec.e_flags &= ~clear_flags;
5269 5239
5270 ret = __ocfs2_split_extent(handle, et, left_path, 5240 ret = ocfs2_split_extent(handle, et, left_path,
5271 index, &split_rec, meta_ac, 5241 index, &split_rec, meta_ac,
5272 dealloc); 5242 dealloc);
5273 if (ret) 5243 if (ret)
5274 mlog_errno(ret); 5244 mlog_errno(ret);
5275 5245