OSDN Git Service

xfs: devirtualize ->m_dirnameops
[tomoyo/tomoyo-test1.git] / fs / xfs / libxfs / xfs_dir2_node.c
index 705c4f5..3a8b062 100644 (file)
@@ -34,6 +34,25 @@ static int xfs_dir2_leafn_remove(xfs_da_args_t *args, struct xfs_buf *bp,
                                 int *rval);
 
 /*
+ * Convert data space db to the corresponding free db.
+ */
+static xfs_dir2_db_t
+xfs_dir2_db_to_fdb(struct xfs_da_geometry *geo, xfs_dir2_db_t db)
+{
+       return xfs_dir2_byte_to_db(geo, XFS_DIR2_FREE_OFFSET) +
+                       (db / geo->free_max_bests);
+}
+
+/*
+ * Convert data space db to the corresponding index in a free db.
+ */
+static int
+xfs_dir2_db_to_fdindex(struct xfs_da_geometry *geo, xfs_dir2_db_t db)
+{
+       return db % geo->free_max_bests;
+}
+
+/*
  * Check internal consistency of a leafn block.
  */
 #ifdef DEBUG
@@ -45,7 +64,7 @@ xfs_dir3_leafn_check(
        struct xfs_dir2_leaf    *leaf = bp->b_addr;
        struct xfs_dir3_icleaf_hdr leafhdr;
 
-       dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
+       xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr, leaf);
 
        if (leafhdr.magic == XFS_DIR3_LEAFN_MAGIC) {
                struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr;
@@ -54,7 +73,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
@@ -160,10 +179,9 @@ xfs_dir3_free_header_check(
        struct xfs_buf          *bp)
 {
        struct xfs_mount        *mp = dp->i_mount;
+       int                     maxbests = mp->m_dir_geo->free_max_bests;
        unsigned int            firstdb;
-       int                     maxbests;
 
-       maxbests = dp->d_ops->free_max_bests(mp->m_dir_geo);
        firstdb = (xfs_dir2_da_to_db(mp->m_dir_geo, fbno) -
                   xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET)) *
                        maxbests;
@@ -220,6 +238,58 @@ __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);
+               to->bests = from3->bests;
+
+               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);
+               to->bests = from->bests;
+
+               ASSERT(to->magic == XFS_DIR2_FREE_MAGIC);
+       }
+}
+
+static void
+xfs_dir2_free_hdr_to_disk(
+       struct xfs_mount                *mp,
+       struct xfs_dir2_free            *to,
+       struct xfs_dir3_icfree_hdr      *from)
+{
+       if (xfs_sb_version_hascrc(&mp->m_sb)) {
+               struct xfs_dir3_free    *to3 = (struct xfs_dir3_free *)to;
+
+               ASSERT(from->magic == XFS_DIR3_FREE_MAGIC);
+
+               to3->hdr.hdr.magic = cpu_to_be32(from->magic);
+               to3->hdr.firstdb = cpu_to_be32(from->firstdb);
+               to3->hdr.nvalid = cpu_to_be32(from->nvalid);
+               to3->hdr.nused = cpu_to_be32(from->nused);
+       } else {
+               ASSERT(from->magic == XFS_DIR2_FREE_MAGIC);
+
+               to->hdr.magic = cpu_to_be32(from->magic);
+               to->hdr.firstdb = cpu_to_be32(from->firstdb);
+               to->hdr.nvalid = cpu_to_be32(from->nvalid);
+               to->hdr.nused = cpu_to_be32(from->nused);
+       }
+}
+
 int
 xfs_dir2_free_read(
        struct xfs_trans        *tp,
@@ -278,7 +348,7 @@ xfs_dir3_free_get_buf(
                uuid_copy(&hdr3->hdr.uuid, &mp->m_sb.sb_meta_uuid);
        } else
                hdr.magic = XFS_DIR2_FREE_MAGIC;
-       dp->d_ops->free_hdr_to_disk(bp->b_addr, &hdr);
+       xfs_dir2_free_hdr_to_disk(mp, bp->b_addr, &hdr);
        *bpp = bp;
        return 0;
 }
@@ -289,21 +359,19 @@ xfs_dir3_free_get_buf(
 STATIC void
 xfs_dir2_free_log_bests(
        struct xfs_da_args      *args,
+       struct xfs_dir3_icfree_hdr *hdr,
        struct xfs_buf          *bp,
        int                     first,          /* first entry to log */
        int                     last)           /* last entry to log */
 {
-       xfs_dir2_free_t         *free;          /* freespace structure */
-       __be16                  *bests;
+       struct xfs_dir2_free    *free = bp->b_addr;
 
-       free = bp->b_addr;
-       bests = args->dp->d_ops->free_bests_p(free);
        ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) ||
               free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC));
        xfs_trans_log_buf(args->trans, bp,
-               (uint)((char *)&bests[first] - (char *)free),
-               (uint)((char *)&bests[last] - (char *)free +
-                      sizeof(bests[0]) - 1));
+                         (char *)&hdr->bests[first] - (char *)free,
+                         (char *)&hdr->bests[last] - (char *)free +
+                          sizeof(hdr->bests[0]) - 1);
 }
 
 /*
@@ -322,7 +390,7 @@ xfs_dir2_free_log_header(
               free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC));
 #endif
        xfs_trans_log_buf(args->trans, bp, 0,
-                         args->dp->d_ops->free_hdr_size - 1);
+                         args->geo->free_hdr_size - 1);
 }
 
 /*
@@ -339,14 +407,12 @@ xfs_dir2_leaf_to_node(
        int                     error;          /* error return value */
        struct xfs_buf          *fbp;           /* freespace buffer */
        xfs_dir2_db_t           fdb;            /* freespace block number */
-       xfs_dir2_free_t         *free;          /* freespace structure */
        __be16                  *from;          /* pointer to freespace entry */
        int                     i;              /* leaf freespace index */
        xfs_dir2_leaf_t         *leaf;          /* leaf structure */
        xfs_dir2_leaf_tail_t    *ltp;           /* leaf tail structure */
        int                     n;              /* count of live freespc ents */
        xfs_dir2_data_off_t     off;            /* freespace entry value */
-       __be16                  *to;            /* pointer to freespace entry */
        xfs_trans_t             *tp;            /* transaction pointer */
        struct xfs_dir3_icfree_hdr freehdr;
 
@@ -368,24 +434,25 @@ xfs_dir2_leaf_to_node(
        if (error)
                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, fbp->b_addr);
        leaf = lbp->b_addr;
        ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
        if (be32_to_cpu(ltp->bestcount) >
-                               (uint)dp->i_d.di_size / args->geo->blksize)
+                               (uint)dp->i_d.di_size / args->geo->blksize) {
+               xfs_buf_corruption_error(lbp);
                return -EFSCORRUPTED;
+       }
 
        /*
         * Copy freespace entries from the leaf block to the new block.
         * Count active entries.
         */
        from = xfs_dir2_leaf_bests_p(ltp);
-       to = dp->d_ops->free_bests_p(free);
-       for (i = n = 0; i < be32_to_cpu(ltp->bestcount); i++, from++, to++) {
-               if ((off = be16_to_cpu(*from)) != NULLDATAOFF)
+       for (i = n = 0; i < be32_to_cpu(ltp->bestcount); i++, from++) {
+               off = be16_to_cpu(*from);
+               if (off != NULLDATAOFF)
                        n++;
-               *to = cpu_to_be16(off);
+               freehdr.bests[i] = cpu_to_be16(off);
        }
 
        /*
@@ -394,8 +461,8 @@ xfs_dir2_leaf_to_node(
        freehdr.nused = n;
        freehdr.nvalid = be32_to_cpu(ltp->bestcount);
 
-       dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr);
-       xfs_dir2_free_log_bests(args, fbp, 0, freehdr.nvalid - 1);
+       xfs_dir2_free_hdr_to_disk(dp->i_mount, fbp->b_addr, &freehdr);
+       xfs_dir2_free_log_bests(args, &freehdr, fbp, 0, freehdr.nvalid - 1);
        xfs_dir2_free_log_header(args, fbp);
 
        /*
@@ -438,15 +505,17 @@ xfs_dir2_leafn_add(
 
        trace_xfs_dir2_leafn_add(args, index);
 
-       dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
-       ents = dp->d_ops->leaf_ents_p(leaf);
+       xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr, leaf);
+       ents = leafhdr.ents;
 
        /*
         * Quick check just to make sure we are not going to index
         * into other peoples memory
         */
-       if (index < 0)
+       if (index < 0) {
+               xfs_buf_corruption_error(bp);
                return -EFSCORRUPTED;
+       }
 
        /*
         * If there are already the maximum number of leaf entries in
@@ -455,7 +524,7 @@ xfs_dir2_leafn_add(
         * a compact.
         */
 
-       if (leafhdr.count == dp->d_ops->leaf_max_ents(args->geo)) {
+       if (leafhdr.count == args->geo->leaf_max_ents) {
                if (!leafhdr.stale)
                        return -ENOSPC;
                compact = leafhdr.stale > 1;
@@ -493,9 +562,9 @@ xfs_dir2_leafn_add(
        lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(args->geo,
                                args->blkno, args->index));
 
-       dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr);
+       xfs_dir2_leaf_hdr_to_disk(dp->i_mount, leaf, &leafhdr);
        xfs_dir3_leaf_log_header(args, bp);
-       xfs_dir3_leaf_log_ents(args, bp, lfloglow, lfloghigh);
+       xfs_dir3_leaf_log_ents(args, &leafhdr, bp, lfloglow, lfloghigh);
        xfs_dir3_leaf_check(dp, bp);
        return 0;
 }
@@ -509,10 +578,9 @@ 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);
+       ASSERT((hdr.firstdb % dp->i_mount->m_dir_geo->free_max_bests) == 0);
        ASSERT(hdr.firstdb <= db);
        ASSERT(db < hdr.firstdb + hdr.nvalid);
 }
@@ -530,11 +598,9 @@ xfs_dir2_leaf_lasthash(
        struct xfs_buf  *bp,                    /* leaf buffer */
        int             *count)                 /* count of entries in leaf */
 {
-       struct xfs_dir2_leaf    *leaf = bp->b_addr;
-       struct xfs_dir2_leaf_entry *ents;
        struct xfs_dir3_icleaf_hdr leafhdr;
 
-       dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
+       xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr, bp->b_addr);
 
        ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC ||
               leafhdr.magic == XFS_DIR3_LEAFN_MAGIC ||
@@ -545,9 +611,7 @@ xfs_dir2_leaf_lasthash(
                *count = leafhdr.count;
        if (!leafhdr.count)
                return 0;
-
-       ents = dp->d_ops->leaf_ents_p(leaf);
-       return be32_to_cpu(ents[leafhdr.count - 1].hashval);
+       return be32_to_cpu(leafhdr.ents[leafhdr.count - 1].hashval);
 }
 
 /*
@@ -576,15 +640,13 @@ xfs_dir2_leafn_lookup_for_addname(
        xfs_dir2_db_t           newdb;          /* new data block number */
        xfs_dir2_db_t           newfdb;         /* new free block number */
        xfs_trans_t             *tp;            /* transaction pointer */
-       struct xfs_dir2_leaf_entry *ents;
        struct xfs_dir3_icleaf_hdr leafhdr;
 
        dp = args->dp;
        tp = args->trans;
        mp = dp->i_mount;
        leaf = bp->b_addr;
-       dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
-       ents = dp->d_ops->leaf_ents_p(leaf);
+       xfs_dir2_leaf_hdr_from_disk(mp, &leafhdr, leaf);
 
        xfs_dir3_leaf_check(dp, bp);
        ASSERT(leafhdr.count > 0);
@@ -604,11 +666,11 @@ xfs_dir2_leafn_lookup_for_addname(
                ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) ||
                       free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC));
        }
-       length = dp->d_ops->data_entsize(args->namelen);
+       length = xfs_dir2_data_entsize(mp, args->namelen);
        /*
         * Loop over leaf entries with the right hash value.
         */
-       for (lep = &ents[index];
+       for (lep = &leafhdr.ents[index];
             index < leafhdr.count && be32_to_cpu(lep->hashval) == args->hashval;
             lep++, index++) {
                /*
@@ -630,14 +692,14 @@ xfs_dir2_leafn_lookup_for_addname(
                 * in hand, take a look at it.
                 */
                if (newdb != curdb) {
-                       __be16 *bests;
+                       struct xfs_dir3_icfree_hdr freehdr;
 
                        curdb = newdb;
                        /*
                         * Convert the data block to the free block
                         * holding its freespace information.
                         */
-                       newfdb = dp->d_ops->db_to_fdb(args->geo, newdb);
+                       newfdb = xfs_dir2_db_to_fdb(args->geo, newdb);
                        /*
                         * If it's not the one we have in hand, read it in.
                         */
@@ -661,20 +723,20 @@ xfs_dir2_leafn_lookup_for_addname(
                        /*
                         * Get the index for our entry.
                         */
-                       fi = dp->d_ops->db_to_fdindex(args->geo, curdb);
+                       fi = xfs_dir2_db_to_fdindex(args->geo, curdb);
                        /*
                         * If it has room, return it.
                         */
-                       bests = dp->d_ops->free_bests_p(free);
-                       if (unlikely(bests[fi] == cpu_to_be16(NULLDATAOFF))) {
-                               XFS_ERROR_REPORT("xfs_dir2_leafn_lookup_int",
-                                                       XFS_ERRLEVEL_LOW, mp);
+                       xfs_dir2_free_hdr_from_disk(mp, &freehdr, free);
+                       if (XFS_IS_CORRUPT(mp,
+                                          freehdr.bests[fi] ==
+                                          cpu_to_be16(NULLDATAOFF))) {
                                if (curfdb != newfdb)
                                        xfs_trans_brelse(tp, curbp);
                                return -EFSCORRUPTED;
                        }
                        curfdb = newfdb;
-                       if (be16_to_cpu(bests[fi]) >= length)
+                       if (be16_to_cpu(freehdr.bests[fi]) >= length)
                                goto out;
                }
        }
@@ -728,19 +790,19 @@ xfs_dir2_leafn_lookup_for_entry(
        xfs_dir2_db_t           newdb;          /* new data block number */
        xfs_trans_t             *tp;            /* transaction pointer */
        enum xfs_dacmp          cmp;            /* comparison result */
-       struct xfs_dir2_leaf_entry *ents;
        struct xfs_dir3_icleaf_hdr leafhdr;
 
        dp = args->dp;
        tp = args->trans;
        mp = dp->i_mount;
        leaf = bp->b_addr;
-       dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
-       ents = dp->d_ops->leaf_ents_p(leaf);
+       xfs_dir2_leaf_hdr_from_disk(mp, &leafhdr, leaf);
 
        xfs_dir3_leaf_check(dp, bp);
-       if (leafhdr.count <= 0)
+       if (leafhdr.count <= 0) {
+               xfs_buf_corruption_error(bp);
                return -EFSCORRUPTED;
+       }
 
        /*
         * Look up the hash value in the leaf entries.
@@ -756,7 +818,7 @@ xfs_dir2_leafn_lookup_for_entry(
        /*
         * Loop over leaf entries with the right hash value.
         */
-       for (lep = &ents[index];
+       for (lep = &leafhdr.ents[index];
             index < leafhdr.count && be32_to_cpu(lep->hashval) == args->hashval;
             lep++, index++) {
                /*
@@ -813,7 +875,7 @@ xfs_dir2_leafn_lookup_for_entry(
                 * EEXIST immediately. If it's the first case-insensitive
                 * match, store the block & inode number and continue looking.
                 */
-               cmp = mp->m_dirnameops->compname(args, dep->name, dep->namelen);
+               cmp = xfs_dir2_compname(args, dep->name, dep->namelen);
                if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) {
                        /* If there is a CI match block, drop it */
                        if (args->cmpresult != XFS_CMP_DIFFERENT &&
@@ -821,7 +883,7 @@ xfs_dir2_leafn_lookup_for_entry(
                                xfs_trans_brelse(tp, state->extrablk.bp);
                        args->cmpresult = cmp;
                        args->inumber = be64_to_cpu(dep->inumber);
-                       args->filetype = dp->d_ops->data_get_ftype(dep);
+                       args->filetype = xfs_dir2_data_get_ftype(mp, dep);
                        *indexp = index;
                        state->extravalid = 1;
                        state->extrablk.bp = curbp;
@@ -911,7 +973,7 @@ xfs_dir3_leafn_moveents(
        if (start_d < dhdr->count) {
                memmove(&dents[start_d + count], &dents[start_d],
                        (dhdr->count - start_d) * sizeof(xfs_dir2_leaf_entry_t));
-               xfs_dir3_leaf_log_ents(args, bp_d, start_d + count,
+               xfs_dir3_leaf_log_ents(args, dhdr, bp_d, start_d + count,
                                       count + dhdr->count - 1);
        }
        /*
@@ -933,7 +995,7 @@ xfs_dir3_leafn_moveents(
         */
        memcpy(&dents[start_d], &sents[start_s],
                count * sizeof(xfs_dir2_leaf_entry_t));
-       xfs_dir3_leaf_log_ents(args, bp_d, start_d, start_d + count - 1);
+       xfs_dir3_leaf_log_ents(args, dhdr, bp_d, start_d, start_d + count - 1);
 
        /*
         * If there are source entries after the ones we copied,
@@ -942,7 +1004,8 @@ xfs_dir3_leafn_moveents(
        if (start_s + count < shdr->count) {
                memmove(&sents[start_s], &sents[start_s + count],
                        count * sizeof(xfs_dir2_leaf_entry_t));
-               xfs_dir3_leaf_log_ents(args, bp_s, start_s, start_s + count - 1);
+               xfs_dir3_leaf_log_ents(args, shdr, bp_s, start_s,
+                                      start_s + count - 1);
        }
 
        /*
@@ -971,10 +1034,10 @@ xfs_dir2_leafn_order(
        struct xfs_dir3_icleaf_hdr hdr1;
        struct xfs_dir3_icleaf_hdr hdr2;
 
-       dp->d_ops->leaf_hdr_from_disk(&hdr1, leaf1);
-       dp->d_ops->leaf_hdr_from_disk(&hdr2, leaf2);
-       ents1 = dp->d_ops->leaf_ents_p(leaf1);
-       ents2 = dp->d_ops->leaf_ents_p(leaf2);
+       xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &hdr1, leaf1);
+       xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &hdr2, leaf2);
+       ents1 = hdr1.ents;
+       ents2 = hdr2.ents;
 
        if (hdr1.count > 0 && hdr2.count > 0 &&
            (be32_to_cpu(ents2[0].hashval) < be32_to_cpu(ents1[0].hashval) ||
@@ -1024,10 +1087,10 @@ xfs_dir2_leafn_rebalance(
 
        leaf1 = blk1->bp->b_addr;
        leaf2 = blk2->bp->b_addr;
-       dp->d_ops->leaf_hdr_from_disk(&hdr1, leaf1);
-       dp->d_ops->leaf_hdr_from_disk(&hdr2, leaf2);
-       ents1 = dp->d_ops->leaf_ents_p(leaf1);
-       ents2 = dp->d_ops->leaf_ents_p(leaf2);
+       xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &hdr1, leaf1);
+       xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &hdr2, leaf2);
+       ents1 = hdr1.ents;
+       ents2 = hdr2.ents;
 
        oldsum = hdr1.count + hdr2.count;
 #if defined(DEBUG) || defined(XFS_WARN)
@@ -1073,8 +1136,8 @@ xfs_dir2_leafn_rebalance(
        ASSERT(hdr1.stale + hdr2.stale == oldstale);
 
        /* log the changes made when moving the entries */
-       dp->d_ops->leaf_hdr_to_disk(leaf1, &hdr1);
-       dp->d_ops->leaf_hdr_to_disk(leaf2, &hdr2);
+       xfs_dir2_leaf_hdr_to_disk(dp->i_mount, leaf1, &hdr1);
+       xfs_dir2_leaf_hdr_to_disk(dp->i_mount, leaf2, &hdr2);
        xfs_dir3_leaf_log_header(args, blk1->bp);
        xfs_dir3_leaf_log_header(args, blk2->bp);
 
@@ -1120,19 +1183,17 @@ xfs_dir3_data_block_free(
        int                     longest)
 {
        int                     logfree = 0;
-       __be16                  *bests;
        struct xfs_dir3_icfree_hdr freehdr;
        struct xfs_inode        *dp = args->dp;
 
-       dp->d_ops->free_hdr_from_disk(&freehdr, free);
-       bests = dp->d_ops->free_bests_p(free);
+       xfs_dir2_free_hdr_from_disk(dp->i_mount, &freehdr, free);
        if (hdr) {
                /*
                 * Data block is not empty, just set the free entry to the new
                 * value.
                 */
-               bests[findex] = cpu_to_be16(longest);
-               xfs_dir2_free_log_bests(args, fbp, findex, findex);
+               freehdr.bests[findex] = cpu_to_be16(longest);
+               xfs_dir2_free_log_bests(args, &freehdr, fbp, findex, findex);
                return 0;
        }
 
@@ -1148,18 +1209,18 @@ xfs_dir3_data_block_free(
                int     i;              /* free entry index */
 
                for (i = findex - 1; i >= 0; i--) {
-                       if (bests[i] != cpu_to_be16(NULLDATAOFF))
+                       if (freehdr.bests[i] != cpu_to_be16(NULLDATAOFF))
                                break;
                }
                freehdr.nvalid = i + 1;
                logfree = 0;
        } else {
                /* Not the last entry, just punch it out.  */
-               bests[findex] = cpu_to_be16(NULLDATAOFF);
+               freehdr.bests[findex] = cpu_to_be16(NULLDATAOFF);
                logfree = 1;
        }
 
-       dp->d_ops->free_hdr_to_disk(free, &freehdr);
+       xfs_dir2_free_hdr_to_disk(dp->i_mount, free, &freehdr);
        xfs_dir2_free_log_header(args, fbp);
 
        /*
@@ -1184,7 +1245,7 @@ xfs_dir3_data_block_free(
 
        /* Log the free entry that changed, unless we got rid of it.  */
        if (logfree)
-               xfs_dir2_free_log_bests(args, fbp, findex, findex);
+               xfs_dir2_free_log_bests(args, &freehdr, fbp, findex, findex);
        return 0;
 }
 
@@ -1201,6 +1262,7 @@ xfs_dir2_leafn_remove(
        xfs_da_state_blk_t      *dblk,          /* data block */
        int                     *rval)          /* resulting block needs join */
 {
+       struct xfs_da_geometry  *geo = args->geo;
        xfs_dir2_data_hdr_t     *hdr;           /* data block header */
        xfs_dir2_db_t           db;             /* data block number */
        struct xfs_buf          *dbp;           /* data block buffer */
@@ -1215,27 +1277,25 @@ xfs_dir2_leafn_remove(
        xfs_trans_t             *tp;            /* transaction pointer */
        struct xfs_dir2_data_free *bf;          /* bestfree table */
        struct xfs_dir3_icleaf_hdr leafhdr;
-       struct xfs_dir2_leaf_entry *ents;
 
        trace_xfs_dir2_leafn_remove(args, index);
 
        dp = args->dp;
        tp = args->trans;
        leaf = bp->b_addr;
-       dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
-       ents = dp->d_ops->leaf_ents_p(leaf);
+       xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr, leaf);
 
        /*
         * Point to the entry we're removing.
         */
-       lep = &ents[index];
+       lep = &leafhdr.ents[index];
 
        /*
         * Extract the data block and offset from the entry.
         */
-       db = xfs_dir2_dataptr_to_db(args->geo, be32_to_cpu(lep->address));
+       db = xfs_dir2_dataptr_to_db(geo, be32_to_cpu(lep->address));
        ASSERT(dblk->blkno == db);
-       off = xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address));
+       off = xfs_dir2_dataptr_to_off(geo, be32_to_cpu(lep->address));
        ASSERT(dblk->index == off);
 
        /*
@@ -1243,11 +1303,11 @@ xfs_dir2_leafn_remove(
         * Log the leaf block changes.
         */
        leafhdr.stale++;
-       dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr);
+       xfs_dir2_leaf_hdr_to_disk(dp->i_mount, leaf, &leafhdr);
        xfs_dir3_leaf_log_header(args, bp);
 
        lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR);
-       xfs_dir3_leaf_log_ents(args, bp, index, index);
+       xfs_dir3_leaf_log_ents(args, &leafhdr, bp, index, index);
 
        /*
         * Make the data entry free.  Keep track of the longest freespace
@@ -1256,17 +1316,18 @@ xfs_dir2_leafn_remove(
        dbp = dblk->bp;
        hdr = dbp->b_addr;
        dep = (xfs_dir2_data_entry_t *)((char *)hdr + off);
-       bf = dp->d_ops->data_bestfree_p(hdr);
+       bf = xfs_dir2_data_bestfree_p(dp->i_mount, hdr);
        longest = be16_to_cpu(bf[0].length);
        needlog = needscan = 0;
        xfs_dir2_data_make_free(args, dbp, off,
-               dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan);
+               xfs_dir2_data_entsize(dp->i_mount, dep->namelen), &needlog,
+               &needscan);
        /*
         * Rescan the data block freespaces for bestfree.
         * Log the data block header if needed.
         */
        if (needscan)
-               xfs_dir2_data_freescan(dp, hdr, &needlog);
+               xfs_dir2_data_freescan(dp->i_mount, hdr, &needlog);
        if (needlog)
                xfs_dir2_data_log_header(args, dbp);
        xfs_dir3_data_check(dp, dbp);
@@ -1285,9 +1346,8 @@ xfs_dir2_leafn_remove(
                 * Convert the data block number to a free block,
                 * read in the free block.
                 */
-               fdb = dp->d_ops->db_to_fdb(args->geo, db);
-               error = xfs_dir2_free_read(tp, dp,
-                                          xfs_dir2_db_to_da(args->geo, fdb),
+               fdb = xfs_dir2_db_to_fdb(geo, db);
+               error = xfs_dir2_free_read(tp, dp, xfs_dir2_db_to_da(geo, fdb),
                                           &fbp);
                if (error)
                        return error;
@@ -1295,23 +1355,22 @@ xfs_dir2_leafn_remove(
 #ifdef DEBUG
        {
                struct xfs_dir3_icfree_hdr freehdr;
-               dp->d_ops->free_hdr_from_disk(&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)));
+
+               xfs_dir2_free_hdr_from_disk(dp->i_mount, &freehdr, free);
+               ASSERT(freehdr.firstdb == geo->free_max_bests *
+                       (fdb - xfs_dir2_byte_to_db(geo, XFS_DIR2_FREE_OFFSET)));
        }
 #endif
                /*
                 * Calculate which entry we need to fix.
                 */
-               findex = dp->d_ops->db_to_fdindex(args->geo, db);
+               findex = xfs_dir2_db_to_fdindex(geo, db);
                longest = be16_to_cpu(bf[0].length);
                /*
                 * If the data block is now empty we can get rid of it
                 * (usually).
                 */
-               if (longest == args->geo->blksize -
-                              dp->d_ops->data_entry_offset) {
+               if (longest == geo->blksize - geo->data_entry_offset) {
                        /*
                         * Try to punch out the data block.
                         */
@@ -1343,9 +1402,9 @@ xfs_dir2_leafn_remove(
         * Return indication of whether this leaf block is empty enough
         * to justify trying to join it with a neighbor.
         */
-       *rval = (dp->d_ops->leaf_hdr_size +
-                (uint)sizeof(ents[0]) * (leafhdr.count - leafhdr.stale)) <
-               args->geo->magicpct;
+       *rval = (geo->leaf_hdr_size +
+                (uint)sizeof(leafhdr.ents) * (leafhdr.count - leafhdr.stale)) <
+               geo->magicpct;
        return 0;
 }
 
@@ -1444,12 +1503,12 @@ xfs_dir2_leafn_toosmall(
         */
        blk = &state->path.blk[state->path.active - 1];
        leaf = blk->bp->b_addr;
-       dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
-       ents = dp->d_ops->leaf_ents_p(leaf);
+       xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr, leaf);
+       ents = leafhdr.ents;
        xfs_dir3_leaf_check(dp, blk->bp);
 
        count = leafhdr.count - leafhdr.stale;
-       bytes = dp->d_ops->leaf_hdr_size + count * sizeof(ents[0]);
+       bytes = state->args->geo->leaf_hdr_size + count * sizeof(ents[0]);
        if (bytes > (state->args->geo->blksize >> 1)) {
                /*
                 * Blk over 50%, don't try to join.
@@ -1507,8 +1566,8 @@ xfs_dir2_leafn_toosmall(
                        (state->args->geo->blksize >> 2);
 
                leaf = bp->b_addr;
-               dp->d_ops->leaf_hdr_from_disk(&hdr2, leaf);
-               ents = dp->d_ops->leaf_ents_p(leaf);
+               xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &hdr2, leaf);
+               ents = hdr2.ents;
                count += hdr2.count - hdr2.stale;
                bytes -= count * sizeof(ents[0]);
 
@@ -1570,10 +1629,10 @@ xfs_dir2_leafn_unbalance(
        drop_leaf = drop_blk->bp->b_addr;
        save_leaf = save_blk->bp->b_addr;
 
-       dp->d_ops->leaf_hdr_from_disk(&savehdr, save_leaf);
-       dp->d_ops->leaf_hdr_from_disk(&drophdr, drop_leaf);
-       sents = dp->d_ops->leaf_ents_p(save_leaf);
-       dents = dp->d_ops->leaf_ents_p(drop_leaf);
+       xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &savehdr, save_leaf);
+       xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &drophdr, drop_leaf);
+       sents = savehdr.ents;
+       dents = drophdr.ents;
 
        /*
         * If there are any stale leaf entries, take this opportunity
@@ -1599,8 +1658,8 @@ xfs_dir2_leafn_unbalance(
        save_blk->hashval = be32_to_cpu(sents[savehdr.count - 1].hashval);
 
        /* log the changes made when moving the entries */
-       dp->d_ops->leaf_hdr_to_disk(save_leaf, &savehdr);
-       dp->d_ops->leaf_hdr_to_disk(drop_leaf, &drophdr);
+       xfs_dir2_leaf_hdr_to_disk(dp->i_mount, save_leaf, &savehdr);
+       xfs_dir2_leaf_hdr_to_disk(dp->i_mount, drop_leaf, &drophdr);
        xfs_dir3_leaf_log_header(args, save_blk->bp);
        xfs_dir3_leaf_log_header(args, drop_blk->bp);
 
@@ -1619,19 +1678,16 @@ xfs_dir2_node_add_datablk(
        xfs_dir2_db_t           *dbno,
        struct xfs_buf          **dbpp,
        struct xfs_buf          **fbpp,
+       struct xfs_dir3_icfree_hdr *hdr,
        int                     *findex)
 {
        struct xfs_inode        *dp = args->dp;
        struct xfs_trans        *tp = args->trans;
        struct xfs_mount        *mp = dp->i_mount;
-       struct xfs_dir3_icfree_hdr freehdr;
        struct xfs_dir2_data_free *bf;
-       struct xfs_dir2_data_hdr *hdr;
-       struct xfs_dir2_free    *free = NULL;
        xfs_dir2_db_t           fbno;
        struct xfs_buf          *fbp;
        struct xfs_buf          *dbp;
-       __be16                  *bests = NULL;
        int                     error;
 
        /* Not allowed to allocate, return failure. */
@@ -1650,7 +1706,7 @@ xfs_dir2_node_add_datablk(
         * Get the freespace block corresponding to the data block
         * that was just allocated.
         */
-       fbno = dp->d_ops->db_to_fdb(args->geo, *dbno);
+       fbno = xfs_dir2_db_to_fdb(args->geo, *dbno);
        error = xfs_dir2_free_try_read(tp, dp,
                               xfs_dir2_db_to_da(args->geo, fbno), &fbp);
        if (error)
@@ -1665,11 +1721,13 @@ xfs_dir2_node_add_datablk(
                if (error)
                        return error;
 
-               if (dp->d_ops->db_to_fdb(args->geo, *dbno) != fbno) {
+               if (XFS_IS_CORRUPT(mp,
+                                  xfs_dir2_db_to_fdb(args->geo, *dbno) !=
+                                  fbno)) {
                        xfs_alert(mp,
 "%s: dir ino %llu needed freesp block %lld for data block %lld, got %lld",
                                __func__, (unsigned long long)dp->i_ino,
-                               (long long)dp->d_ops->db_to_fdb(args->geo, *dbno),
+                               (long long)xfs_dir2_db_to_fdb(args->geo, *dbno),
                                (long long)*dbno, (long long)fbno);
                        if (fblk) {
                                xfs_alert(mp,
@@ -1679,7 +1737,6 @@ xfs_dir2_node_add_datablk(
                        } else {
                                xfs_alert(mp, " ... fblk is NULL");
                        }
-                       XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp);
                        return -EFSCORRUPTED;
                }
 
@@ -1687,44 +1744,39 @@ xfs_dir2_node_add_datablk(
                error = xfs_dir3_free_get_buf(args, fbno, &fbp);
                if (error)
                        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, hdr, fbp->b_addr);
 
                /* Remember the first slot as our empty slot. */
-               freehdr.firstdb = (fbno - xfs_dir2_byte_to_db(args->geo,
+               hdr->firstdb = (fbno - xfs_dir2_byte_to_db(args->geo,
                                                        XFS_DIR2_FREE_OFFSET)) *
-                               dp->d_ops->free_max_bests(args->geo);
+                               args->geo->free_max_bests;
        } 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, hdr, fbp->b_addr);
        }
 
        /* Set the freespace block index from the data block number. */
-       *findex = dp->d_ops->db_to_fdindex(args->geo, *dbno);
+       *findex = xfs_dir2_db_to_fdindex(args->geo, *dbno);
 
        /* Extend the freespace table if the new data block is off the end. */
-       if (*findex >= freehdr.nvalid) {
-               ASSERT(*findex < dp->d_ops->free_max_bests(args->geo));
-               freehdr.nvalid = *findex + 1;
-               bests[*findex] = cpu_to_be16(NULLDATAOFF);
+       if (*findex >= hdr->nvalid) {
+               ASSERT(*findex < args->geo->free_max_bests);
+               hdr->nvalid = *findex + 1;
+               hdr->bests[*findex] = cpu_to_be16(NULLDATAOFF);
        }
 
        /*
         * If this entry was for an empty data block (this should always be
         * true) then update the header.
         */
-       if (bests[*findex] == cpu_to_be16(NULLDATAOFF)) {
-               freehdr.nused++;
-               dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr);
+       if (hdr->bests[*findex] == cpu_to_be16(NULLDATAOFF)) {
+               hdr->nused++;
+               xfs_dir2_free_hdr_to_disk(mp, fbp->b_addr, hdr);
                xfs_dir2_free_log_header(args, fbp);
        }
 
        /* Update the freespace value for the new block in the table. */
-       hdr = dbp->b_addr;
-       bf = dp->d_ops->data_bestfree_p(hdr);
-       bests[*findex] = bf[0].length;
+       bf = xfs_dir2_data_bestfree_p(mp, dbp->b_addr);
+       hdr->bests[*findex] = bf[0].length;
 
        *dbpp = dbp;
        *fbpp = fbp;
@@ -1737,11 +1789,10 @@ xfs_dir2_node_find_freeblk(
        struct xfs_da_state_blk *fblk,
        xfs_dir2_db_t           *dbnop,
        struct xfs_buf          **fbpp,
+       struct xfs_dir3_icfree_hdr *hdr,
        int                     *findexp,
        int                     length)
 {
-       struct xfs_dir3_icfree_hdr freehdr;
-       struct xfs_dir2_free    *free = NULL;
        struct xfs_inode        *dp = args->dp;
        struct xfs_trans        *tp = args->trans;
        struct xfs_buf          *fbp = NULL;
@@ -1751,7 +1802,6 @@ xfs_dir2_node_find_freeblk(
        xfs_dir2_db_t           dbno = -1;
        xfs_dir2_db_t           fbno;
        xfs_fileoff_t           fo;
-       __be16                  *bests = NULL;
        int                     findex = 0;
        int                     error;
 
@@ -1762,17 +1812,14 @@ xfs_dir2_node_find_freeblk(
         */
        if (fblk) {
                fbp = fblk->bp;
-               free = fbp->b_addr;
                findex = fblk->index;
+               xfs_dir2_free_hdr_from_disk(dp->i_mount, hdr, fbp->b_addr);
                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);
-
-                       ASSERT(findex < freehdr.nvalid);
-                       ASSERT(be16_to_cpu(bests[findex]) != NULLDATAOFF);
-                       ASSERT(be16_to_cpu(bests[findex]) >= length);
-                       dbno = freehdr.firstdb + findex;
+                       ASSERT(findex < hdr->nvalid);
+                       ASSERT(be16_to_cpu(hdr->bests[findex]) != NULLDATAOFF);
+                       ASSERT(be16_to_cpu(hdr->bests[findex]) >= length);
+                       dbno = hdr->firstdb + findex;
                        goto found_block;
                }
 
@@ -1814,15 +1861,13 @@ xfs_dir2_node_find_freeblk(
                if (!fbp)
                        continue;
 
-               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, hdr, fbp->b_addr);
 
                /* Scan the free entry array for a large enough free space. */
-               for (findex = freehdr.nvalid - 1; findex >= 0; findex--) {
-                       if (be16_to_cpu(bests[findex]) != NULLDATAOFF &&
-                           be16_to_cpu(bests[findex]) >= length) {
-                               dbno = freehdr.firstdb + findex;
+               for (findex = hdr->nvalid - 1; findex >= 0; findex--) {
+                       if (be16_to_cpu(hdr->bests[findex]) != NULLDATAOFF &&
+                           be16_to_cpu(hdr->bests[findex]) >= length) {
+                               dbno = hdr->firstdb + findex;
                                goto found_block;
                        }
                }
@@ -1838,7 +1883,6 @@ found_block:
        return 0;
 }
 
-
 /*
  * Add the data entry for a node-format directory name addition.
  * The leaf entry is added in xfs_dir2_leafn_add.
@@ -1853,9 +1897,9 @@ xfs_dir2_node_addname_int(
        struct xfs_dir2_data_entry *dep;        /* data entry pointer */
        struct xfs_dir2_data_hdr *hdr;          /* data block header */
        struct xfs_dir2_data_free *bf;
-       struct xfs_dir2_free    *free = NULL;   /* freespace block structure */
        struct xfs_trans        *tp = args->trans;
        struct xfs_inode        *dp = args->dp;
+       struct xfs_dir3_icfree_hdr freehdr;
        struct xfs_buf          *dbp;           /* data block buffer */
        struct xfs_buf          *fbp;           /* freespace buffer */
        xfs_dir2_data_aoff_t    aoff;
@@ -1867,11 +1911,10 @@ xfs_dir2_node_addname_int(
        int                     needlog = 0;    /* need to log data header */
        int                     needscan = 0;   /* need to rescan data frees */
        __be16                  *tagp;          /* data entry tag pointer */
-       __be16                  *bests;
 
-       length = dp->d_ops->data_entsize(args->namelen);
-       error = xfs_dir2_node_find_freeblk(args, fblk, &dbno, &fbp, &findex,
-                                          length);
+       length = xfs_dir2_data_entsize(dp->i_mount, args->namelen);
+       error = xfs_dir2_node_find_freeblk(args, fblk, &dbno, &fbp, &freehdr,
+                                          &findex, length);
        if (error)
                return error;
 
@@ -1893,7 +1936,7 @@ xfs_dir2_node_addname_int(
                /* we're going to have to log the free block index later */
                logfree = 1;
                error = xfs_dir2_node_add_datablk(args, fblk, &dbno, &dbp, &fbp,
-                                                 &findex);
+                                                 &freehdr, &findex);
        } else {
                /* Read the data block in. */
                error = xfs_dir3_data_read(tp, dp,
@@ -1905,7 +1948,7 @@ xfs_dir2_node_addname_int(
 
        /* setup for data block up now */
        hdr = dbp->b_addr;
-       bf = dp->d_ops->data_bestfree_p(hdr);
+       bf = xfs_dir2_data_bestfree_p(dp->i_mount, hdr);
        ASSERT(be16_to_cpu(bf[0].length) >= length);
 
        /* Point to the existing unused space. */
@@ -1926,28 +1969,26 @@ xfs_dir2_node_addname_int(
        dep->inumber = cpu_to_be64(args->inumber);
        dep->namelen = args->namelen;
        memcpy(dep->name, args->name, dep->namelen);
-       dp->d_ops->data_put_ftype(dep, args->filetype);
-       tagp = dp->d_ops->data_entry_tag_p(dep);
+       xfs_dir2_data_put_ftype(dp->i_mount, dep, args->filetype);
+       tagp = xfs_dir2_data_entry_tag_p(dp->i_mount, dep);
        *tagp = cpu_to_be16((char *)dep - (char *)hdr);
        xfs_dir2_data_log_entry(args, dbp, dep);
 
        /* Rescan the freespace and log the data block if needed. */
        if (needscan)
-               xfs_dir2_data_freescan(dp, hdr, &needlog);
+               xfs_dir2_data_freescan(dp->i_mount, hdr, &needlog);
        if (needlog)
                xfs_dir2_data_log_header(args, dbp);
 
        /* If the freespace block entry is now wrong, update it. */
-       free = fbp->b_addr;
-       bests = dp->d_ops->free_bests_p(free);
-       if (bests[findex] != bf[0].length) {
-               bests[findex] = bf[0].length;
+       if (freehdr.bests[findex] != bf[0].length) {
+               freehdr.bests[findex] = bf[0].length;
                logfree = 1;
        }
 
        /* Log the freespace entry if needed. */
        if (logfree)
-               xfs_dir2_free_log_bests(args, fbp, findex, findex);
+               xfs_dir2_free_log_bests(args, &freehdr, fbp, findex, findex);
 
        /* Return the data block and offset in args. */
        args->blkno = (xfs_dablk_t)dbno;
@@ -2155,8 +2196,6 @@ xfs_dir2_node_replace(
        int                     i;              /* btree level */
        xfs_ino_t               inum;           /* new inode number */
        int                     ftype;          /* new file type */
-       xfs_dir2_leaf_t         *leaf;          /* leaf structure */
-       xfs_dir2_leaf_entry_t   *lep;           /* leaf entry being changed */
        int                     rval;           /* internal return value */
        xfs_da_state_t          *state;         /* btree cursor */
 
@@ -2188,16 +2227,17 @@ xfs_dir2_node_replace(
         * and locked it.  But paranoia is good.
         */
        if (rval == -EEXIST) {
-               struct xfs_dir2_leaf_entry *ents;
+               struct xfs_dir3_icleaf_hdr      leafhdr;
+
                /*
                 * Find the leaf entry.
                 */
                blk = &state->path.blk[state->path.active - 1];
                ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC);
-               leaf = blk->bp->b_addr;
-               ents = args->dp->d_ops->leaf_ents_p(leaf);
-               lep = &ents[blk->index];
                ASSERT(state->extravalid);
+
+               xfs_dir2_leaf_hdr_from_disk(state->mp, &leafhdr,
+                                           blk->bp->b_addr);
                /*
                 * Point to the data entry.
                 */
@@ -2207,13 +2247,13 @@ xfs_dir2_node_replace(
                dep = (xfs_dir2_data_entry_t *)
                      ((char *)hdr +
                       xfs_dir2_dataptr_to_off(args->geo,
-                                              be32_to_cpu(lep->address)));
+                               be32_to_cpu(leafhdr.ents[blk->index].address)));
                ASSERT(inum != be64_to_cpu(dep->inumber));
                /*
                 * Fill in the new inode number and log the entry.
                 */
                dep->inumber = cpu_to_be64(inum);
-               args->dp->d_ops->data_put_ftype(dep, ftype);
+               xfs_dir2_data_put_ftype(state->mp, dep, ftype);
                xfs_dir2_data_log_entry(args, state->extrablk.bp, dep);
                rval = 0;
        }
@@ -2270,7 +2310,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.