aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_da_btree.c
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2013-10-29 07:11:52 -0400
committerBen Myers <bpm@sgi.com>2013-10-30 14:47:22 -0400
commit01ba43b873d9e91ba2e0341fe8cb7e89eaa41661 (patch)
tree34b0f2ae40956eaf3a2dc1a693f29ff4200eb845 /fs/xfs/xfs_da_btree.c
parent4bceb18f1551c8c047eeb54d48cda9f5453dc12f (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.c141
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
132void
133xfs_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
157void
158xfs_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
182static bool 132static bool
183xfs_da3_node_verify( 133xfs_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);