aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2013-10-30 14:48:41 -0400
committerBen Myers <bpm@sgi.com>2013-10-30 14:48:41 -0400
commit24dd0f546c366da68f33bbf2ecef2306f8c2281d (patch)
treefbf05c39dd41ba9d8430b560dba8ce3d0d61adb0
parent01ba43b873d9e91ba2e0341fe8cb7e89eaa41661 (diff)
xfs: convert directory vector functions to constants
Next step in the vectorisation process is the directory free block encode/decode operations. There are relatively few of these, though there are quite a number of calls to them. Binary sizes: 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 791701 96802 1096 889599 d92ff fs/xfs/xfs.o.p8 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_da_format.c89
-rw-r--r--fs/xfs/xfs_da_format.h39
-rw-r--r--fs/xfs/xfs_dir2.h5
-rw-r--r--fs/xfs/xfs_dir2_leaf.c2
-rw-r--r--fs/xfs/xfs_dir2_node.c61
5 files changed, 126 insertions, 70 deletions
diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c
index b232c275791d..01e6f9a9b804 100644
--- a/fs/xfs/xfs_da_format.c
+++ b/fs/xfs/xfs_da_format.c
@@ -629,6 +629,80 @@ xfs_da3_node_hdr_to_disk(
629/* 629/*
630 * Directory free space block operations 630 * Directory free space block operations
631 */ 631 */
632static int
633xfs_dir2_free_hdr_size(void)
634{
635 return sizeof(struct xfs_dir2_free_hdr);
636}
637
638static int
639xfs_dir2_free_max_bests(struct xfs_mount *mp)
640{
641 return (mp->m_dirblksize - xfs_dir2_free_hdr_size()) /
642 sizeof(xfs_dir2_data_off_t);
643}
644
645static __be16 *
646xfs_dir2_free_bests_p(struct xfs_dir2_free *free)
647{
648 return (__be16 *)((char *)free + xfs_dir2_free_hdr_size());
649}
650
651/*
652 * Convert data space db to the corresponding free db.
653 */
654static xfs_dir2_db_t
655xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db)
656{
657 return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir2_free_max_bests(mp);
658}
659
660/*
661 * Convert data space db to the corresponding index in a free db.
662 */
663static int
664xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db)
665{
666 return db % xfs_dir2_free_max_bests(mp);
667}
668
669static int
670xfs_dir3_free_hdr_size(void)
671{
672 return sizeof(struct xfs_dir3_free_hdr);
673}
674
675static int
676xfs_dir3_free_max_bests(struct xfs_mount *mp)
677{
678 return (mp->m_dirblksize - xfs_dir3_free_hdr_size()) /
679 sizeof(xfs_dir2_data_off_t);
680}
681
682static __be16 *
683xfs_dir3_free_bests_p(struct xfs_dir2_free *free)
684{
685 return (__be16 *)((char *)free + xfs_dir3_free_hdr_size());
686}
687
688/*
689 * Convert data space db to the corresponding free db.
690 */
691static xfs_dir2_db_t
692xfs_dir3_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db)
693{
694 return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp);
695}
696
697/*
698 * Convert data space db to the corresponding index in a free db.
699 */
700static int
701xfs_dir3_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db)
702{
703 return db % xfs_dir3_free_max_bests(mp);
704}
705
632static void 706static void
633xfs_dir2_free_hdr_from_disk( 707xfs_dir2_free_hdr_from_disk(
634 struct xfs_dir3_icfree_hdr *to, 708 struct xfs_dir3_icfree_hdr *to,
@@ -722,8 +796,13 @@ const struct xfs_dir_ops xfs_dir2_ops = {
722 .node_hdr_from_disk = xfs_da2_node_hdr_from_disk, 796 .node_hdr_from_disk = xfs_da2_node_hdr_from_disk,
723 .node_tree_p = xfs_da2_node_tree_p, 797 .node_tree_p = xfs_da2_node_tree_p,
724 798
799 .free_hdr_size = xfs_dir2_free_hdr_size,
725 .free_hdr_to_disk = xfs_dir2_free_hdr_to_disk, 800 .free_hdr_to_disk = xfs_dir2_free_hdr_to_disk,
726 .free_hdr_from_disk = xfs_dir2_free_hdr_from_disk, 801 .free_hdr_from_disk = xfs_dir2_free_hdr_from_disk,
802 .free_max_bests = xfs_dir2_free_max_bests,
803 .free_bests_p = xfs_dir2_free_bests_p,
804 .db_to_fdb = xfs_dir2_db_to_fdb,
805 .db_to_fdindex = xfs_dir2_db_to_fdindex,
727}; 806};
728 807
729const struct xfs_dir_ops xfs_dir2_ftype_ops = { 808const struct xfs_dir_ops xfs_dir2_ftype_ops = {
@@ -764,8 +843,13 @@ const struct xfs_dir_ops xfs_dir2_ftype_ops = {
764 .node_hdr_from_disk = xfs_da2_node_hdr_from_disk, 843 .node_hdr_from_disk = xfs_da2_node_hdr_from_disk,
765 .node_tree_p = xfs_da2_node_tree_p, 844 .node_tree_p = xfs_da2_node_tree_p,
766 845
846 .free_hdr_size = xfs_dir2_free_hdr_size,
767 .free_hdr_to_disk = xfs_dir2_free_hdr_to_disk, 847 .free_hdr_to_disk = xfs_dir2_free_hdr_to_disk,
768 .free_hdr_from_disk = xfs_dir2_free_hdr_from_disk, 848 .free_hdr_from_disk = xfs_dir2_free_hdr_from_disk,
849 .free_max_bests = xfs_dir2_free_max_bests,
850 .free_bests_p = xfs_dir2_free_bests_p,
851 .db_to_fdb = xfs_dir2_db_to_fdb,
852 .db_to_fdindex = xfs_dir2_db_to_fdindex,
769}; 853};
770 854
771const struct xfs_dir_ops xfs_dir3_ops = { 855const struct xfs_dir_ops xfs_dir3_ops = {
@@ -806,8 +890,13 @@ const struct xfs_dir_ops xfs_dir3_ops = {
806 .node_hdr_from_disk = xfs_da3_node_hdr_from_disk, 890 .node_hdr_from_disk = xfs_da3_node_hdr_from_disk,
807 .node_tree_p = xfs_da3_node_tree_p, 891 .node_tree_p = xfs_da3_node_tree_p,
808 892
893 .free_hdr_size = xfs_dir3_free_hdr_size,
809 .free_hdr_to_disk = xfs_dir3_free_hdr_to_disk, 894 .free_hdr_to_disk = xfs_dir3_free_hdr_to_disk,
810 .free_hdr_from_disk = xfs_dir3_free_hdr_from_disk, 895 .free_hdr_from_disk = xfs_dir3_free_hdr_from_disk,
896 .free_max_bests = xfs_dir3_free_max_bests,
897 .free_bests_p = xfs_dir3_free_bests_p,
898 .db_to_fdb = xfs_dir3_db_to_fdb,
899 .db_to_fdindex = xfs_dir3_db_to_fdindex,
811}; 900};
812 901
813const struct xfs_dir_ops xfs_dir2_nondir_ops = { 902const struct xfs_dir_ops xfs_dir2_nondir_ops = {
diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h
index 1ff7b9f42097..a19d3f8f639c 100644
--- a/fs/xfs/xfs_da_format.h
+++ b/fs/xfs/xfs_da_format.h
@@ -704,45 +704,6 @@ struct xfs_dir3_icfree_hdr {
704 704
705}; 705};
706 706
707static inline int
708xfs_dir3_free_hdr_size(struct xfs_mount *mp)
709{
710 if (xfs_sb_version_hascrc(&mp->m_sb))
711 return sizeof(struct xfs_dir3_free_hdr);
712 return sizeof(struct xfs_dir2_free_hdr);
713}
714
715static inline int
716xfs_dir3_free_max_bests(struct xfs_mount *mp)
717{
718 return (mp->m_dirblksize - xfs_dir3_free_hdr_size(mp)) /
719 sizeof(xfs_dir2_data_off_t);
720}
721
722static inline __be16 *
723xfs_dir3_free_bests_p(struct xfs_mount *mp, struct xfs_dir2_free *free)
724{
725 return (__be16 *)((char *)free + xfs_dir3_free_hdr_size(mp));
726}
727
728/*
729 * Convert data space db to the corresponding free db.
730 */
731static inline xfs_dir2_db_t
732xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db)
733{
734 return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp);
735}
736
737/*
738 * Convert data space db to the corresponding index in a free db.
739 */
740static inline int
741xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db)
742{
743 return db % xfs_dir3_free_max_bests(mp);
744}
745
746/* 707/*
747 * Single block format. 708 * Single block format.
748 * 709 *
diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h
index 61195348f667..4264cb9199f8 100644
--- a/fs/xfs/xfs_dir2.h
+++ b/fs/xfs/xfs_dir2.h
@@ -92,10 +92,15 @@ struct xfs_dir_ops {
92 struct xfs_da_node_entry * 92 struct xfs_da_node_entry *
93 (*node_tree_p)(struct xfs_da_intnode *dap); 93 (*node_tree_p)(struct xfs_da_intnode *dap);
94 94
95 int (*free_hdr_size)(void);
95 void (*free_hdr_to_disk)(struct xfs_dir2_free *to, 96 void (*free_hdr_to_disk)(struct xfs_dir2_free *to,
96 struct xfs_dir3_icfree_hdr *from); 97 struct xfs_dir3_icfree_hdr *from);
97 void (*free_hdr_from_disk)(struct xfs_dir3_icfree_hdr *to, 98 void (*free_hdr_from_disk)(struct xfs_dir3_icfree_hdr *to,
98 struct xfs_dir2_free *from); 99 struct xfs_dir2_free *from);
100 int (*free_max_bests)(struct xfs_mount *mp);
101 __be16 * (*free_bests_p)(struct xfs_dir2_free *free);
102 xfs_dir2_db_t (*db_to_fdb)(struct xfs_mount *mp, xfs_dir2_db_t db);
103 int (*db_to_fdindex)(struct xfs_mount *mp, xfs_dir2_db_t db);
99}; 104};
100 105
101extern const struct xfs_dir_ops * 106extern const struct xfs_dir_ops *
diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c
index 2fb8db9fb574..a3c21b15cf7b 100644
--- a/fs/xfs/xfs_dir2_leaf.c
+++ b/fs/xfs/xfs_dir2_leaf.c
@@ -1785,7 +1785,7 @@ xfs_dir2_node_to_leaf(
1785 /* 1785 /*
1786 * Set up the leaf bests table. 1786 * Set up the leaf bests table.
1787 */ 1787 */
1788 memcpy(xfs_dir2_leaf_bests_p(ltp), xfs_dir3_free_bests_p(mp, free), 1788 memcpy(xfs_dir2_leaf_bests_p(ltp), dp->d_ops->free_bests_p(free),
1789 freehdr.nvalid * sizeof(xfs_dir2_data_off_t)); 1789 freehdr.nvalid * sizeof(xfs_dir2_data_off_t));
1790 1790
1791 dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); 1791 dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr);
diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c
index eaee8c36bcc4..853798519ae9 100644
--- a/fs/xfs/xfs_dir2_node.c
+++ b/fs/xfs/xfs_dir2_node.c
@@ -240,6 +240,7 @@ xfs_dir3_free_get_buf(
240STATIC void 240STATIC void
241xfs_dir2_free_log_bests( 241xfs_dir2_free_log_bests(
242 struct xfs_trans *tp, 242 struct xfs_trans *tp,
243 struct xfs_inode *dp,
243 struct xfs_buf *bp, 244 struct xfs_buf *bp,
244 int first, /* first entry to log */ 245 int first, /* first entry to log */
245 int last) /* last entry to log */ 246 int last) /* last entry to log */
@@ -248,7 +249,7 @@ xfs_dir2_free_log_bests(
248 __be16 *bests; 249 __be16 *bests;
249 250
250 free = bp->b_addr; 251 free = bp->b_addr;
251 bests = xfs_dir3_free_bests_p(tp->t_mountp, free); 252 bests = dp->d_ops->free_bests_p(free);
252 ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || 253 ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) ||
253 free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); 254 free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC));
254 xfs_trans_log_buf(tp, bp, 255 xfs_trans_log_buf(tp, bp,
@@ -263,6 +264,7 @@ xfs_dir2_free_log_bests(
263static void 264static void
264xfs_dir2_free_log_header( 265xfs_dir2_free_log_header(
265 struct xfs_trans *tp, 266 struct xfs_trans *tp,
267 struct xfs_inode *dp,
266 struct xfs_buf *bp) 268 struct xfs_buf *bp)
267{ 269{
268#ifdef DEBUG 270#ifdef DEBUG
@@ -272,7 +274,7 @@ xfs_dir2_free_log_header(
272 ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || 274 ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) ||
273 free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); 275 free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC));
274#endif 276#endif
275 xfs_trans_log_buf(tp, bp, 0, xfs_dir3_free_hdr_size(tp->t_mountp) - 1); 277 xfs_trans_log_buf(tp, bp, 0, dp->d_ops->free_hdr_size() - 1);
276} 278}
277 279
278/* 280/*
@@ -332,7 +334,7 @@ xfs_dir2_leaf_to_node(
332 * Count active entries. 334 * Count active entries.
333 */ 335 */
334 from = xfs_dir2_leaf_bests_p(ltp); 336 from = xfs_dir2_leaf_bests_p(ltp);
335 to = xfs_dir3_free_bests_p(mp, free); 337 to = dp->d_ops->free_bests_p(free);
336 for (i = n = 0; i < be32_to_cpu(ltp->bestcount); i++, from++, to++) { 338 for (i = n = 0; i < be32_to_cpu(ltp->bestcount); i++, from++, to++) {
337 if ((off = be16_to_cpu(*from)) != NULLDATAOFF) 339 if ((off = be16_to_cpu(*from)) != NULLDATAOFF)
338 n++; 340 n++;
@@ -346,8 +348,8 @@ xfs_dir2_leaf_to_node(
346 freehdr.nvalid = be32_to_cpu(ltp->bestcount); 348 freehdr.nvalid = be32_to_cpu(ltp->bestcount);
347 349
348 dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr); 350 dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr);
349 xfs_dir2_free_log_bests(tp, fbp, 0, freehdr.nvalid - 1); 351 xfs_dir2_free_log_bests(tp, dp, fbp, 0, freehdr.nvalid - 1);
350 xfs_dir2_free_log_header(tp, fbp); 352 xfs_dir2_free_log_header(tp, dp, fbp);
351 353
352 /* 354 /*
353 * Converting the leaf to a leafnode is just a matter of changing the 355 * Converting the leaf to a leafnode is just a matter of changing the
@@ -468,7 +470,7 @@ xfs_dir2_free_hdr_check(
468 470
469 dp->d_ops->free_hdr_from_disk(&hdr, bp->b_addr); 471 dp->d_ops->free_hdr_from_disk(&hdr, bp->b_addr);
470 472
471 ASSERT((hdr.firstdb % xfs_dir3_free_max_bests(dp->i_mount)) == 0); 473 ASSERT((hdr.firstdb % dp->d_ops->free_max_bests(dp->i_mount)) == 0);
472 ASSERT(hdr.firstdb <= db); 474 ASSERT(hdr.firstdb <= db);
473 ASSERT(db < hdr.firstdb + hdr.nvalid); 475 ASSERT(db < hdr.firstdb + hdr.nvalid);
474} 476}
@@ -590,7 +592,7 @@ xfs_dir2_leafn_lookup_for_addname(
590 * Convert the data block to the free block 592 * Convert the data block to the free block
591 * holding its freespace information. 593 * holding its freespace information.
592 */ 594 */
593 newfdb = xfs_dir2_db_to_fdb(mp, newdb); 595 newfdb = dp->d_ops->db_to_fdb(mp, newdb);
594 /* 596 /*
595 * If it's not the one we have in hand, read it in. 597 * If it's not the one we have in hand, read it in.
596 */ 598 */
@@ -613,11 +615,11 @@ xfs_dir2_leafn_lookup_for_addname(
613 /* 615 /*
614 * Get the index for our entry. 616 * Get the index for our entry.
615 */ 617 */
616 fi = xfs_dir2_db_to_fdindex(mp, curdb); 618 fi = dp->d_ops->db_to_fdindex(mp, curdb);
617 /* 619 /*
618 * If it has room, return it. 620 * If it has room, return it.
619 */ 621 */
620 bests = xfs_dir3_free_bests_p(mp, free); 622 bests = dp->d_ops->free_bests_p(free);
621 if (unlikely(bests[fi] == cpu_to_be16(NULLDATAOFF))) { 623 if (unlikely(bests[fi] == cpu_to_be16(NULLDATAOFF))) {
622 XFS_ERROR_REPORT("xfs_dir2_leafn_lookup_int", 624 XFS_ERROR_REPORT("xfs_dir2_leafn_lookup_int",
623 XFS_ERRLEVEL_LOW, mp); 625 XFS_ERRLEVEL_LOW, mp);
@@ -1080,15 +1082,14 @@ xfs_dir3_data_block_free(
1080 struct xfs_inode *dp = args->dp; 1082 struct xfs_inode *dp = args->dp;
1081 1083
1082 dp->d_ops->free_hdr_from_disk(&freehdr, free); 1084 dp->d_ops->free_hdr_from_disk(&freehdr, free);
1083 1085 bests = dp->d_ops->free_bests_p(free);
1084 bests = xfs_dir3_free_bests_p(tp->t_mountp, free);
1085 if (hdr) { 1086 if (hdr) {
1086 /* 1087 /*
1087 * Data block is not empty, just set the free entry to the new 1088 * Data block is not empty, just set the free entry to the new
1088 * value. 1089 * value.
1089 */ 1090 */
1090 bests[findex] = cpu_to_be16(longest); 1091 bests[findex] = cpu_to_be16(longest);
1091 xfs_dir2_free_log_bests(tp, fbp, findex, findex); 1092 xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex);
1092 return 0; 1093 return 0;
1093 } 1094 }
1094 1095
@@ -1116,7 +1117,7 @@ xfs_dir3_data_block_free(
1116 } 1117 }
1117 1118
1118 dp->d_ops->free_hdr_to_disk(free, &freehdr); 1119 dp->d_ops->free_hdr_to_disk(free, &freehdr);
1119 xfs_dir2_free_log_header(tp, fbp); 1120 xfs_dir2_free_log_header(tp, dp, fbp);
1120 1121
1121 /* 1122 /*
1122 * If there are no useful entries left in the block, get rid of the 1123 * If there are no useful entries left in the block, get rid of the
@@ -1140,7 +1141,7 @@ xfs_dir3_data_block_free(
1140 1141
1141 /* Log the free entry that changed, unless we got rid of it. */ 1142 /* Log the free entry that changed, unless we got rid of it. */
1142 if (logfree) 1143 if (logfree)
1143 xfs_dir2_free_log_bests(tp, fbp, findex, findex); 1144 xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex);
1144 return 0; 1145 return 0;
1145} 1146}
1146 1147
@@ -1243,7 +1244,7 @@ xfs_dir2_leafn_remove(
1243 * Convert the data block number to a free block, 1244 * Convert the data block number to a free block,
1244 * read in the free block. 1245 * read in the free block.
1245 */ 1246 */
1246 fdb = xfs_dir2_db_to_fdb(mp, db); 1247 fdb = dp->d_ops->db_to_fdb(mp, db);
1247 error = xfs_dir2_free_read(tp, dp, xfs_dir2_db_to_da(mp, fdb), 1248 error = xfs_dir2_free_read(tp, dp, xfs_dir2_db_to_da(mp, fdb),
1248 &fbp); 1249 &fbp);
1249 if (error) 1250 if (error)
@@ -1253,14 +1254,14 @@ xfs_dir2_leafn_remove(
1253 { 1254 {
1254 struct xfs_dir3_icfree_hdr freehdr; 1255 struct xfs_dir3_icfree_hdr freehdr;
1255 dp->d_ops->free_hdr_from_disk(&freehdr, free); 1256 dp->d_ops->free_hdr_from_disk(&freehdr, free);
1256 ASSERT(freehdr.firstdb == xfs_dir3_free_max_bests(mp) * 1257 ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(mp) *
1257 (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); 1258 (fdb - XFS_DIR2_FREE_FIRSTDB(mp)));
1258 } 1259 }
1259#endif 1260#endif
1260 /* 1261 /*
1261 * Calculate which entry we need to fix. 1262 * Calculate which entry we need to fix.
1262 */ 1263 */
1263 findex = xfs_dir2_db_to_fdindex(mp, db); 1264 findex = dp->d_ops->db_to_fdindex(mp, db);
1264 longest = be16_to_cpu(bf[0].length); 1265 longest = be16_to_cpu(bf[0].length);
1265 /* 1266 /*
1266 * If the data block is now empty we can get rid of it 1267 * If the data block is now empty we can get rid of it
@@ -1688,7 +1689,7 @@ xfs_dir2_node_addname_int(
1688 ifbno = fblk->blkno; 1689 ifbno = fblk->blkno;
1689 free = fbp->b_addr; 1690 free = fbp->b_addr;
1690 findex = fblk->index; 1691 findex = fblk->index;
1691 bests = xfs_dir3_free_bests_p(mp, free); 1692 bests = dp->d_ops->free_bests_p(free);
1692 dp->d_ops->free_hdr_from_disk(&freehdr, free); 1693 dp->d_ops->free_hdr_from_disk(&freehdr, free);
1693 1694
1694 /* 1695 /*
@@ -1781,7 +1782,7 @@ xfs_dir2_node_addname_int(
1781 * and the freehdr are actually initialised if they are placed 1782 * and the freehdr are actually initialised if they are placed
1782 * there, so we have to do it here to avoid warnings. Blech. 1783 * there, so we have to do it here to avoid warnings. Blech.
1783 */ 1784 */
1784 bests = xfs_dir3_free_bests_p(mp, free); 1785 bests = dp->d_ops->free_bests_p(free);
1785 dp->d_ops->free_hdr_from_disk(&freehdr, free); 1786 dp->d_ops->free_hdr_from_disk(&freehdr, free);
1786 if (be16_to_cpu(bests[findex]) != NULLDATAOFF && 1787 if (be16_to_cpu(bests[findex]) != NULLDATAOFF &&
1787 be16_to_cpu(bests[findex]) >= length) 1788 be16_to_cpu(bests[findex]) >= length)
@@ -1833,7 +1834,7 @@ xfs_dir2_node_addname_int(
1833 * Get the freespace block corresponding to the data block 1834 * Get the freespace block corresponding to the data block
1834 * that was just allocated. 1835 * that was just allocated.
1835 */ 1836 */
1836 fbno = xfs_dir2_db_to_fdb(mp, dbno); 1837 fbno = dp->d_ops->db_to_fdb(mp, dbno);
1837 error = xfs_dir2_free_try_read(tp, dp, 1838 error = xfs_dir2_free_try_read(tp, dp,
1838 xfs_dir2_db_to_da(mp, fbno), 1839 xfs_dir2_db_to_da(mp, fbno),
1839 &fbp); 1840 &fbp);
@@ -1850,12 +1851,12 @@ xfs_dir2_node_addname_int(
1850 if (error) 1851 if (error)
1851 return error; 1852 return error;
1852 1853
1853 if (unlikely(xfs_dir2_db_to_fdb(mp, dbno) != fbno)) { 1854 if (unlikely(dp->d_ops->db_to_fdb(mp, dbno) != fbno)) {
1854 xfs_alert(mp, 1855 xfs_alert(mp,
1855 "%s: dir ino %llu needed freesp block %lld for\n" 1856 "%s: dir ino %llu needed freesp block %lld for\n"
1856 " data block %lld, got %lld ifbno %llu lastfbno %d", 1857 " data block %lld, got %lld ifbno %llu lastfbno %d",
1857 __func__, (unsigned long long)dp->i_ino, 1858 __func__, (unsigned long long)dp->i_ino,
1858 (long long)xfs_dir2_db_to_fdb(mp, dbno), 1859 (long long)dp->d_ops->db_to_fdb(mp, dbno),
1859 (long long)dbno, (long long)fbno, 1860 (long long)dbno, (long long)fbno,
1860 (unsigned long long)ifbno, lastfbno); 1861 (unsigned long long)ifbno, lastfbno);
1861 if (fblk) { 1862 if (fblk) {
@@ -1880,30 +1881,30 @@ xfs_dir2_node_addname_int(
1880 if (error) 1881 if (error)
1881 return error; 1882 return error;
1882 free = fbp->b_addr; 1883 free = fbp->b_addr;
1883 bests = xfs_dir3_free_bests_p(mp, free); 1884 bests = dp->d_ops->free_bests_p(free);
1884 dp->d_ops->free_hdr_from_disk(&freehdr, free); 1885 dp->d_ops->free_hdr_from_disk(&freehdr, free);
1885 1886
1886 /* 1887 /*
1887 * Remember the first slot as our empty slot. 1888 * Remember the first slot as our empty slot.
1888 */ 1889 */
1889 freehdr.firstdb = (fbno - XFS_DIR2_FREE_FIRSTDB(mp)) * 1890 freehdr.firstdb = (fbno - XFS_DIR2_FREE_FIRSTDB(mp)) *
1890 xfs_dir3_free_max_bests(mp); 1891 dp->d_ops->free_max_bests(mp);
1891 } else { 1892 } else {
1892 free = fbp->b_addr; 1893 free = fbp->b_addr;
1893 bests = xfs_dir3_free_bests_p(mp, free); 1894 bests = dp->d_ops->free_bests_p(free);
1894 dp->d_ops->free_hdr_from_disk(&freehdr, free); 1895 dp->d_ops->free_hdr_from_disk(&freehdr, free);
1895 } 1896 }
1896 1897
1897 /* 1898 /*
1898 * Set the freespace block index from the data block number. 1899 * Set the freespace block index from the data block number.
1899 */ 1900 */
1900 findex = xfs_dir2_db_to_fdindex(mp, dbno); 1901 findex = dp->d_ops->db_to_fdindex(mp, dbno);
1901 /* 1902 /*
1902 * If it's after the end of the current entries in the 1903 * If it's after the end of the current entries in the
1903 * freespace block, extend that table. 1904 * freespace block, extend that table.
1904 */ 1905 */
1905 if (findex >= freehdr.nvalid) { 1906 if (findex >= freehdr.nvalid) {
1906 ASSERT(findex < xfs_dir3_free_max_bests(mp)); 1907 ASSERT(findex < dp->d_ops->free_max_bests(mp));
1907 freehdr.nvalid = findex + 1; 1908 freehdr.nvalid = findex + 1;
1908 /* 1909 /*
1909 * Tag new entry so nused will go up. 1910 * Tag new entry so nused will go up.
@@ -1917,7 +1918,7 @@ xfs_dir2_node_addname_int(
1917 if (bests[findex] == cpu_to_be16(NULLDATAOFF)) { 1918 if (bests[findex] == cpu_to_be16(NULLDATAOFF)) {
1918 freehdr.nused++; 1919 freehdr.nused++;
1919 dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr); 1920 dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr);
1920 xfs_dir2_free_log_header(tp, fbp); 1921 xfs_dir2_free_log_header(tp, dp, fbp);
1921 } 1922 }
1922 /* 1923 /*
1923 * Update the real value in the table. 1924 * Update the real value in the table.
@@ -1987,7 +1988,7 @@ xfs_dir2_node_addname_int(
1987 /* 1988 /*
1988 * If the freespace entry is now wrong, update it. 1989 * If the freespace entry is now wrong, update it.
1989 */ 1990 */
1990 bests = xfs_dir3_free_bests_p(mp, free); /* gcc is so stupid */ 1991 bests = dp->d_ops->free_bests_p(free); /* gcc is so stupid */
1991 if (be16_to_cpu(bests[findex]) != be16_to_cpu(bf[0].length)) { 1992 if (be16_to_cpu(bests[findex]) != be16_to_cpu(bf[0].length)) {
1992 bests[findex] = bf[0].length; 1993 bests[findex] = bf[0].length;
1993 logfree = 1; 1994 logfree = 1;
@@ -1996,7 +1997,7 @@ xfs_dir2_node_addname_int(
1996 * Log the freespace entry if needed. 1997 * Log the freespace entry if needed.
1997 */ 1998 */
1998 if (logfree) 1999 if (logfree)
1999 xfs_dir2_free_log_bests(tp, fbp, findex, findex); 2000 xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex);
2000 /* 2001 /*
2001 * Return the data block and offset in args, then drop the data block. 2002 * Return the data block and offset in args, then drop the data block.
2002 */ 2003 */