]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: devirtualize ->free_hdr_from_disk
authorChristoph Hellwig <hch@lst.de>
Wed, 22 Jan 2020 16:29:41 +0000 (11:29 -0500)
committerEric Sandeen <sandeen@redhat.com>
Wed, 22 Jan 2020 16:29:41 +0000 (11:29 -0500)
Source kernel commit: 5ba30919a6fcf0d3d52507082ea67fab32c8bb29

Replace the ->free_hdr_from_disk dir ops method with a directly called
xfs_dir_free_hdr_from_disk helper that takes care of the differences
between the v4 and v5 on-disk format.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
db/metadump.c
libxfs/libxfs_api_defs.h
libxfs/xfs_da_format.c
libxfs/xfs_dir2.h
libxfs/xfs_dir2_leaf.c
libxfs/xfs_dir2_node.c
libxfs/xfs_dir2_priv.h
repair/phase6.c

index 3c82b940583157cfcfa7a6f7504ab9777d7eac8e..f27d1a4fdb1a97c460b2856473ee7843890a30ac 100644 (file)
@@ -1433,7 +1433,7 @@ process_dir_free_block(
                return;
 
        free = (struct xfs_dir2_free *)block;
-       M_DIROPS(mp)->free_hdr_from_disk(&freehdr, free);
+       libxfs_dir2_free_hdr_from_disk(mp, &freehdr, free);
 
        switch (freehdr.magic) {
        case XFS_DIR2_FREE_MAGIC:
index 889d4e52edd2bf813e60839fc1386ab4e2707eb5..8770e317827829ab5343df15b4deee0258d24d23 100644 (file)
@@ -76,6 +76,7 @@
 #define xfs_dir_lookup                 libxfs_dir_lookup
 #define xfs_dir_replace                        libxfs_dir_replace
 #define xfs_dir2_leaf_hdr_from_disk    libxfs_dir2_leaf_hdr_from_disk
+#define xfs_dir2_free_hdr_from_disk    libxfs_dir2_free_hdr_from_disk
 #define xfs_dir2_isblock               libxfs_dir2_isblock
 #define xfs_dir2_isleaf                        libxfs_dir2_isleaf
 #define xfs_dir2_data_freescan_int     libxfs_dir2_data_freescan_int
index 2ba880be637d0f62f5a5b7bcf943a1bdcf16d4d2..b22c95dffefc9acf16615da17e328ebdcf1aff39 100644 (file)
@@ -468,18 +468,6 @@ xfs_dir3_db_to_fdindex(struct xfs_da_geometry *geo, xfs_dir2_db_t db)
        return db % xfs_dir3_free_max_bests(geo);
 }
 
-static void
-xfs_dir2_free_hdr_from_disk(
-       struct xfs_dir3_icfree_hdr      *to,
-       struct xfs_dir2_free            *from)
-{
-       to->magic = be32_to_cpu(from->hdr.magic);
-       to->firstdb = be32_to_cpu(from->hdr.firstdb);
-       to->nvalid = be32_to_cpu(from->hdr.nvalid);
-       to->nused = be32_to_cpu(from->hdr.nused);
-       ASSERT(to->magic == XFS_DIR2_FREE_MAGIC);
-}
-
 static void
 xfs_dir2_free_hdr_to_disk(
        struct xfs_dir2_free            *to,
@@ -493,21 +481,6 @@ xfs_dir2_free_hdr_to_disk(
        to->hdr.nused = cpu_to_be32(from->nused);
 }
 
-static void
-xfs_dir3_free_hdr_from_disk(
-       struct xfs_dir3_icfree_hdr      *to,
-       struct xfs_dir2_free            *from)
-{
-       struct xfs_dir3_free_hdr *hdr3 = (struct xfs_dir3_free_hdr *)from;
-
-       to->magic = be32_to_cpu(hdr3->hdr.magic);
-       to->firstdb = be32_to_cpu(hdr3->firstdb);
-       to->nvalid = be32_to_cpu(hdr3->nvalid);
-       to->nused = be32_to_cpu(hdr3->nused);
-
-       ASSERT(to->magic == XFS_DIR3_FREE_MAGIC);
-}
-
 static void
 xfs_dir3_free_hdr_to_disk(
        struct xfs_dir2_free            *to,
@@ -555,7 +528,6 @@ static const struct xfs_dir_ops xfs_dir2_ops = {
 
        .free_hdr_size = sizeof(struct xfs_dir2_free_hdr),
        .free_hdr_to_disk = xfs_dir2_free_hdr_to_disk,
-       .free_hdr_from_disk = xfs_dir2_free_hdr_from_disk,
        .free_max_bests = xfs_dir2_free_max_bests,
        .free_bests_p = xfs_dir2_free_bests_p,
        .db_to_fdb = xfs_dir2_db_to_fdb,
@@ -594,7 +566,6 @@ static const struct xfs_dir_ops xfs_dir2_ftype_ops = {
 
        .free_hdr_size = sizeof(struct xfs_dir2_free_hdr),
        .free_hdr_to_disk = xfs_dir2_free_hdr_to_disk,
-       .free_hdr_from_disk = xfs_dir2_free_hdr_from_disk,
        .free_max_bests = xfs_dir2_free_max_bests,
        .free_bests_p = xfs_dir2_free_bests_p,
        .db_to_fdb = xfs_dir2_db_to_fdb,
@@ -633,7 +604,6 @@ static const struct xfs_dir_ops xfs_dir3_ops = {
 
        .free_hdr_size = sizeof(struct xfs_dir3_free_hdr),
        .free_hdr_to_disk = xfs_dir3_free_hdr_to_disk,
-       .free_hdr_from_disk = xfs_dir3_free_hdr_from_disk,
        .free_max_bests = xfs_dir3_free_max_bests,
        .free_bests_p = xfs_dir3_free_bests_p,
        .db_to_fdb = xfs_dir3_db_to_fdb,
index ee18fc56a6a1a4430b7ecf128b92f018ffcc4f90..c3e6a6fb7e3788702161620399304a2bd197a17e 100644 (file)
@@ -75,8 +75,6 @@ struct xfs_dir_ops {
        int     free_hdr_size;
        void    (*free_hdr_to_disk)(struct xfs_dir2_free *to,
                                    struct xfs_dir3_icfree_hdr *from);
-       void    (*free_hdr_from_disk)(struct xfs_dir3_icfree_hdr *to,
-                                     struct xfs_dir2_free *from);
        int     (*free_max_bests)(struct xfs_da_geometry *geo);
        __be16 * (*free_bests_p)(struct xfs_dir2_free *free);
        xfs_dir2_db_t (*db_to_fdb)(struct xfs_da_geometry *geo,
index cca56370632c5a857c6958bbd8f868e6a141119e..83738db6c00aa9122ab00875d427745425c86c79 100644 (file)
@@ -111,7 +111,7 @@ xfs_dir3_leaf1_check(
        } else if (leafhdr.magic != XFS_DIR2_LEAF1_MAGIC)
                return __this_address;
 
-       return xfs_dir3_leaf_check_int(dp->i_mount, dp, &leafhdr, leaf);
+       return xfs_dir3_leaf_check_int(dp->i_mount, &leafhdr, leaf);
 }
 
 static inline void
@@ -136,23 +136,15 @@ xfs_dir3_leaf_check(
 xfs_failaddr_t
 xfs_dir3_leaf_check_int(
        struct xfs_mount        *mp,
-       struct xfs_inode        *dp,
        struct xfs_dir3_icleaf_hdr *hdr,
        struct xfs_dir2_leaf    *leaf)
 {
        xfs_dir2_leaf_tail_t    *ltp;
        int                     stale;
        int                     i;
-       const struct xfs_dir_ops *ops;
        struct xfs_dir3_icleaf_hdr leafhdr;
        struct xfs_da_geometry  *geo = mp->m_dir_geo;
 
-       /*
-        * we can be passed a null dp here from a verifier, so we need to go the
-        * hard way to get them.
-        */
-       ops = xfs_dir_get_ops(mp, dp);
-
        if (!hdr) {
                xfs_dir2_leaf_hdr_from_disk(mp, &leafhdr, leaf);
                hdr = &leafhdr;
@@ -206,7 +198,7 @@ xfs_dir3_leaf_verify(
        if (fa)
                return fa;
 
-       return xfs_dir3_leaf_check_int(mp, NULL, NULL, leaf);
+       return xfs_dir3_leaf_check_int(mp, NULL, leaf);
 }
 
 static void
@@ -1756,7 +1748,7 @@ xfs_dir2_node_to_leaf(
        if (error)
                return error;
        free = fbp->b_addr;
-       dp->d_ops->free_hdr_from_disk(&freehdr, free);
+       xfs_dir2_free_hdr_from_disk(mp, &freehdr, free);
 
        ASSERT(!freehdr.firstdb);
 
index 81c5ef9193b4e3d7e3703b1c0a50927cb47f008c..e3f574cbc22ff7177a61703839d8285c8a6b6e5e 100644 (file)
@@ -51,7 +51,7 @@ xfs_dir3_leafn_check(
        } else if (leafhdr.magic != XFS_DIR2_LEAFN_MAGIC)
                return __this_address;
 
-       return xfs_dir3_leaf_check_int(dp->i_mount, dp, &leafhdr, leaf);
+       return xfs_dir3_leaf_check_int(dp->i_mount, &leafhdr, leaf);
 }
 
 static inline void
@@ -217,6 +217,30 @@ __xfs_dir3_free_read(
        return 0;
 }
 
+void
+xfs_dir2_free_hdr_from_disk(
+       struct xfs_mount                *mp,
+       struct xfs_dir3_icfree_hdr      *to,
+       struct xfs_dir2_free            *from)
+{
+       if (xfs_sb_version_hascrc(&mp->m_sb)) {
+               struct xfs_dir3_free    *from3 = (struct xfs_dir3_free *)from;
+
+               to->magic = be32_to_cpu(from3->hdr.hdr.magic);
+               to->firstdb = be32_to_cpu(from3->hdr.firstdb);
+               to->nvalid = be32_to_cpu(from3->hdr.nvalid);
+               to->nused = be32_to_cpu(from3->hdr.nused);
+
+               ASSERT(to->magic == XFS_DIR3_FREE_MAGIC);
+       } else {
+               to->magic = be32_to_cpu(from->hdr.magic);
+               to->firstdb = be32_to_cpu(from->hdr.firstdb);
+               to->nvalid = be32_to_cpu(from->hdr.nvalid);
+               to->nused = be32_to_cpu(from->hdr.nused);
+               ASSERT(to->magic == XFS_DIR2_FREE_MAGIC);
+       }
+}
+
 int
 xfs_dir2_free_read(
        struct xfs_trans        *tp,
@@ -366,7 +390,7 @@ xfs_dir2_leaf_to_node(
                return error;
 
        free = fbp->b_addr;
-       dp->d_ops->free_hdr_from_disk(&freehdr, free);
+       xfs_dir2_free_hdr_from_disk(dp->i_mount, &freehdr, free);
        leaf = lbp->b_addr;
        ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
        if (be32_to_cpu(ltp->bestcount) >
@@ -510,7 +534,7 @@ xfs_dir2_free_hdr_check(
 {
        struct xfs_dir3_icfree_hdr hdr;
 
-       dp->d_ops->free_hdr_from_disk(&hdr, bp->b_addr);
+       xfs_dir2_free_hdr_from_disk(dp->i_mount, &hdr, bp->b_addr);
 
        ASSERT((hdr.firstdb %
                dp->d_ops->free_max_bests(dp->i_mount->m_dir_geo)) == 0);
@@ -1120,7 +1144,7 @@ xfs_dir3_data_block_free(
        struct xfs_dir3_icfree_hdr freehdr;
        struct xfs_inode        *dp = args->dp;
 
-       dp->d_ops->free_hdr_from_disk(&freehdr, free);
+       xfs_dir2_free_hdr_from_disk(dp->i_mount, &freehdr, free);
        bests = dp->d_ops->free_bests_p(free);
        if (hdr) {
                /*
@@ -1289,7 +1313,8 @@ xfs_dir2_leafn_remove(
 #ifdef DEBUG
        {
                struct xfs_dir3_icfree_hdr freehdr;
-               dp->d_ops->free_hdr_from_disk(&freehdr, free);
+
+               xfs_dir2_free_hdr_from_disk(dp->i_mount, &freehdr, free);
                ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(args->geo) *
                        (fdb - xfs_dir2_byte_to_db(args->geo,
                                                   XFS_DIR2_FREE_OFFSET)));
@@ -1683,7 +1708,7 @@ xfs_dir2_node_add_datablk(
                        return error;
                free = fbp->b_addr;
                bests = dp->d_ops->free_bests_p(free);
-               dp->d_ops->free_hdr_from_disk(&freehdr, free);
+               xfs_dir2_free_hdr_from_disk(mp, &freehdr, free);
 
                /* Remember the first slot as our empty slot. */
                freehdr.firstdb = (fbno - xfs_dir2_byte_to_db(args->geo,
@@ -1692,7 +1717,7 @@ xfs_dir2_node_add_datablk(
        } else {
                free = fbp->b_addr;
                bests = dp->d_ops->free_bests_p(free);
-               dp->d_ops->free_hdr_from_disk(&freehdr, free);
+               xfs_dir2_free_hdr_from_disk(mp, &freehdr, free);
        }
 
        /* Set the freespace block index from the data block number. */
@@ -1761,7 +1786,8 @@ xfs_dir2_node_find_freeblk(
                if (findex >= 0) {
                        /* caller already found the freespace for us. */
                        bests = dp->d_ops->free_bests_p(free);
-                       dp->d_ops->free_hdr_from_disk(&freehdr, free);
+                       xfs_dir2_free_hdr_from_disk(dp->i_mount, &freehdr,
+                                                   free);
 
                        ASSERT(findex < freehdr.nvalid);
                        ASSERT(be16_to_cpu(bests[findex]) != NULLDATAOFF);
@@ -1810,7 +1836,7 @@ xfs_dir2_node_find_freeblk(
 
                free = fbp->b_addr;
                bests = dp->d_ops->free_bests_p(free);
-               dp->d_ops->free_hdr_from_disk(&freehdr, free);
+               xfs_dir2_free_hdr_from_disk(dp->i_mount, &freehdr, free);
 
                /* Scan the free entry array for a large enough free space. */
                for (findex = freehdr.nvalid - 1; findex >= 0; findex--) {
@@ -2263,7 +2289,7 @@ xfs_dir2_node_trim_free(
        if (!bp)
                return 0;
        free = bp->b_addr;
-       dp->d_ops->free_hdr_from_disk(&freehdr, free);
+       xfs_dir2_free_hdr_from_disk(dp->i_mount, &freehdr, free);
 
        /*
         * If there are used entries, there's nothing to do.
index 1f068812c453a4cbb102a3c42f4767a8021441ce..2c3370a3c010a9afdec10e7ba56ef181d75db59d 100644 (file)
@@ -109,10 +109,11 @@ xfs_dir3_leaf_find_entry(struct xfs_dir3_icleaf_hdr *leafhdr,
 extern int xfs_dir2_node_to_leaf(struct xfs_da_state *state);
 
 extern xfs_failaddr_t xfs_dir3_leaf_check_int(struct xfs_mount *mp,
-               struct xfs_inode *dp, struct xfs_dir3_icleaf_hdr *hdr,
-               struct xfs_dir2_leaf *leaf);
+               struct xfs_dir3_icleaf_hdr *hdr, struct xfs_dir2_leaf *leaf);
 
 /* xfs_dir2_node.c */
+void xfs_dir2_free_hdr_from_disk(struct xfs_mount *mp,
+               struct xfs_dir3_icfree_hdr *to, struct xfs_dir2_free *from);
 extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args,
                struct xfs_buf *lbp);
 extern xfs_dahash_t xfs_dir2_leaf_lasthash(struct xfs_inode *dp,
index a31597c5fa125e26ab0078d7a720ce54e8646fea..e7da9f2b22165a7493390989d6b1588543d0fc66 100644 (file)
@@ -2221,7 +2221,7 @@ longform_dir2_check_node(
                        return 1;
                }
                free = bp->b_addr;
-               M_DIROPS(mp)->free_hdr_from_disk(&freehdr, free);
+               libxfs_dir2_free_hdr_from_disk(mp, &freehdr, free);
                bests = M_DIROPS(mp)->free_bests_p(free);
                fdb = xfs_dir2_da_to_db(mp->m_dir_geo, da_bno);
                if (!(freehdr.magic == XFS_DIR2_FREE_MAGIC ||