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 | |
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>
-rw-r--r-- | fs/xfs/xfs_attr_inactive.c | 2 | ||||
-rw-r--r-- | fs/xfs/xfs_attr_leaf.c | 4 | ||||
-rw-r--r-- | fs/xfs/xfs_attr_list.c | 2 | ||||
-rw-r--r-- | fs/xfs/xfs_da_btree.c | 141 | ||||
-rw-r--r-- | fs/xfs/xfs_da_format.c | 209 | ||||
-rw-r--r-- | fs/xfs/xfs_da_format.h | 16 | ||||
-rw-r--r-- | fs/xfs/xfs_dir2.h | 13 | ||||
-rw-r--r-- | fs/xfs/xfs_dir2_block.c | 2 | ||||
-rw-r--r-- | fs/xfs/xfs_dir2_leaf.c | 100 | ||||
-rw-r--r-- | fs/xfs/xfs_dir2_node.c | 126 | ||||
-rw-r--r-- | fs/xfs/xfs_dir2_priv.h | 4 |
11 files changed, 338 insertions, 281 deletions
diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c index 4855085f8c6b..09480c57f069 100644 --- a/fs/xfs/xfs_attr_inactive.c +++ b/fs/xfs/xfs_attr_inactive.c | |||
@@ -231,7 +231,7 @@ xfs_attr3_node_inactive( | |||
231 | } | 231 | } |
232 | 232 | ||
233 | node = bp->b_addr; | 233 | node = bp->b_addr; |
234 | xfs_da3_node_hdr_from_disk(&ichdr, node); | 234 | dp->d_ops->node_hdr_from_disk(&ichdr, node); |
235 | parent_blkno = bp->b_bn; | 235 | parent_blkno = bp->b_bn; |
236 | if (!ichdr.count) { | 236 | if (!ichdr.count) { |
237 | xfs_trans_brelse(*trans, bp); | 237 | xfs_trans_brelse(*trans, bp); |
diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 82f1354c77b6..fdf9992dcbbc 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c | |||
@@ -916,7 +916,7 @@ xfs_attr3_leaf_to_node( | |||
916 | if (error) | 916 | if (error) |
917 | goto out; | 917 | goto out; |
918 | node = bp1->b_addr; | 918 | node = bp1->b_addr; |
919 | xfs_da3_node_hdr_from_disk(&icnodehdr, node); | 919 | dp->d_ops->node_hdr_from_disk(&icnodehdr, node); |
920 | btree = dp->d_ops->node_tree_p(node); | 920 | btree = dp->d_ops->node_tree_p(node); |
921 | 921 | ||
922 | leaf = bp2->b_addr; | 922 | leaf = bp2->b_addr; |
@@ -927,7 +927,7 @@ xfs_attr3_leaf_to_node( | |||
927 | btree[0].hashval = entries[icleafhdr.count - 1].hashval; | 927 | btree[0].hashval = entries[icleafhdr.count - 1].hashval; |
928 | btree[0].before = cpu_to_be32(blkno); | 928 | btree[0].before = cpu_to_be32(blkno); |
929 | icnodehdr.count = 1; | 929 | icnodehdr.count = 1; |
930 | xfs_da3_node_hdr_to_disk(node, &icnodehdr); | 930 | dp->d_ops->node_hdr_to_disk(node, &icnodehdr); |
931 | xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(mp) - 1); | 931 | xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(mp) - 1); |
932 | error = 0; | 932 | error = 0; |
933 | out: | 933 | out: |
diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index ea1c4c46c24f..2d174b128153 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c | |||
@@ -311,7 +311,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) | |||
311 | return XFS_ERROR(EFSCORRUPTED); | 311 | return XFS_ERROR(EFSCORRUPTED); |
312 | } | 312 | } |
313 | 313 | ||
314 | xfs_da3_node_hdr_from_disk(&nodehdr, node); | 314 | dp->d_ops->node_hdr_from_disk(&nodehdr, node); |
315 | btree = dp->d_ops->node_tree_p(node); | 315 | btree = dp->d_ops->node_tree_p(node); |
316 | for (i = 0; i < nodehdr.count; btree++, i++) { | 316 | for (i = 0; i < nodehdr.count; btree++, i++) { |
317 | if (cursor->hashval | 317 | if (cursor->hashval |
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); |
diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index 72b48b5ec69a..b232c275791d 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c | |||
@@ -464,19 +464,84 @@ xfs_dir3_leaf_hdr_size(void) | |||
464 | return sizeof(struct xfs_dir3_leaf_hdr); | 464 | return sizeof(struct xfs_dir3_leaf_hdr); |
465 | } | 465 | } |
466 | 466 | ||
467 | static inline int | 467 | static int |
468 | xfs_dir3_max_leaf_ents(struct xfs_mount *mp) | 468 | xfs_dir3_max_leaf_ents(struct xfs_mount *mp) |
469 | { | 469 | { |
470 | return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size()) / | 470 | return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size()) / |
471 | (uint)sizeof(struct xfs_dir2_leaf_entry); | 471 | (uint)sizeof(struct xfs_dir2_leaf_entry); |
472 | } | 472 | } |
473 | 473 | ||
474 | static inline struct xfs_dir2_leaf_entry * | 474 | static struct xfs_dir2_leaf_entry * |
475 | xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp) | 475 | xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp) |
476 | { | 476 | { |
477 | return ((struct xfs_dir3_leaf *)lp)->__ents; | 477 | return ((struct xfs_dir3_leaf *)lp)->__ents; |
478 | } | 478 | } |
479 | 479 | ||
480 | static void | ||
481 | xfs_dir2_leaf_hdr_from_disk( | ||
482 | struct xfs_dir3_icleaf_hdr *to, | ||
483 | struct xfs_dir2_leaf *from) | ||
484 | { | ||
485 | to->forw = be32_to_cpu(from->hdr.info.forw); | ||
486 | to->back = be32_to_cpu(from->hdr.info.back); | ||
487 | to->magic = be16_to_cpu(from->hdr.info.magic); | ||
488 | to->count = be16_to_cpu(from->hdr.count); | ||
489 | to->stale = be16_to_cpu(from->hdr.stale); | ||
490 | |||
491 | ASSERT(to->magic == XFS_DIR2_LEAF1_MAGIC || | ||
492 | to->magic == XFS_DIR2_LEAFN_MAGIC); | ||
493 | } | ||
494 | |||
495 | static void | ||
496 | xfs_dir2_leaf_hdr_to_disk( | ||
497 | struct xfs_dir2_leaf *to, | ||
498 | struct xfs_dir3_icleaf_hdr *from) | ||
499 | { | ||
500 | ASSERT(from->magic == XFS_DIR2_LEAF1_MAGIC || | ||
501 | from->magic == XFS_DIR2_LEAFN_MAGIC); | ||
502 | |||
503 | to->hdr.info.forw = cpu_to_be32(from->forw); | ||
504 | to->hdr.info.back = cpu_to_be32(from->back); | ||
505 | to->hdr.info.magic = cpu_to_be16(from->magic); | ||
506 | to->hdr.count = cpu_to_be16(from->count); | ||
507 | to->hdr.stale = cpu_to_be16(from->stale); | ||
508 | } | ||
509 | |||
510 | static void | ||
511 | xfs_dir3_leaf_hdr_from_disk( | ||
512 | struct xfs_dir3_icleaf_hdr *to, | ||
513 | struct xfs_dir2_leaf *from) | ||
514 | { | ||
515 | struct xfs_dir3_leaf_hdr *hdr3 = (struct xfs_dir3_leaf_hdr *)from; | ||
516 | |||
517 | to->forw = be32_to_cpu(hdr3->info.hdr.forw); | ||
518 | to->back = be32_to_cpu(hdr3->info.hdr.back); | ||
519 | to->magic = be16_to_cpu(hdr3->info.hdr.magic); | ||
520 | to->count = be16_to_cpu(hdr3->count); | ||
521 | to->stale = be16_to_cpu(hdr3->stale); | ||
522 | |||
523 | ASSERT(to->magic == XFS_DIR3_LEAF1_MAGIC || | ||
524 | to->magic == XFS_DIR3_LEAFN_MAGIC); | ||
525 | } | ||
526 | |||
527 | static void | ||
528 | xfs_dir3_leaf_hdr_to_disk( | ||
529 | struct xfs_dir2_leaf *to, | ||
530 | struct xfs_dir3_icleaf_hdr *from) | ||
531 | { | ||
532 | struct xfs_dir3_leaf_hdr *hdr3 = (struct xfs_dir3_leaf_hdr *)to; | ||
533 | |||
534 | ASSERT(from->magic == XFS_DIR3_LEAF1_MAGIC || | ||
535 | from->magic == XFS_DIR3_LEAFN_MAGIC); | ||
536 | |||
537 | hdr3->info.hdr.forw = cpu_to_be32(from->forw); | ||
538 | hdr3->info.hdr.back = cpu_to_be32(from->back); | ||
539 | hdr3->info.hdr.magic = cpu_to_be16(from->magic); | ||
540 | hdr3->count = cpu_to_be16(from->count); | ||
541 | hdr3->stale = cpu_to_be16(from->stale); | ||
542 | } | ||
543 | |||
544 | |||
480 | /* | 545 | /* |
481 | * Directory/Attribute Node block operations | 546 | * Directory/Attribute Node block operations |
482 | */ | 547 | */ |
@@ -504,6 +569,121 @@ xfs_da3_node_tree_p(struct xfs_da_intnode *dap) | |||
504 | return ((struct xfs_da3_intnode *)dap)->__btree; | 569 | return ((struct xfs_da3_intnode *)dap)->__btree; |
505 | } | 570 | } |
506 | 571 | ||
572 | static void | ||
573 | xfs_da2_node_hdr_from_disk( | ||
574 | struct xfs_da3_icnode_hdr *to, | ||
575 | struct xfs_da_intnode *from) | ||
576 | { | ||
577 | ASSERT(from->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); | ||
578 | to->forw = be32_to_cpu(from->hdr.info.forw); | ||
579 | to->back = be32_to_cpu(from->hdr.info.back); | ||
580 | to->magic = be16_to_cpu(from->hdr.info.magic); | ||
581 | to->count = be16_to_cpu(from->hdr.__count); | ||
582 | to->level = be16_to_cpu(from->hdr.__level); | ||
583 | } | ||
584 | |||
585 | static void | ||
586 | xfs_da2_node_hdr_to_disk( | ||
587 | struct xfs_da_intnode *to, | ||
588 | struct xfs_da3_icnode_hdr *from) | ||
589 | { | ||
590 | ASSERT(from->magic == XFS_DA_NODE_MAGIC); | ||
591 | to->hdr.info.forw = cpu_to_be32(from->forw); | ||
592 | to->hdr.info.back = cpu_to_be32(from->back); | ||
593 | to->hdr.info.magic = cpu_to_be16(from->magic); | ||
594 | to->hdr.__count = cpu_to_be16(from->count); | ||
595 | to->hdr.__level = cpu_to_be16(from->level); | ||
596 | } | ||
597 | |||
598 | static void | ||
599 | xfs_da3_node_hdr_from_disk( | ||
600 | struct xfs_da3_icnode_hdr *to, | ||
601 | struct xfs_da_intnode *from) | ||
602 | { | ||
603 | struct xfs_da3_node_hdr *hdr3 = (struct xfs_da3_node_hdr *)from; | ||
604 | |||
605 | ASSERT(from->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)); | ||
606 | to->forw = be32_to_cpu(hdr3->info.hdr.forw); | ||
607 | to->back = be32_to_cpu(hdr3->info.hdr.back); | ||
608 | to->magic = be16_to_cpu(hdr3->info.hdr.magic); | ||
609 | to->count = be16_to_cpu(hdr3->__count); | ||
610 | to->level = be16_to_cpu(hdr3->__level); | ||
611 | } | ||
612 | |||
613 | static void | ||
614 | xfs_da3_node_hdr_to_disk( | ||
615 | struct xfs_da_intnode *to, | ||
616 | struct xfs_da3_icnode_hdr *from) | ||
617 | { | ||
618 | struct xfs_da3_node_hdr *hdr3 = (struct xfs_da3_node_hdr *)to; | ||
619 | |||
620 | ASSERT(from->magic == XFS_DA3_NODE_MAGIC); | ||
621 | hdr3->info.hdr.forw = cpu_to_be32(from->forw); | ||
622 | hdr3->info.hdr.back = cpu_to_be32(from->back); | ||
623 | hdr3->info.hdr.magic = cpu_to_be16(from->magic); | ||
624 | hdr3->__count = cpu_to_be16(from->count); | ||
625 | hdr3->__level = cpu_to_be16(from->level); | ||
626 | } | ||
627 | |||
628 | |||
629 | /* | ||
630 | * Directory free space block operations | ||
631 | */ | ||
632 | static void | ||
633 | xfs_dir2_free_hdr_from_disk( | ||
634 | struct xfs_dir3_icfree_hdr *to, | ||
635 | struct xfs_dir2_free *from) | ||
636 | { | ||
637 | to->magic = be32_to_cpu(from->hdr.magic); | ||
638 | to->firstdb = be32_to_cpu(from->hdr.firstdb); | ||
639 | to->nvalid = be32_to_cpu(from->hdr.nvalid); | ||
640 | to->nused = be32_to_cpu(from->hdr.nused); | ||
641 | ASSERT(to->magic == XFS_DIR2_FREE_MAGIC); | ||
642 | } | ||
643 | |||
644 | static void | ||
645 | xfs_dir2_free_hdr_to_disk( | ||
646 | struct xfs_dir2_free *to, | ||
647 | struct xfs_dir3_icfree_hdr *from) | ||
648 | { | ||
649 | ASSERT(from->magic == XFS_DIR2_FREE_MAGIC); | ||
650 | |||
651 | to->hdr.magic = cpu_to_be32(from->magic); | ||
652 | to->hdr.firstdb = cpu_to_be32(from->firstdb); | ||
653 | to->hdr.nvalid = cpu_to_be32(from->nvalid); | ||
654 | to->hdr.nused = cpu_to_be32(from->nused); | ||
655 | } | ||
656 | |||
657 | static void | ||
658 | xfs_dir3_free_hdr_from_disk( | ||
659 | struct xfs_dir3_icfree_hdr *to, | ||
660 | struct xfs_dir2_free *from) | ||
661 | { | ||
662 | struct xfs_dir3_free_hdr *hdr3 = (struct xfs_dir3_free_hdr *)from; | ||
663 | |||
664 | to->magic = be32_to_cpu(hdr3->hdr.magic); | ||
665 | to->firstdb = be32_to_cpu(hdr3->firstdb); | ||
666 | to->nvalid = be32_to_cpu(hdr3->nvalid); | ||
667 | to->nused = be32_to_cpu(hdr3->nused); | ||
668 | |||
669 | ASSERT(to->magic == XFS_DIR3_FREE_MAGIC); | ||
670 | } | ||
671 | |||
672 | static void | ||
673 | xfs_dir3_free_hdr_to_disk( | ||
674 | struct xfs_dir2_free *to, | ||
675 | struct xfs_dir3_icfree_hdr *from) | ||
676 | { | ||
677 | struct xfs_dir3_free_hdr *hdr3 = (struct xfs_dir3_free_hdr *)to; | ||
678 | |||
679 | ASSERT(from->magic == XFS_DIR3_FREE_MAGIC); | ||
680 | |||
681 | hdr3->hdr.magic = cpu_to_be32(from->magic); | ||
682 | hdr3->firstdb = cpu_to_be32(from->firstdb); | ||
683 | hdr3->nvalid = cpu_to_be32(from->nvalid); | ||
684 | hdr3->nused = cpu_to_be32(from->nused); | ||
685 | } | ||
686 | |||
507 | const struct xfs_dir_ops xfs_dir2_ops = { | 687 | const struct xfs_dir_ops xfs_dir2_ops = { |
508 | .sf_entsize = xfs_dir2_sf_entsize, | 688 | .sf_entsize = xfs_dir2_sf_entsize, |
509 | .sf_nextentry = xfs_dir2_sf_nextentry, | 689 | .sf_nextentry = xfs_dir2_sf_nextentry, |
@@ -532,11 +712,18 @@ const struct xfs_dir_ops xfs_dir2_ops = { | |||
532 | .data_unused_p = xfs_dir2_data_unused_p, | 712 | .data_unused_p = xfs_dir2_data_unused_p, |
533 | 713 | ||
534 | .leaf_hdr_size = xfs_dir2_leaf_hdr_size, | 714 | .leaf_hdr_size = xfs_dir2_leaf_hdr_size, |
715 | .leaf_hdr_to_disk = xfs_dir2_leaf_hdr_to_disk, | ||
716 | .leaf_hdr_from_disk = xfs_dir2_leaf_hdr_from_disk, | ||
535 | .leaf_max_ents = xfs_dir2_max_leaf_ents, | 717 | .leaf_max_ents = xfs_dir2_max_leaf_ents, |
536 | .leaf_ents_p = xfs_dir2_leaf_ents_p, | 718 | .leaf_ents_p = xfs_dir2_leaf_ents_p, |
537 | 719 | ||
538 | .node_hdr_size = xfs_da2_node_hdr_size, | 720 | .node_hdr_size = xfs_da2_node_hdr_size, |
721 | .node_hdr_to_disk = xfs_da2_node_hdr_to_disk, | ||
722 | .node_hdr_from_disk = xfs_da2_node_hdr_from_disk, | ||
539 | .node_tree_p = xfs_da2_node_tree_p, | 723 | .node_tree_p = xfs_da2_node_tree_p, |
724 | |||
725 | .free_hdr_to_disk = xfs_dir2_free_hdr_to_disk, | ||
726 | .free_hdr_from_disk = xfs_dir2_free_hdr_from_disk, | ||
540 | }; | 727 | }; |
541 | 728 | ||
542 | const struct xfs_dir_ops xfs_dir2_ftype_ops = { | 729 | const struct xfs_dir_ops xfs_dir2_ftype_ops = { |
@@ -567,11 +754,18 @@ const struct xfs_dir_ops xfs_dir2_ftype_ops = { | |||
567 | .data_unused_p = xfs_dir2_data_unused_p, | 754 | .data_unused_p = xfs_dir2_data_unused_p, |
568 | 755 | ||
569 | .leaf_hdr_size = xfs_dir2_leaf_hdr_size, | 756 | .leaf_hdr_size = xfs_dir2_leaf_hdr_size, |
757 | .leaf_hdr_to_disk = xfs_dir2_leaf_hdr_to_disk, | ||
758 | .leaf_hdr_from_disk = xfs_dir2_leaf_hdr_from_disk, | ||
570 | .leaf_max_ents = xfs_dir2_max_leaf_ents, | 759 | .leaf_max_ents = xfs_dir2_max_leaf_ents, |
571 | .leaf_ents_p = xfs_dir2_leaf_ents_p, | 760 | .leaf_ents_p = xfs_dir2_leaf_ents_p, |
572 | 761 | ||
573 | .node_hdr_size = xfs_da2_node_hdr_size, | 762 | .node_hdr_size = xfs_da2_node_hdr_size, |
763 | .node_hdr_to_disk = xfs_da2_node_hdr_to_disk, | ||
764 | .node_hdr_from_disk = xfs_da2_node_hdr_from_disk, | ||
574 | .node_tree_p = xfs_da2_node_tree_p, | 765 | .node_tree_p = xfs_da2_node_tree_p, |
766 | |||
767 | .free_hdr_to_disk = xfs_dir2_free_hdr_to_disk, | ||
768 | .free_hdr_from_disk = xfs_dir2_free_hdr_from_disk, | ||
575 | }; | 769 | }; |
576 | 770 | ||
577 | const struct xfs_dir_ops xfs_dir3_ops = { | 771 | const struct xfs_dir_ops xfs_dir3_ops = { |
@@ -602,20 +796,31 @@ const struct xfs_dir_ops xfs_dir3_ops = { | |||
602 | .data_unused_p = xfs_dir3_data_unused_p, | 796 | .data_unused_p = xfs_dir3_data_unused_p, |
603 | 797 | ||
604 | .leaf_hdr_size = xfs_dir3_leaf_hdr_size, | 798 | .leaf_hdr_size = xfs_dir3_leaf_hdr_size, |
799 | .leaf_hdr_to_disk = xfs_dir3_leaf_hdr_to_disk, | ||
800 | .leaf_hdr_from_disk = xfs_dir3_leaf_hdr_from_disk, | ||
605 | .leaf_max_ents = xfs_dir3_max_leaf_ents, | 801 | .leaf_max_ents = xfs_dir3_max_leaf_ents, |
606 | .leaf_ents_p = xfs_dir3_leaf_ents_p, | 802 | .leaf_ents_p = xfs_dir3_leaf_ents_p, |
607 | 803 | ||
608 | .node_hdr_size = xfs_da3_node_hdr_size, | 804 | .node_hdr_size = xfs_da3_node_hdr_size, |
805 | .node_hdr_to_disk = xfs_da3_node_hdr_to_disk, | ||
806 | .node_hdr_from_disk = xfs_da3_node_hdr_from_disk, | ||
609 | .node_tree_p = xfs_da3_node_tree_p, | 807 | .node_tree_p = xfs_da3_node_tree_p, |
808 | |||
809 | .free_hdr_to_disk = xfs_dir3_free_hdr_to_disk, | ||
810 | .free_hdr_from_disk = xfs_dir3_free_hdr_from_disk, | ||
610 | }; | 811 | }; |
611 | 812 | ||
612 | const struct xfs_dir_ops xfs_dir2_nondir_ops = { | 813 | const struct xfs_dir_ops xfs_dir2_nondir_ops = { |
613 | .node_hdr_size = xfs_da2_node_hdr_size, | 814 | .node_hdr_size = xfs_da2_node_hdr_size, |
815 | .node_hdr_to_disk = xfs_da2_node_hdr_to_disk, | ||
816 | .node_hdr_from_disk = xfs_da2_node_hdr_from_disk, | ||
614 | .node_tree_p = xfs_da2_node_tree_p, | 817 | .node_tree_p = xfs_da2_node_tree_p, |
615 | }; | 818 | }; |
616 | 819 | ||
617 | const struct xfs_dir_ops xfs_dir3_nondir_ops = { | 820 | const struct xfs_dir_ops xfs_dir3_nondir_ops = { |
618 | .node_hdr_size = xfs_da3_node_hdr_size, | 821 | .node_hdr_size = xfs_da3_node_hdr_size, |
822 | .node_hdr_to_disk = xfs_da3_node_hdr_to_disk, | ||
823 | .node_hdr_from_disk = xfs_da3_node_hdr_from_disk, | ||
619 | .node_tree_p = xfs_da3_node_tree_p, | 824 | .node_tree_p = xfs_da3_node_tree_p, |
620 | }; | 825 | }; |
621 | 826 | ||
diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index 69b4c6e1c52e..1ff7b9f42097 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h | |||
@@ -122,16 +122,6 @@ struct xfs_da3_icnode_hdr { | |||
122 | __uint16_t level; | 122 | __uint16_t level; |
123 | }; | 123 | }; |
124 | 124 | ||
125 | extern void xfs_da3_node_hdr_from_disk(struct xfs_da3_icnode_hdr *to, | ||
126 | struct xfs_da_intnode *from); | ||
127 | extern void xfs_da3_node_hdr_to_disk(struct xfs_da_intnode *to, | ||
128 | struct xfs_da3_icnode_hdr *from); | ||
129 | |||
130 | extern void xfs_da3_intnode_from_disk(struct xfs_da3_icnode_hdr *to, | ||
131 | struct xfs_da_intnode *from); | ||
132 | extern void xfs_da3_intnode_to_disk(struct xfs_da_intnode *to, | ||
133 | struct xfs_da3_icnode_hdr *from); | ||
134 | |||
135 | #define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize | 125 | #define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize |
136 | 126 | ||
137 | /* | 127 | /* |
@@ -523,9 +513,6 @@ struct xfs_dir3_leaf { | |||
523 | 513 | ||
524 | #define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) | 514 | #define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) |
525 | 515 | ||
526 | extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, | ||
527 | struct xfs_dir2_leaf *from); | ||
528 | |||
529 | /* | 516 | /* |
530 | * Get address of the bestcount field in the single-leaf block. | 517 | * Get address of the bestcount field in the single-leaf block. |
531 | */ | 518 | */ |
@@ -717,9 +704,6 @@ struct xfs_dir3_icfree_hdr { | |||
717 | 704 | ||
718 | }; | 705 | }; |
719 | 706 | ||
720 | void xfs_dir3_free_hdr_from_disk(struct xfs_dir3_icfree_hdr *to, | ||
721 | struct xfs_dir2_free *from); | ||
722 | |||
723 | static inline int | 707 | static inline int |
724 | xfs_dir3_free_hdr_size(struct xfs_mount *mp) | 708 | xfs_dir3_free_hdr_size(struct xfs_mount *mp) |
725 | { | 709 | { |
diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index c5cad9d9239d..61195348f667 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h | |||
@@ -76,13 +76,26 @@ struct xfs_dir_ops { | |||
76 | (*data_unused_p)(struct xfs_dir2_data_hdr *hdr); | 76 | (*data_unused_p)(struct xfs_dir2_data_hdr *hdr); |
77 | 77 | ||
78 | int (*leaf_hdr_size)(void); | 78 | int (*leaf_hdr_size)(void); |
79 | void (*leaf_hdr_to_disk)(struct xfs_dir2_leaf *to, | ||
80 | struct xfs_dir3_icleaf_hdr *from); | ||
81 | void (*leaf_hdr_from_disk)(struct xfs_dir3_icleaf_hdr *to, | ||
82 | struct xfs_dir2_leaf *from); | ||
79 | int (*leaf_max_ents)(struct xfs_mount *mp); | 83 | int (*leaf_max_ents)(struct xfs_mount *mp); |
80 | struct xfs_dir2_leaf_entry * | 84 | struct xfs_dir2_leaf_entry * |
81 | (*leaf_ents_p)(struct xfs_dir2_leaf *lp); | 85 | (*leaf_ents_p)(struct xfs_dir2_leaf *lp); |
82 | 86 | ||
83 | int (*node_hdr_size)(void); | 87 | int (*node_hdr_size)(void); |
88 | void (*node_hdr_to_disk)(struct xfs_da_intnode *to, | ||
89 | struct xfs_da3_icnode_hdr *from); | ||
90 | void (*node_hdr_from_disk)(struct xfs_da3_icnode_hdr *to, | ||
91 | struct xfs_da_intnode *from); | ||
84 | struct xfs_da_node_entry * | 92 | struct xfs_da_node_entry * |
85 | (*node_tree_p)(struct xfs_da_intnode *dap); | 93 | (*node_tree_p)(struct xfs_da_intnode *dap); |
94 | |||
95 | void (*free_hdr_to_disk)(struct xfs_dir2_free *to, | ||
96 | struct xfs_dir3_icfree_hdr *from); | ||
97 | void (*free_hdr_from_disk)(struct xfs_dir3_icfree_hdr *to, | ||
98 | struct xfs_dir2_free *from); | ||
86 | }; | 99 | }; |
87 | 100 | ||
88 | extern const struct xfs_dir_ops * | 101 | extern const struct xfs_dir_ops * |
diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 75f815786b97..c1ff552aa7bf 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c | |||
@@ -936,7 +936,7 @@ xfs_dir2_leaf_to_block( | |||
936 | tp = args->trans; | 936 | tp = args->trans; |
937 | mp = dp->i_mount; | 937 | mp = dp->i_mount; |
938 | leaf = lbp->b_addr; | 938 | leaf = lbp->b_addr; |
939 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 939 | dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); |
940 | ents = dp->d_ops->leaf_ents_p(leaf); | 940 | ents = dp->d_ops->leaf_ents_p(leaf); |
941 | ltp = xfs_dir2_leaf_tail_p(mp, leaf); | 941 | ltp = xfs_dir2_leaf_tail_p(mp, leaf); |
942 | 942 | ||
diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 16fdc0e627a7..2fb8db9fb574 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c | |||
@@ -64,7 +64,7 @@ xfs_dir3_leaf1_check( | |||
64 | struct xfs_dir2_leaf *leaf = bp->b_addr; | 64 | struct xfs_dir2_leaf *leaf = bp->b_addr; |
65 | struct xfs_dir3_icleaf_hdr leafhdr; | 65 | struct xfs_dir3_icleaf_hdr leafhdr; |
66 | 66 | ||
67 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 67 | dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); |
68 | 68 | ||
69 | if (leafhdr.magic == XFS_DIR3_LEAF1_MAGIC) { | 69 | if (leafhdr.magic == XFS_DIR3_LEAF1_MAGIC) { |
70 | struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; | 70 | struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; |
@@ -79,62 +79,6 @@ xfs_dir3_leaf1_check( | |||
79 | #define xfs_dir3_leaf_check(dp, bp) | 79 | #define xfs_dir3_leaf_check(dp, bp) |
80 | #endif | 80 | #endif |
81 | 81 | ||
82 | void | ||
83 | xfs_dir3_leaf_hdr_from_disk( | ||
84 | struct xfs_dir3_icleaf_hdr *to, | ||
85 | struct xfs_dir2_leaf *from) | ||
86 | { | ||
87 | if (from->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || | ||
88 | from->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)) { | ||
89 | to->forw = be32_to_cpu(from->hdr.info.forw); | ||
90 | to->back = be32_to_cpu(from->hdr.info.back); | ||
91 | to->magic = be16_to_cpu(from->hdr.info.magic); | ||
92 | to->count = be16_to_cpu(from->hdr.count); | ||
93 | to->stale = be16_to_cpu(from->hdr.stale); | ||
94 | } else { | ||
95 | struct xfs_dir3_leaf_hdr *hdr3 = (struct xfs_dir3_leaf_hdr *)from; | ||
96 | |||
97 | to->forw = be32_to_cpu(hdr3->info.hdr.forw); | ||
98 | to->back = be32_to_cpu(hdr3->info.hdr.back); | ||
99 | to->magic = be16_to_cpu(hdr3->info.hdr.magic); | ||
100 | to->count = be16_to_cpu(hdr3->count); | ||
101 | to->stale = be16_to_cpu(hdr3->stale); | ||
102 | } | ||
103 | |||
104 | ASSERT(to->magic == XFS_DIR2_LEAF1_MAGIC || | ||
105 | to->magic == XFS_DIR3_LEAF1_MAGIC || | ||
106 | to->magic == XFS_DIR2_LEAFN_MAGIC || | ||
107 | to->magic == XFS_DIR3_LEAFN_MAGIC); | ||
108 | } | ||
109 | |||
110 | void | ||
111 | xfs_dir3_leaf_hdr_to_disk( | ||
112 | struct xfs_dir2_leaf *to, | ||
113 | struct xfs_dir3_icleaf_hdr *from) | ||
114 | { | ||
115 | ASSERT(from->magic == XFS_DIR2_LEAF1_MAGIC || | ||
116 | from->magic == XFS_DIR3_LEAF1_MAGIC || | ||
117 | from->magic == XFS_DIR2_LEAFN_MAGIC || | ||
118 | from->magic == XFS_DIR3_LEAFN_MAGIC); | ||
119 | |||
120 | if (from->magic == XFS_DIR2_LEAF1_MAGIC || | ||
121 | from->magic == XFS_DIR2_LEAFN_MAGIC) { | ||
122 | to->hdr.info.forw = cpu_to_be32(from->forw); | ||
123 | to->hdr.info.back = cpu_to_be32(from->back); | ||
124 | to->hdr.info.magic = cpu_to_be16(from->magic); | ||
125 | to->hdr.count = cpu_to_be16(from->count); | ||
126 | to->hdr.stale = cpu_to_be16(from->stale); | ||
127 | } else { | ||
128 | struct xfs_dir3_leaf_hdr *hdr3 = (struct xfs_dir3_leaf_hdr *)to; | ||
129 | |||
130 | hdr3->info.hdr.forw = cpu_to_be32(from->forw); | ||
131 | hdr3->info.hdr.back = cpu_to_be32(from->back); | ||
132 | hdr3->info.hdr.magic = cpu_to_be16(from->magic); | ||
133 | hdr3->count = cpu_to_be16(from->count); | ||
134 | hdr3->stale = cpu_to_be16(from->stale); | ||
135 | } | ||
136 | } | ||
137 | |||
138 | bool | 82 | bool |
139 | xfs_dir3_leaf_check_int( | 83 | xfs_dir3_leaf_check_int( |
140 | struct xfs_mount *mp, | 84 | struct xfs_mount *mp, |
@@ -147,6 +91,7 @@ xfs_dir3_leaf_check_int( | |||
147 | int stale; | 91 | int stale; |
148 | int i; | 92 | int i; |
149 | const struct xfs_dir_ops *ops; | 93 | const struct xfs_dir_ops *ops; |
94 | struct xfs_dir3_icleaf_hdr leafhdr; | ||
150 | 95 | ||
151 | /* | 96 | /* |
152 | * we can be passed a null dp here from a verifier, so we need to go the | 97 | * we can be passed a null dp here from a verifier, so we need to go the |
@@ -154,6 +99,11 @@ xfs_dir3_leaf_check_int( | |||
154 | */ | 99 | */ |
155 | ops = xfs_dir_get_ops(mp, dp); | 100 | ops = xfs_dir_get_ops(mp, dp); |
156 | 101 | ||
102 | if (!hdr) { | ||
103 | ops->leaf_hdr_from_disk(&leafhdr, leaf); | ||
104 | hdr = &leafhdr; | ||
105 | } | ||
106 | |||
157 | ents = ops->leaf_ents_p(leaf); | 107 | ents = ops->leaf_ents_p(leaf); |
158 | ltp = xfs_dir2_leaf_tail_p(mp, leaf); | 108 | ltp = xfs_dir2_leaf_tail_p(mp, leaf); |
159 | 109 | ||
@@ -198,7 +148,6 @@ xfs_dir3_leaf_verify( | |||
198 | { | 148 | { |
199 | struct xfs_mount *mp = bp->b_target->bt_mount; | 149 | struct xfs_mount *mp = bp->b_target->bt_mount; |
200 | struct xfs_dir2_leaf *leaf = bp->b_addr; | 150 | struct xfs_dir2_leaf *leaf = bp->b_addr; |
201 | struct xfs_dir3_icleaf_hdr leafhdr; | ||
202 | 151 | ||
203 | ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); | 152 | ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); |
204 | 153 | ||
@@ -220,8 +169,7 @@ xfs_dir3_leaf_verify( | |||
220 | return false; | 169 | return false; |
221 | } | 170 | } |
222 | 171 | ||
223 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 172 | return xfs_dir3_leaf_check_int(mp, NULL, NULL, leaf); |
224 | return xfs_dir3_leaf_check_int(mp, NULL, &leafhdr, leaf); | ||
225 | } | 173 | } |
226 | 174 | ||
227 | static void | 175 | static void |
@@ -474,10 +422,10 @@ xfs_dir2_block_to_leaf( | |||
474 | /* | 422 | /* |
475 | * Set the counts in the leaf header. | 423 | * Set the counts in the leaf header. |
476 | */ | 424 | */ |
477 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 425 | dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); |
478 | leafhdr.count = be32_to_cpu(btp->count); | 426 | leafhdr.count = be32_to_cpu(btp->count); |
479 | leafhdr.stale = be32_to_cpu(btp->stale); | 427 | leafhdr.stale = be32_to_cpu(btp->stale); |
480 | xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); | 428 | dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); |
481 | xfs_dir3_leaf_log_header(tp, dp, lbp); | 429 | xfs_dir3_leaf_log_header(tp, dp, lbp); |
482 | 430 | ||
483 | /* | 431 | /* |
@@ -706,7 +654,7 @@ xfs_dir2_leaf_addname( | |||
706 | leaf = lbp->b_addr; | 654 | leaf = lbp->b_addr; |
707 | ltp = xfs_dir2_leaf_tail_p(mp, leaf); | 655 | ltp = xfs_dir2_leaf_tail_p(mp, leaf); |
708 | ents = dp->d_ops->leaf_ents_p(leaf); | 656 | ents = dp->d_ops->leaf_ents_p(leaf); |
709 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 657 | dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); |
710 | bestsp = xfs_dir2_leaf_bests_p(ltp); | 658 | bestsp = xfs_dir2_leaf_bests_p(ltp); |
711 | length = dp->d_ops->data_entsize(args->namelen); | 659 | length = dp->d_ops->data_entsize(args->namelen); |
712 | 660 | ||
@@ -945,7 +893,7 @@ xfs_dir2_leaf_addname( | |||
945 | /* | 893 | /* |
946 | * Log the leaf fields and give up the buffers. | 894 | * Log the leaf fields and give up the buffers. |
947 | */ | 895 | */ |
948 | xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); | 896 | dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); |
949 | xfs_dir3_leaf_log_header(tp, dp, lbp); | 897 | xfs_dir3_leaf_log_header(tp, dp, lbp); |
950 | xfs_dir3_leaf_log_ents(tp, dp, lbp, lfloglow, lfloghigh); | 898 | xfs_dir3_leaf_log_ents(tp, dp, lbp, lfloglow, lfloghigh); |
951 | xfs_dir3_leaf_check(dp, lbp); | 899 | xfs_dir3_leaf_check(dp, lbp); |
@@ -968,6 +916,7 @@ xfs_dir3_leaf_compact( | |||
968 | int loglow; /* first leaf entry to log */ | 916 | int loglow; /* first leaf entry to log */ |
969 | int to; /* target leaf index */ | 917 | int to; /* target leaf index */ |
970 | struct xfs_dir2_leaf_entry *ents; | 918 | struct xfs_dir2_leaf_entry *ents; |
919 | struct xfs_inode *dp = args->dp; | ||
971 | 920 | ||
972 | leaf = bp->b_addr; | 921 | leaf = bp->b_addr; |
973 | if (!leafhdr->stale) | 922 | if (!leafhdr->stale) |
@@ -976,7 +925,7 @@ xfs_dir3_leaf_compact( | |||
976 | /* | 925 | /* |
977 | * Compress out the stale entries in place. | 926 | * Compress out the stale entries in place. |
978 | */ | 927 | */ |
979 | ents = args->dp->d_ops->leaf_ents_p(leaf); | 928 | ents = dp->d_ops->leaf_ents_p(leaf); |
980 | for (from = to = 0, loglow = -1; from < leafhdr->count; from++) { | 929 | for (from = to = 0, loglow = -1; from < leafhdr->count; from++) { |
981 | if (ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) | 930 | if (ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) |
982 | continue; | 931 | continue; |
@@ -997,11 +946,10 @@ xfs_dir3_leaf_compact( | |||
997 | leafhdr->count -= leafhdr->stale; | 946 | leafhdr->count -= leafhdr->stale; |
998 | leafhdr->stale = 0; | 947 | leafhdr->stale = 0; |
999 | 948 | ||
1000 | xfs_dir3_leaf_hdr_to_disk(leaf, leafhdr); | 949 | dp->d_ops->leaf_hdr_to_disk(leaf, leafhdr); |
1001 | xfs_dir3_leaf_log_header(args->trans, args->dp, bp); | 950 | xfs_dir3_leaf_log_header(args->trans, dp, bp); |
1002 | if (loglow != -1) | 951 | if (loglow != -1) |
1003 | xfs_dir3_leaf_log_ents(args->trans, args->dp, bp, | 952 | xfs_dir3_leaf_log_ents(args->trans, dp, bp, loglow, to - 1); |
1004 | loglow, to - 1); | ||
1005 | } | 953 | } |
1006 | 954 | ||
1007 | /* | 955 | /* |
@@ -1290,7 +1238,7 @@ xfs_dir2_leaf_lookup_int( | |||
1290 | leaf = lbp->b_addr; | 1238 | leaf = lbp->b_addr; |
1291 | xfs_dir3_leaf_check(dp, lbp); | 1239 | xfs_dir3_leaf_check(dp, lbp); |
1292 | ents = dp->d_ops->leaf_ents_p(leaf); | 1240 | ents = dp->d_ops->leaf_ents_p(leaf); |
1293 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 1241 | dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); |
1294 | 1242 | ||
1295 | /* | 1243 | /* |
1296 | * Look for the first leaf entry with our hash value. | 1244 | * Look for the first leaf entry with our hash value. |
@@ -1425,7 +1373,7 @@ xfs_dir2_leaf_removename( | |||
1425 | hdr = dbp->b_addr; | 1373 | hdr = dbp->b_addr; |
1426 | xfs_dir3_data_check(dp, dbp); | 1374 | xfs_dir3_data_check(dp, dbp); |
1427 | bf = dp->d_ops->data_bestfree_p(hdr); | 1375 | bf = dp->d_ops->data_bestfree_p(hdr); |
1428 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 1376 | dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); |
1429 | ents = dp->d_ops->leaf_ents_p(leaf); | 1377 | ents = dp->d_ops->leaf_ents_p(leaf); |
1430 | /* | 1378 | /* |
1431 | * Point to the leaf entry, use that to point to the data entry. | 1379 | * Point to the leaf entry, use that to point to the data entry. |
@@ -1449,7 +1397,7 @@ xfs_dir2_leaf_removename( | |||
1449 | * We just mark the leaf entry stale by putting a null in it. | 1397 | * We just mark the leaf entry stale by putting a null in it. |
1450 | */ | 1398 | */ |
1451 | leafhdr.stale++; | 1399 | leafhdr.stale++; |
1452 | xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); | 1400 | dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); |
1453 | xfs_dir3_leaf_log_header(tp, dp, lbp); | 1401 | xfs_dir3_leaf_log_header(tp, dp, lbp); |
1454 | 1402 | ||
1455 | lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); | 1403 | lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); |
@@ -1602,7 +1550,7 @@ xfs_dir2_leaf_search_hash( | |||
1602 | 1550 | ||
1603 | leaf = lbp->b_addr; | 1551 | leaf = lbp->b_addr; |
1604 | ents = args->dp->d_ops->leaf_ents_p(leaf); | 1552 | ents = args->dp->d_ops->leaf_ents_p(leaf); |
1605 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 1553 | args->dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); |
1606 | 1554 | ||
1607 | /* | 1555 | /* |
1608 | * Note, the table cannot be empty, so we have to go through the loop. | 1556 | * Note, the table cannot be empty, so we have to go through the loop. |
@@ -1791,7 +1739,7 @@ xfs_dir2_node_to_leaf( | |||
1791 | return 0; | 1739 | return 0; |
1792 | lbp = state->path.blk[0].bp; | 1740 | lbp = state->path.blk[0].bp; |
1793 | leaf = lbp->b_addr; | 1741 | leaf = lbp->b_addr; |
1794 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 1742 | dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); |
1795 | 1743 | ||
1796 | ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || | 1744 | ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || |
1797 | leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); | 1745 | leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); |
@@ -1803,7 +1751,7 @@ xfs_dir2_node_to_leaf( | |||
1803 | if (error) | 1751 | if (error) |
1804 | return error; | 1752 | return error; |
1805 | free = fbp->b_addr; | 1753 | free = fbp->b_addr; |
1806 | xfs_dir3_free_hdr_from_disk(&freehdr, free); | 1754 | dp->d_ops->free_hdr_from_disk(&freehdr, free); |
1807 | 1755 | ||
1808 | ASSERT(!freehdr.firstdb); | 1756 | ASSERT(!freehdr.firstdb); |
1809 | 1757 | ||
@@ -1840,7 +1788,7 @@ xfs_dir2_node_to_leaf( | |||
1840 | memcpy(xfs_dir2_leaf_bests_p(ltp), xfs_dir3_free_bests_p(mp, free), | 1788 | memcpy(xfs_dir2_leaf_bests_p(ltp), xfs_dir3_free_bests_p(mp, free), |
1841 | freehdr.nvalid * sizeof(xfs_dir2_data_off_t)); | 1789 | freehdr.nvalid * sizeof(xfs_dir2_data_off_t)); |
1842 | 1790 | ||
1843 | xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); | 1791 | dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); |
1844 | xfs_dir3_leaf_log_header(tp, dp, lbp); | 1792 | xfs_dir3_leaf_log_header(tp, dp, lbp); |
1845 | xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); | 1793 | xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); |
1846 | xfs_dir3_leaf_log_tail(tp, lbp); | 1794 | xfs_dir3_leaf_log_tail(tp, lbp); |
diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 3a426ed9b16e..eaee8c36bcc4 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c | |||
@@ -68,7 +68,7 @@ xfs_dir3_leafn_check( | |||
68 | struct xfs_dir2_leaf *leaf = bp->b_addr; | 68 | struct xfs_dir2_leaf *leaf = bp->b_addr; |
69 | struct xfs_dir3_icleaf_hdr leafhdr; | 69 | struct xfs_dir3_icleaf_hdr leafhdr; |
70 | 70 | ||
71 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 71 | dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); |
72 | 72 | ||
73 | if (leafhdr.magic == XFS_DIR3_LEAFN_MAGIC) { | 73 | if (leafhdr.magic == XFS_DIR3_LEAFN_MAGIC) { |
74 | struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; | 74 | struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; |
@@ -192,53 +192,6 @@ xfs_dir2_free_try_read( | |||
192 | return __xfs_dir3_free_read(tp, dp, fbno, -2, bpp); | 192 | return __xfs_dir3_free_read(tp, dp, fbno, -2, bpp); |
193 | } | 193 | } |
194 | 194 | ||
195 | |||
196 | void | ||
197 | xfs_dir3_free_hdr_from_disk( | ||
198 | struct xfs_dir3_icfree_hdr *to, | ||
199 | struct xfs_dir2_free *from) | ||
200 | { | ||
201 | if (from->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)) { | ||
202 | to->magic = be32_to_cpu(from->hdr.magic); | ||
203 | to->firstdb = be32_to_cpu(from->hdr.firstdb); | ||
204 | to->nvalid = be32_to_cpu(from->hdr.nvalid); | ||
205 | to->nused = be32_to_cpu(from->hdr.nused); | ||
206 | } else { | ||
207 | struct xfs_dir3_free_hdr *hdr3 = (struct xfs_dir3_free_hdr *)from; | ||
208 | |||
209 | to->magic = be32_to_cpu(hdr3->hdr.magic); | ||
210 | to->firstdb = be32_to_cpu(hdr3->firstdb); | ||
211 | to->nvalid = be32_to_cpu(hdr3->nvalid); | ||
212 | to->nused = be32_to_cpu(hdr3->nused); | ||
213 | } | ||
214 | |||
215 | ASSERT(to->magic == XFS_DIR2_FREE_MAGIC || | ||
216 | to->magic == XFS_DIR3_FREE_MAGIC); | ||
217 | } | ||
218 | |||
219 | static void | ||
220 | xfs_dir3_free_hdr_to_disk( | ||
221 | struct xfs_dir2_free *to, | ||
222 | struct xfs_dir3_icfree_hdr *from) | ||
223 | { | ||
224 | ASSERT(from->magic == XFS_DIR2_FREE_MAGIC || | ||
225 | from->magic == XFS_DIR3_FREE_MAGIC); | ||
226 | |||
227 | if (from->magic == XFS_DIR2_FREE_MAGIC) { | ||
228 | to->hdr.magic = cpu_to_be32(from->magic); | ||
229 | to->hdr.firstdb = cpu_to_be32(from->firstdb); | ||
230 | to->hdr.nvalid = cpu_to_be32(from->nvalid); | ||
231 | to->hdr.nused = cpu_to_be32(from->nused); | ||
232 | } else { | ||
233 | struct xfs_dir3_free_hdr *hdr3 = (struct xfs_dir3_free_hdr *)to; | ||
234 | |||
235 | hdr3->hdr.magic = cpu_to_be32(from->magic); | ||
236 | hdr3->firstdb = cpu_to_be32(from->firstdb); | ||
237 | hdr3->nvalid = cpu_to_be32(from->nvalid); | ||
238 | hdr3->nused = cpu_to_be32(from->nused); | ||
239 | } | ||
240 | } | ||
241 | |||
242 | static int | 195 | static int |
243 | xfs_dir3_free_get_buf( | 196 | xfs_dir3_free_get_buf( |
244 | struct xfs_trans *tp, | 197 | struct xfs_trans *tp, |
@@ -276,7 +229,7 @@ xfs_dir3_free_get_buf( | |||
276 | uuid_copy(&hdr3->hdr.uuid, &mp->m_sb.sb_uuid); | 229 | uuid_copy(&hdr3->hdr.uuid, &mp->m_sb.sb_uuid); |
277 | } else | 230 | } else |
278 | hdr.magic = XFS_DIR2_FREE_MAGIC; | 231 | hdr.magic = XFS_DIR2_FREE_MAGIC; |
279 | xfs_dir3_free_hdr_to_disk(bp->b_addr, &hdr); | 232 | dp->d_ops->free_hdr_to_disk(bp->b_addr, &hdr); |
280 | *bpp = bp; | 233 | *bpp = bp; |
281 | return 0; | 234 | return 0; |
282 | } | 235 | } |
@@ -368,7 +321,7 @@ xfs_dir2_leaf_to_node( | |||
368 | return error; | 321 | return error; |
369 | 322 | ||
370 | free = fbp->b_addr; | 323 | free = fbp->b_addr; |
371 | xfs_dir3_free_hdr_from_disk(&freehdr, free); | 324 | dp->d_ops->free_hdr_from_disk(&freehdr, free); |
372 | leaf = lbp->b_addr; | 325 | leaf = lbp->b_addr; |
373 | ltp = xfs_dir2_leaf_tail_p(mp, leaf); | 326 | ltp = xfs_dir2_leaf_tail_p(mp, leaf); |
374 | ASSERT(be32_to_cpu(ltp->bestcount) <= | 327 | ASSERT(be32_to_cpu(ltp->bestcount) <= |
@@ -392,7 +345,7 @@ xfs_dir2_leaf_to_node( | |||
392 | freehdr.nused = n; | 345 | freehdr.nused = n; |
393 | freehdr.nvalid = be32_to_cpu(ltp->bestcount); | 346 | freehdr.nvalid = be32_to_cpu(ltp->bestcount); |
394 | 347 | ||
395 | xfs_dir3_free_hdr_to_disk(fbp->b_addr, &freehdr); | 348 | dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr); |
396 | xfs_dir2_free_log_bests(tp, fbp, 0, freehdr.nvalid - 1); | 349 | xfs_dir2_free_log_bests(tp, fbp, 0, freehdr.nvalid - 1); |
397 | xfs_dir2_free_log_header(tp, fbp); | 350 | xfs_dir2_free_log_header(tp, fbp); |
398 | 351 | ||
@@ -442,7 +395,7 @@ xfs_dir2_leafn_add( | |||
442 | mp = dp->i_mount; | 395 | mp = dp->i_mount; |
443 | tp = args->trans; | 396 | tp = args->trans; |
444 | leaf = bp->b_addr; | 397 | leaf = bp->b_addr; |
445 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 398 | dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); |
446 | ents = dp->d_ops->leaf_ents_p(leaf); | 399 | ents = dp->d_ops->leaf_ents_p(leaf); |
447 | 400 | ||
448 | /* | 401 | /* |
@@ -497,7 +450,7 @@ xfs_dir2_leafn_add( | |||
497 | lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(mp, | 450 | lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(mp, |
498 | args->blkno, args->index)); | 451 | args->blkno, args->index)); |
499 | 452 | ||
500 | xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); | 453 | dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); |
501 | xfs_dir3_leaf_log_header(tp, dp, bp); | 454 | xfs_dir3_leaf_log_header(tp, dp, bp); |
502 | xfs_dir3_leaf_log_ents(tp, dp, bp, lfloglow, lfloghigh); | 455 | xfs_dir3_leaf_log_ents(tp, dp, bp, lfloglow, lfloghigh); |
503 | xfs_dir3_leaf_check(dp, bp); | 456 | xfs_dir3_leaf_check(dp, bp); |
@@ -507,20 +460,20 @@ xfs_dir2_leafn_add( | |||
507 | #ifdef DEBUG | 460 | #ifdef DEBUG |
508 | static void | 461 | static void |
509 | xfs_dir2_free_hdr_check( | 462 | xfs_dir2_free_hdr_check( |
510 | struct xfs_mount *mp, | 463 | struct xfs_inode *dp, |
511 | struct xfs_buf *bp, | 464 | struct xfs_buf *bp, |
512 | xfs_dir2_db_t db) | 465 | xfs_dir2_db_t db) |
513 | { | 466 | { |
514 | struct xfs_dir3_icfree_hdr hdr; | 467 | struct xfs_dir3_icfree_hdr hdr; |
515 | 468 | ||
516 | xfs_dir3_free_hdr_from_disk(&hdr, bp->b_addr); | 469 | dp->d_ops->free_hdr_from_disk(&hdr, bp->b_addr); |
517 | 470 | ||
518 | ASSERT((hdr.firstdb % xfs_dir3_free_max_bests(mp)) == 0); | 471 | ASSERT((hdr.firstdb % xfs_dir3_free_max_bests(dp->i_mount)) == 0); |
519 | ASSERT(hdr.firstdb <= db); | 472 | ASSERT(hdr.firstdb <= db); |
520 | ASSERT(db < hdr.firstdb + hdr.nvalid); | 473 | ASSERT(db < hdr.firstdb + hdr.nvalid); |
521 | } | 474 | } |
522 | #else | 475 | #else |
523 | #define xfs_dir2_free_hdr_check(mp, dp, db) | 476 | #define xfs_dir2_free_hdr_check(dp, bp, db) |
524 | #endif /* DEBUG */ | 477 | #endif /* DEBUG */ |
525 | 478 | ||
526 | /* | 479 | /* |
@@ -537,7 +490,7 @@ xfs_dir2_leafn_lasthash( | |||
537 | struct xfs_dir2_leaf_entry *ents; | 490 | struct xfs_dir2_leaf_entry *ents; |
538 | struct xfs_dir3_icleaf_hdr leafhdr; | 491 | struct xfs_dir3_icleaf_hdr leafhdr; |
539 | 492 | ||
540 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 493 | dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); |
541 | 494 | ||
542 | ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || | 495 | ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || |
543 | leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); | 496 | leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); |
@@ -584,7 +537,7 @@ xfs_dir2_leafn_lookup_for_addname( | |||
584 | tp = args->trans; | 537 | tp = args->trans; |
585 | mp = dp->i_mount; | 538 | mp = dp->i_mount; |
586 | leaf = bp->b_addr; | 539 | leaf = bp->b_addr; |
587 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 540 | dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); |
588 | ents = dp->d_ops->leaf_ents_p(leaf); | 541 | ents = dp->d_ops->leaf_ents_p(leaf); |
589 | 542 | ||
590 | xfs_dir3_leaf_check(dp, bp); | 543 | xfs_dir3_leaf_check(dp, bp); |
@@ -655,7 +608,7 @@ xfs_dir2_leafn_lookup_for_addname( | |||
655 | return error; | 608 | return error; |
656 | free = curbp->b_addr; | 609 | free = curbp->b_addr; |
657 | 610 | ||
658 | xfs_dir2_free_hdr_check(mp, curbp, curdb); | 611 | xfs_dir2_free_hdr_check(dp, curbp, curdb); |
659 | } | 612 | } |
660 | /* | 613 | /* |
661 | * Get the index for our entry. | 614 | * Get the index for our entry. |
@@ -734,7 +687,7 @@ xfs_dir2_leafn_lookup_for_entry( | |||
734 | tp = args->trans; | 687 | tp = args->trans; |
735 | mp = dp->i_mount; | 688 | mp = dp->i_mount; |
736 | leaf = bp->b_addr; | 689 | leaf = bp->b_addr; |
737 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 690 | dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); |
738 | ents = dp->d_ops->leaf_ents_p(leaf); | 691 | ents = dp->d_ops->leaf_ents_p(leaf); |
739 | 692 | ||
740 | xfs_dir3_leaf_check(dp, bp); | 693 | xfs_dir3_leaf_check(dp, bp); |
@@ -969,8 +922,8 @@ xfs_dir2_leafn_order( | |||
969 | struct xfs_dir3_icleaf_hdr hdr1; | 922 | struct xfs_dir3_icleaf_hdr hdr1; |
970 | struct xfs_dir3_icleaf_hdr hdr2; | 923 | struct xfs_dir3_icleaf_hdr hdr2; |
971 | 924 | ||
972 | xfs_dir3_leaf_hdr_from_disk(&hdr1, leaf1); | 925 | dp->d_ops->leaf_hdr_from_disk(&hdr1, leaf1); |
973 | xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf2); | 926 | dp->d_ops->leaf_hdr_from_disk(&hdr2, leaf2); |
974 | ents1 = dp->d_ops->leaf_ents_p(leaf1); | 927 | ents1 = dp->d_ops->leaf_ents_p(leaf1); |
975 | ents2 = dp->d_ops->leaf_ents_p(leaf2); | 928 | ents2 = dp->d_ops->leaf_ents_p(leaf2); |
976 | 929 | ||
@@ -1025,8 +978,8 @@ xfs_dir2_leafn_rebalance( | |||
1025 | } | 978 | } |
1026 | leaf1 = blk1->bp->b_addr; | 979 | leaf1 = blk1->bp->b_addr; |
1027 | leaf2 = blk2->bp->b_addr; | 980 | leaf2 = blk2->bp->b_addr; |
1028 | xfs_dir3_leaf_hdr_from_disk(&hdr1, leaf1); | 981 | dp->d_ops->leaf_hdr_from_disk(&hdr1, leaf1); |
1029 | xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf2); | 982 | dp->d_ops->leaf_hdr_from_disk(&hdr2, leaf2); |
1030 | ents1 = dp->d_ops->leaf_ents_p(leaf1); | 983 | ents1 = dp->d_ops->leaf_ents_p(leaf1); |
1031 | ents2 = dp->d_ops->leaf_ents_p(leaf2); | 984 | ents2 = dp->d_ops->leaf_ents_p(leaf2); |
1032 | 985 | ||
@@ -1074,8 +1027,8 @@ xfs_dir2_leafn_rebalance( | |||
1074 | ASSERT(hdr1.stale + hdr2.stale == oldstale); | 1027 | ASSERT(hdr1.stale + hdr2.stale == oldstale); |
1075 | 1028 | ||
1076 | /* log the changes made when moving the entries */ | 1029 | /* log the changes made when moving the entries */ |
1077 | xfs_dir3_leaf_hdr_to_disk(leaf1, &hdr1); | 1030 | dp->d_ops->leaf_hdr_to_disk(leaf1, &hdr1); |
1078 | xfs_dir3_leaf_hdr_to_disk(leaf2, &hdr2); | 1031 | dp->d_ops->leaf_hdr_to_disk(leaf2, &hdr2); |
1079 | xfs_dir3_leaf_log_header(args->trans, dp, blk1->bp); | 1032 | xfs_dir3_leaf_log_header(args->trans, dp, blk1->bp); |
1080 | xfs_dir3_leaf_log_header(args->trans, dp, blk2->bp); | 1033 | xfs_dir3_leaf_log_header(args->trans, dp, blk2->bp); |
1081 | 1034 | ||
@@ -1124,8 +1077,9 @@ xfs_dir3_data_block_free( | |||
1124 | int logfree = 0; | 1077 | int logfree = 0; |
1125 | __be16 *bests; | 1078 | __be16 *bests; |
1126 | struct xfs_dir3_icfree_hdr freehdr; | 1079 | struct xfs_dir3_icfree_hdr freehdr; |
1080 | struct xfs_inode *dp = args->dp; | ||
1127 | 1081 | ||
1128 | xfs_dir3_free_hdr_from_disk(&freehdr, free); | 1082 | dp->d_ops->free_hdr_from_disk(&freehdr, free); |
1129 | 1083 | ||
1130 | bests = xfs_dir3_free_bests_p(tp->t_mountp, free); | 1084 | bests = xfs_dir3_free_bests_p(tp->t_mountp, free); |
1131 | if (hdr) { | 1085 | if (hdr) { |
@@ -1161,7 +1115,7 @@ xfs_dir3_data_block_free( | |||
1161 | logfree = 1; | 1115 | logfree = 1; |
1162 | } | 1116 | } |
1163 | 1117 | ||
1164 | xfs_dir3_free_hdr_to_disk(free, &freehdr); | 1118 | dp->d_ops->free_hdr_to_disk(free, &freehdr); |
1165 | xfs_dir2_free_log_header(tp, fbp); | 1119 | xfs_dir2_free_log_header(tp, fbp); |
1166 | 1120 | ||
1167 | /* | 1121 | /* |
@@ -1226,7 +1180,7 @@ xfs_dir2_leafn_remove( | |||
1226 | tp = args->trans; | 1180 | tp = args->trans; |
1227 | mp = dp->i_mount; | 1181 | mp = dp->i_mount; |
1228 | leaf = bp->b_addr; | 1182 | leaf = bp->b_addr; |
1229 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 1183 | dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); |
1230 | ents = dp->d_ops->leaf_ents_p(leaf); | 1184 | ents = dp->d_ops->leaf_ents_p(leaf); |
1231 | 1185 | ||
1232 | /* | 1186 | /* |
@@ -1247,7 +1201,7 @@ xfs_dir2_leafn_remove( | |||
1247 | * Log the leaf block changes. | 1201 | * Log the leaf block changes. |
1248 | */ | 1202 | */ |
1249 | leafhdr.stale++; | 1203 | leafhdr.stale++; |
1250 | xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); | 1204 | dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); |
1251 | xfs_dir3_leaf_log_header(tp, dp, bp); | 1205 | xfs_dir3_leaf_log_header(tp, dp, bp); |
1252 | 1206 | ||
1253 | lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); | 1207 | lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); |
@@ -1298,7 +1252,7 @@ xfs_dir2_leafn_remove( | |||
1298 | #ifdef DEBUG | 1252 | #ifdef DEBUG |
1299 | { | 1253 | { |
1300 | struct xfs_dir3_icfree_hdr freehdr; | 1254 | struct xfs_dir3_icfree_hdr freehdr; |
1301 | xfs_dir3_free_hdr_from_disk(&freehdr, free); | 1255 | dp->d_ops->free_hdr_from_disk(&freehdr, free); |
1302 | ASSERT(freehdr.firstdb == xfs_dir3_free_max_bests(mp) * | 1256 | ASSERT(freehdr.firstdb == xfs_dir3_free_max_bests(mp) * |
1303 | (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); | 1257 | (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); |
1304 | } | 1258 | } |
@@ -1449,7 +1403,7 @@ xfs_dir2_leafn_toosmall( | |||
1449 | */ | 1403 | */ |
1450 | blk = &state->path.blk[state->path.active - 1]; | 1404 | blk = &state->path.blk[state->path.active - 1]; |
1451 | leaf = blk->bp->b_addr; | 1405 | leaf = blk->bp->b_addr; |
1452 | xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); | 1406 | dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); |
1453 | ents = dp->d_ops->leaf_ents_p(leaf); | 1407 | ents = dp->d_ops->leaf_ents_p(leaf); |
1454 | xfs_dir3_leaf_check(dp, blk->bp); | 1408 | xfs_dir3_leaf_check(dp, blk->bp); |
1455 | 1409 | ||
@@ -1511,7 +1465,7 @@ xfs_dir2_leafn_toosmall( | |||
1511 | bytes = state->blocksize - (state->blocksize >> 2); | 1465 | bytes = state->blocksize - (state->blocksize >> 2); |
1512 | 1466 | ||
1513 | leaf = bp->b_addr; | 1467 | leaf = bp->b_addr; |
1514 | xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf); | 1468 | dp->d_ops->leaf_hdr_from_disk(&hdr2, leaf); |
1515 | ents = dp->d_ops->leaf_ents_p(leaf); | 1469 | ents = dp->d_ops->leaf_ents_p(leaf); |
1516 | count += hdr2.count - hdr2.stale; | 1470 | count += hdr2.count - hdr2.stale; |
1517 | bytes -= count * sizeof(ents[0]); | 1471 | bytes -= count * sizeof(ents[0]); |
@@ -1574,10 +1528,10 @@ xfs_dir2_leafn_unbalance( | |||
1574 | drop_leaf = drop_blk->bp->b_addr; | 1528 | drop_leaf = drop_blk->bp->b_addr; |
1575 | save_leaf = save_blk->bp->b_addr; | 1529 | save_leaf = save_blk->bp->b_addr; |
1576 | 1530 | ||
1577 | xfs_dir3_leaf_hdr_from_disk(&savehdr, save_leaf); | 1531 | dp->d_ops->leaf_hdr_from_disk(&savehdr, save_leaf); |
1578 | xfs_dir3_leaf_hdr_from_disk(&drophdr, drop_leaf); | 1532 | dp->d_ops->leaf_hdr_from_disk(&drophdr, drop_leaf); |
1579 | sents = args->dp->d_ops->leaf_ents_p(save_leaf); | 1533 | sents = dp->d_ops->leaf_ents_p(save_leaf); |
1580 | dents = args->dp->d_ops->leaf_ents_p(drop_leaf); | 1534 | dents = dp->d_ops->leaf_ents_p(drop_leaf); |
1581 | 1535 | ||
1582 | /* | 1536 | /* |
1583 | * If there are any stale leaf entries, take this opportunity | 1537 | * If there are any stale leaf entries, take this opportunity |
@@ -1603,8 +1557,8 @@ xfs_dir2_leafn_unbalance( | |||
1603 | save_blk->hashval = be32_to_cpu(sents[savehdr.count - 1].hashval); | 1557 | save_blk->hashval = be32_to_cpu(sents[savehdr.count - 1].hashval); |
1604 | 1558 | ||
1605 | /* log the changes made when moving the entries */ | 1559 | /* log the changes made when moving the entries */ |
1606 | xfs_dir3_leaf_hdr_to_disk(save_leaf, &savehdr); | 1560 | dp->d_ops->leaf_hdr_to_disk(save_leaf, &savehdr); |
1607 | xfs_dir3_leaf_hdr_to_disk(drop_leaf, &drophdr); | 1561 | dp->d_ops->leaf_hdr_to_disk(drop_leaf, &drophdr); |
1608 | xfs_dir3_leaf_log_header(args->trans, dp, save_blk->bp); | 1562 | xfs_dir3_leaf_log_header(args->trans, dp, save_blk->bp); |
1609 | xfs_dir3_leaf_log_header(args->trans, dp, drop_blk->bp); | 1563 | xfs_dir3_leaf_log_header(args->trans, dp, drop_blk->bp); |
1610 | 1564 | ||
@@ -1735,7 +1689,7 @@ xfs_dir2_node_addname_int( | |||
1735 | free = fbp->b_addr; | 1689 | free = fbp->b_addr; |
1736 | findex = fblk->index; | 1690 | findex = fblk->index; |
1737 | bests = xfs_dir3_free_bests_p(mp, free); | 1691 | bests = xfs_dir3_free_bests_p(mp, free); |
1738 | xfs_dir3_free_hdr_from_disk(&freehdr, free); | 1692 | dp->d_ops->free_hdr_from_disk(&freehdr, free); |
1739 | 1693 | ||
1740 | /* | 1694 | /* |
1741 | * This means the free entry showed that the data block had | 1695 | * This means the free entry showed that the data block had |
@@ -1828,7 +1782,7 @@ xfs_dir2_node_addname_int( | |||
1828 | * there, so we have to do it here to avoid warnings. Blech. | 1782 | * there, so we have to do it here to avoid warnings. Blech. |
1829 | */ | 1783 | */ |
1830 | bests = xfs_dir3_free_bests_p(mp, free); | 1784 | bests = xfs_dir3_free_bests_p(mp, free); |
1831 | xfs_dir3_free_hdr_from_disk(&freehdr, free); | 1785 | dp->d_ops->free_hdr_from_disk(&freehdr, free); |
1832 | if (be16_to_cpu(bests[findex]) != NULLDATAOFF && | 1786 | if (be16_to_cpu(bests[findex]) != NULLDATAOFF && |
1833 | be16_to_cpu(bests[findex]) >= length) | 1787 | be16_to_cpu(bests[findex]) >= length) |
1834 | dbno = freehdr.firstdb + findex; | 1788 | dbno = freehdr.firstdb + findex; |
@@ -1927,7 +1881,7 @@ xfs_dir2_node_addname_int( | |||
1927 | return error; | 1881 | return error; |
1928 | free = fbp->b_addr; | 1882 | free = fbp->b_addr; |
1929 | bests = xfs_dir3_free_bests_p(mp, free); | 1883 | bests = xfs_dir3_free_bests_p(mp, free); |
1930 | xfs_dir3_free_hdr_from_disk(&freehdr, free); | 1884 | dp->d_ops->free_hdr_from_disk(&freehdr, free); |
1931 | 1885 | ||
1932 | /* | 1886 | /* |
1933 | * Remember the first slot as our empty slot. | 1887 | * Remember the first slot as our empty slot. |
@@ -1937,7 +1891,7 @@ xfs_dir2_node_addname_int( | |||
1937 | } else { | 1891 | } else { |
1938 | free = fbp->b_addr; | 1892 | free = fbp->b_addr; |
1939 | bests = xfs_dir3_free_bests_p(mp, free); | 1893 | bests = xfs_dir3_free_bests_p(mp, free); |
1940 | xfs_dir3_free_hdr_from_disk(&freehdr, free); | 1894 | dp->d_ops->free_hdr_from_disk(&freehdr, free); |
1941 | } | 1895 | } |
1942 | 1896 | ||
1943 | /* | 1897 | /* |
@@ -1962,7 +1916,7 @@ xfs_dir2_node_addname_int( | |||
1962 | */ | 1916 | */ |
1963 | if (bests[findex] == cpu_to_be16(NULLDATAOFF)) { | 1917 | if (bests[findex] == cpu_to_be16(NULLDATAOFF)) { |
1964 | freehdr.nused++; | 1918 | freehdr.nused++; |
1965 | xfs_dir3_free_hdr_to_disk(fbp->b_addr, &freehdr); | 1919 | dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr); |
1966 | xfs_dir2_free_log_header(tp, fbp); | 1920 | xfs_dir2_free_log_header(tp, fbp); |
1967 | } | 1921 | } |
1968 | /* | 1922 | /* |
@@ -2294,7 +2248,7 @@ xfs_dir2_node_trim_free( | |||
2294 | if (!bp) | 2248 | if (!bp) |
2295 | return 0; | 2249 | return 0; |
2296 | free = bp->b_addr; | 2250 | free = bp->b_addr; |
2297 | xfs_dir3_free_hdr_from_disk(&freehdr, free); | 2251 | dp->d_ops->free_hdr_from_disk(&freehdr, free); |
2298 | 2252 | ||
2299 | /* | 2253 | /* |
2300 | * If there are used entries, there's nothing to do. | 2254 | * If there are used entries, there's nothing to do. |
diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 3e4b5ba7b41f..8b9d2281f85b 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h | |||
@@ -94,10 +94,6 @@ xfs_dir3_leaf_find_entry(struct xfs_dir3_icleaf_hdr *leafhdr, | |||
94 | int lowstale, int highstale, int *lfloglow, int *lfloghigh); | 94 | int lowstale, int highstale, int *lfloglow, int *lfloghigh); |
95 | extern int xfs_dir2_node_to_leaf(struct xfs_da_state *state); | 95 | extern int xfs_dir2_node_to_leaf(struct xfs_da_state *state); |
96 | 96 | ||
97 | extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, | ||
98 | struct xfs_dir2_leaf *from); | ||
99 | extern void xfs_dir3_leaf_hdr_to_disk(struct xfs_dir2_leaf *to, | ||
100 | struct xfs_dir3_icleaf_hdr *from); | ||
101 | extern bool xfs_dir3_leaf_check_int(struct xfs_mount *mp, struct xfs_inode *dp, | 97 | extern bool xfs_dir3_leaf_check_int(struct xfs_mount *mp, struct xfs_inode *dp, |
102 | struct xfs_dir3_icleaf_hdr *hdr, struct xfs_dir2_leaf *leaf); | 98 | struct xfs_dir3_icleaf_hdr *hdr, struct xfs_dir2_leaf *leaf); |
103 | 99 | ||