diff options
author | Dave Chinner <dchinner@redhat.com> | 2013-10-29 07:11:52 -0400 |
---|---|---|
committer | Ben Myers <bpm@sgi.com> | 2013-10-30 14:47:22 -0400 |
commit | 01ba43b873d9e91ba2e0341fe8cb7e89eaa41661 (patch) | |
tree | 34b0f2ae40956eaf3a2dc1a693f29ff4200eb845 /fs/xfs/xfs_da_btree.c | |
parent | 4bceb18f1551c8c047eeb54d48cda9f5453dc12f (diff) |
xfs: vectorise encoding/decoding directory headers
Conversion from on-disk structures to in-core header structures
currently relies on magic number checks. If the magic number is
wrong, but one of the supported values, we do the wrong thing with
the encode/decode operation. Split these functions so that there are
discrete operations for the specific directory format we are
handling.
In doing this, move all the header encode/decode functions to
xfs_da_format.c as they are directly manipulating the on-disk
format. It should be noted that all the growth in binary size is
from xfs_da_format.c - the rest of the code actaully shrinks.
text data bss dec hex filename
794490 96802 1096 892388 d9de4 fs/xfs/xfs.o.orig
792986 96802 1096 890884 d9804 fs/xfs/xfs.o.p1
792350 96802 1096 890248 d9588 fs/xfs/xfs.o.p2
789293 96802 1096 887191 d8997 fs/xfs/xfs.o.p3
789005 96802 1096 886903 d8997 fs/xfs/xfs.o.p4
789061 96802 1096 886959 d88af fs/xfs/xfs.o.p5
789733 96802 1096 887631 d8b4f fs/xfs/xfs.o.p6
791421 96802 1096 889319 d91e7 fs/xfs/xfs.o.p7
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Ben Myers <bpm@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_da_btree.c')
-rw-r--r-- | fs/xfs/xfs_da_btree.c | 141 |
1 files changed, 49 insertions, 92 deletions
diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 26dfc42a28f9..a51762dae543 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c | |||
@@ -129,56 +129,6 @@ xfs_da_state_free(xfs_da_state_t *state) | |||
129 | kmem_zone_free(xfs_da_state_zone, state); | 129 | kmem_zone_free(xfs_da_state_zone, state); |
130 | } | 130 | } |
131 | 131 | ||
132 | void | ||
133 | xfs_da3_node_hdr_from_disk( | ||
134 | struct xfs_da3_icnode_hdr *to, | ||
135 | struct xfs_da_intnode *from) | ||
136 | { | ||
137 | ASSERT(from->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || | ||
138 | from->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)); | ||
139 | |||
140 | if (from->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { | ||
141 | struct xfs_da3_node_hdr *hdr3 = (struct xfs_da3_node_hdr *)from; | ||
142 | |||
143 | to->forw = be32_to_cpu(hdr3->info.hdr.forw); | ||
144 | to->back = be32_to_cpu(hdr3->info.hdr.back); | ||
145 | to->magic = be16_to_cpu(hdr3->info.hdr.magic); | ||
146 | to->count = be16_to_cpu(hdr3->__count); | ||
147 | to->level = be16_to_cpu(hdr3->__level); | ||
148 | return; | ||
149 | } | ||
150 | to->forw = be32_to_cpu(from->hdr.info.forw); | ||
151 | to->back = be32_to_cpu(from->hdr.info.back); | ||
152 | to->magic = be16_to_cpu(from->hdr.info.magic); | ||
153 | to->count = be16_to_cpu(from->hdr.__count); | ||
154 | to->level = be16_to_cpu(from->hdr.__level); | ||
155 | } | ||
156 | |||
157 | void | ||
158 | xfs_da3_node_hdr_to_disk( | ||
159 | struct xfs_da_intnode *to, | ||
160 | struct xfs_da3_icnode_hdr *from) | ||
161 | { | ||
162 | ASSERT(from->magic == XFS_DA_NODE_MAGIC || | ||
163 | from->magic == XFS_DA3_NODE_MAGIC); | ||
164 | |||
165 | if (from->magic == XFS_DA3_NODE_MAGIC) { | ||
166 | struct xfs_da3_node_hdr *hdr3 = (struct xfs_da3_node_hdr *)to; | ||
167 | |||
168 | hdr3->info.hdr.forw = cpu_to_be32(from->forw); | ||
169 | hdr3->info.hdr.back = cpu_to_be32(from->back); | ||
170 | hdr3->info.hdr.magic = cpu_to_be16(from->magic); | ||
171 | hdr3->__count = cpu_to_be16(from->count); | ||
172 | hdr3->__level = cpu_to_be16(from->level); | ||
173 | return; | ||
174 | } | ||
175 | to->hdr.info.forw = cpu_to_be32(from->forw); | ||
176 | to->hdr.info.back = cpu_to_be32(from->back); | ||
177 | to->hdr.info.magic = cpu_to_be16(from->magic); | ||
178 | to->hdr.__count = cpu_to_be16(from->count); | ||
179 | to->hdr.__level = cpu_to_be16(from->level); | ||
180 | } | ||
181 | |||
182 | static bool | 132 | static bool |
183 | xfs_da3_node_verify( | 133 | xfs_da3_node_verify( |
184 | struct xfs_buf *bp) | 134 | struct xfs_buf *bp) |
@@ -186,8 +136,11 @@ xfs_da3_node_verify( | |||
186 | struct xfs_mount *mp = bp->b_target->bt_mount; | 136 | struct xfs_mount *mp = bp->b_target->bt_mount; |
187 | struct xfs_da_intnode *hdr = bp->b_addr; | 137 | struct xfs_da_intnode *hdr = bp->b_addr; |
188 | struct xfs_da3_icnode_hdr ichdr; | 138 | struct xfs_da3_icnode_hdr ichdr; |
139 | const struct xfs_dir_ops *ops; | ||
140 | |||
141 | ops = xfs_dir_get_ops(mp, NULL); | ||
189 | 142 | ||
190 | xfs_da3_node_hdr_from_disk(&ichdr, hdr); | 143 | ops->node_hdr_from_disk(&ichdr, hdr); |
191 | 144 | ||
192 | if (xfs_sb_version_hascrc(&mp->m_sb)) { | 145 | if (xfs_sb_version_hascrc(&mp->m_sb)) { |
193 | struct xfs_da3_node_hdr *hdr3 = bp->b_addr; | 146 | struct xfs_da3_node_hdr *hdr3 = bp->b_addr; |
@@ -354,11 +307,12 @@ xfs_da3_node_create( | |||
354 | struct xfs_da3_icnode_hdr ichdr = {0}; | 307 | struct xfs_da3_icnode_hdr ichdr = {0}; |
355 | struct xfs_buf *bp; | 308 | struct xfs_buf *bp; |
356 | int error; | 309 | int error; |
310 | struct xfs_inode *dp = args->dp; | ||
357 | 311 | ||
358 | trace_xfs_da_node_create(args); | 312 | trace_xfs_da_node_create(args); |
359 | ASSERT(level <= XFS_DA_NODE_MAXDEPTH); | 313 | ASSERT(level <= XFS_DA_NODE_MAXDEPTH); |
360 | 314 | ||
361 | error = xfs_da_get_buf(tp, args->dp, blkno, -1, &bp, whichfork); | 315 | error = xfs_da_get_buf(tp, dp, blkno, -1, &bp, whichfork); |
362 | if (error) | 316 | if (error) |
363 | return(error); | 317 | return(error); |
364 | bp->b_ops = &xfs_da3_node_buf_ops; | 318 | bp->b_ops = &xfs_da3_node_buf_ops; |
@@ -377,10 +331,10 @@ xfs_da3_node_create( | |||
377 | } | 331 | } |
378 | ichdr.level = level; | 332 | ichdr.level = level; |
379 | 333 | ||
380 | xfs_da3_node_hdr_to_disk(node, &ichdr); | 334 | dp->d_ops->node_hdr_to_disk(node, &ichdr); |
381 | xfs_trans_log_buf(tp, bp, | 335 | xfs_trans_log_buf(tp, bp, |
382 | XFS_DA_LOGRANGE(node, &node->hdr, | 336 | XFS_DA_LOGRANGE(node, &node->hdr, |
383 | args->dp->d_ops->node_hdr_size())); | 337 | dp->d_ops->node_hdr_size())); |
384 | 338 | ||
385 | *bpp = bp; | 339 | *bpp = bp; |
386 | return(0); | 340 | return(0); |
@@ -590,7 +544,7 @@ xfs_da3_root_split( | |||
590 | oldroot->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { | 544 | oldroot->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { |
591 | struct xfs_da3_icnode_hdr nodehdr; | 545 | struct xfs_da3_icnode_hdr nodehdr; |
592 | 546 | ||
593 | xfs_da3_node_hdr_from_disk(&nodehdr, oldroot); | 547 | dp->d_ops->node_hdr_from_disk(&nodehdr, oldroot); |
594 | btree = dp->d_ops->node_tree_p(oldroot); | 548 | btree = dp->d_ops->node_tree_p(oldroot); |
595 | size = (int)((char *)&btree[nodehdr.count] - (char *)oldroot); | 549 | size = (int)((char *)&btree[nodehdr.count] - (char *)oldroot); |
596 | level = nodehdr.level; | 550 | level = nodehdr.level; |
@@ -605,7 +559,7 @@ xfs_da3_root_split( | |||
605 | struct xfs_dir2_leaf_entry *ents; | 559 | struct xfs_dir2_leaf_entry *ents; |
606 | 560 | ||
607 | leaf = (xfs_dir2_leaf_t *)oldroot; | 561 | leaf = (xfs_dir2_leaf_t *)oldroot; |
608 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 562 | dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); |
609 | ents = dp->d_ops->leaf_ents_p(leaf); | 563 | ents = dp->d_ops->leaf_ents_p(leaf); |
610 | 564 | ||
611 | ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || | 565 | ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || |
@@ -650,14 +604,14 @@ xfs_da3_root_split( | |||
650 | return error; | 604 | return error; |
651 | 605 | ||
652 | node = bp->b_addr; | 606 | node = bp->b_addr; |
653 | xfs_da3_node_hdr_from_disk(&nodehdr, node); | 607 | dp->d_ops->node_hdr_from_disk(&nodehdr, node); |
654 | btree = dp->d_ops->node_tree_p(node); | 608 | btree = dp->d_ops->node_tree_p(node); |
655 | btree[0].hashval = cpu_to_be32(blk1->hashval); | 609 | btree[0].hashval = cpu_to_be32(blk1->hashval); |
656 | btree[0].before = cpu_to_be32(blk1->blkno); | 610 | btree[0].before = cpu_to_be32(blk1->blkno); |
657 | btree[1].hashval = cpu_to_be32(blk2->hashval); | 611 | btree[1].hashval = cpu_to_be32(blk2->hashval); |
658 | btree[1].before = cpu_to_be32(blk2->blkno); | 612 | btree[1].before = cpu_to_be32(blk2->blkno); |
659 | nodehdr.count = 2; | 613 | nodehdr.count = 2; |
660 | xfs_da3_node_hdr_to_disk(node, &nodehdr); | 614 | dp->d_ops->node_hdr_to_disk(node, &nodehdr); |
661 | 615 | ||
662 | #ifdef DEBUG | 616 | #ifdef DEBUG |
663 | if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || | 617 | if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || |
@@ -694,11 +648,12 @@ xfs_da3_node_split( | |||
694 | int newcount; | 648 | int newcount; |
695 | int error; | 649 | int error; |
696 | int useextra; | 650 | int useextra; |
651 | struct xfs_inode *dp = state->args->dp; | ||
697 | 652 | ||
698 | trace_xfs_da_node_split(state->args); | 653 | trace_xfs_da_node_split(state->args); |
699 | 654 | ||
700 | node = oldblk->bp->b_addr; | 655 | node = oldblk->bp->b_addr; |
701 | xfs_da3_node_hdr_from_disk(&nodehdr, node); | 656 | dp->d_ops->node_hdr_from_disk(&nodehdr, node); |
702 | 657 | ||
703 | /* | 658 | /* |
704 | * With V2 dirs the extra block is data or freespace. | 659 | * With V2 dirs the extra block is data or freespace. |
@@ -745,7 +700,7 @@ xfs_da3_node_split( | |||
745 | * If we had double-split op below us, then add the extra block too. | 700 | * If we had double-split op below us, then add the extra block too. |
746 | */ | 701 | */ |
747 | node = oldblk->bp->b_addr; | 702 | node = oldblk->bp->b_addr; |
748 | xfs_da3_node_hdr_from_disk(&nodehdr, node); | 703 | dp->d_ops->node_hdr_from_disk(&nodehdr, node); |
749 | if (oldblk->index <= nodehdr.count) { | 704 | if (oldblk->index <= nodehdr.count) { |
750 | oldblk->index++; | 705 | oldblk->index++; |
751 | xfs_da3_node_add(state, oldblk, addblk); | 706 | xfs_da3_node_add(state, oldblk, addblk); |
@@ -800,8 +755,8 @@ xfs_da3_node_rebalance( | |||
800 | 755 | ||
801 | node1 = blk1->bp->b_addr; | 756 | node1 = blk1->bp->b_addr; |
802 | node2 = blk2->bp->b_addr; | 757 | node2 = blk2->bp->b_addr; |
803 | xfs_da3_node_hdr_from_disk(&nodehdr1, node1); | 758 | dp->d_ops->node_hdr_from_disk(&nodehdr1, node1); |
804 | xfs_da3_node_hdr_from_disk(&nodehdr2, node2); | 759 | dp->d_ops->node_hdr_from_disk(&nodehdr2, node2); |
805 | btree1 = dp->d_ops->node_tree_p(node1); | 760 | btree1 = dp->d_ops->node_tree_p(node1); |
806 | btree2 = dp->d_ops->node_tree_p(node2); | 761 | btree2 = dp->d_ops->node_tree_p(node2); |
807 | 762 | ||
@@ -816,8 +771,8 @@ xfs_da3_node_rebalance( | |||
816 | tmpnode = node1; | 771 | tmpnode = node1; |
817 | node1 = node2; | 772 | node1 = node2; |
818 | node2 = tmpnode; | 773 | node2 = tmpnode; |
819 | xfs_da3_node_hdr_from_disk(&nodehdr1, node1); | 774 | dp->d_ops->node_hdr_from_disk(&nodehdr1, node1); |
820 | xfs_da3_node_hdr_from_disk(&nodehdr2, node2); | 775 | dp->d_ops->node_hdr_from_disk(&nodehdr2, node2); |
821 | btree1 = dp->d_ops->node_tree_p(node1); | 776 | btree1 = dp->d_ops->node_tree_p(node1); |
822 | btree2 = dp->d_ops->node_tree_p(node2); | 777 | btree2 = dp->d_ops->node_tree_p(node2); |
823 | swap = 1; | 778 | swap = 1; |
@@ -881,12 +836,12 @@ xfs_da3_node_rebalance( | |||
881 | /* | 836 | /* |
882 | * Log header of node 1 and all current bits of node 2. | 837 | * Log header of node 1 and all current bits of node 2. |
883 | */ | 838 | */ |
884 | xfs_da3_node_hdr_to_disk(node1, &nodehdr1); | 839 | dp->d_ops->node_hdr_to_disk(node1, &nodehdr1); |
885 | xfs_trans_log_buf(tp, blk1->bp, | 840 | xfs_trans_log_buf(tp, blk1->bp, |
886 | XFS_DA_LOGRANGE(node1, &node1->hdr, | 841 | XFS_DA_LOGRANGE(node1, &node1->hdr, |
887 | dp->d_ops->node_hdr_size())); | 842 | dp->d_ops->node_hdr_size())); |
888 | 843 | ||
889 | xfs_da3_node_hdr_to_disk(node2, &nodehdr2); | 844 | dp->d_ops->node_hdr_to_disk(node2, &nodehdr2); |
890 | xfs_trans_log_buf(tp, blk2->bp, | 845 | xfs_trans_log_buf(tp, blk2->bp, |
891 | XFS_DA_LOGRANGE(node2, &node2->hdr, | 846 | XFS_DA_LOGRANGE(node2, &node2->hdr, |
892 | dp->d_ops->node_hdr_size() + | 847 | dp->d_ops->node_hdr_size() + |
@@ -899,8 +854,8 @@ xfs_da3_node_rebalance( | |||
899 | if (swap) { | 854 | if (swap) { |
900 | node1 = blk1->bp->b_addr; | 855 | node1 = blk1->bp->b_addr; |
901 | node2 = blk2->bp->b_addr; | 856 | node2 = blk2->bp->b_addr; |
902 | xfs_da3_node_hdr_from_disk(&nodehdr1, node1); | 857 | dp->d_ops->node_hdr_from_disk(&nodehdr1, node1); |
903 | xfs_da3_node_hdr_from_disk(&nodehdr2, node2); | 858 | dp->d_ops->node_hdr_from_disk(&nodehdr2, node2); |
904 | btree1 = dp->d_ops->node_tree_p(node1); | 859 | btree1 = dp->d_ops->node_tree_p(node1); |
905 | btree2 = dp->d_ops->node_tree_p(node2); | 860 | btree2 = dp->d_ops->node_tree_p(node2); |
906 | } | 861 | } |
@@ -934,7 +889,7 @@ xfs_da3_node_add( | |||
934 | trace_xfs_da_node_add(state->args); | 889 | trace_xfs_da_node_add(state->args); |
935 | 890 | ||
936 | node = oldblk->bp->b_addr; | 891 | node = oldblk->bp->b_addr; |
937 | xfs_da3_node_hdr_from_disk(&nodehdr, node); | 892 | dp->d_ops->node_hdr_from_disk(&nodehdr, node); |
938 | btree = dp->d_ops->node_tree_p(node); | 893 | btree = dp->d_ops->node_tree_p(node); |
939 | 894 | ||
940 | ASSERT(oldblk->index >= 0 && oldblk->index <= nodehdr.count); | 895 | ASSERT(oldblk->index >= 0 && oldblk->index <= nodehdr.count); |
@@ -958,7 +913,7 @@ xfs_da3_node_add( | |||
958 | tmp + sizeof(*btree))); | 913 | tmp + sizeof(*btree))); |
959 | 914 | ||
960 | nodehdr.count += 1; | 915 | nodehdr.count += 1; |
961 | xfs_da3_node_hdr_to_disk(node, &nodehdr); | 916 | dp->d_ops->node_hdr_to_disk(node, &nodehdr); |
962 | xfs_trans_log_buf(state->args->trans, oldblk->bp, | 917 | xfs_trans_log_buf(state->args->trans, oldblk->bp, |
963 | XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size())); | 918 | XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size())); |
964 | 919 | ||
@@ -1097,6 +1052,7 @@ xfs_da3_root_join( | |||
1097 | struct xfs_da3_icnode_hdr oldroothdr; | 1052 | struct xfs_da3_icnode_hdr oldroothdr; |
1098 | struct xfs_da_node_entry *btree; | 1053 | struct xfs_da_node_entry *btree; |
1099 | int error; | 1054 | int error; |
1055 | struct xfs_inode *dp = state->args->dp; | ||
1100 | 1056 | ||
1101 | trace_xfs_da_root_join(state->args); | 1057 | trace_xfs_da_root_join(state->args); |
1102 | 1058 | ||
@@ -1104,7 +1060,7 @@ xfs_da3_root_join( | |||
1104 | 1060 | ||
1105 | args = state->args; | 1061 | args = state->args; |
1106 | oldroot = root_blk->bp->b_addr; | 1062 | oldroot = root_blk->bp->b_addr; |
1107 | xfs_da3_node_hdr_from_disk(&oldroothdr, oldroot); | 1063 | dp->d_ops->node_hdr_from_disk(&oldroothdr, oldroot); |
1108 | ASSERT(oldroothdr.forw == 0); | 1064 | ASSERT(oldroothdr.forw == 0); |
1109 | ASSERT(oldroothdr.back == 0); | 1065 | ASSERT(oldroothdr.back == 0); |
1110 | 1066 | ||
@@ -1118,10 +1074,10 @@ xfs_da3_root_join( | |||
1118 | * Read in the (only) child block, then copy those bytes into | 1074 | * Read in the (only) child block, then copy those bytes into |
1119 | * the root block's buffer and free the original child block. | 1075 | * the root block's buffer and free the original child block. |
1120 | */ | 1076 | */ |
1121 | btree = args->dp->d_ops->node_tree_p(oldroot); | 1077 | btree = dp->d_ops->node_tree_p(oldroot); |
1122 | child = be32_to_cpu(btree[0].before); | 1078 | child = be32_to_cpu(btree[0].before); |
1123 | ASSERT(child != 0); | 1079 | ASSERT(child != 0); |
1124 | error = xfs_da3_node_read(args->trans, args->dp, child, -1, &bp, | 1080 | error = xfs_da3_node_read(args->trans, dp, child, -1, &bp, |
1125 | args->whichfork); | 1081 | args->whichfork); |
1126 | if (error) | 1082 | if (error) |
1127 | return error; | 1083 | return error; |
@@ -1171,6 +1127,7 @@ xfs_da3_node_toosmall( | |||
1171 | int error; | 1127 | int error; |
1172 | int retval; | 1128 | int retval; |
1173 | int i; | 1129 | int i; |
1130 | struct xfs_inode *dp = state->args->dp; | ||
1174 | 1131 | ||
1175 | trace_xfs_da_node_toosmall(state->args); | 1132 | trace_xfs_da_node_toosmall(state->args); |
1176 | 1133 | ||
@@ -1182,7 +1139,7 @@ xfs_da3_node_toosmall( | |||
1182 | blk = &state->path.blk[ state->path.active-1 ]; | 1139 | blk = &state->path.blk[ state->path.active-1 ]; |
1183 | info = blk->bp->b_addr; | 1140 | info = blk->bp->b_addr; |
1184 | node = (xfs_da_intnode_t *)info; | 1141 | node = (xfs_da_intnode_t *)info; |
1185 | xfs_da3_node_hdr_from_disk(&nodehdr, node); | 1142 | dp->d_ops->node_hdr_from_disk(&nodehdr, node); |
1186 | if (nodehdr.count > (state->node_ents >> 1)) { | 1143 | if (nodehdr.count > (state->node_ents >> 1)) { |
1187 | *action = 0; /* blk over 50%, don't try to join */ | 1144 | *action = 0; /* blk over 50%, don't try to join */ |
1188 | return(0); /* blk over 50%, don't try to join */ | 1145 | return(0); /* blk over 50%, don't try to join */ |
@@ -1234,13 +1191,13 @@ xfs_da3_node_toosmall( | |||
1234 | blkno = nodehdr.back; | 1191 | blkno = nodehdr.back; |
1235 | if (blkno == 0) | 1192 | if (blkno == 0) |
1236 | continue; | 1193 | continue; |
1237 | error = xfs_da3_node_read(state->args->trans, state->args->dp, | 1194 | error = xfs_da3_node_read(state->args->trans, dp, |
1238 | blkno, -1, &bp, state->args->whichfork); | 1195 | blkno, -1, &bp, state->args->whichfork); |
1239 | if (error) | 1196 | if (error) |
1240 | return(error); | 1197 | return(error); |
1241 | 1198 | ||
1242 | node = bp->b_addr; | 1199 | node = bp->b_addr; |
1243 | xfs_da3_node_hdr_from_disk(&thdr, node); | 1200 | dp->d_ops->node_hdr_from_disk(&thdr, node); |
1244 | xfs_trans_brelse(state->args->trans, bp); | 1201 | xfs_trans_brelse(state->args->trans, bp); |
1245 | 1202 | ||
1246 | if (count - thdr.count >= 0) | 1203 | if (count - thdr.count >= 0) |
@@ -1287,7 +1244,7 @@ xfs_da3_node_lasthash( | |||
1287 | struct xfs_da3_icnode_hdr nodehdr; | 1244 | struct xfs_da3_icnode_hdr nodehdr; |
1288 | 1245 | ||
1289 | node = bp->b_addr; | 1246 | node = bp->b_addr; |
1290 | xfs_da3_node_hdr_from_disk(&nodehdr, node); | 1247 | dp->d_ops->node_hdr_from_disk(&nodehdr, node); |
1291 | if (count) | 1248 | if (count) |
1292 | *count = nodehdr.count; | 1249 | *count = nodehdr.count; |
1293 | if (!nodehdr.count) | 1250 | if (!nodehdr.count) |
@@ -1338,7 +1295,7 @@ xfs_da3_fixhashpath( | |||
1338 | struct xfs_da3_icnode_hdr nodehdr; | 1295 | struct xfs_da3_icnode_hdr nodehdr; |
1339 | 1296 | ||
1340 | node = blk->bp->b_addr; | 1297 | node = blk->bp->b_addr; |
1341 | xfs_da3_node_hdr_from_disk(&nodehdr, node); | 1298 | dp->d_ops->node_hdr_from_disk(&nodehdr, node); |
1342 | btree = dp->d_ops->node_tree_p(node); | 1299 | btree = dp->d_ops->node_tree_p(node); |
1343 | if (be32_to_cpu(btree->hashval) == lasthash) | 1300 | if (be32_to_cpu(btree->hashval) == lasthash) |
1344 | break; | 1301 | break; |
@@ -1370,7 +1327,7 @@ xfs_da3_node_remove( | |||
1370 | trace_xfs_da_node_remove(state->args); | 1327 | trace_xfs_da_node_remove(state->args); |
1371 | 1328 | ||
1372 | node = drop_blk->bp->b_addr; | 1329 | node = drop_blk->bp->b_addr; |
1373 | xfs_da3_node_hdr_from_disk(&nodehdr, node); | 1330 | dp->d_ops->node_hdr_from_disk(&nodehdr, node); |
1374 | ASSERT(drop_blk->index < nodehdr.count); | 1331 | ASSERT(drop_blk->index < nodehdr.count); |
1375 | ASSERT(drop_blk->index >= 0); | 1332 | ASSERT(drop_blk->index >= 0); |
1376 | 1333 | ||
@@ -1391,7 +1348,7 @@ xfs_da3_node_remove( | |||
1391 | xfs_trans_log_buf(state->args->trans, drop_blk->bp, | 1348 | xfs_trans_log_buf(state->args->trans, drop_blk->bp, |
1392 | XFS_DA_LOGRANGE(node, &btree[index], sizeof(btree[index]))); | 1349 | XFS_DA_LOGRANGE(node, &btree[index], sizeof(btree[index]))); |
1393 | nodehdr.count -= 1; | 1350 | nodehdr.count -= 1; |
1394 | xfs_da3_node_hdr_to_disk(node, &nodehdr); | 1351 | dp->d_ops->node_hdr_to_disk(node, &nodehdr); |
1395 | xfs_trans_log_buf(state->args->trans, drop_blk->bp, | 1352 | xfs_trans_log_buf(state->args->trans, drop_blk->bp, |
1396 | XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size())); | 1353 | XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size())); |
1397 | 1354 | ||
@@ -1426,8 +1383,8 @@ xfs_da3_node_unbalance( | |||
1426 | 1383 | ||
1427 | drop_node = drop_blk->bp->b_addr; | 1384 | drop_node = drop_blk->bp->b_addr; |
1428 | save_node = save_blk->bp->b_addr; | 1385 | save_node = save_blk->bp->b_addr; |
1429 | xfs_da3_node_hdr_from_disk(&drop_hdr, drop_node); | 1386 | dp->d_ops->node_hdr_from_disk(&drop_hdr, drop_node); |
1430 | xfs_da3_node_hdr_from_disk(&save_hdr, save_node); | 1387 | dp->d_ops->node_hdr_from_disk(&save_hdr, save_node); |
1431 | drop_btree = dp->d_ops->node_tree_p(drop_node); | 1388 | drop_btree = dp->d_ops->node_tree_p(drop_node); |
1432 | save_btree = dp->d_ops->node_tree_p(save_node); | 1389 | save_btree = dp->d_ops->node_tree_p(save_node); |
1433 | tp = state->args->trans; | 1390 | tp = state->args->trans; |
@@ -1463,7 +1420,7 @@ xfs_da3_node_unbalance( | |||
1463 | memcpy(&save_btree[sindex], &drop_btree[0], tmp); | 1420 | memcpy(&save_btree[sindex], &drop_btree[0], tmp); |
1464 | save_hdr.count += drop_hdr.count; | 1421 | save_hdr.count += drop_hdr.count; |
1465 | 1422 | ||
1466 | xfs_da3_node_hdr_to_disk(save_node, &save_hdr); | 1423 | dp->d_ops->node_hdr_to_disk(save_node, &save_hdr); |
1467 | xfs_trans_log_buf(tp, save_blk->bp, | 1424 | xfs_trans_log_buf(tp, save_blk->bp, |
1468 | XFS_DA_LOGRANGE(save_node, &save_node->hdr, | 1425 | XFS_DA_LOGRANGE(save_node, &save_node->hdr, |
1469 | dp->d_ops->node_hdr_size())); | 1426 | dp->d_ops->node_hdr_size())); |
@@ -1556,7 +1513,7 @@ xfs_da3_node_lookup_int( | |||
1556 | * Search an intermediate node for a match. | 1513 | * Search an intermediate node for a match. |
1557 | */ | 1514 | */ |
1558 | node = blk->bp->b_addr; | 1515 | node = blk->bp->b_addr; |
1559 | xfs_da3_node_hdr_from_disk(&nodehdr, node); | 1516 | dp->d_ops->node_hdr_from_disk(&nodehdr, node); |
1560 | btree = dp->d_ops->node_tree_p(node); | 1517 | btree = dp->d_ops->node_tree_p(node); |
1561 | 1518 | ||
1562 | max = nodehdr.count; | 1519 | max = nodehdr.count; |
@@ -1665,8 +1622,8 @@ xfs_da3_node_order( | |||
1665 | 1622 | ||
1666 | node1 = node1_bp->b_addr; | 1623 | node1 = node1_bp->b_addr; |
1667 | node2 = node2_bp->b_addr; | 1624 | node2 = node2_bp->b_addr; |
1668 | xfs_da3_node_hdr_from_disk(&node1hdr, node1); | 1625 | dp->d_ops->node_hdr_from_disk(&node1hdr, node1); |
1669 | xfs_da3_node_hdr_from_disk(&node2hdr, node2); | 1626 | dp->d_ops->node_hdr_from_disk(&node2hdr, node2); |
1670 | btree1 = dp->d_ops->node_tree_p(node1); | 1627 | btree1 = dp->d_ops->node_tree_p(node1); |
1671 | btree2 = dp->d_ops->node_tree_p(node2); | 1628 | btree2 = dp->d_ops->node_tree_p(node2); |
1672 | 1629 | ||
@@ -1888,7 +1845,7 @@ xfs_da3_path_shift( | |||
1888 | level = (path->active-1) - 1; /* skip bottom layer in path */ | 1845 | level = (path->active-1) - 1; /* skip bottom layer in path */ |
1889 | for (blk = &path->blk[level]; level >= 0; blk--, level--) { | 1846 | for (blk = &path->blk[level]; level >= 0; blk--, level--) { |
1890 | node = blk->bp->b_addr; | 1847 | node = blk->bp->b_addr; |
1891 | xfs_da3_node_hdr_from_disk(&nodehdr, node); | 1848 | dp->d_ops->node_hdr_from_disk(&nodehdr, node); |
1892 | btree = dp->d_ops->node_tree_p(node); | 1849 | btree = dp->d_ops->node_tree_p(node); |
1893 | 1850 | ||
1894 | if (forward && (blk->index < nodehdr.count - 1)) { | 1851 | if (forward && (blk->index < nodehdr.count - 1)) { |
@@ -1945,7 +1902,7 @@ xfs_da3_path_shift( | |||
1945 | case XFS_DA3_NODE_MAGIC: | 1902 | case XFS_DA3_NODE_MAGIC: |
1946 | blk->magic = XFS_DA_NODE_MAGIC; | 1903 | blk->magic = XFS_DA_NODE_MAGIC; |
1947 | node = (xfs_da_intnode_t *)info; | 1904 | node = (xfs_da_intnode_t *)info; |
1948 | xfs_da3_node_hdr_from_disk(&nodehdr, node); | 1905 | dp->d_ops->node_hdr_from_disk(&nodehdr, node); |
1949 | btree = dp->d_ops->node_tree_p(node); | 1906 | btree = dp->d_ops->node_tree_p(node); |
1950 | blk->hashval = be32_to_cpu(btree[nodehdr.count - 1].hashval); | 1907 | blk->hashval = be32_to_cpu(btree[nodehdr.count - 1].hashval); |
1951 | if (forward) | 1908 | if (forward) |
@@ -2233,7 +2190,7 @@ xfs_da3_swap_lastblock( | |||
2233 | struct xfs_dir2_leaf_entry *ents; | 2190 | struct xfs_dir2_leaf_entry *ents; |
2234 | 2191 | ||
2235 | dead_leaf2 = (xfs_dir2_leaf_t *)dead_info; | 2192 | dead_leaf2 = (xfs_dir2_leaf_t *)dead_info; |
2236 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, dead_leaf2); | 2193 | dp->d_ops->leaf_hdr_from_disk(&leafhdr, dead_leaf2); |
2237 | ents = dp->d_ops->leaf_ents_p(dead_leaf2); | 2194 | ents = dp->d_ops->leaf_ents_p(dead_leaf2); |
2238 | dead_level = 0; | 2195 | dead_level = 0; |
2239 | dead_hash = be32_to_cpu(ents[leafhdr.count - 1].hashval); | 2196 | dead_hash = be32_to_cpu(ents[leafhdr.count - 1].hashval); |
@@ -2241,7 +2198,7 @@ xfs_da3_swap_lastblock( | |||
2241 | struct xfs_da3_icnode_hdr deadhdr; | 2198 | struct xfs_da3_icnode_hdr deadhdr; |
2242 | 2199 | ||
2243 | dead_node = (xfs_da_intnode_t *)dead_info; | 2200 | dead_node = (xfs_da_intnode_t *)dead_info; |
2244 | xfs_da3_node_hdr_from_disk(&deadhdr, dead_node); | 2201 | dp->d_ops->node_hdr_from_disk(&deadhdr, dead_node); |
2245 | btree = dp->d_ops->node_tree_p(dead_node); | 2202 | btree = dp->d_ops->node_tree_p(dead_node); |
2246 | dead_level = deadhdr.level; | 2203 | dead_level = deadhdr.level; |
2247 | dead_hash = be32_to_cpu(btree[deadhdr.count - 1].hashval); | 2204 | dead_hash = be32_to_cpu(btree[deadhdr.count - 1].hashval); |
@@ -2301,7 +2258,7 @@ xfs_da3_swap_lastblock( | |||
2301 | if (error) | 2258 | if (error) |
2302 | goto done; | 2259 | goto done; |
2303 | par_node = par_buf->b_addr; | 2260 | par_node = par_buf->b_addr; |
2304 | xfs_da3_node_hdr_from_disk(&par_hdr, par_node); | 2261 | dp->d_ops->node_hdr_from_disk(&par_hdr, par_node); |
2305 | if (level >= 0 && level != par_hdr.level + 1) { | 2262 | if (level >= 0 && level != par_hdr.level + 1) { |
2306 | XFS_ERROR_REPORT("xfs_da_swap_lastblock(4)", | 2263 | XFS_ERROR_REPORT("xfs_da_swap_lastblock(4)", |
2307 | XFS_ERRLEVEL_LOW, mp); | 2264 | XFS_ERRLEVEL_LOW, mp); |
@@ -2352,7 +2309,7 @@ xfs_da3_swap_lastblock( | |||
2352 | if (error) | 2309 | if (error) |
2353 | goto done; | 2310 | goto done; |
2354 | par_node = par_buf->b_addr; | 2311 | par_node = par_buf->b_addr; |
2355 | xfs_da3_node_hdr_from_disk(&par_hdr, par_node); | 2312 | dp->d_ops->node_hdr_from_disk(&par_hdr, par_node); |
2356 | if (par_hdr.level != level) { | 2313 | if (par_hdr.level != level) { |
2357 | XFS_ERROR_REPORT("xfs_da_swap_lastblock(7)", | 2314 | XFS_ERROR_REPORT("xfs_da_swap_lastblock(7)", |
2358 | XFS_ERRLEVEL_LOW, mp); | 2315 | XFS_ERRLEVEL_LOW, mp); |