diff options
author | Dave Chinner <dchinner@redhat.com> | 2013-10-30 14:48:41 -0400 |
---|---|---|
committer | Ben Myers <bpm@sgi.com> | 2013-10-30 14:48:41 -0400 |
commit | 24dd0f546c366da68f33bbf2ecef2306f8c2281d (patch) | |
tree | fbf05c39dd41ba9d8430b560dba8ce3d0d61adb0 | |
parent | 01ba43b873d9e91ba2e0341fe8cb7e89eaa41661 (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.c | 89 | ||||
-rw-r--r-- | fs/xfs/xfs_da_format.h | 39 | ||||
-rw-r--r-- | fs/xfs/xfs_dir2.h | 5 | ||||
-rw-r--r-- | fs/xfs/xfs_dir2_leaf.c | 2 | ||||
-rw-r--r-- | fs/xfs/xfs_dir2_node.c | 61 |
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 | */ |
632 | static int | ||
633 | xfs_dir2_free_hdr_size(void) | ||
634 | { | ||
635 | return sizeof(struct xfs_dir2_free_hdr); | ||
636 | } | ||
637 | |||
638 | static int | ||
639 | xfs_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 | |||
645 | static __be16 * | ||
646 | xfs_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 | */ | ||
654 | static xfs_dir2_db_t | ||
655 | xfs_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 | */ | ||
663 | static int | ||
664 | xfs_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 | |||
669 | static int | ||
670 | xfs_dir3_free_hdr_size(void) | ||
671 | { | ||
672 | return sizeof(struct xfs_dir3_free_hdr); | ||
673 | } | ||
674 | |||
675 | static int | ||
676 | xfs_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 | |||
682 | static __be16 * | ||
683 | xfs_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 | */ | ||
691 | static xfs_dir2_db_t | ||
692 | xfs_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 | */ | ||
700 | static int | ||
701 | xfs_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 | |||
632 | static void | 706 | static void |
633 | xfs_dir2_free_hdr_from_disk( | 707 | xfs_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 | ||
729 | const struct xfs_dir_ops xfs_dir2_ftype_ops = { | 808 | const 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 | ||
771 | const struct xfs_dir_ops xfs_dir3_ops = { | 855 | const 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 | ||
813 | const struct xfs_dir_ops xfs_dir2_nondir_ops = { | 902 | const 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 | ||
707 | static inline int | ||
708 | xfs_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 | |||
715 | static inline int | ||
716 | xfs_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 | |||
722 | static inline __be16 * | ||
723 | xfs_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 | */ | ||
731 | static inline xfs_dir2_db_t | ||
732 | xfs_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 | */ | ||
740 | static inline int | ||
741 | xfs_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 | ||
101 | extern const struct xfs_dir_ops * | 106 | extern 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( | |||
240 | STATIC void | 240 | STATIC void |
241 | xfs_dir2_free_log_bests( | 241 | xfs_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( | |||
263 | static void | 264 | static void |
264 | xfs_dir2_free_log_header( | 265 | xfs_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 | */ |