aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2013-10-29 07:11:50 -0400
committerBen Myers <bpm@sgi.com>2013-10-30 14:39:43 -0400
commit4141956ae05e0685b14b30f92fdc8fb11b4a0cb2 (patch)
treea6043fa6f5aa87f6aa7d1a479768a175b54dd3b5
parent2ca9877410594dd321621efc9e1cbcd1ca24d0f3 (diff)
xfs: vectorise directory leaf operations
Next step in the vectorisation process is the leaf block encode/decode operations. Most of the operations on leaves are handled by the data block vectors, so there are relatively few of them here. Because of all the shuffling of code and having to pass more state to some functions, this patch doesn't directly reduce the size of the binary. It does open up many more opportunities for factoring and optimisation, however. 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 Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Ben Myers <bpm@sgi.com>
-rw-r--r--fs/xfs/xfs_da_btree.c19
-rw-r--r--fs/xfs/xfs_da_format.c75
-rw-r--r--fs/xfs/xfs_da_format.h30
-rw-r--r--fs/xfs/xfs_dir2.c7
-rw-r--r--fs/xfs/xfs_dir2.h10
-rw-r--r--fs/xfs/xfs_dir2_block.c2
-rw-r--r--fs/xfs/xfs_dir2_data.c13
-rw-r--r--fs/xfs/xfs_dir2_leaf.c91
-rw-r--r--fs/xfs/xfs_dir2_node.c117
-rw-r--r--fs/xfs/xfs_dir2_priv.h13
10 files changed, 218 insertions, 159 deletions
diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c
index eb65c546ffd8..df3759c51470 100644
--- a/fs/xfs/xfs_da_btree.c
+++ b/fs/xfs/xfs_da_btree.c
@@ -605,7 +605,7 @@ xfs_da3_root_split(
605 605
606 leaf = (xfs_dir2_leaf_t *)oldroot; 606 leaf = (xfs_dir2_leaf_t *)oldroot;
607 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); 607 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf);
608 ents = xfs_dir3_leaf_ents_p(leaf); 608 ents = dp->d_ops->leaf_ents_p(leaf);
609 609
610 ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || 610 ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC ||
611 leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); 611 leafhdr.magic == XFS_DIR3_LEAFN_MAGIC);
@@ -1319,7 +1319,8 @@ xfs_da3_fixhashpath(
1319 return; 1319 return;
1320 break; 1320 break;
1321 case XFS_DIR2_LEAFN_MAGIC: 1321 case XFS_DIR2_LEAFN_MAGIC:
1322 lasthash = xfs_dir2_leafn_lasthash(blk->bp, &count); 1322 lasthash = xfs_dir2_leafn_lasthash(state->args->dp,
1323 blk->bp, &count);
1323 if (count == 0) 1324 if (count == 0)
1324 return; 1325 return;
1325 break; 1326 break;
@@ -1536,7 +1537,8 @@ xfs_da3_node_lookup_int(
1536 if (blk->magic == XFS_DIR2_LEAFN_MAGIC || 1537 if (blk->magic == XFS_DIR2_LEAFN_MAGIC ||
1537 blk->magic == XFS_DIR3_LEAFN_MAGIC) { 1538 blk->magic == XFS_DIR3_LEAFN_MAGIC) {
1538 blk->magic = XFS_DIR2_LEAFN_MAGIC; 1539 blk->magic = XFS_DIR2_LEAFN_MAGIC;
1539 blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, NULL); 1540 blk->hashval = xfs_dir2_leafn_lasthash(args->dp,
1541 blk->bp, NULL);
1540 break; 1542 break;
1541 } 1543 }
1542 1544
@@ -1702,7 +1704,7 @@ xfs_da3_blk_link(
1702 before = xfs_attr_leaf_order(old_blk->bp, new_blk->bp); 1704 before = xfs_attr_leaf_order(old_blk->bp, new_blk->bp);
1703 break; 1705 break;
1704 case XFS_DIR2_LEAFN_MAGIC: 1706 case XFS_DIR2_LEAFN_MAGIC:
1705 before = xfs_dir2_leafn_order(old_blk->bp, new_blk->bp); 1707 before = xfs_dir2_leafn_order(args->dp, old_blk->bp, new_blk->bp);
1706 break; 1708 break;
1707 case XFS_DA_NODE_MAGIC: 1709 case XFS_DA_NODE_MAGIC:
1708 before = xfs_da3_node_order(old_blk->bp, new_blk->bp); 1710 before = xfs_da3_node_order(old_blk->bp, new_blk->bp);
@@ -1947,16 +1949,15 @@ xfs_da3_path_shift(
1947 blk->magic = XFS_ATTR_LEAF_MAGIC; 1949 blk->magic = XFS_ATTR_LEAF_MAGIC;
1948 ASSERT(level == path->active-1); 1950 ASSERT(level == path->active-1);
1949 blk->index = 0; 1951 blk->index = 0;
1950 blk->hashval = xfs_attr_leaf_lasthash(blk->bp, 1952 blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL);
1951 NULL);
1952 break; 1953 break;
1953 case XFS_DIR2_LEAFN_MAGIC: 1954 case XFS_DIR2_LEAFN_MAGIC:
1954 case XFS_DIR3_LEAFN_MAGIC: 1955 case XFS_DIR3_LEAFN_MAGIC:
1955 blk->magic = XFS_DIR2_LEAFN_MAGIC; 1956 blk->magic = XFS_DIR2_LEAFN_MAGIC;
1956 ASSERT(level == path->active-1); 1957 ASSERT(level == path->active-1);
1957 blk->index = 0; 1958 blk->index = 0;
1958 blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, 1959 blk->hashval = xfs_dir2_leafn_lasthash(args->dp,
1959 NULL); 1960 blk->bp, NULL);
1960 break; 1961 break;
1961 default: 1962 default:
1962 ASSERT(0); 1963 ASSERT(0);
@@ -2223,7 +2224,7 @@ xfs_da3_swap_lastblock(
2223 2224
2224 dead_leaf2 = (xfs_dir2_leaf_t *)dead_info; 2225 dead_leaf2 = (xfs_dir2_leaf_t *)dead_info;
2225 xfs_dir3_leaf_hdr_from_disk(&leafhdr, dead_leaf2); 2226 xfs_dir3_leaf_hdr_from_disk(&leafhdr, dead_leaf2);
2226 ents = xfs_dir3_leaf_ents_p(dead_leaf2); 2227 ents = ip->d_ops->leaf_ents_p(dead_leaf2);
2227 dead_level = 0; 2228 dead_level = 0;
2228 dead_hash = be32_to_cpu(ents[leafhdr.count - 1].hashval); 2229 dead_hash = be32_to_cpu(ents[leafhdr.count - 1].hashval);
2229 } else { 2230 } else {
diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c
index 1e92a241fd52..ff8b50368c94 100644
--- a/fs/xfs/xfs_da_format.c
+++ b/fs/xfs/xfs_da_format.c
@@ -435,6 +435,48 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr)
435 ((char *)hdr + xfs_dir3_data_entry_offset()); 435 ((char *)hdr + xfs_dir3_data_entry_offset());
436} 436}
437 437
438
439/*
440 * Directory Leaf block operations
441 */
442static int
443xfs_dir2_leaf_hdr_size(void)
444{
445 return sizeof(struct xfs_dir2_leaf_hdr);
446}
447
448static int
449xfs_dir2_max_leaf_ents(struct xfs_mount *mp)
450{
451 return (mp->m_dirblksize - xfs_dir2_leaf_hdr_size()) /
452 (uint)sizeof(struct xfs_dir2_leaf_entry);
453}
454
455static struct xfs_dir2_leaf_entry *
456xfs_dir2_leaf_ents_p(struct xfs_dir2_leaf *lp)
457{
458 return lp->__ents;
459}
460
461static int
462xfs_dir3_leaf_hdr_size(void)
463{
464 return sizeof(struct xfs_dir3_leaf_hdr);
465}
466
467static inline int
468xfs_dir3_max_leaf_ents(struct xfs_mount *mp)
469{
470 return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size()) /
471 (uint)sizeof(struct xfs_dir2_leaf_entry);
472}
473
474static inline struct xfs_dir2_leaf_entry *
475xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp)
476{
477 return ((struct xfs_dir3_leaf *)lp)->__ents;
478}
479
438const struct xfs_dir_ops xfs_dir2_ops = { 480const struct xfs_dir_ops xfs_dir2_ops = {
439 .sf_entsize = xfs_dir2_sf_entsize, 481 .sf_entsize = xfs_dir2_sf_entsize,
440 .sf_nextentry = xfs_dir2_sf_nextentry, 482 .sf_nextentry = xfs_dir2_sf_nextentry,
@@ -462,6 +504,10 @@ const struct xfs_dir_ops xfs_dir2_ops = {
462 .data_entry_p = xfs_dir2_data_entry_p, 504 .data_entry_p = xfs_dir2_data_entry_p,
463 .data_unused_p = xfs_dir2_data_unused_p, 505 .data_unused_p = xfs_dir2_data_unused_p,
464 506
507 .leaf_hdr_size = xfs_dir2_leaf_hdr_size,
508 .leaf_max_ents = xfs_dir2_max_leaf_ents,
509 .leaf_ents_p = xfs_dir2_leaf_ents_p,
510
465}; 511};
466 512
467const struct xfs_dir_ops xfs_dir2_ftype_ops = { 513const struct xfs_dir_ops xfs_dir2_ftype_ops = {
@@ -490,6 +536,10 @@ const struct xfs_dir_ops xfs_dir2_ftype_ops = {
490 .data_first_entry_p = xfs_dir2_data_first_entry_p, 536 .data_first_entry_p = xfs_dir2_data_first_entry_p,
491 .data_entry_p = xfs_dir2_data_entry_p, 537 .data_entry_p = xfs_dir2_data_entry_p,
492 .data_unused_p = xfs_dir2_data_unused_p, 538 .data_unused_p = xfs_dir2_data_unused_p,
539
540 .leaf_hdr_size = xfs_dir2_leaf_hdr_size,
541 .leaf_max_ents = xfs_dir2_max_leaf_ents,
542 .leaf_ents_p = xfs_dir2_leaf_ents_p,
493}; 543};
494 544
495const struct xfs_dir_ops xfs_dir3_ops = { 545const struct xfs_dir_ops xfs_dir3_ops = {
@@ -518,4 +568,29 @@ const struct xfs_dir_ops xfs_dir3_ops = {
518 .data_first_entry_p = xfs_dir3_data_first_entry_p, 568 .data_first_entry_p = xfs_dir3_data_first_entry_p,
519 .data_entry_p = xfs_dir3_data_entry_p, 569 .data_entry_p = xfs_dir3_data_entry_p,
520 .data_unused_p = xfs_dir3_data_unused_p, 570 .data_unused_p = xfs_dir3_data_unused_p,
571
572 .leaf_hdr_size = xfs_dir3_leaf_hdr_size,
573 .leaf_max_ents = xfs_dir3_max_leaf_ents,
574 .leaf_ents_p = xfs_dir3_leaf_ents_p,
521}; 575};
576
577/*
578 * Return the ops structure according to the current config. If we are passed
579 * an inode, then that overrides the default config we use which is based on
580 * feature bits.
581 */
582const struct xfs_dir_ops *
583xfs_dir_get_ops(
584 struct xfs_mount *mp,
585 struct xfs_inode *dp)
586{
587 if (dp)
588 return dp->d_ops;
589 if (mp->m_dir_inode_ops)
590 return mp->m_dir_inode_ops;
591 if (xfs_sb_version_hascrc(&mp->m_sb))
592 return &xfs_dir3_ops;
593 if (xfs_sb_version_hasftype(&mp->m_sb))
594 return &xfs_dir2_ftype_ops;
595 return &xfs_dir2_ops;
596}
diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h
index aeca0038a013..0a567e25cf59 100644
--- a/fs/xfs/xfs_da_format.h
+++ b/fs/xfs/xfs_da_format.h
@@ -551,36 +551,6 @@ struct xfs_dir3_leaf {
551extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, 551extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to,
552 struct xfs_dir2_leaf *from); 552 struct xfs_dir2_leaf *from);
553 553
554static inline int
555xfs_dir3_leaf_hdr_size(struct xfs_dir2_leaf *lp)
556{
557 if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) ||
558 lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC))
559 return sizeof(struct xfs_dir3_leaf_hdr);
560 return sizeof(struct xfs_dir2_leaf_hdr);
561}
562
563static inline int
564xfs_dir3_max_leaf_ents(struct xfs_mount *mp, struct xfs_dir2_leaf *lp)
565{
566 return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size(lp)) /
567 (uint)sizeof(struct xfs_dir2_leaf_entry);
568}
569
570/*
571 * Get address of the bestcount field in the single-leaf block.
572 */
573static inline struct xfs_dir2_leaf_entry *
574xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp)
575{
576 if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) ||
577 lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) {
578 struct xfs_dir3_leaf *lp3 = (struct xfs_dir3_leaf *)lp;
579 return lp3->__ents;
580 }
581 return lp->__ents;
582}
583
584/* 554/*
585 * Get address of the bestcount field in the single-leaf block. 555 * Get address of the bestcount field in the single-leaf block.
586 */ 556 */
diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c
index 7911136453cd..2b98a33ca383 100644
--- a/fs/xfs/xfs_dir2.c
+++ b/fs/xfs/xfs_dir2.c
@@ -113,12 +113,7 @@ xfs_dir_mount(
113 else 113 else
114 mp->m_dirnameops = &xfs_default_nameops; 114 mp->m_dirnameops = &xfs_default_nameops;
115 115
116 if (xfs_sb_version_hascrc(&mp->m_sb)) 116 mp->m_dir_inode_ops = xfs_dir_get_ops(mp, NULL);
117 mp->m_dir_inode_ops = &xfs_dir3_ops;
118 else if (xfs_sb_version_hasftype(&mp->m_sb))
119 mp->m_dir_inode_ops = &xfs_dir2_ftype_ops;
120 else
121 mp->m_dir_inode_ops = &xfs_dir2_ops;
122} 117}
123 118
124/* 119/*
diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h
index 076010a1376a..9ba9db731990 100644
--- a/fs/xfs/xfs_dir2.h
+++ b/fs/xfs/xfs_dir2.h
@@ -74,11 +74,15 @@ struct xfs_dir_ops {
74 (*data_entry_p)(struct xfs_dir2_data_hdr *hdr); 74 (*data_entry_p)(struct xfs_dir2_data_hdr *hdr);
75 struct xfs_dir2_data_unused * 75 struct xfs_dir2_data_unused *
76 (*data_unused_p)(struct xfs_dir2_data_hdr *hdr); 76 (*data_unused_p)(struct xfs_dir2_data_hdr *hdr);
77
78 int (*leaf_hdr_size)(void);
79 int (*leaf_max_ents)(struct xfs_mount *mp);
80 struct xfs_dir2_leaf_entry *
81 (*leaf_ents_p)(struct xfs_dir2_leaf *lp);
77}; 82};
78 83
79extern const struct xfs_dir_ops xfs_dir2_ops; 84extern const struct xfs_dir_ops *
80extern const struct xfs_dir_ops xfs_dir2_ftype_ops; 85 xfs_dir_get_ops(struct xfs_mount *mp, struct xfs_inode *dp);
81extern const struct xfs_dir_ops xfs_dir3_ops;
82 86
83/* 87/*
84 * Generic directory interface routines 88 * Generic directory interface routines
diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c
index f92ca5699342..75f815786b97 100644
--- a/fs/xfs/xfs_dir2_block.c
+++ b/fs/xfs/xfs_dir2_block.c
@@ -937,7 +937,7 @@ xfs_dir2_leaf_to_block(
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 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf);
940 ents = xfs_dir3_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
943 ASSERT(leafhdr.magic == XFS_DIR2_LEAF1_MAGIC || 943 ASSERT(leafhdr.magic == XFS_DIR2_LEAF1_MAGIC ||
diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c
index 13fa0d6b4ff7..32d657fbe6a4 100644
--- a/fs/xfs/xfs_dir2_data.c
+++ b/fs/xfs/xfs_dir2_data.c
@@ -68,17 +68,10 @@ __xfs_dir3_data_check(
68 hdr = bp->b_addr; 68 hdr = bp->b_addr;
69 69
70 /* 70 /*
71 * We can be passed a null dp here from a verifier, so manually 71 * We can be passed a null dp here from a verifier, so we need to go the
72 * configure the ops here in that case. 72 * hard way to get them.
73 */ 73 */
74 if (dp) 74 ops = xfs_dir_get_ops(mp, dp);
75 ops = dp->d_ops;
76 else if (xfs_sb_version_hascrc(&mp->m_sb))
77 ops = &xfs_dir3_ops;
78 else if (xfs_sb_version_hasftype(&mp->m_sb))
79 ops = &xfs_dir2_ftype_ops;
80 else
81 ops = &xfs_dir2_ops;
82 75
83 switch (hdr->magic) { 76 switch (hdr->magic) {
84 case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC): 77 case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC):
diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c
index f35b3942c1a6..16fdc0e627a7 100644
--- a/fs/xfs/xfs_dir2_leaf.c
+++ b/fs/xfs/xfs_dir2_leaf.c
@@ -50,15 +50,15 @@ static void xfs_dir3_leaf_log_tail(struct xfs_trans *tp, struct xfs_buf *bp);
50 * Pop an assert if something is wrong. 50 * Pop an assert if something is wrong.
51 */ 51 */
52#ifdef DEBUG 52#ifdef DEBUG
53#define xfs_dir3_leaf_check(mp, bp) \ 53#define xfs_dir3_leaf_check(dp, bp) \
54do { \ 54do { \
55 if (!xfs_dir3_leaf1_check((mp), (bp))) \ 55 if (!xfs_dir3_leaf1_check((dp), (bp))) \
56 ASSERT(0); \ 56 ASSERT(0); \
57} while (0); 57} while (0);
58 58
59STATIC bool 59STATIC bool
60xfs_dir3_leaf1_check( 60xfs_dir3_leaf1_check(
61 struct xfs_mount *mp, 61 struct xfs_inode *dp,
62 struct xfs_buf *bp) 62 struct xfs_buf *bp)
63{ 63{
64 struct xfs_dir2_leaf *leaf = bp->b_addr; 64 struct xfs_dir2_leaf *leaf = bp->b_addr;
@@ -73,10 +73,10 @@ xfs_dir3_leaf1_check(
73 } else if (leafhdr.magic != XFS_DIR2_LEAF1_MAGIC) 73 } else if (leafhdr.magic != XFS_DIR2_LEAF1_MAGIC)
74 return false; 74 return false;
75 75
76 return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); 76 return xfs_dir3_leaf_check_int(dp->i_mount, dp, &leafhdr, leaf);
77} 77}
78#else 78#else
79#define xfs_dir3_leaf_check(mp, bp) 79#define xfs_dir3_leaf_check(dp, bp)
80#endif 80#endif
81 81
82void 82void
@@ -138,6 +138,7 @@ xfs_dir3_leaf_hdr_to_disk(
138bool 138bool
139xfs_dir3_leaf_check_int( 139xfs_dir3_leaf_check_int(
140 struct xfs_mount *mp, 140 struct xfs_mount *mp,
141 struct xfs_inode *dp,
141 struct xfs_dir3_icleaf_hdr *hdr, 142 struct xfs_dir3_icleaf_hdr *hdr,
142 struct xfs_dir2_leaf *leaf) 143 struct xfs_dir2_leaf *leaf)
143{ 144{
@@ -145,8 +146,15 @@ xfs_dir3_leaf_check_int(
145 xfs_dir2_leaf_tail_t *ltp; 146 xfs_dir2_leaf_tail_t *ltp;
146 int stale; 147 int stale;
147 int i; 148 int i;
149 const struct xfs_dir_ops *ops;
148 150
149 ents = xfs_dir3_leaf_ents_p(leaf); 151 /*
152 * we can be passed a null dp here from a verifier, so we need to go the
153 * hard way to get them.
154 */
155 ops = xfs_dir_get_ops(mp, dp);
156
157 ents = ops->leaf_ents_p(leaf);
150 ltp = xfs_dir2_leaf_tail_p(mp, leaf); 158 ltp = xfs_dir2_leaf_tail_p(mp, leaf);
151 159
152 /* 160 /*
@@ -154,7 +162,7 @@ xfs_dir3_leaf_check_int(
154 * Should factor in the size of the bests table as well. 162 * Should factor in the size of the bests table as well.
155 * We can deduce a value for that from di_size. 163 * We can deduce a value for that from di_size.
156 */ 164 */
157 if (hdr->count > xfs_dir3_max_leaf_ents(mp, leaf)) 165 if (hdr->count > ops->leaf_max_ents(mp))
158 return false; 166 return false;
159 167
160 /* Leaves and bests don't overlap in leaf format. */ 168 /* Leaves and bests don't overlap in leaf format. */
@@ -213,7 +221,7 @@ xfs_dir3_leaf_verify(
213 } 221 }
214 222
215 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); 223 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf);
216 return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); 224 return xfs_dir3_leaf_check_int(mp, NULL, &leafhdr, leaf);
217} 225}
218 226
219static void 227static void
@@ -399,7 +407,7 @@ xfs_dir3_leaf_get_buf(
399 return error; 407 return error;
400 408
401 xfs_dir3_leaf_init(mp, tp, bp, dp->i_ino, magic); 409 xfs_dir3_leaf_init(mp, tp, bp, dp->i_ino, magic);
402 xfs_dir3_leaf_log_header(tp, bp); 410 xfs_dir3_leaf_log_header(tp, dp, bp);
403 if (magic == XFS_DIR2_LEAF1_MAGIC) 411 if (magic == XFS_DIR2_LEAF1_MAGIC)
404 xfs_dir3_leaf_log_tail(tp, bp); 412 xfs_dir3_leaf_log_tail(tp, bp);
405 *bpp = bp; 413 *bpp = bp;
@@ -461,7 +469,7 @@ xfs_dir2_block_to_leaf(
461 btp = xfs_dir2_block_tail_p(mp, hdr); 469 btp = xfs_dir2_block_tail_p(mp, hdr);
462 blp = xfs_dir2_block_leaf_p(btp); 470 blp = xfs_dir2_block_leaf_p(btp);
463 bf = dp->d_ops->data_bestfree_p(hdr); 471 bf = dp->d_ops->data_bestfree_p(hdr);
464 ents = xfs_dir3_leaf_ents_p(leaf); 472 ents = dp->d_ops->leaf_ents_p(leaf);
465 473
466 /* 474 /*
467 * Set the counts in the leaf header. 475 * Set the counts in the leaf header.
@@ -470,14 +478,14 @@ xfs_dir2_block_to_leaf(
470 leafhdr.count = be32_to_cpu(btp->count); 478 leafhdr.count = be32_to_cpu(btp->count);
471 leafhdr.stale = be32_to_cpu(btp->stale); 479 leafhdr.stale = be32_to_cpu(btp->stale);
472 xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); 480 xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr);
473 xfs_dir3_leaf_log_header(tp, lbp); 481 xfs_dir3_leaf_log_header(tp, dp, lbp);
474 482
475 /* 483 /*
476 * Could compact these but I think we always do the conversion 484 * Could compact these but I think we always do the conversion
477 * after squeezing out stale entries. 485 * after squeezing out stale entries.
478 */ 486 */
479 memcpy(ents, blp, be32_to_cpu(btp->count) * sizeof(xfs_dir2_leaf_entry_t)); 487 memcpy(ents, blp, be32_to_cpu(btp->count) * sizeof(xfs_dir2_leaf_entry_t));
480 xfs_dir3_leaf_log_ents(tp, lbp, 0, leafhdr.count - 1); 488 xfs_dir3_leaf_log_ents(tp, dp, lbp, 0, leafhdr.count - 1);
481 needscan = 0; 489 needscan = 0;
482 needlog = 1; 490 needlog = 1;
483 /* 491 /*
@@ -513,7 +521,7 @@ xfs_dir2_block_to_leaf(
513 */ 521 */
514 if (needlog) 522 if (needlog)
515 xfs_dir2_data_log_header(tp, dp, dbp); 523 xfs_dir2_data_log_header(tp, dp, dbp);
516 xfs_dir3_leaf_check(mp, lbp); 524 xfs_dir3_leaf_check(dp, lbp);
517 xfs_dir3_data_check(dp, dbp); 525 xfs_dir3_data_check(dp, dbp);
518 xfs_dir3_leaf_log_bests(tp, lbp, 0, 0); 526 xfs_dir3_leaf_log_bests(tp, lbp, 0, 0);
519 return 0; 527 return 0;
@@ -697,7 +705,7 @@ xfs_dir2_leaf_addname(
697 index = xfs_dir2_leaf_search_hash(args, lbp); 705 index = xfs_dir2_leaf_search_hash(args, lbp);
698 leaf = lbp->b_addr; 706 leaf = lbp->b_addr;
699 ltp = xfs_dir2_leaf_tail_p(mp, leaf); 707 ltp = xfs_dir2_leaf_tail_p(mp, leaf);
700 ents = xfs_dir3_leaf_ents_p(leaf); 708 ents = dp->d_ops->leaf_ents_p(leaf);
701 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); 709 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf);
702 bestsp = xfs_dir2_leaf_bests_p(ltp); 710 bestsp = xfs_dir2_leaf_bests_p(ltp);
703 length = dp->d_ops->data_entsize(args->namelen); 711 length = dp->d_ops->data_entsize(args->namelen);
@@ -938,9 +946,9 @@ xfs_dir2_leaf_addname(
938 * Log the leaf fields and give up the buffers. 946 * Log the leaf fields and give up the buffers.
939 */ 947 */
940 xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); 948 xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr);
941 xfs_dir3_leaf_log_header(tp, lbp); 949 xfs_dir3_leaf_log_header(tp, dp, lbp);
942 xfs_dir3_leaf_log_ents(tp, lbp, lfloglow, lfloghigh); 950 xfs_dir3_leaf_log_ents(tp, dp, lbp, lfloglow, lfloghigh);
943 xfs_dir3_leaf_check(mp, lbp); 951 xfs_dir3_leaf_check(dp, lbp);
944 xfs_dir3_data_check(dp, dbp); 952 xfs_dir3_data_check(dp, dbp);
945 return 0; 953 return 0;
946} 954}
@@ -968,7 +976,7 @@ xfs_dir3_leaf_compact(
968 /* 976 /*
969 * Compress out the stale entries in place. 977 * Compress out the stale entries in place.
970 */ 978 */
971 ents = xfs_dir3_leaf_ents_p(leaf); 979 ents = args->dp->d_ops->leaf_ents_p(leaf);
972 for (from = to = 0, loglow = -1; from < leafhdr->count; from++) { 980 for (from = to = 0, loglow = -1; from < leafhdr->count; from++) {
973 if (ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) 981 if (ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR))
974 continue; 982 continue;
@@ -990,9 +998,10 @@ xfs_dir3_leaf_compact(
990 leafhdr->stale = 0; 998 leafhdr->stale = 0;
991 999
992 xfs_dir3_leaf_hdr_to_disk(leaf, leafhdr); 1000 xfs_dir3_leaf_hdr_to_disk(leaf, leafhdr);
993 xfs_dir3_leaf_log_header(args->trans, bp); 1001 xfs_dir3_leaf_log_header(args->trans, args->dp, bp);
994 if (loglow != -1) 1002 if (loglow != -1)
995 xfs_dir3_leaf_log_ents(args->trans, bp, loglow, to - 1); 1003 xfs_dir3_leaf_log_ents(args->trans, args->dp, bp,
1004 loglow, to - 1);
996} 1005}
997 1006
998/* 1007/*
@@ -1119,10 +1128,11 @@ xfs_dir3_leaf_log_bests(
1119 */ 1128 */
1120void 1129void
1121xfs_dir3_leaf_log_ents( 1130xfs_dir3_leaf_log_ents(
1122 xfs_trans_t *tp, /* transaction pointer */ 1131 struct xfs_trans *tp,
1123 struct xfs_buf *bp, /* leaf buffer */ 1132 struct xfs_inode *dp,
1124 int first, /* first entry to log */ 1133 struct xfs_buf *bp,
1125 int last) /* last entry to log */ 1134 int first,
1135 int last)
1126{ 1136{
1127 xfs_dir2_leaf_entry_t *firstlep; /* pointer to first entry */ 1137 xfs_dir2_leaf_entry_t *firstlep; /* pointer to first entry */
1128 xfs_dir2_leaf_entry_t *lastlep; /* pointer to last entry */ 1138 xfs_dir2_leaf_entry_t *lastlep; /* pointer to last entry */
@@ -1134,7 +1144,7 @@ xfs_dir3_leaf_log_ents(
1134 leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || 1144 leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
1135 leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); 1145 leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC));
1136 1146
1137 ents = xfs_dir3_leaf_ents_p(leaf); 1147 ents = dp->d_ops->leaf_ents_p(leaf);
1138 firstlep = &ents[first]; 1148 firstlep = &ents[first];
1139 lastlep = &ents[last]; 1149 lastlep = &ents[last];
1140 xfs_trans_log_buf(tp, bp, (uint)((char *)firstlep - (char *)leaf), 1150 xfs_trans_log_buf(tp, bp, (uint)((char *)firstlep - (char *)leaf),
@@ -1147,6 +1157,7 @@ xfs_dir3_leaf_log_ents(
1147void 1157void
1148xfs_dir3_leaf_log_header( 1158xfs_dir3_leaf_log_header(
1149 struct xfs_trans *tp, 1159 struct xfs_trans *tp,
1160 struct xfs_inode *dp,
1150 struct xfs_buf *bp) 1161 struct xfs_buf *bp)
1151{ 1162{
1152 struct xfs_dir2_leaf *leaf = bp->b_addr; 1163 struct xfs_dir2_leaf *leaf = bp->b_addr;
@@ -1157,7 +1168,7 @@ xfs_dir3_leaf_log_header(
1157 leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); 1168 leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC));
1158 1169
1159 xfs_trans_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), 1170 xfs_trans_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf),
1160 xfs_dir3_leaf_hdr_size(leaf) - 1); 1171 dp->d_ops->leaf_hdr_size() - 1);
1161} 1172}
1162 1173
1163/* 1174/*
@@ -1212,9 +1223,9 @@ xfs_dir2_leaf_lookup(
1212 } 1223 }
1213 tp = args->trans; 1224 tp = args->trans;
1214 dp = args->dp; 1225 dp = args->dp;
1215 xfs_dir3_leaf_check(dp->i_mount, lbp); 1226 xfs_dir3_leaf_check(dp, lbp);
1216 leaf = lbp->b_addr; 1227 leaf = lbp->b_addr;
1217 ents = xfs_dir3_leaf_ents_p(leaf); 1228 ents = dp->d_ops->leaf_ents_p(leaf);
1218 /* 1229 /*
1219 * Get to the leaf entry and contained data entry address. 1230 * Get to the leaf entry and contained data entry address.
1220 */ 1231 */
@@ -1277,8 +1288,8 @@ xfs_dir2_leaf_lookup_int(
1277 1288
1278 *lbpp = lbp; 1289 *lbpp = lbp;
1279 leaf = lbp->b_addr; 1290 leaf = lbp->b_addr;
1280 xfs_dir3_leaf_check(mp, lbp); 1291 xfs_dir3_leaf_check(dp, lbp);
1281 ents = xfs_dir3_leaf_ents_p(leaf); 1292 ents = dp->d_ops->leaf_ents_p(leaf);
1282 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); 1293 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf);
1283 1294
1284 /* 1295 /*
@@ -1415,7 +1426,7 @@ xfs_dir2_leaf_removename(
1415 xfs_dir3_data_check(dp, dbp); 1426 xfs_dir3_data_check(dp, dbp);
1416 bf = dp->d_ops->data_bestfree_p(hdr); 1427 bf = dp->d_ops->data_bestfree_p(hdr);
1417 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); 1428 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf);
1418 ents = xfs_dir3_leaf_ents_p(leaf); 1429 ents = dp->d_ops->leaf_ents_p(leaf);
1419 /* 1430 /*
1420 * Point to the leaf entry, use that to point to the data entry. 1431 * Point to the leaf entry, use that to point to the data entry.
1421 */ 1432 */
@@ -1439,10 +1450,10 @@ xfs_dir2_leaf_removename(
1439 */ 1450 */
1440 leafhdr.stale++; 1451 leafhdr.stale++;
1441 xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); 1452 xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr);
1442 xfs_dir3_leaf_log_header(tp, lbp); 1453 xfs_dir3_leaf_log_header(tp, dp, lbp);
1443 1454
1444 lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); 1455 lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR);
1445 xfs_dir3_leaf_log_ents(tp, lbp, index, index); 1456 xfs_dir3_leaf_log_ents(tp, dp, lbp, index, index);
1446 1457
1447 /* 1458 /*
1448 * Scan the freespace in the data block again if necessary, 1459 * Scan the freespace in the data block again if necessary,
@@ -1476,7 +1487,7 @@ xfs_dir2_leaf_removename(
1476 */ 1487 */
1477 if (error == ENOSPC && args->total == 0) 1488 if (error == ENOSPC && args->total == 0)
1478 error = 0; 1489 error = 0;
1479 xfs_dir3_leaf_check(mp, lbp); 1490 xfs_dir3_leaf_check(dp, lbp);
1480 return error; 1491 return error;
1481 } 1492 }
1482 dbp = NULL; 1493 dbp = NULL;
@@ -1510,7 +1521,7 @@ xfs_dir2_leaf_removename(
1510 else if (db != mp->m_dirdatablk) 1521 else if (db != mp->m_dirdatablk)
1511 dbp = NULL; 1522 dbp = NULL;
1512 1523
1513 xfs_dir3_leaf_check(mp, lbp); 1524 xfs_dir3_leaf_check(dp, lbp);
1514 /* 1525 /*
1515 * See if we can convert to block form. 1526 * See if we can convert to block form.
1516 */ 1527 */
@@ -1545,7 +1556,7 @@ xfs_dir2_leaf_replace(
1545 } 1556 }
1546 dp = args->dp; 1557 dp = args->dp;
1547 leaf = lbp->b_addr; 1558 leaf = lbp->b_addr;
1548 ents = xfs_dir3_leaf_ents_p(leaf); 1559 ents = dp->d_ops->leaf_ents_p(leaf);
1549 /* 1560 /*
1550 * Point to the leaf entry, get data address from it. 1561 * Point to the leaf entry, get data address from it.
1551 */ 1562 */
@@ -1564,7 +1575,7 @@ xfs_dir2_leaf_replace(
1564 dp->d_ops->data_put_ftype(dep, args->filetype); 1575 dp->d_ops->data_put_ftype(dep, args->filetype);
1565 tp = args->trans; 1576 tp = args->trans;
1566 xfs_dir2_data_log_entry(tp, dp, dbp, dep); 1577 xfs_dir2_data_log_entry(tp, dp, dbp, dep);
1567 xfs_dir3_leaf_check(dp->i_mount, lbp); 1578 xfs_dir3_leaf_check(dp, lbp);
1568 xfs_trans_brelse(tp, lbp); 1579 xfs_trans_brelse(tp, lbp);
1569 return 0; 1580 return 0;
1570} 1581}
@@ -1590,7 +1601,7 @@ xfs_dir2_leaf_search_hash(
1590 struct xfs_dir3_icleaf_hdr leafhdr; 1601 struct xfs_dir3_icleaf_hdr leafhdr;
1591 1602
1592 leaf = lbp->b_addr; 1603 leaf = lbp->b_addr;
1593 ents = xfs_dir3_leaf_ents_p(leaf); 1604 ents = args->dp->d_ops->leaf_ents_p(leaf);
1594 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); 1605 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf);
1595 1606
1596 /* 1607 /*
@@ -1830,10 +1841,10 @@ xfs_dir2_node_to_leaf(
1830 freehdr.nvalid * sizeof(xfs_dir2_data_off_t)); 1841 freehdr.nvalid * sizeof(xfs_dir2_data_off_t));
1831 1842
1832 xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); 1843 xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr);
1833 xfs_dir3_leaf_log_header(tp, lbp); 1844 xfs_dir3_leaf_log_header(tp, dp, lbp);
1834 xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); 1845 xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1);
1835 xfs_dir3_leaf_log_tail(tp, lbp); 1846 xfs_dir3_leaf_log_tail(tp, lbp);
1836 xfs_dir3_leaf_check(mp, lbp); 1847 xfs_dir3_leaf_check(dp, lbp);
1837 1848
1838 /* 1849 /*
1839 * Get rid of the freespace block. 1850 * Get rid of the freespace block.
diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c
index 9cfc00323b19..3a426ed9b16e 100644
--- a/fs/xfs/xfs_dir2_node.c
+++ b/fs/xfs/xfs_dir2_node.c
@@ -54,15 +54,15 @@ static int xfs_dir2_node_addname_int(xfs_da_args_t *args,
54 * Check internal consistency of a leafn block. 54 * Check internal consistency of a leafn block.
55 */ 55 */
56#ifdef DEBUG 56#ifdef DEBUG
57#define xfs_dir3_leaf_check(mp, bp) \ 57#define xfs_dir3_leaf_check(dp, bp) \
58do { \ 58do { \
59 if (!xfs_dir3_leafn_check((mp), (bp))) \ 59 if (!xfs_dir3_leafn_check((dp), (bp))) \
60 ASSERT(0); \ 60 ASSERT(0); \
61} while (0); 61} while (0);
62 62
63static bool 63static bool
64xfs_dir3_leafn_check( 64xfs_dir3_leafn_check(
65 struct xfs_mount *mp, 65 struct xfs_inode *dp,
66 struct xfs_buf *bp) 66 struct xfs_buf *bp)
67{ 67{
68 struct xfs_dir2_leaf *leaf = bp->b_addr; 68 struct xfs_dir2_leaf *leaf = bp->b_addr;
@@ -77,10 +77,10 @@ xfs_dir3_leafn_check(
77 } else if (leafhdr.magic != XFS_DIR2_LEAFN_MAGIC) 77 } else if (leafhdr.magic != XFS_DIR2_LEAFN_MAGIC)
78 return false; 78 return false;
79 79
80 return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); 80 return xfs_dir3_leaf_check_int(dp->i_mount, dp, &leafhdr, leaf);
81} 81}
82#else 82#else
83#define xfs_dir3_leaf_check(mp, bp) 83#define xfs_dir3_leaf_check(dp, bp)
84#endif 84#endif
85 85
86static bool 86static bool
@@ -408,8 +408,8 @@ xfs_dir2_leaf_to_node(
408 leaf->hdr.info.magic = cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); 408 leaf->hdr.info.magic = cpu_to_be16(XFS_DIR3_LEAFN_MAGIC);
409 lbp->b_ops = &xfs_dir3_leafn_buf_ops; 409 lbp->b_ops = &xfs_dir3_leafn_buf_ops;
410 xfs_trans_buf_set_type(tp, lbp, XFS_BLFT_DIR_LEAFN_BUF); 410 xfs_trans_buf_set_type(tp, lbp, XFS_BLFT_DIR_LEAFN_BUF);
411 xfs_dir3_leaf_log_header(tp, lbp); 411 xfs_dir3_leaf_log_header(tp, dp, lbp);
412 xfs_dir3_leaf_check(mp, lbp); 412 xfs_dir3_leaf_check(dp, lbp);
413 return 0; 413 return 0;
414} 414}
415 415
@@ -443,7 +443,7 @@ xfs_dir2_leafn_add(
443 tp = args->trans; 443 tp = args->trans;
444 leaf = bp->b_addr; 444 leaf = bp->b_addr;
445 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); 445 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf);
446 ents = xfs_dir3_leaf_ents_p(leaf); 446 ents = dp->d_ops->leaf_ents_p(leaf);
447 447
448 /* 448 /*
449 * Quick check just to make sure we are not going to index 449 * Quick check just to make sure we are not going to index
@@ -459,7 +459,7 @@ xfs_dir2_leafn_add(
459 * a compact. 459 * a compact.
460 */ 460 */
461 461
462 if (leafhdr.count == xfs_dir3_max_leaf_ents(mp, leaf)) { 462 if (leafhdr.count == dp->d_ops->leaf_max_ents(mp)) {
463 if (!leafhdr.stale) 463 if (!leafhdr.stale)
464 return XFS_ERROR(ENOSPC); 464 return XFS_ERROR(ENOSPC);
465 compact = leafhdr.stale > 1; 465 compact = leafhdr.stale > 1;
@@ -498,9 +498,9 @@ xfs_dir2_leafn_add(
498 args->blkno, args->index)); 498 args->blkno, args->index));
499 499
500 xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); 500 xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr);
501 xfs_dir3_leaf_log_header(tp, bp); 501 xfs_dir3_leaf_log_header(tp, dp, bp);
502 xfs_dir3_leaf_log_ents(tp, bp, lfloglow, lfloghigh); 502 xfs_dir3_leaf_log_ents(tp, dp, bp, lfloglow, lfloghigh);
503 xfs_dir3_leaf_check(mp, bp); 503 xfs_dir3_leaf_check(dp, bp);
504 return 0; 504 return 0;
505} 505}
506 506
@@ -529,6 +529,7 @@ xfs_dir2_free_hdr_check(
529 */ 529 */
530xfs_dahash_t /* hash value */ 530xfs_dahash_t /* hash value */
531xfs_dir2_leafn_lasthash( 531xfs_dir2_leafn_lasthash(
532 struct xfs_inode *dp,
532 struct xfs_buf *bp, /* leaf buffer */ 533 struct xfs_buf *bp, /* leaf buffer */
533 int *count) /* count of entries in leaf */ 534 int *count) /* count of entries in leaf */
534{ 535{
@@ -546,7 +547,7 @@ xfs_dir2_leafn_lasthash(
546 if (!leafhdr.count) 547 if (!leafhdr.count)
547 return 0; 548 return 0;
548 549
549 ents = xfs_dir3_leaf_ents_p(leaf); 550 ents = dp->d_ops->leaf_ents_p(leaf);
550 return be32_to_cpu(ents[leafhdr.count - 1].hashval); 551 return be32_to_cpu(ents[leafhdr.count - 1].hashval);
551} 552}
552 553
@@ -584,9 +585,9 @@ xfs_dir2_leafn_lookup_for_addname(
584 mp = dp->i_mount; 585 mp = dp->i_mount;
585 leaf = bp->b_addr; 586 leaf = bp->b_addr;
586 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); 587 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf);
587 ents = xfs_dir3_leaf_ents_p(leaf); 588 ents = dp->d_ops->leaf_ents_p(leaf);
588 589
589 xfs_dir3_leaf_check(mp, bp); 590 xfs_dir3_leaf_check(dp, bp);
590 ASSERT(leafhdr.count > 0); 591 ASSERT(leafhdr.count > 0);
591 592
592 /* 593 /*
@@ -734,9 +735,9 @@ xfs_dir2_leafn_lookup_for_entry(
734 mp = dp->i_mount; 735 mp = dp->i_mount;
735 leaf = bp->b_addr; 736 leaf = bp->b_addr;
736 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); 737 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf);
737 ents = xfs_dir3_leaf_ents_p(leaf); 738 ents = dp->d_ops->leaf_ents_p(leaf);
738 739
739 xfs_dir3_leaf_check(mp, bp); 740 xfs_dir3_leaf_check(dp, bp);
740 ASSERT(leafhdr.count > 0); 741 ASSERT(leafhdr.count > 0);
741 742
742 /* 743 /*
@@ -906,7 +907,7 @@ xfs_dir3_leafn_moveents(
906 if (start_d < dhdr->count) { 907 if (start_d < dhdr->count) {
907 memmove(&dents[start_d + count], &dents[start_d], 908 memmove(&dents[start_d + count], &dents[start_d],
908 (dhdr->count - start_d) * sizeof(xfs_dir2_leaf_entry_t)); 909 (dhdr->count - start_d) * sizeof(xfs_dir2_leaf_entry_t));
909 xfs_dir3_leaf_log_ents(tp, bp_d, start_d + count, 910 xfs_dir3_leaf_log_ents(tp, args->dp, bp_d, start_d + count,
910 count + dhdr->count - 1); 911 count + dhdr->count - 1);
911 } 912 }
912 /* 913 /*
@@ -928,7 +929,8 @@ xfs_dir3_leafn_moveents(
928 */ 929 */
929 memcpy(&dents[start_d], &sents[start_s], 930 memcpy(&dents[start_d], &sents[start_s],
930 count * sizeof(xfs_dir2_leaf_entry_t)); 931 count * sizeof(xfs_dir2_leaf_entry_t));
931 xfs_dir3_leaf_log_ents(tp, bp_d, start_d, start_d + count - 1); 932 xfs_dir3_leaf_log_ents(tp, args->dp, bp_d,
933 start_d, start_d + count - 1);
932 934
933 /* 935 /*
934 * If there are source entries after the ones we copied, 936 * If there are source entries after the ones we copied,
@@ -937,7 +939,8 @@ xfs_dir3_leafn_moveents(
937 if (start_s + count < shdr->count) { 939 if (start_s + count < shdr->count) {
938 memmove(&sents[start_s], &sents[start_s + count], 940 memmove(&sents[start_s], &sents[start_s + count],
939 count * sizeof(xfs_dir2_leaf_entry_t)); 941 count * sizeof(xfs_dir2_leaf_entry_t));
940 xfs_dir3_leaf_log_ents(tp, bp_s, start_s, start_s + count - 1); 942 xfs_dir3_leaf_log_ents(tp, args->dp, bp_s,
943 start_s, start_s + count - 1);
941 } 944 }
942 945
943 /* 946 /*
@@ -955,6 +958,7 @@ xfs_dir3_leafn_moveents(
955 */ 958 */
956int /* sort order */ 959int /* sort order */
957xfs_dir2_leafn_order( 960xfs_dir2_leafn_order(
961 struct xfs_inode *dp,
958 struct xfs_buf *leaf1_bp, /* leaf1 buffer */ 962 struct xfs_buf *leaf1_bp, /* leaf1 buffer */
959 struct xfs_buf *leaf2_bp) /* leaf2 buffer */ 963 struct xfs_buf *leaf2_bp) /* leaf2 buffer */
960{ 964{
@@ -967,8 +971,8 @@ xfs_dir2_leafn_order(
967 971
968 xfs_dir3_leaf_hdr_from_disk(&hdr1, leaf1); 972 xfs_dir3_leaf_hdr_from_disk(&hdr1, leaf1);
969 xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf2); 973 xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf2);
970 ents1 = xfs_dir3_leaf_ents_p(leaf1); 974 ents1 = dp->d_ops->leaf_ents_p(leaf1);
971 ents2 = xfs_dir3_leaf_ents_p(leaf2); 975 ents2 = dp->d_ops->leaf_ents_p(leaf2);
972 976
973 if (hdr1.count > 0 && hdr2.count > 0 && 977 if (hdr1.count > 0 && hdr2.count > 0 &&
974 (be32_to_cpu(ents2[0].hashval) < be32_to_cpu(ents1[0].hashval) || 978 (be32_to_cpu(ents2[0].hashval) < be32_to_cpu(ents1[0].hashval) ||
@@ -1006,12 +1010,13 @@ xfs_dir2_leafn_rebalance(
1006 struct xfs_dir2_leaf_entry *ents2; 1010 struct xfs_dir2_leaf_entry *ents2;
1007 struct xfs_dir3_icleaf_hdr hdr1; 1011 struct xfs_dir3_icleaf_hdr hdr1;
1008 struct xfs_dir3_icleaf_hdr hdr2; 1012 struct xfs_dir3_icleaf_hdr hdr2;
1013 struct xfs_inode *dp = state->args->dp;
1009 1014
1010 args = state->args; 1015 args = state->args;
1011 /* 1016 /*
1012 * If the block order is wrong, swap the arguments. 1017 * If the block order is wrong, swap the arguments.
1013 */ 1018 */
1014 if ((swap = xfs_dir2_leafn_order(blk1->bp, blk2->bp))) { 1019 if ((swap = xfs_dir2_leafn_order(dp, blk1->bp, blk2->bp))) {
1015 xfs_da_state_blk_t *tmp; /* temp for block swap */ 1020 xfs_da_state_blk_t *tmp; /* temp for block swap */
1016 1021
1017 tmp = blk1; 1022 tmp = blk1;
@@ -1022,8 +1027,8 @@ xfs_dir2_leafn_rebalance(
1022 leaf2 = blk2->bp->b_addr; 1027 leaf2 = blk2->bp->b_addr;
1023 xfs_dir3_leaf_hdr_from_disk(&hdr1, leaf1); 1028 xfs_dir3_leaf_hdr_from_disk(&hdr1, leaf1);
1024 xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf2); 1029 xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf2);
1025 ents1 = xfs_dir3_leaf_ents_p(leaf1); 1030 ents1 = dp->d_ops->leaf_ents_p(leaf1);
1026 ents2 = xfs_dir3_leaf_ents_p(leaf2); 1031 ents2 = dp->d_ops->leaf_ents_p(leaf2);
1027 1032
1028 oldsum = hdr1.count + hdr2.count; 1033 oldsum = hdr1.count + hdr2.count;
1029#if defined(DEBUG) || defined(XFS_WARN) 1034#if defined(DEBUG) || defined(XFS_WARN)
@@ -1071,11 +1076,11 @@ xfs_dir2_leafn_rebalance(
1071 /* log the changes made when moving the entries */ 1076 /* log the changes made when moving the entries */
1072 xfs_dir3_leaf_hdr_to_disk(leaf1, &hdr1); 1077 xfs_dir3_leaf_hdr_to_disk(leaf1, &hdr1);
1073 xfs_dir3_leaf_hdr_to_disk(leaf2, &hdr2); 1078 xfs_dir3_leaf_hdr_to_disk(leaf2, &hdr2);
1074 xfs_dir3_leaf_log_header(args->trans, blk1->bp); 1079 xfs_dir3_leaf_log_header(args->trans, dp, blk1->bp);
1075 xfs_dir3_leaf_log_header(args->trans, blk2->bp); 1080 xfs_dir3_leaf_log_header(args->trans, dp, blk2->bp);
1076 1081
1077 xfs_dir3_leaf_check(args->dp->i_mount, blk1->bp); 1082 xfs_dir3_leaf_check(dp, blk1->bp);
1078 xfs_dir3_leaf_check(args->dp->i_mount, blk2->bp); 1083 xfs_dir3_leaf_check(dp, blk2->bp);
1079 1084
1080 /* 1085 /*
1081 * Mark whether we're inserting into the old or new leaf. 1086 * Mark whether we're inserting into the old or new leaf.
@@ -1096,10 +1101,10 @@ xfs_dir2_leafn_rebalance(
1096 * Finally sanity check just to make sure we are not returning a 1101 * Finally sanity check just to make sure we are not returning a
1097 * negative index 1102 * negative index
1098 */ 1103 */
1099 if(blk2->index < 0) { 1104 if (blk2->index < 0) {
1100 state->inleaf = 1; 1105 state->inleaf = 1;
1101 blk2->index = 0; 1106 blk2->index = 0;
1102 xfs_alert(args->dp->i_mount, 1107 xfs_alert(dp->i_mount,
1103 "%s: picked the wrong leaf? reverting original leaf: blk1->index %d", 1108 "%s: picked the wrong leaf? reverting original leaf: blk1->index %d",
1104 __func__, blk1->index); 1109 __func__, blk1->index);
1105 } 1110 }
@@ -1222,7 +1227,7 @@ xfs_dir2_leafn_remove(
1222 mp = dp->i_mount; 1227 mp = dp->i_mount;
1223 leaf = bp->b_addr; 1228 leaf = bp->b_addr;
1224 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); 1229 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf);
1225 ents = xfs_dir3_leaf_ents_p(leaf); 1230 ents = dp->d_ops->leaf_ents_p(leaf);
1226 1231
1227 /* 1232 /*
1228 * Point to the entry we're removing. 1233 * Point to the entry we're removing.
@@ -1243,10 +1248,10 @@ xfs_dir2_leafn_remove(
1243 */ 1248 */
1244 leafhdr.stale++; 1249 leafhdr.stale++;
1245 xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); 1250 xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr);
1246 xfs_dir3_leaf_log_header(tp, bp); 1251 xfs_dir3_leaf_log_header(tp, dp, bp);
1247 1252
1248 lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); 1253 lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR);
1249 xfs_dir3_leaf_log_ents(tp, bp, index, index); 1254 xfs_dir3_leaf_log_ents(tp, dp, bp, index, index);
1250 1255
1251 /* 1256 /*
1252 * Make the data entry free. Keep track of the longest freespace 1257 * Make the data entry free. Keep track of the longest freespace
@@ -1335,12 +1340,12 @@ xfs_dir2_leafn_remove(
1335 return error; 1340 return error;
1336 } 1341 }
1337 1342
1338 xfs_dir3_leaf_check(mp, bp); 1343 xfs_dir3_leaf_check(dp, bp);
1339 /* 1344 /*
1340 * Return indication of whether this leaf block is empty enough 1345 * Return indication of whether this leaf block is empty enough
1341 * to justify trying to join it with a neighbor. 1346 * to justify trying to join it with a neighbor.
1342 */ 1347 */
1343 *rval = (xfs_dir3_leaf_hdr_size(leaf) + 1348 *rval = (dp->d_ops->leaf_hdr_size() +
1344 (uint)sizeof(ents[0]) * (leafhdr.count - leafhdr.stale)) < 1349 (uint)sizeof(ents[0]) * (leafhdr.count - leafhdr.stale)) <
1345 mp->m_dir_magicpct; 1350 mp->m_dir_magicpct;
1346 return 0; 1351 return 0;
@@ -1359,12 +1364,14 @@ xfs_dir2_leafn_split(
1359 xfs_dablk_t blkno; /* new leaf block number */ 1364 xfs_dablk_t blkno; /* new leaf block number */
1360 int error; /* error return value */ 1365 int error; /* error return value */
1361 xfs_mount_t *mp; /* filesystem mount point */ 1366 xfs_mount_t *mp; /* filesystem mount point */
1367 struct xfs_inode *dp;
1362 1368
1363 /* 1369 /*
1364 * Allocate space for a new leaf node. 1370 * Allocate space for a new leaf node.
1365 */ 1371 */
1366 args = state->args; 1372 args = state->args;
1367 mp = args->dp->i_mount; 1373 dp = args->dp;
1374 mp = dp->i_mount;
1368 ASSERT(args != NULL); 1375 ASSERT(args != NULL);
1369 ASSERT(oldblk->magic == XFS_DIR2_LEAFN_MAGIC); 1376 ASSERT(oldblk->magic == XFS_DIR2_LEAFN_MAGIC);
1370 error = xfs_da_grow_inode(args, &blkno); 1377 error = xfs_da_grow_inode(args, &blkno);
@@ -1400,10 +1407,10 @@ xfs_dir2_leafn_split(
1400 /* 1407 /*
1401 * Update last hashval in each block since we added the name. 1408 * Update last hashval in each block since we added the name.
1402 */ 1409 */
1403 oldblk->hashval = xfs_dir2_leafn_lasthash(oldblk->bp, NULL); 1410 oldblk->hashval = xfs_dir2_leafn_lasthash(dp, oldblk->bp, NULL);
1404 newblk->hashval = xfs_dir2_leafn_lasthash(newblk->bp, NULL); 1411 newblk->hashval = xfs_dir2_leafn_lasthash(dp, newblk->bp, NULL);
1405 xfs_dir3_leaf_check(mp, oldblk->bp); 1412 xfs_dir3_leaf_check(dp, oldblk->bp);
1406 xfs_dir3_leaf_check(mp, newblk->bp); 1413 xfs_dir3_leaf_check(dp, newblk->bp);
1407 return error; 1414 return error;
1408} 1415}
1409 1416
@@ -1433,6 +1440,7 @@ xfs_dir2_leafn_toosmall(
1433 int rval; /* result from path_shift */ 1440 int rval; /* result from path_shift */
1434 struct xfs_dir3_icleaf_hdr leafhdr; 1441 struct xfs_dir3_icleaf_hdr leafhdr;
1435 struct xfs_dir2_leaf_entry *ents; 1442 struct xfs_dir2_leaf_entry *ents;
1443 struct xfs_inode *dp = state->args->dp;
1436 1444
1437 /* 1445 /*
1438 * Check for the degenerate case of the block being over 50% full. 1446 * Check for the degenerate case of the block being over 50% full.
@@ -1442,11 +1450,11 @@ xfs_dir2_leafn_toosmall(
1442 blk = &state->path.blk[state->path.active - 1]; 1450 blk = &state->path.blk[state->path.active - 1];
1443 leaf = blk->bp->b_addr; 1451 leaf = blk->bp->b_addr;
1444 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); 1452 xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf);
1445 ents = xfs_dir3_leaf_ents_p(leaf); 1453 ents = dp->d_ops->leaf_ents_p(leaf);
1446 xfs_dir3_leaf_check(state->args->dp->i_mount, blk->bp); 1454 xfs_dir3_leaf_check(dp, blk->bp);
1447 1455
1448 count = leafhdr.count - leafhdr.stale; 1456 count = leafhdr.count - leafhdr.stale;
1449 bytes = xfs_dir3_leaf_hdr_size(leaf) + count * sizeof(ents[0]); 1457 bytes = dp->d_ops->leaf_hdr_size() + count * sizeof(ents[0]);
1450 if (bytes > (state->blocksize >> 1)) { 1458 if (bytes > (state->blocksize >> 1)) {
1451 /* 1459 /*
1452 * Blk over 50%, don't try to join. 1460 * Blk over 50%, don't try to join.
@@ -1491,7 +1499,7 @@ xfs_dir2_leafn_toosmall(
1491 /* 1499 /*
1492 * Read the sibling leaf block. 1500 * Read the sibling leaf block.
1493 */ 1501 */
1494 error = xfs_dir3_leafn_read(state->args->trans, state->args->dp, 1502 error = xfs_dir3_leafn_read(state->args->trans, dp,
1495 blkno, -1, &bp); 1503 blkno, -1, &bp);
1496 if (error) 1504 if (error)
1497 return error; 1505 return error;
@@ -1504,7 +1512,7 @@ xfs_dir2_leafn_toosmall(
1504 1512
1505 leaf = bp->b_addr; 1513 leaf = bp->b_addr;
1506 xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf); 1514 xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf);
1507 ents = xfs_dir3_leaf_ents_p(leaf); 1515 ents = dp->d_ops->leaf_ents_p(leaf);
1508 count += hdr2.count - hdr2.stale; 1516 count += hdr2.count - hdr2.stale;
1509 bytes -= count * sizeof(ents[0]); 1517 bytes -= count * sizeof(ents[0]);
1510 1518
@@ -1558,6 +1566,7 @@ xfs_dir2_leafn_unbalance(
1558 struct xfs_dir3_icleaf_hdr drophdr; 1566 struct xfs_dir3_icleaf_hdr drophdr;
1559 struct xfs_dir2_leaf_entry *sents; 1567 struct xfs_dir2_leaf_entry *sents;
1560 struct xfs_dir2_leaf_entry *dents; 1568 struct xfs_dir2_leaf_entry *dents;
1569 struct xfs_inode *dp = state->args->dp;
1561 1570
1562 args = state->args; 1571 args = state->args;
1563 ASSERT(drop_blk->magic == XFS_DIR2_LEAFN_MAGIC); 1572 ASSERT(drop_blk->magic == XFS_DIR2_LEAFN_MAGIC);
@@ -1567,8 +1576,8 @@ xfs_dir2_leafn_unbalance(
1567 1576
1568 xfs_dir3_leaf_hdr_from_disk(&savehdr, save_leaf); 1577 xfs_dir3_leaf_hdr_from_disk(&savehdr, save_leaf);
1569 xfs_dir3_leaf_hdr_from_disk(&drophdr, drop_leaf); 1578 xfs_dir3_leaf_hdr_from_disk(&drophdr, drop_leaf);
1570 sents = xfs_dir3_leaf_ents_p(save_leaf); 1579 sents = args->dp->d_ops->leaf_ents_p(save_leaf);
1571 dents = xfs_dir3_leaf_ents_p(drop_leaf); 1580 dents = args->dp->d_ops->leaf_ents_p(drop_leaf);
1572 1581
1573 /* 1582 /*
1574 * If there are any stale leaf entries, take this opportunity 1583 * If there are any stale leaf entries, take this opportunity
@@ -1583,7 +1592,7 @@ xfs_dir2_leafn_unbalance(
1583 * Move the entries from drop to the appropriate end of save. 1592 * Move the entries from drop to the appropriate end of save.
1584 */ 1593 */
1585 drop_blk->hashval = be32_to_cpu(dents[drophdr.count - 1].hashval); 1594 drop_blk->hashval = be32_to_cpu(dents[drophdr.count - 1].hashval);
1586 if (xfs_dir2_leafn_order(save_blk->bp, drop_blk->bp)) 1595 if (xfs_dir2_leafn_order(dp, save_blk->bp, drop_blk->bp))
1587 xfs_dir3_leafn_moveents(args, drop_blk->bp, &drophdr, dents, 0, 1596 xfs_dir3_leafn_moveents(args, drop_blk->bp, &drophdr, dents, 0,
1588 save_blk->bp, &savehdr, sents, 0, 1597 save_blk->bp, &savehdr, sents, 0,
1589 drophdr.count); 1598 drophdr.count);
@@ -1596,11 +1605,11 @@ xfs_dir2_leafn_unbalance(
1596 /* log the changes made when moving the entries */ 1605 /* log the changes made when moving the entries */
1597 xfs_dir3_leaf_hdr_to_disk(save_leaf, &savehdr); 1606 xfs_dir3_leaf_hdr_to_disk(save_leaf, &savehdr);
1598 xfs_dir3_leaf_hdr_to_disk(drop_leaf, &drophdr); 1607 xfs_dir3_leaf_hdr_to_disk(drop_leaf, &drophdr);
1599 xfs_dir3_leaf_log_header(args->trans, save_blk->bp); 1608 xfs_dir3_leaf_log_header(args->trans, dp, save_blk->bp);
1600 xfs_dir3_leaf_log_header(args->trans, drop_blk->bp); 1609 xfs_dir3_leaf_log_header(args->trans, dp, drop_blk->bp);
1601 1610
1602 xfs_dir3_leaf_check(args->dp->i_mount, save_blk->bp); 1611 xfs_dir3_leaf_check(dp, save_blk->bp);
1603 xfs_dir3_leaf_check(args->dp->i_mount, drop_blk->bp); 1612 xfs_dir3_leaf_check(dp, drop_blk->bp);
1604} 1613}
1605 1614
1606/* 1615/*
@@ -2211,7 +2220,7 @@ xfs_dir2_node_replace(
2211 blk = &state->path.blk[state->path.active - 1]; 2220 blk = &state->path.blk[state->path.active - 1];
2212 ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC); 2221 ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC);
2213 leaf = blk->bp->b_addr; 2222 leaf = blk->bp->b_addr;
2214 ents = xfs_dir3_leaf_ents_p(leaf); 2223 ents = args->dp->d_ops->leaf_ents_p(leaf);
2215 lep = &ents[blk->index]; 2224 lep = &ents[blk->index];
2216 ASSERT(state->extravalid); 2225 ASSERT(state->extravalid);
2217 /* 2226 /*
diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h
index 9a69f206daf9..3e4b5ba7b41f 100644
--- a/fs/xfs/xfs_dir2_priv.h
+++ b/fs/xfs/xfs_dir2_priv.h
@@ -77,9 +77,9 @@ extern void xfs_dir3_leaf_compact_x1(struct xfs_dir3_icleaf_hdr *leafhdr,
77 int *lowstalep, int *highstalep, int *lowlogp, int *highlogp); 77 int *lowstalep, int *highstalep, int *lowlogp, int *highlogp);
78extern int xfs_dir3_leaf_get_buf(struct xfs_da_args *args, xfs_dir2_db_t bno, 78extern int xfs_dir3_leaf_get_buf(struct xfs_da_args *args, xfs_dir2_db_t bno,
79 struct xfs_buf **bpp, __uint16_t magic); 79 struct xfs_buf **bpp, __uint16_t magic);
80extern void xfs_dir3_leaf_log_ents(struct xfs_trans *tp, struct xfs_buf *bp, 80extern void xfs_dir3_leaf_log_ents(struct xfs_trans *tp, struct xfs_inode *dp,
81 int first, int last); 81 struct xfs_buf *bp, int first, int last);
82extern void xfs_dir3_leaf_log_header(struct xfs_trans *tp, 82extern void xfs_dir3_leaf_log_header(struct xfs_trans *tp, struct xfs_inode *dp,
83 struct xfs_buf *bp); 83 struct xfs_buf *bp);
84extern int xfs_dir2_leaf_lookup(struct xfs_da_args *args); 84extern int xfs_dir2_leaf_lookup(struct xfs_da_args *args);
85extern int xfs_dir2_leaf_removename(struct xfs_da_args *args); 85extern int xfs_dir2_leaf_removename(struct xfs_da_args *args);
@@ -98,17 +98,18 @@ extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to,
98 struct xfs_dir2_leaf *from); 98 struct xfs_dir2_leaf *from);
99extern void xfs_dir3_leaf_hdr_to_disk(struct xfs_dir2_leaf *to, 99extern void xfs_dir3_leaf_hdr_to_disk(struct xfs_dir2_leaf *to,
100 struct xfs_dir3_icleaf_hdr *from); 100 struct xfs_dir3_icleaf_hdr *from);
101extern bool xfs_dir3_leaf_check_int(struct xfs_mount *mp, 101extern 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); 102 struct xfs_dir3_icleaf_hdr *hdr, struct xfs_dir2_leaf *leaf);
103 103
104/* xfs_dir2_node.c */ 104/* xfs_dir2_node.c */
105extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args, 105extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args,
106 struct xfs_buf *lbp); 106 struct xfs_buf *lbp);
107extern xfs_dahash_t xfs_dir2_leafn_lasthash(struct xfs_buf *bp, int *count); 107extern xfs_dahash_t xfs_dir2_leafn_lasthash(struct xfs_inode *dp,
108 struct xfs_buf *bp, int *count);
108extern int xfs_dir2_leafn_lookup_int(struct xfs_buf *bp, 109extern int xfs_dir2_leafn_lookup_int(struct xfs_buf *bp,
109 struct xfs_da_args *args, int *indexp, 110 struct xfs_da_args *args, int *indexp,
110 struct xfs_da_state *state); 111 struct xfs_da_state *state);
111extern int xfs_dir2_leafn_order(struct xfs_buf *leaf1_bp, 112extern int xfs_dir2_leafn_order(struct xfs_inode *dp, struct xfs_buf *leaf1_bp,
112 struct xfs_buf *leaf2_bp); 113 struct xfs_buf *leaf2_bp);
113extern int xfs_dir2_leafn_split(struct xfs_da_state *state, 114extern int xfs_dir2_leafn_split(struct xfs_da_state *state,
114 struct xfs_da_state_blk *oldblk, struct xfs_da_state_blk *newblk); 115 struct xfs_da_state_blk *oldblk, struct xfs_da_state_blk *newblk);