Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
0004  * Copyright (c) 2013 Red Hat, Inc.
0005  * All Rights Reserved.
0006  */
0007 #include "xfs.h"
0008 #include "xfs_fs.h"
0009 #include "xfs_shared.h"
0010 #include "xfs_format.h"
0011 #include "xfs_log_format.h"
0012 #include "xfs_trans_resv.h"
0013 #include "xfs_mount.h"
0014 #include "xfs_inode.h"
0015 #include "xfs_bmap.h"
0016 #include "xfs_dir2.h"
0017 #include "xfs_dir2_priv.h"
0018 #include "xfs_error.h"
0019 #include "xfs_trace.h"
0020 #include "xfs_trans.h"
0021 #include "xfs_buf_item.h"
0022 
0023 /*
0024  * Local function declarations.
0025  */
0026 static int xfs_dir2_leaf_lookup_int(xfs_da_args_t *args, struct xfs_buf **lbpp,
0027                     int *indexp, struct xfs_buf **dbpp,
0028                     struct xfs_dir3_icleaf_hdr *leafhdr);
0029 static void xfs_dir3_leaf_log_bests(struct xfs_da_args *args,
0030                     struct xfs_buf *bp, int first, int last);
0031 static void xfs_dir3_leaf_log_tail(struct xfs_da_args *args,
0032                    struct xfs_buf *bp);
0033 
0034 void
0035 xfs_dir2_leaf_hdr_from_disk(
0036     struct xfs_mount        *mp,
0037     struct xfs_dir3_icleaf_hdr  *to,
0038     struct xfs_dir2_leaf        *from)
0039 {
0040     if (xfs_has_crc(mp)) {
0041         struct xfs_dir3_leaf *from3 = (struct xfs_dir3_leaf *)from;
0042 
0043         to->forw = be32_to_cpu(from3->hdr.info.hdr.forw);
0044         to->back = be32_to_cpu(from3->hdr.info.hdr.back);
0045         to->magic = be16_to_cpu(from3->hdr.info.hdr.magic);
0046         to->count = be16_to_cpu(from3->hdr.count);
0047         to->stale = be16_to_cpu(from3->hdr.stale);
0048         to->ents = from3->__ents;
0049 
0050         ASSERT(to->magic == XFS_DIR3_LEAF1_MAGIC ||
0051                to->magic == XFS_DIR3_LEAFN_MAGIC);
0052     } else {
0053         to->forw = be32_to_cpu(from->hdr.info.forw);
0054         to->back = be32_to_cpu(from->hdr.info.back);
0055         to->magic = be16_to_cpu(from->hdr.info.magic);
0056         to->count = be16_to_cpu(from->hdr.count);
0057         to->stale = be16_to_cpu(from->hdr.stale);
0058         to->ents = from->__ents;
0059 
0060         ASSERT(to->magic == XFS_DIR2_LEAF1_MAGIC ||
0061                to->magic == XFS_DIR2_LEAFN_MAGIC);
0062     }
0063 }
0064 
0065 void
0066 xfs_dir2_leaf_hdr_to_disk(
0067     struct xfs_mount        *mp,
0068     struct xfs_dir2_leaf        *to,
0069     struct xfs_dir3_icleaf_hdr  *from)
0070 {
0071     if (xfs_has_crc(mp)) {
0072         struct xfs_dir3_leaf *to3 = (struct xfs_dir3_leaf *)to;
0073 
0074         ASSERT(from->magic == XFS_DIR3_LEAF1_MAGIC ||
0075                from->magic == XFS_DIR3_LEAFN_MAGIC);
0076 
0077         to3->hdr.info.hdr.forw = cpu_to_be32(from->forw);
0078         to3->hdr.info.hdr.back = cpu_to_be32(from->back);
0079         to3->hdr.info.hdr.magic = cpu_to_be16(from->magic);
0080         to3->hdr.count = cpu_to_be16(from->count);
0081         to3->hdr.stale = cpu_to_be16(from->stale);
0082     } else {
0083         ASSERT(from->magic == XFS_DIR2_LEAF1_MAGIC ||
0084                from->magic == XFS_DIR2_LEAFN_MAGIC);
0085 
0086         to->hdr.info.forw = cpu_to_be32(from->forw);
0087         to->hdr.info.back = cpu_to_be32(from->back);
0088         to->hdr.info.magic = cpu_to_be16(from->magic);
0089         to->hdr.count = cpu_to_be16(from->count);
0090         to->hdr.stale = cpu_to_be16(from->stale);
0091     }
0092 }
0093 
0094 /*
0095  * Check the internal consistency of a leaf1 block.
0096  * Pop an assert if something is wrong.
0097  */
0098 #ifdef DEBUG
0099 static xfs_failaddr_t
0100 xfs_dir3_leaf1_check(
0101     struct xfs_inode    *dp,
0102     struct xfs_buf      *bp)
0103 {
0104     struct xfs_dir2_leaf    *leaf = bp->b_addr;
0105     struct xfs_dir3_icleaf_hdr leafhdr;
0106 
0107     xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr, leaf);
0108 
0109     if (leafhdr.magic == XFS_DIR3_LEAF1_MAGIC) {
0110         struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr;
0111         if (be64_to_cpu(leaf3->info.blkno) != xfs_buf_daddr(bp))
0112             return __this_address;
0113     } else if (leafhdr.magic != XFS_DIR2_LEAF1_MAGIC)
0114         return __this_address;
0115 
0116     return xfs_dir3_leaf_check_int(dp->i_mount, &leafhdr, leaf, false);
0117 }
0118 
0119 static inline void
0120 xfs_dir3_leaf_check(
0121     struct xfs_inode    *dp,
0122     struct xfs_buf      *bp)
0123 {
0124     xfs_failaddr_t      fa;
0125 
0126     fa = xfs_dir3_leaf1_check(dp, bp);
0127     if (!fa)
0128         return;
0129     xfs_corruption_error(__func__, XFS_ERRLEVEL_LOW, dp->i_mount,
0130             bp->b_addr, BBTOB(bp->b_length), __FILE__, __LINE__,
0131             fa);
0132     ASSERT(0);
0133 }
0134 #else
0135 #define xfs_dir3_leaf_check(dp, bp)
0136 #endif
0137 
0138 xfs_failaddr_t
0139 xfs_dir3_leaf_check_int(
0140     struct xfs_mount        *mp,
0141     struct xfs_dir3_icleaf_hdr  *hdr,
0142     struct xfs_dir2_leaf        *leaf,
0143     bool                expensive_checking)
0144 {
0145     struct xfs_da_geometry      *geo = mp->m_dir_geo;
0146     xfs_dir2_leaf_tail_t        *ltp;
0147     int             stale;
0148     int             i;
0149 
0150     ltp = xfs_dir2_leaf_tail_p(geo, leaf);
0151 
0152     /*
0153      * XXX (dgc): This value is not restrictive enough.
0154      * Should factor in the size of the bests table as well.
0155      * We can deduce a value for that from i_disk_size.
0156      */
0157     if (hdr->count > geo->leaf_max_ents)
0158         return __this_address;
0159 
0160     /* Leaves and bests don't overlap in leaf format. */
0161     if ((hdr->magic == XFS_DIR2_LEAF1_MAGIC ||
0162          hdr->magic == XFS_DIR3_LEAF1_MAGIC) &&
0163         (char *)&hdr->ents[hdr->count] > (char *)xfs_dir2_leaf_bests_p(ltp))
0164         return __this_address;
0165 
0166     if (!expensive_checking)
0167         return NULL;
0168 
0169     /* Check hash value order, count stale entries.  */
0170     for (i = stale = 0; i < hdr->count; i++) {
0171         if (i + 1 < hdr->count) {
0172             if (be32_to_cpu(hdr->ents[i].hashval) >
0173                     be32_to_cpu(hdr->ents[i + 1].hashval))
0174                 return __this_address;
0175         }
0176         if (hdr->ents[i].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR))
0177             stale++;
0178     }
0179     if (hdr->stale != stale)
0180         return __this_address;
0181     return NULL;
0182 }
0183 
0184 /*
0185  * We verify the magic numbers before decoding the leaf header so that on debug
0186  * kernels we don't get assertion failures in xfs_dir3_leaf_hdr_from_disk() due
0187  * to incorrect magic numbers.
0188  */
0189 static xfs_failaddr_t
0190 xfs_dir3_leaf_verify(
0191     struct xfs_buf          *bp)
0192 {
0193     struct xfs_mount        *mp = bp->b_mount;
0194     struct xfs_dir3_icleaf_hdr  leafhdr;
0195     xfs_failaddr_t          fa;
0196 
0197     fa = xfs_da3_blkinfo_verify(bp, bp->b_addr);
0198     if (fa)
0199         return fa;
0200 
0201     xfs_dir2_leaf_hdr_from_disk(mp, &leafhdr, bp->b_addr);
0202     return xfs_dir3_leaf_check_int(mp, &leafhdr, bp->b_addr, true);
0203 }
0204 
0205 static void
0206 xfs_dir3_leaf_read_verify(
0207     struct xfs_buf  *bp)
0208 {
0209     struct xfs_mount    *mp = bp->b_mount;
0210     xfs_failaddr_t      fa;
0211 
0212     if (xfs_has_crc(mp) &&
0213          !xfs_buf_verify_cksum(bp, XFS_DIR3_LEAF_CRC_OFF))
0214         xfs_verifier_error(bp, -EFSBADCRC, __this_address);
0215     else {
0216         fa = xfs_dir3_leaf_verify(bp);
0217         if (fa)
0218             xfs_verifier_error(bp, -EFSCORRUPTED, fa);
0219     }
0220 }
0221 
0222 static void
0223 xfs_dir3_leaf_write_verify(
0224     struct xfs_buf  *bp)
0225 {
0226     struct xfs_mount    *mp = bp->b_mount;
0227     struct xfs_buf_log_item *bip = bp->b_log_item;
0228     struct xfs_dir3_leaf_hdr *hdr3 = bp->b_addr;
0229     xfs_failaddr_t      fa;
0230 
0231     fa = xfs_dir3_leaf_verify(bp);
0232     if (fa) {
0233         xfs_verifier_error(bp, -EFSCORRUPTED, fa);
0234         return;
0235     }
0236 
0237     if (!xfs_has_crc(mp))
0238         return;
0239 
0240     if (bip)
0241         hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn);
0242 
0243     xfs_buf_update_cksum(bp, XFS_DIR3_LEAF_CRC_OFF);
0244 }
0245 
0246 const struct xfs_buf_ops xfs_dir3_leaf1_buf_ops = {
0247     .name = "xfs_dir3_leaf1",
0248     .magic16 = { cpu_to_be16(XFS_DIR2_LEAF1_MAGIC),
0249              cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) },
0250     .verify_read = xfs_dir3_leaf_read_verify,
0251     .verify_write = xfs_dir3_leaf_write_verify,
0252     .verify_struct = xfs_dir3_leaf_verify,
0253 };
0254 
0255 const struct xfs_buf_ops xfs_dir3_leafn_buf_ops = {
0256     .name = "xfs_dir3_leafn",
0257     .magic16 = { cpu_to_be16(XFS_DIR2_LEAFN_MAGIC),
0258              cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) },
0259     .verify_read = xfs_dir3_leaf_read_verify,
0260     .verify_write = xfs_dir3_leaf_write_verify,
0261     .verify_struct = xfs_dir3_leaf_verify,
0262 };
0263 
0264 int
0265 xfs_dir3_leaf_read(
0266     struct xfs_trans    *tp,
0267     struct xfs_inode    *dp,
0268     xfs_dablk_t     fbno,
0269     struct xfs_buf      **bpp)
0270 {
0271     int         err;
0272 
0273     err = xfs_da_read_buf(tp, dp, fbno, 0, bpp, XFS_DATA_FORK,
0274             &xfs_dir3_leaf1_buf_ops);
0275     if (!err && tp && *bpp)
0276         xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_LEAF1_BUF);
0277     return err;
0278 }
0279 
0280 int
0281 xfs_dir3_leafn_read(
0282     struct xfs_trans    *tp,
0283     struct xfs_inode    *dp,
0284     xfs_dablk_t     fbno,
0285     struct xfs_buf      **bpp)
0286 {
0287     int         err;
0288 
0289     err = xfs_da_read_buf(tp, dp, fbno, 0, bpp, XFS_DATA_FORK,
0290             &xfs_dir3_leafn_buf_ops);
0291     if (!err && tp && *bpp)
0292         xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_LEAFN_BUF);
0293     return err;
0294 }
0295 
0296 /*
0297  * Initialize a new leaf block, leaf1 or leafn magic accepted.
0298  */
0299 static void
0300 xfs_dir3_leaf_init(
0301     struct xfs_mount    *mp,
0302     struct xfs_trans    *tp,
0303     struct xfs_buf      *bp,
0304     xfs_ino_t       owner,
0305     uint16_t        type)
0306 {
0307     struct xfs_dir2_leaf    *leaf = bp->b_addr;
0308 
0309     ASSERT(type == XFS_DIR2_LEAF1_MAGIC || type == XFS_DIR2_LEAFN_MAGIC);
0310 
0311     if (xfs_has_crc(mp)) {
0312         struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr;
0313 
0314         memset(leaf3, 0, sizeof(*leaf3));
0315 
0316         leaf3->info.hdr.magic = (type == XFS_DIR2_LEAF1_MAGIC)
0317                      ? cpu_to_be16(XFS_DIR3_LEAF1_MAGIC)
0318                      : cpu_to_be16(XFS_DIR3_LEAFN_MAGIC);
0319         leaf3->info.blkno = cpu_to_be64(xfs_buf_daddr(bp));
0320         leaf3->info.owner = cpu_to_be64(owner);
0321         uuid_copy(&leaf3->info.uuid, &mp->m_sb.sb_meta_uuid);
0322     } else {
0323         memset(leaf, 0, sizeof(*leaf));
0324         leaf->hdr.info.magic = cpu_to_be16(type);
0325     }
0326 
0327     /*
0328      * If it's a leaf-format directory initialize the tail.
0329      * Caller is responsible for initialising the bests table.
0330      */
0331     if (type == XFS_DIR2_LEAF1_MAGIC) {
0332         struct xfs_dir2_leaf_tail *ltp;
0333 
0334         ltp = xfs_dir2_leaf_tail_p(mp->m_dir_geo, leaf);
0335         ltp->bestcount = 0;
0336         bp->b_ops = &xfs_dir3_leaf1_buf_ops;
0337         xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAF1_BUF);
0338     } else {
0339         bp->b_ops = &xfs_dir3_leafn_buf_ops;
0340         xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAFN_BUF);
0341     }
0342 }
0343 
0344 int
0345 xfs_dir3_leaf_get_buf(
0346     xfs_da_args_t       *args,
0347     xfs_dir2_db_t       bno,
0348     struct xfs_buf      **bpp,
0349     uint16_t        magic)
0350 {
0351     struct xfs_inode    *dp = args->dp;
0352     struct xfs_trans    *tp = args->trans;
0353     struct xfs_mount    *mp = dp->i_mount;
0354     struct xfs_buf      *bp;
0355     int         error;
0356 
0357     ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC);
0358     ASSERT(bno >= xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET) &&
0359            bno < xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET));
0360 
0361     error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, bno),
0362                    &bp, XFS_DATA_FORK);
0363     if (error)
0364         return error;
0365 
0366     xfs_dir3_leaf_init(mp, tp, bp, dp->i_ino, magic);
0367     xfs_dir3_leaf_log_header(args, bp);
0368     if (magic == XFS_DIR2_LEAF1_MAGIC)
0369         xfs_dir3_leaf_log_tail(args, bp);
0370     *bpp = bp;
0371     return 0;
0372 }
0373 
0374 /*
0375  * Convert a block form directory to a leaf form directory.
0376  */
0377 int                     /* error */
0378 xfs_dir2_block_to_leaf(
0379     xfs_da_args_t       *args,      /* operation arguments */
0380     struct xfs_buf      *dbp)       /* input block's buffer */
0381 {
0382     __be16          *bestsp;    /* leaf's bestsp entries */
0383     xfs_dablk_t     blkno;      /* leaf block's bno */
0384     xfs_dir2_data_hdr_t *hdr;       /* block header */
0385     xfs_dir2_leaf_entry_t   *blp;       /* block's leaf entries */
0386     xfs_dir2_block_tail_t   *btp;       /* block's tail */
0387     xfs_inode_t     *dp;        /* incore directory inode */
0388     int         error;      /* error return code */
0389     struct xfs_buf      *lbp;       /* leaf block's buffer */
0390     xfs_dir2_db_t       ldb;        /* leaf block's bno */
0391     xfs_dir2_leaf_t     *leaf;      /* leaf structure */
0392     xfs_dir2_leaf_tail_t    *ltp;       /* leaf's tail */
0393     int         needlog;    /* need to log block header */
0394     int         needscan;   /* need to rescan bestfree */
0395     xfs_trans_t     *tp;        /* transaction pointer */
0396     struct xfs_dir2_data_free *bf;
0397     struct xfs_dir3_icleaf_hdr leafhdr;
0398 
0399     trace_xfs_dir2_block_to_leaf(args);
0400 
0401     dp = args->dp;
0402     tp = args->trans;
0403     /*
0404      * Add the leaf block to the inode.
0405      * This interface will only put blocks in the leaf/node range.
0406      * Since that's empty now, we'll get the root (block 0 in range).
0407      */
0408     if ((error = xfs_da_grow_inode(args, &blkno))) {
0409         return error;
0410     }
0411     ldb = xfs_dir2_da_to_db(args->geo, blkno);
0412     ASSERT(ldb == xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET));
0413     /*
0414      * Initialize the leaf block, get a buffer for it.
0415      */
0416     error = xfs_dir3_leaf_get_buf(args, ldb, &lbp, XFS_DIR2_LEAF1_MAGIC);
0417     if (error)
0418         return error;
0419 
0420     leaf = lbp->b_addr;
0421     hdr = dbp->b_addr;
0422     xfs_dir3_data_check(dp, dbp);
0423     btp = xfs_dir2_block_tail_p(args->geo, hdr);
0424     blp = xfs_dir2_block_leaf_p(btp);
0425     bf = xfs_dir2_data_bestfree_p(dp->i_mount, hdr);
0426 
0427     /*
0428      * Set the counts in the leaf header.
0429      */
0430     xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr, leaf);
0431     leafhdr.count = be32_to_cpu(btp->count);
0432     leafhdr.stale = be32_to_cpu(btp->stale);
0433     xfs_dir2_leaf_hdr_to_disk(dp->i_mount, leaf, &leafhdr);
0434     xfs_dir3_leaf_log_header(args, lbp);
0435 
0436     /*
0437      * Could compact these but I think we always do the conversion
0438      * after squeezing out stale entries.
0439      */
0440     memcpy(leafhdr.ents, blp,
0441         be32_to_cpu(btp->count) * sizeof(struct xfs_dir2_leaf_entry));
0442     xfs_dir3_leaf_log_ents(args, &leafhdr, lbp, 0, leafhdr.count - 1);
0443     needscan = 0;
0444     needlog = 1;
0445     /*
0446      * Make the space formerly occupied by the leaf entries and block
0447      * tail be free.
0448      */
0449     xfs_dir2_data_make_free(args, dbp,
0450         (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr),
0451         (xfs_dir2_data_aoff_t)((char *)hdr + args->geo->blksize -
0452                        (char *)blp),
0453         &needlog, &needscan);
0454     /*
0455      * Fix up the block header, make it a data block.
0456      */
0457     dbp->b_ops = &xfs_dir3_data_buf_ops;
0458     xfs_trans_buf_set_type(tp, dbp, XFS_BLFT_DIR_DATA_BUF);
0459     if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC))
0460         hdr->magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC);
0461     else
0462         hdr->magic = cpu_to_be32(XFS_DIR3_DATA_MAGIC);
0463 
0464     if (needscan)
0465         xfs_dir2_data_freescan(dp->i_mount, hdr, &needlog);
0466     /*
0467      * Set up leaf tail and bests table.
0468      */
0469     ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
0470     ltp->bestcount = cpu_to_be32(1);
0471     bestsp = xfs_dir2_leaf_bests_p(ltp);
0472     bestsp[0] =  bf[0].length;
0473     /*
0474      * Log the data header and leaf bests table.
0475      */
0476     if (needlog)
0477         xfs_dir2_data_log_header(args, dbp);
0478     xfs_dir3_leaf_check(dp, lbp);
0479     xfs_dir3_data_check(dp, dbp);
0480     xfs_dir3_leaf_log_bests(args, lbp, 0, 0);
0481     return 0;
0482 }
0483 
0484 STATIC void
0485 xfs_dir3_leaf_find_stale(
0486     struct xfs_dir3_icleaf_hdr *leafhdr,
0487     struct xfs_dir2_leaf_entry *ents,
0488     int         index,
0489     int         *lowstale,
0490     int         *highstale)
0491 {
0492     /*
0493      * Find the first stale entry before our index, if any.
0494      */
0495     for (*lowstale = index - 1; *lowstale >= 0; --*lowstale) {
0496         if (ents[*lowstale].address ==
0497             cpu_to_be32(XFS_DIR2_NULL_DATAPTR))
0498             break;
0499     }
0500 
0501     /*
0502      * Find the first stale entry at or after our index, if any.
0503      * Stop if the result would require moving more entries than using
0504      * lowstale.
0505      */
0506     for (*highstale = index; *highstale < leafhdr->count; ++*highstale) {
0507         if (ents[*highstale].address ==
0508             cpu_to_be32(XFS_DIR2_NULL_DATAPTR))
0509             break;
0510         if (*lowstale >= 0 && index - *lowstale <= *highstale - index)
0511             break;
0512     }
0513 }
0514 
0515 struct xfs_dir2_leaf_entry *
0516 xfs_dir3_leaf_find_entry(
0517     struct xfs_dir3_icleaf_hdr *leafhdr,
0518     struct xfs_dir2_leaf_entry *ents,
0519     int         index,      /* leaf table position */
0520     int         compact,    /* need to compact leaves */
0521     int         lowstale,   /* index of prev stale leaf */
0522     int         highstale,  /* index of next stale leaf */
0523     int         *lfloglow,  /* low leaf logging index */
0524     int         *lfloghigh) /* high leaf logging index */
0525 {
0526     if (!leafhdr->stale) {
0527         xfs_dir2_leaf_entry_t   *lep;   /* leaf entry table pointer */
0528 
0529         /*
0530          * Now we need to make room to insert the leaf entry.
0531          *
0532          * If there are no stale entries, just insert a hole at index.
0533          */
0534         lep = &ents[index];
0535         if (index < leafhdr->count)
0536             memmove(lep + 1, lep,
0537                 (leafhdr->count - index) * sizeof(*lep));
0538 
0539         /*
0540          * Record low and high logging indices for the leaf.
0541          */
0542         *lfloglow = index;
0543         *lfloghigh = leafhdr->count++;
0544         return lep;
0545     }
0546 
0547     /*
0548      * There are stale entries.
0549      *
0550      * We will use one of them for the new entry.  It's probably not at
0551      * the right location, so we'll have to shift some up or down first.
0552      *
0553      * If we didn't compact before, we need to find the nearest stale
0554      * entries before and after our insertion point.
0555      */
0556     if (compact == 0)
0557         xfs_dir3_leaf_find_stale(leafhdr, ents, index,
0558                      &lowstale, &highstale);
0559 
0560     /*
0561      * If the low one is better, use it.
0562      */
0563     if (lowstale >= 0 &&
0564         (highstale == leafhdr->count ||
0565          index - lowstale - 1 < highstale - index)) {
0566         ASSERT(index - lowstale - 1 >= 0);
0567         ASSERT(ents[lowstale].address ==
0568                cpu_to_be32(XFS_DIR2_NULL_DATAPTR));
0569 
0570         /*
0571          * Copy entries up to cover the stale entry and make room
0572          * for the new entry.
0573          */
0574         if (index - lowstale - 1 > 0) {
0575             memmove(&ents[lowstale], &ents[lowstale + 1],
0576                 (index - lowstale - 1) *
0577                     sizeof(xfs_dir2_leaf_entry_t));
0578         }
0579         *lfloglow = min(lowstale, *lfloglow);
0580         *lfloghigh = max(index - 1, *lfloghigh);
0581         leafhdr->stale--;
0582         return &ents[index - 1];
0583     }
0584 
0585     /*
0586      * The high one is better, so use that one.
0587      */
0588     ASSERT(highstale - index >= 0);
0589     ASSERT(ents[highstale].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR));
0590 
0591     /*
0592      * Copy entries down to cover the stale entry and make room for the
0593      * new entry.
0594      */
0595     if (highstale - index > 0) {
0596         memmove(&ents[index + 1], &ents[index],
0597             (highstale - index) * sizeof(xfs_dir2_leaf_entry_t));
0598     }
0599     *lfloglow = min(index, *lfloglow);
0600     *lfloghigh = max(highstale, *lfloghigh);
0601     leafhdr->stale--;
0602     return &ents[index];
0603 }
0604 
0605 /*
0606  * Add an entry to a leaf form directory.
0607  */
0608 int                     /* error */
0609 xfs_dir2_leaf_addname(
0610     struct xfs_da_args  *args)      /* operation arguments */
0611 {
0612     struct xfs_dir3_icleaf_hdr leafhdr;
0613     struct xfs_trans    *tp = args->trans;
0614     __be16          *bestsp;    /* freespace table in leaf */
0615     __be16          *tagp;      /* end of data entry */
0616     struct xfs_buf      *dbp;       /* data block buffer */
0617     struct xfs_buf      *lbp;       /* leaf's buffer */
0618     struct xfs_dir2_leaf    *leaf;      /* leaf structure */
0619     struct xfs_inode    *dp = args->dp; /* incore directory inode */
0620     struct xfs_dir2_data_hdr *hdr;      /* data block header */
0621     struct xfs_dir2_data_entry *dep;    /* data block entry */
0622     struct xfs_dir2_leaf_entry *lep;    /* leaf entry table pointer */
0623     struct xfs_dir2_leaf_entry *ents;
0624     struct xfs_dir2_data_unused *dup;   /* data unused entry */
0625     struct xfs_dir2_leaf_tail *ltp;     /* leaf tail pointer */
0626     struct xfs_dir2_data_free *bf;      /* bestfree table */
0627     int         compact;    /* need to compact leaves */
0628     int         error;      /* error return value */
0629     int         grown;      /* allocated new data block */
0630     int         highstale = 0;  /* index of next stale leaf */
0631     int         i;      /* temporary, index */
0632     int         index;      /* leaf table position */
0633     int         length;     /* length of new entry */
0634     int         lfloglow;   /* low leaf logging index */
0635     int         lfloghigh;  /* high leaf logging index */
0636     int         lowstale = 0;   /* index of prev stale leaf */
0637     int         needbytes;  /* leaf block bytes needed */
0638     int         needlog;    /* need to log data header */
0639     int         needscan;   /* need to rescan data free */
0640     xfs_dir2_db_t       use_block;  /* data block number */
0641 
0642     trace_xfs_dir2_leaf_addname(args);
0643 
0644     error = xfs_dir3_leaf_read(tp, dp, args->geo->leafblk, &lbp);
0645     if (error)
0646         return error;
0647 
0648     /*
0649      * Look up the entry by hash value and name.
0650      * We know it's not there, our caller has already done a lookup.
0651      * So the index is of the entry to insert in front of.
0652      * But if there are dup hash values the index is of the first of those.
0653      */
0654     index = xfs_dir2_leaf_search_hash(args, lbp);
0655     leaf = lbp->b_addr;
0656     ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
0657     xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr, leaf);
0658     ents = leafhdr.ents;
0659     bestsp = xfs_dir2_leaf_bests_p(ltp);
0660     length = xfs_dir2_data_entsize(dp->i_mount, args->namelen);
0661 
0662     /*
0663      * See if there are any entries with the same hash value
0664      * and space in their block for the new entry.
0665      * This is good because it puts multiple same-hash value entries
0666      * in a data block, improving the lookup of those entries.
0667      */
0668     for (use_block = -1, lep = &ents[index];
0669          index < leafhdr.count && be32_to_cpu(lep->hashval) == args->hashval;
0670          index++, lep++) {
0671         if (be32_to_cpu(lep->address) == XFS_DIR2_NULL_DATAPTR)
0672             continue;
0673         i = xfs_dir2_dataptr_to_db(args->geo, be32_to_cpu(lep->address));
0674         ASSERT(i < be32_to_cpu(ltp->bestcount));
0675         ASSERT(bestsp[i] != cpu_to_be16(NULLDATAOFF));
0676         if (be16_to_cpu(bestsp[i]) >= length) {
0677             use_block = i;
0678             break;
0679         }
0680     }
0681     /*
0682      * Didn't find a block yet, linear search all the data blocks.
0683      */
0684     if (use_block == -1) {
0685         for (i = 0; i < be32_to_cpu(ltp->bestcount); i++) {
0686             /*
0687              * Remember a block we see that's missing.
0688              */
0689             if (bestsp[i] == cpu_to_be16(NULLDATAOFF) &&
0690                 use_block == -1)
0691                 use_block = i;
0692             else if (be16_to_cpu(bestsp[i]) >= length) {
0693                 use_block = i;
0694                 break;
0695             }
0696         }
0697     }
0698     /*
0699      * How many bytes do we need in the leaf block?
0700      */
0701     needbytes = 0;
0702     if (!leafhdr.stale)
0703         needbytes += sizeof(xfs_dir2_leaf_entry_t);
0704     if (use_block == -1)
0705         needbytes += sizeof(xfs_dir2_data_off_t);
0706 
0707     /*
0708      * Now kill use_block if it refers to a missing block, so we
0709      * can use it as an indication of allocation needed.
0710      */
0711     if (use_block != -1 && bestsp[use_block] == cpu_to_be16(NULLDATAOFF))
0712         use_block = -1;
0713     /*
0714      * If we don't have enough free bytes but we can make enough
0715      * by compacting out stale entries, we'll do that.
0716      */
0717     if ((char *)bestsp - (char *)&ents[leafhdr.count] < needbytes &&
0718         leafhdr.stale > 1)
0719         compact = 1;
0720 
0721     /*
0722      * Otherwise if we don't have enough free bytes we need to
0723      * convert to node form.
0724      */
0725     else if ((char *)bestsp - (char *)&ents[leafhdr.count] < needbytes) {
0726         /*
0727          * Just checking or no space reservation, give up.
0728          */
0729         if ((args->op_flags & XFS_DA_OP_JUSTCHECK) ||
0730                             args->total == 0) {
0731             xfs_trans_brelse(tp, lbp);
0732             return -ENOSPC;
0733         }
0734         /*
0735          * Convert to node form.
0736          */
0737         error = xfs_dir2_leaf_to_node(args, lbp);
0738         if (error)
0739             return error;
0740         /*
0741          * Then add the new entry.
0742          */
0743         return xfs_dir2_node_addname(args);
0744     }
0745     /*
0746      * Otherwise it will fit without compaction.
0747      */
0748     else
0749         compact = 0;
0750     /*
0751      * If just checking, then it will fit unless we needed to allocate
0752      * a new data block.
0753      */
0754     if (args->op_flags & XFS_DA_OP_JUSTCHECK) {
0755         xfs_trans_brelse(tp, lbp);
0756         return use_block == -1 ? -ENOSPC : 0;
0757     }
0758     /*
0759      * If no allocations are allowed, return now before we've
0760      * changed anything.
0761      */
0762     if (args->total == 0 && use_block == -1) {
0763         xfs_trans_brelse(tp, lbp);
0764         return -ENOSPC;
0765     }
0766     /*
0767      * Need to compact the leaf entries, removing stale ones.
0768      * Leave one stale entry behind - the one closest to our
0769      * insertion index - and we'll shift that one to our insertion
0770      * point later.
0771      */
0772     if (compact) {
0773         xfs_dir3_leaf_compact_x1(&leafhdr, ents, &index, &lowstale,
0774             &highstale, &lfloglow, &lfloghigh);
0775     }
0776     /*
0777      * There are stale entries, so we'll need log-low and log-high
0778      * impossibly bad values later.
0779      */
0780     else if (leafhdr.stale) {
0781         lfloglow = leafhdr.count;
0782         lfloghigh = -1;
0783     }
0784     /*
0785      * If there was no data block space found, we need to allocate
0786      * a new one.
0787      */
0788     if (use_block == -1) {
0789         /*
0790          * Add the new data block.
0791          */
0792         if ((error = xfs_dir2_grow_inode(args, XFS_DIR2_DATA_SPACE,
0793                 &use_block))) {
0794             xfs_trans_brelse(tp, lbp);
0795             return error;
0796         }
0797         /*
0798          * Initialize the block.
0799          */
0800         if ((error = xfs_dir3_data_init(args, use_block, &dbp))) {
0801             xfs_trans_brelse(tp, lbp);
0802             return error;
0803         }
0804         /*
0805          * If we're adding a new data block on the end we need to
0806          * extend the bests table.  Copy it up one entry.
0807          */
0808         if (use_block >= be32_to_cpu(ltp->bestcount)) {
0809             bestsp--;
0810             memmove(&bestsp[0], &bestsp[1],
0811                 be32_to_cpu(ltp->bestcount) * sizeof(bestsp[0]));
0812             be32_add_cpu(&ltp->bestcount, 1);
0813             xfs_dir3_leaf_log_tail(args, lbp);
0814             xfs_dir3_leaf_log_bests(args, lbp, 0,
0815                         be32_to_cpu(ltp->bestcount) - 1);
0816         }
0817         /*
0818          * If we're filling in a previously empty block just log it.
0819          */
0820         else
0821             xfs_dir3_leaf_log_bests(args, lbp, use_block, use_block);
0822         hdr = dbp->b_addr;
0823         bf = xfs_dir2_data_bestfree_p(dp->i_mount, hdr);
0824         bestsp[use_block] = bf[0].length;
0825         grown = 1;
0826     } else {
0827         /*
0828          * Already had space in some data block.
0829          * Just read that one in.
0830          */
0831         error = xfs_dir3_data_read(tp, dp,
0832                    xfs_dir2_db_to_da(args->geo, use_block),
0833                    0, &dbp);
0834         if (error) {
0835             xfs_trans_brelse(tp, lbp);
0836             return error;
0837         }
0838         hdr = dbp->b_addr;
0839         bf = xfs_dir2_data_bestfree_p(dp->i_mount, hdr);
0840         grown = 0;
0841     }
0842     /*
0843      * Point to the biggest freespace in our data block.
0844      */
0845     dup = (xfs_dir2_data_unused_t *)
0846           ((char *)hdr + be16_to_cpu(bf[0].offset));
0847     needscan = needlog = 0;
0848     /*
0849      * Mark the initial part of our freespace in use for the new entry.
0850      */
0851     error = xfs_dir2_data_use_free(args, dbp, dup,
0852             (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr),
0853             length, &needlog, &needscan);
0854     if (error) {
0855         xfs_trans_brelse(tp, lbp);
0856         return error;
0857     }
0858     /*
0859      * Initialize our new entry (at last).
0860      */
0861     dep = (xfs_dir2_data_entry_t *)dup;
0862     dep->inumber = cpu_to_be64(args->inumber);
0863     dep->namelen = args->namelen;
0864     memcpy(dep->name, args->name, dep->namelen);
0865     xfs_dir2_data_put_ftype(dp->i_mount, dep, args->filetype);
0866     tagp = xfs_dir2_data_entry_tag_p(dp->i_mount, dep);
0867     *tagp = cpu_to_be16((char *)dep - (char *)hdr);
0868     /*
0869      * Need to scan fix up the bestfree table.
0870      */
0871     if (needscan)
0872         xfs_dir2_data_freescan(dp->i_mount, hdr, &needlog);
0873     /*
0874      * Need to log the data block's header.
0875      */
0876     if (needlog)
0877         xfs_dir2_data_log_header(args, dbp);
0878     xfs_dir2_data_log_entry(args, dbp, dep);
0879     /*
0880      * If the bests table needs to be changed, do it.
0881      * Log the change unless we've already done that.
0882      */
0883     if (be16_to_cpu(bestsp[use_block]) != be16_to_cpu(bf[0].length)) {
0884         bestsp[use_block] = bf[0].length;
0885         if (!grown)
0886             xfs_dir3_leaf_log_bests(args, lbp, use_block, use_block);
0887     }
0888 
0889     lep = xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale,
0890                        highstale, &lfloglow, &lfloghigh);
0891 
0892     /*
0893      * Fill in the new leaf entry.
0894      */
0895     lep->hashval = cpu_to_be32(args->hashval);
0896     lep->address = cpu_to_be32(
0897                 xfs_dir2_db_off_to_dataptr(args->geo, use_block,
0898                 be16_to_cpu(*tagp)));
0899     /*
0900      * Log the leaf fields and give up the buffers.
0901      */
0902     xfs_dir2_leaf_hdr_to_disk(dp->i_mount, leaf, &leafhdr);
0903     xfs_dir3_leaf_log_header(args, lbp);
0904     xfs_dir3_leaf_log_ents(args, &leafhdr, lbp, lfloglow, lfloghigh);
0905     xfs_dir3_leaf_check(dp, lbp);
0906     xfs_dir3_data_check(dp, dbp);
0907     return 0;
0908 }
0909 
0910 /*
0911  * Compact out any stale entries in the leaf.
0912  * Log the header and changed leaf entries, if any.
0913  */
0914 void
0915 xfs_dir3_leaf_compact(
0916     xfs_da_args_t   *args,      /* operation arguments */
0917     struct xfs_dir3_icleaf_hdr *leafhdr,
0918     struct xfs_buf  *bp)        /* leaf buffer */
0919 {
0920     int     from;       /* source leaf index */
0921     xfs_dir2_leaf_t *leaf;      /* leaf structure */
0922     int     loglow;     /* first leaf entry to log */
0923     int     to;     /* target leaf index */
0924     struct xfs_inode *dp = args->dp;
0925 
0926     leaf = bp->b_addr;
0927     if (!leafhdr->stale)
0928         return;
0929 
0930     /*
0931      * Compress out the stale entries in place.
0932      */
0933     for (from = to = 0, loglow = -1; from < leafhdr->count; from++) {
0934         if (leafhdr->ents[from].address ==
0935             cpu_to_be32(XFS_DIR2_NULL_DATAPTR))
0936             continue;
0937         /*
0938          * Only actually copy the entries that are different.
0939          */
0940         if (from > to) {
0941             if (loglow == -1)
0942                 loglow = to;
0943             leafhdr->ents[to] = leafhdr->ents[from];
0944         }
0945         to++;
0946     }
0947     /*
0948      * Update and log the header, log the leaf entries.
0949      */
0950     ASSERT(leafhdr->stale == from - to);
0951     leafhdr->count -= leafhdr->stale;
0952     leafhdr->stale = 0;
0953 
0954     xfs_dir2_leaf_hdr_to_disk(dp->i_mount, leaf, leafhdr);
0955     xfs_dir3_leaf_log_header(args, bp);
0956     if (loglow != -1)
0957         xfs_dir3_leaf_log_ents(args, leafhdr, bp, loglow, to - 1);
0958 }
0959 
0960 /*
0961  * Compact the leaf entries, removing stale ones.
0962  * Leave one stale entry behind - the one closest to our
0963  * insertion index - and the caller will shift that one to our insertion
0964  * point later.
0965  * Return new insertion index, where the remaining stale entry is,
0966  * and leaf logging indices.
0967  */
0968 void
0969 xfs_dir3_leaf_compact_x1(
0970     struct xfs_dir3_icleaf_hdr *leafhdr,
0971     struct xfs_dir2_leaf_entry *ents,
0972     int     *indexp,    /* insertion index */
0973     int     *lowstalep, /* out: stale entry before us */
0974     int     *highstalep,    /* out: stale entry after us */
0975     int     *lowlogp,   /* out: low log index */
0976     int     *highlogp)  /* out: high log index */
0977 {
0978     int     from;       /* source copy index */
0979     int     highstale;  /* stale entry at/after index */
0980     int     index;      /* insertion index */
0981     int     keepstale;  /* source index of kept stale */
0982     int     lowstale;   /* stale entry before index */
0983     int     newindex=0; /* new insertion index */
0984     int     to;     /* destination copy index */
0985 
0986     ASSERT(leafhdr->stale > 1);
0987     index = *indexp;
0988 
0989     xfs_dir3_leaf_find_stale(leafhdr, ents, index, &lowstale, &highstale);
0990 
0991     /*
0992      * Pick the better of lowstale and highstale.
0993      */
0994     if (lowstale >= 0 &&
0995         (highstale == leafhdr->count ||
0996          index - lowstale <= highstale - index))
0997         keepstale = lowstale;
0998     else
0999         keepstale = highstale;
1000     /*
1001      * Copy the entries in place, removing all the stale entries
1002      * except keepstale.
1003      */
1004     for (from = to = 0; from < leafhdr->count; from++) {
1005         /*
1006          * Notice the new value of index.
1007          */
1008         if (index == from)
1009             newindex = to;
1010         if (from != keepstale &&
1011             ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) {
1012             if (from == to)
1013                 *lowlogp = to;
1014             continue;
1015         }
1016         /*
1017          * Record the new keepstale value for the insertion.
1018          */
1019         if (from == keepstale)
1020             lowstale = highstale = to;
1021         /*
1022          * Copy only the entries that have moved.
1023          */
1024         if (from > to)
1025             ents[to] = ents[from];
1026         to++;
1027     }
1028     ASSERT(from > to);
1029     /*
1030      * If the insertion point was past the last entry,
1031      * set the new insertion point accordingly.
1032      */
1033     if (index == from)
1034         newindex = to;
1035     *indexp = newindex;
1036     /*
1037      * Adjust the leaf header values.
1038      */
1039     leafhdr->count -= from - to;
1040     leafhdr->stale = 1;
1041     /*
1042      * Remember the low/high stale value only in the "right"
1043      * direction.
1044      */
1045     if (lowstale >= newindex)
1046         lowstale = -1;
1047     else
1048         highstale = leafhdr->count;
1049     *highlogp = leafhdr->count - 1;
1050     *lowstalep = lowstale;
1051     *highstalep = highstale;
1052 }
1053 
1054 /*
1055  * Log the bests entries indicated from a leaf1 block.
1056  */
1057 static void
1058 xfs_dir3_leaf_log_bests(
1059     struct xfs_da_args  *args,
1060     struct xfs_buf      *bp,        /* leaf buffer */
1061     int         first,      /* first entry to log */
1062     int         last)       /* last entry to log */
1063 {
1064     __be16          *firstb;    /* pointer to first entry */
1065     __be16          *lastb;     /* pointer to last entry */
1066     struct xfs_dir2_leaf    *leaf = bp->b_addr;
1067     xfs_dir2_leaf_tail_t    *ltp;       /* leaf tail structure */
1068 
1069     ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) ||
1070            leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC));
1071 
1072     ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
1073     firstb = xfs_dir2_leaf_bests_p(ltp) + first;
1074     lastb = xfs_dir2_leaf_bests_p(ltp) + last;
1075     xfs_trans_log_buf(args->trans, bp,
1076         (uint)((char *)firstb - (char *)leaf),
1077         (uint)((char *)lastb - (char *)leaf + sizeof(*lastb) - 1));
1078 }
1079 
1080 /*
1081  * Log the leaf entries indicated from a leaf1 or leafn block.
1082  */
1083 void
1084 xfs_dir3_leaf_log_ents(
1085     struct xfs_da_args  *args,
1086     struct xfs_dir3_icleaf_hdr *hdr,
1087     struct xfs_buf      *bp,
1088     int         first,
1089     int         last)
1090 {
1091     xfs_dir2_leaf_entry_t   *firstlep;  /* pointer to first entry */
1092     xfs_dir2_leaf_entry_t   *lastlep;   /* pointer to last entry */
1093     struct xfs_dir2_leaf    *leaf = bp->b_addr;
1094 
1095     ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) ||
1096            leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) ||
1097            leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
1098            leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC));
1099 
1100     firstlep = &hdr->ents[first];
1101     lastlep = &hdr->ents[last];
1102     xfs_trans_log_buf(args->trans, bp,
1103         (uint)((char *)firstlep - (char *)leaf),
1104         (uint)((char *)lastlep - (char *)leaf + sizeof(*lastlep) - 1));
1105 }
1106 
1107 /*
1108  * Log the header of the leaf1 or leafn block.
1109  */
1110 void
1111 xfs_dir3_leaf_log_header(
1112     struct xfs_da_args  *args,
1113     struct xfs_buf      *bp)
1114 {
1115     struct xfs_dir2_leaf    *leaf = bp->b_addr;
1116 
1117     ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) ||
1118            leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) ||
1119            leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
1120            leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC));
1121 
1122     xfs_trans_log_buf(args->trans, bp,
1123               (uint)((char *)&leaf->hdr - (char *)leaf),
1124               args->geo->leaf_hdr_size - 1);
1125 }
1126 
1127 /*
1128  * Log the tail of the leaf1 block.
1129  */
1130 STATIC void
1131 xfs_dir3_leaf_log_tail(
1132     struct xfs_da_args  *args,
1133     struct xfs_buf      *bp)
1134 {
1135     struct xfs_dir2_leaf    *leaf = bp->b_addr;
1136     xfs_dir2_leaf_tail_t    *ltp;       /* leaf tail structure */
1137 
1138     ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) ||
1139            leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) ||
1140            leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
1141            leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC));
1142 
1143     ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
1144     xfs_trans_log_buf(args->trans, bp, (uint)((char *)ltp - (char *)leaf),
1145         (uint)(args->geo->blksize - 1));
1146 }
1147 
1148 /*
1149  * Look up the entry referred to by args in the leaf format directory.
1150  * Most of the work is done by the xfs_dir2_leaf_lookup_int routine which
1151  * is also used by the node-format code.
1152  */
1153 int
1154 xfs_dir2_leaf_lookup(
1155     xfs_da_args_t       *args)      /* operation arguments */
1156 {
1157     struct xfs_buf      *dbp;       /* data block buffer */
1158     xfs_dir2_data_entry_t   *dep;       /* data block entry */
1159     xfs_inode_t     *dp;        /* incore directory inode */
1160     int         error;      /* error return code */
1161     int         index;      /* found entry index */
1162     struct xfs_buf      *lbp;       /* leaf buffer */
1163     xfs_dir2_leaf_entry_t   *lep;       /* leaf entry */
1164     xfs_trans_t     *tp;        /* transaction pointer */
1165     struct xfs_dir3_icleaf_hdr leafhdr;
1166 
1167     trace_xfs_dir2_leaf_lookup(args);
1168 
1169     /*
1170      * Look up name in the leaf block, returning both buffers and index.
1171      */
1172     error = xfs_dir2_leaf_lookup_int(args, &lbp, &index, &dbp, &leafhdr);
1173     if (error)
1174         return error;
1175 
1176     tp = args->trans;
1177     dp = args->dp;
1178     xfs_dir3_leaf_check(dp, lbp);
1179 
1180     /*
1181      * Get to the leaf entry and contained data entry address.
1182      */
1183     lep = &leafhdr.ents[index];
1184 
1185     /*
1186      * Point to the data entry.
1187      */
1188     dep = (xfs_dir2_data_entry_t *)
1189           ((char *)dbp->b_addr +
1190            xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address)));
1191     /*
1192      * Return the found inode number & CI name if appropriate
1193      */
1194     args->inumber = be64_to_cpu(dep->inumber);
1195     args->filetype = xfs_dir2_data_get_ftype(dp->i_mount, dep);
1196     error = xfs_dir_cilookup_result(args, dep->name, dep->namelen);
1197     xfs_trans_brelse(tp, dbp);
1198     xfs_trans_brelse(tp, lbp);
1199     return error;
1200 }
1201 
1202 /*
1203  * Look up name/hash in the leaf block.
1204  * Fill in indexp with the found index, and dbpp with the data buffer.
1205  * If not found dbpp will be NULL, and ENOENT comes back.
1206  * lbpp will always be filled in with the leaf buffer unless there's an error.
1207  */
1208 static int                  /* error */
1209 xfs_dir2_leaf_lookup_int(
1210     xfs_da_args_t       *args,      /* operation arguments */
1211     struct xfs_buf      **lbpp,     /* out: leaf buffer */
1212     int         *indexp,    /* out: index in leaf block */
1213     struct xfs_buf      **dbpp,     /* out: data buffer */
1214     struct xfs_dir3_icleaf_hdr *leafhdr)
1215 {
1216     xfs_dir2_db_t       curdb = -1; /* current data block number */
1217     struct xfs_buf      *dbp = NULL;    /* data buffer */
1218     xfs_dir2_data_entry_t   *dep;       /* data entry */
1219     xfs_inode_t     *dp;        /* incore directory inode */
1220     int         error;      /* error return code */
1221     int         index;      /* index in leaf block */
1222     struct xfs_buf      *lbp;       /* leaf buffer */
1223     xfs_dir2_leaf_entry_t   *lep;       /* leaf entry */
1224     xfs_dir2_leaf_t     *leaf;      /* leaf structure */
1225     xfs_mount_t     *mp;        /* filesystem mount point */
1226     xfs_dir2_db_t       newdb;      /* new data block number */
1227     xfs_trans_t     *tp;        /* transaction pointer */
1228     xfs_dir2_db_t       cidb = -1;  /* case match data block no. */
1229     enum xfs_dacmp      cmp;        /* name compare result */
1230 
1231     dp = args->dp;
1232     tp = args->trans;
1233     mp = dp->i_mount;
1234 
1235     error = xfs_dir3_leaf_read(tp, dp, args->geo->leafblk, &lbp);
1236     if (error)
1237         return error;
1238 
1239     *lbpp = lbp;
1240     leaf = lbp->b_addr;
1241     xfs_dir3_leaf_check(dp, lbp);
1242     xfs_dir2_leaf_hdr_from_disk(mp, leafhdr, leaf);
1243 
1244     /*
1245      * Look for the first leaf entry with our hash value.
1246      */
1247     index = xfs_dir2_leaf_search_hash(args, lbp);
1248     /*
1249      * Loop over all the entries with the right hash value
1250      * looking to match the name.
1251      */
1252     for (lep = &leafhdr->ents[index];
1253          index < leafhdr->count &&
1254             be32_to_cpu(lep->hashval) == args->hashval;
1255          lep++, index++) {
1256         /*
1257          * Skip over stale leaf entries.
1258          */
1259         if (be32_to_cpu(lep->address) == XFS_DIR2_NULL_DATAPTR)
1260             continue;
1261         /*
1262          * Get the new data block number.
1263          */
1264         newdb = xfs_dir2_dataptr_to_db(args->geo,
1265                            be32_to_cpu(lep->address));
1266         /*
1267          * If it's not the same as the old data block number,
1268          * need to pitch the old one and read the new one.
1269          */
1270         if (newdb != curdb) {
1271             if (dbp)
1272                 xfs_trans_brelse(tp, dbp);
1273             error = xfs_dir3_data_read(tp, dp,
1274                        xfs_dir2_db_to_da(args->geo, newdb),
1275                        0, &dbp);
1276             if (error) {
1277                 xfs_trans_brelse(tp, lbp);
1278                 return error;
1279             }
1280             curdb = newdb;
1281         }
1282         /*
1283          * Point to the data entry.
1284          */
1285         dep = (xfs_dir2_data_entry_t *)((char *)dbp->b_addr +
1286             xfs_dir2_dataptr_to_off(args->geo,
1287                         be32_to_cpu(lep->address)));
1288         /*
1289          * Compare name and if it's an exact match, return the index
1290          * and buffer. If it's the first case-insensitive match, store
1291          * the index and buffer and continue looking for an exact match.
1292          */
1293         cmp = xfs_dir2_compname(args, dep->name, dep->namelen);
1294         if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) {
1295             args->cmpresult = cmp;
1296             *indexp = index;
1297             /* case exact match: return the current buffer. */
1298             if (cmp == XFS_CMP_EXACT) {
1299                 *dbpp = dbp;
1300                 return 0;
1301             }
1302             cidb = curdb;
1303         }
1304     }
1305     ASSERT(args->op_flags & XFS_DA_OP_OKNOENT);
1306     /*
1307      * Here, we can only be doing a lookup (not a rename or remove).
1308      * If a case-insensitive match was found earlier, re-read the
1309      * appropriate data block if required and return it.
1310      */
1311     if (args->cmpresult == XFS_CMP_CASE) {
1312         ASSERT(cidb != -1);
1313         if (cidb != curdb) {
1314             xfs_trans_brelse(tp, dbp);
1315             error = xfs_dir3_data_read(tp, dp,
1316                        xfs_dir2_db_to_da(args->geo, cidb),
1317                        0, &dbp);
1318             if (error) {
1319                 xfs_trans_brelse(tp, lbp);
1320                 return error;
1321             }
1322         }
1323         *dbpp = dbp;
1324         return 0;
1325     }
1326     /*
1327      * No match found, return -ENOENT.
1328      */
1329     ASSERT(cidb == -1);
1330     if (dbp)
1331         xfs_trans_brelse(tp, dbp);
1332     xfs_trans_brelse(tp, lbp);
1333     return -ENOENT;
1334 }
1335 
1336 /*
1337  * Remove an entry from a leaf format directory.
1338  */
1339 int                     /* error */
1340 xfs_dir2_leaf_removename(
1341     xfs_da_args_t       *args)      /* operation arguments */
1342 {
1343     struct xfs_da_geometry  *geo = args->geo;
1344     __be16          *bestsp;    /* leaf block best freespace */
1345     xfs_dir2_data_hdr_t *hdr;       /* data block header */
1346     xfs_dir2_db_t       db;     /* data block number */
1347     struct xfs_buf      *dbp;       /* data block buffer */
1348     xfs_dir2_data_entry_t   *dep;       /* data entry structure */
1349     xfs_inode_t     *dp;        /* incore directory inode */
1350     int         error;      /* error return code */
1351     xfs_dir2_db_t       i;      /* temporary data block # */
1352     int         index;      /* index into leaf entries */
1353     struct xfs_buf      *lbp;       /* leaf buffer */
1354     xfs_dir2_leaf_t     *leaf;      /* leaf structure */
1355     xfs_dir2_leaf_entry_t   *lep;       /* leaf entry */
1356     xfs_dir2_leaf_tail_t    *ltp;       /* leaf tail structure */
1357     int         needlog;    /* need to log data header */
1358     int         needscan;   /* need to rescan data frees */
1359     xfs_dir2_data_off_t oldbest;    /* old value of best free */
1360     struct xfs_dir2_data_free *bf;      /* bestfree table */
1361     struct xfs_dir3_icleaf_hdr leafhdr;
1362 
1363     trace_xfs_dir2_leaf_removename(args);
1364 
1365     /*
1366      * Lookup the leaf entry, get the leaf and data blocks read in.
1367      */
1368     error = xfs_dir2_leaf_lookup_int(args, &lbp, &index, &dbp, &leafhdr);
1369     if (error)
1370         return error;
1371 
1372     dp = args->dp;
1373     leaf = lbp->b_addr;
1374     hdr = dbp->b_addr;
1375     xfs_dir3_data_check(dp, dbp);
1376     bf = xfs_dir2_data_bestfree_p(dp->i_mount, hdr);
1377 
1378     /*
1379      * Point to the leaf entry, use that to point to the data entry.
1380      */
1381     lep = &leafhdr.ents[index];
1382     db = xfs_dir2_dataptr_to_db(geo, be32_to_cpu(lep->address));
1383     dep = (xfs_dir2_data_entry_t *)((char *)hdr +
1384         xfs_dir2_dataptr_to_off(geo, be32_to_cpu(lep->address)));
1385     needscan = needlog = 0;
1386     oldbest = be16_to_cpu(bf[0].length);
1387     ltp = xfs_dir2_leaf_tail_p(geo, leaf);
1388     bestsp = xfs_dir2_leaf_bests_p(ltp);
1389     if (be16_to_cpu(bestsp[db]) != oldbest) {
1390         xfs_buf_mark_corrupt(lbp);
1391         return -EFSCORRUPTED;
1392     }
1393     /*
1394      * Mark the former data entry unused.
1395      */
1396     xfs_dir2_data_make_free(args, dbp,
1397         (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr),
1398         xfs_dir2_data_entsize(dp->i_mount, dep->namelen), &needlog,
1399         &needscan);
1400     /*
1401      * We just mark the leaf entry stale by putting a null in it.
1402      */
1403     leafhdr.stale++;
1404     xfs_dir2_leaf_hdr_to_disk(dp->i_mount, leaf, &leafhdr);
1405     xfs_dir3_leaf_log_header(args, lbp);
1406 
1407     lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR);
1408     xfs_dir3_leaf_log_ents(args, &leafhdr, lbp, index, index);
1409 
1410     /*
1411      * Scan the freespace in the data block again if necessary,
1412      * log the data block header if necessary.
1413      */
1414     if (needscan)
1415         xfs_dir2_data_freescan(dp->i_mount, hdr, &needlog);
1416     if (needlog)
1417         xfs_dir2_data_log_header(args, dbp);
1418     /*
1419      * If the longest freespace in the data block has changed,
1420      * put the new value in the bests table and log that.
1421      */
1422     if (be16_to_cpu(bf[0].length) != oldbest) {
1423         bestsp[db] = bf[0].length;
1424         xfs_dir3_leaf_log_bests(args, lbp, db, db);
1425     }
1426     xfs_dir3_data_check(dp, dbp);
1427     /*
1428      * If the data block is now empty then get rid of the data block.
1429      */
1430     if (be16_to_cpu(bf[0].length) ==
1431         geo->blksize - geo->data_entry_offset) {
1432         ASSERT(db != geo->datablk);
1433         if ((error = xfs_dir2_shrink_inode(args, db, dbp))) {
1434             /*
1435              * Nope, can't get rid of it because it caused
1436              * allocation of a bmap btree block to do so.
1437              * Just go on, returning success, leaving the
1438              * empty block in place.
1439              */
1440             if (error == -ENOSPC && args->total == 0)
1441                 error = 0;
1442             xfs_dir3_leaf_check(dp, lbp);
1443             return error;
1444         }
1445         dbp = NULL;
1446         /*
1447          * If this is the last data block then compact the
1448          * bests table by getting rid of entries.
1449          */
1450         if (db == be32_to_cpu(ltp->bestcount) - 1) {
1451             /*
1452              * Look for the last active entry (i).
1453              */
1454             for (i = db - 1; i > 0; i--) {
1455                 if (bestsp[i] != cpu_to_be16(NULLDATAOFF))
1456                     break;
1457             }
1458             /*
1459              * Copy the table down so inactive entries at the
1460              * end are removed.
1461              */
1462             memmove(&bestsp[db - i], bestsp,
1463                 (be32_to_cpu(ltp->bestcount) - (db - i)) * sizeof(*bestsp));
1464             be32_add_cpu(&ltp->bestcount, -(db - i));
1465             xfs_dir3_leaf_log_tail(args, lbp);
1466             xfs_dir3_leaf_log_bests(args, lbp, 0,
1467                         be32_to_cpu(ltp->bestcount) - 1);
1468         } else
1469             bestsp[db] = cpu_to_be16(NULLDATAOFF);
1470     }
1471     /*
1472      * If the data block was not the first one, drop it.
1473      */
1474     else if (db != geo->datablk)
1475         dbp = NULL;
1476 
1477     xfs_dir3_leaf_check(dp, lbp);
1478     /*
1479      * See if we can convert to block form.
1480      */
1481     return xfs_dir2_leaf_to_block(args, lbp, dbp);
1482 }
1483 
1484 /*
1485  * Replace the inode number in a leaf format directory entry.
1486  */
1487 int                     /* error */
1488 xfs_dir2_leaf_replace(
1489     xfs_da_args_t       *args)      /* operation arguments */
1490 {
1491     struct xfs_buf      *dbp;       /* data block buffer */
1492     xfs_dir2_data_entry_t   *dep;       /* data block entry */
1493     xfs_inode_t     *dp;        /* incore directory inode */
1494     int         error;      /* error return code */
1495     int         index;      /* index of leaf entry */
1496     struct xfs_buf      *lbp;       /* leaf buffer */
1497     xfs_dir2_leaf_entry_t   *lep;       /* leaf entry */
1498     xfs_trans_t     *tp;        /* transaction pointer */
1499     struct xfs_dir3_icleaf_hdr leafhdr;
1500 
1501     trace_xfs_dir2_leaf_replace(args);
1502 
1503     /*
1504      * Look up the entry.
1505      */
1506     error = xfs_dir2_leaf_lookup_int(args, &lbp, &index, &dbp, &leafhdr);
1507     if (error)
1508         return error;
1509 
1510     dp = args->dp;
1511     /*
1512      * Point to the leaf entry, get data address from it.
1513      */
1514     lep = &leafhdr.ents[index];
1515     /*
1516      * Point to the data entry.
1517      */
1518     dep = (xfs_dir2_data_entry_t *)
1519           ((char *)dbp->b_addr +
1520            xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address)));
1521     ASSERT(args->inumber != be64_to_cpu(dep->inumber));
1522     /*
1523      * Put the new inode number in, log it.
1524      */
1525     dep->inumber = cpu_to_be64(args->inumber);
1526     xfs_dir2_data_put_ftype(dp->i_mount, dep, args->filetype);
1527     tp = args->trans;
1528     xfs_dir2_data_log_entry(args, dbp, dep);
1529     xfs_dir3_leaf_check(dp, lbp);
1530     xfs_trans_brelse(tp, lbp);
1531     return 0;
1532 }
1533 
1534 /*
1535  * Return index in the leaf block (lbp) which is either the first
1536  * one with this hash value, or if there are none, the insert point
1537  * for that hash value.
1538  */
1539 int                     /* index value */
1540 xfs_dir2_leaf_search_hash(
1541     xfs_da_args_t       *args,      /* operation arguments */
1542     struct xfs_buf      *lbp)       /* leaf buffer */
1543 {
1544     xfs_dahash_t        hash=0;     /* hash from this entry */
1545     xfs_dahash_t        hashwant;   /* hash value looking for */
1546     int         high;       /* high leaf index */
1547     int         low;        /* low leaf index */
1548     xfs_dir2_leaf_entry_t   *lep;       /* leaf entry */
1549     int         mid=0;      /* current leaf index */
1550     struct xfs_dir3_icleaf_hdr leafhdr;
1551 
1552     xfs_dir2_leaf_hdr_from_disk(args->dp->i_mount, &leafhdr, lbp->b_addr);
1553 
1554     /*
1555      * Note, the table cannot be empty, so we have to go through the loop.
1556      * Binary search the leaf entries looking for our hash value.
1557      */
1558     for (lep = leafhdr.ents, low = 0, high = leafhdr.count - 1,
1559         hashwant = args->hashval;
1560          low <= high; ) {
1561         mid = (low + high) >> 1;
1562         if ((hash = be32_to_cpu(lep[mid].hashval)) == hashwant)
1563             break;
1564         if (hash < hashwant)
1565             low = mid + 1;
1566         else
1567             high = mid - 1;
1568     }
1569     /*
1570      * Found one, back up through all the equal hash values.
1571      */
1572     if (hash == hashwant) {
1573         while (mid > 0 && be32_to_cpu(lep[mid - 1].hashval) == hashwant) {
1574             mid--;
1575         }
1576     }
1577     /*
1578      * Need to point to an entry higher than ours.
1579      */
1580     else if (hash < hashwant)
1581         mid++;
1582     return mid;
1583 }
1584 
1585 /*
1586  * Trim off a trailing data block.  We know it's empty since the leaf
1587  * freespace table says so.
1588  */
1589 int                     /* error */
1590 xfs_dir2_leaf_trim_data(
1591     xfs_da_args_t       *args,      /* operation arguments */
1592     struct xfs_buf      *lbp,       /* leaf buffer */
1593     xfs_dir2_db_t       db)     /* data block number */
1594 {
1595     struct xfs_da_geometry  *geo = args->geo;
1596     __be16          *bestsp;    /* leaf bests table */
1597     struct xfs_buf      *dbp;       /* data block buffer */
1598     xfs_inode_t     *dp;        /* incore directory inode */
1599     int         error;      /* error return value */
1600     xfs_dir2_leaf_t     *leaf;      /* leaf structure */
1601     xfs_dir2_leaf_tail_t    *ltp;       /* leaf tail structure */
1602     xfs_trans_t     *tp;        /* transaction pointer */
1603 
1604     dp = args->dp;
1605     tp = args->trans;
1606     /*
1607      * Read the offending data block.  We need its buffer.
1608      */
1609     error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(geo, db), 0, &dbp);
1610     if (error)
1611         return error;
1612 
1613     leaf = lbp->b_addr;
1614     ltp = xfs_dir2_leaf_tail_p(geo, leaf);
1615 
1616 #ifdef DEBUG
1617 {
1618     struct xfs_dir2_data_hdr *hdr = dbp->b_addr;
1619     struct xfs_dir2_data_free *bf =
1620         xfs_dir2_data_bestfree_p(dp->i_mount, hdr);
1621 
1622     ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) ||
1623            hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC));
1624     ASSERT(be16_to_cpu(bf[0].length) ==
1625            geo->blksize - geo->data_entry_offset);
1626     ASSERT(db == be32_to_cpu(ltp->bestcount) - 1);
1627 }
1628 #endif
1629 
1630     /*
1631      * Get rid of the data block.
1632      */
1633     if ((error = xfs_dir2_shrink_inode(args, db, dbp))) {
1634         ASSERT(error != -ENOSPC);
1635         xfs_trans_brelse(tp, dbp);
1636         return error;
1637     }
1638     /*
1639      * Eliminate the last bests entry from the table.
1640      */
1641     bestsp = xfs_dir2_leaf_bests_p(ltp);
1642     be32_add_cpu(&ltp->bestcount, -1);
1643     memmove(&bestsp[1], &bestsp[0], be32_to_cpu(ltp->bestcount) * sizeof(*bestsp));
1644     xfs_dir3_leaf_log_tail(args, lbp);
1645     xfs_dir3_leaf_log_bests(args, lbp, 0, be32_to_cpu(ltp->bestcount) - 1);
1646     return 0;
1647 }
1648 
1649 static inline size_t
1650 xfs_dir3_leaf_size(
1651     struct xfs_dir3_icleaf_hdr  *hdr,
1652     int             counts)
1653 {
1654     int entries;
1655     int hdrsize;
1656 
1657     entries = hdr->count - hdr->stale;
1658     if (hdr->magic == XFS_DIR2_LEAF1_MAGIC ||
1659         hdr->magic == XFS_DIR2_LEAFN_MAGIC)
1660         hdrsize = sizeof(struct xfs_dir2_leaf_hdr);
1661     else
1662         hdrsize = sizeof(struct xfs_dir3_leaf_hdr);
1663 
1664     return hdrsize + entries * sizeof(xfs_dir2_leaf_entry_t)
1665                    + counts * sizeof(xfs_dir2_data_off_t)
1666                + sizeof(xfs_dir2_leaf_tail_t);
1667 }
1668 
1669 /*
1670  * Convert node form directory to leaf form directory.
1671  * The root of the node form dir needs to already be a LEAFN block.
1672  * Just return if we can't do anything.
1673  */
1674 int                     /* error */
1675 xfs_dir2_node_to_leaf(
1676     xfs_da_state_t      *state)     /* directory operation state */
1677 {
1678     xfs_da_args_t       *args;      /* operation arguments */
1679     xfs_inode_t     *dp;        /* incore directory inode */
1680     int         error;      /* error return code */
1681     struct xfs_buf      *fbp;       /* buffer for freespace block */
1682     xfs_fileoff_t       fo;     /* freespace file offset */
1683     struct xfs_buf      *lbp;       /* buffer for leaf block */
1684     xfs_dir2_leaf_tail_t    *ltp;       /* tail of leaf structure */
1685     xfs_dir2_leaf_t     *leaf;      /* leaf structure */
1686     xfs_mount_t     *mp;        /* filesystem mount point */
1687     int         rval;       /* successful free trim? */
1688     xfs_trans_t     *tp;        /* transaction pointer */
1689     struct xfs_dir3_icleaf_hdr leafhdr;
1690     struct xfs_dir3_icfree_hdr freehdr;
1691 
1692     /*
1693      * There's more than a leaf level in the btree, so there must
1694      * be multiple leafn blocks.  Give up.
1695      */
1696     if (state->path.active > 1)
1697         return 0;
1698     args = state->args;
1699 
1700     trace_xfs_dir2_node_to_leaf(args);
1701 
1702     mp = state->mp;
1703     dp = args->dp;
1704     tp = args->trans;
1705     /*
1706      * Get the last offset in the file.
1707      */
1708     if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) {
1709         return error;
1710     }
1711     fo -= args->geo->fsbcount;
1712     /*
1713      * If there are freespace blocks other than the first one,
1714      * take this opportunity to remove trailing empty freespace blocks
1715      * that may have been left behind during no-space-reservation
1716      * operations.
1717      */
1718     while (fo > args->geo->freeblk) {
1719         if ((error = xfs_dir2_node_trim_free(args, fo, &rval))) {
1720             return error;
1721         }
1722         if (rval)
1723             fo -= args->geo->fsbcount;
1724         else
1725             return 0;
1726     }
1727     /*
1728      * Now find the block just before the freespace block.
1729      */
1730     if ((error = xfs_bmap_last_before(tp, dp, &fo, XFS_DATA_FORK))) {
1731         return error;
1732     }
1733     /*
1734      * If it's not the single leaf block, give up.
1735      */
1736     if (XFS_FSB_TO_B(mp, fo) > XFS_DIR2_LEAF_OFFSET + args->geo->blksize)
1737         return 0;
1738     lbp = state->path.blk[0].bp;
1739     leaf = lbp->b_addr;
1740     xfs_dir2_leaf_hdr_from_disk(mp, &leafhdr, leaf);
1741 
1742     ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC ||
1743            leafhdr.magic == XFS_DIR3_LEAFN_MAGIC);
1744 
1745     /*
1746      * Read the freespace block.
1747      */
1748     error = xfs_dir2_free_read(tp, dp,  args->geo->freeblk, &fbp);
1749     if (error)
1750         return error;
1751     xfs_dir2_free_hdr_from_disk(mp, &freehdr, fbp->b_addr);
1752 
1753     ASSERT(!freehdr.firstdb);
1754 
1755     /*
1756      * Now see if the leafn and free data will fit in a leaf1.
1757      * If not, release the buffer and give up.
1758      */
1759     if (xfs_dir3_leaf_size(&leafhdr, freehdr.nvalid) > args->geo->blksize) {
1760         xfs_trans_brelse(tp, fbp);
1761         return 0;
1762     }
1763 
1764     /*
1765      * If the leaf has any stale entries in it, compress them out.
1766      */
1767     if (leafhdr.stale)
1768         xfs_dir3_leaf_compact(args, &leafhdr, lbp);
1769 
1770     lbp->b_ops = &xfs_dir3_leaf1_buf_ops;
1771     xfs_trans_buf_set_type(tp, lbp, XFS_BLFT_DIR_LEAF1_BUF);
1772     leafhdr.magic = (leafhdr.magic == XFS_DIR2_LEAFN_MAGIC)
1773                     ? XFS_DIR2_LEAF1_MAGIC
1774                     : XFS_DIR3_LEAF1_MAGIC;
1775 
1776     /*
1777      * Set up the leaf tail from the freespace block.
1778      */
1779     ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
1780     ltp->bestcount = cpu_to_be32(freehdr.nvalid);
1781 
1782     /*
1783      * Set up the leaf bests table.
1784      */
1785     memcpy(xfs_dir2_leaf_bests_p(ltp), freehdr.bests,
1786         freehdr.nvalid * sizeof(xfs_dir2_data_off_t));
1787 
1788     xfs_dir2_leaf_hdr_to_disk(mp, leaf, &leafhdr);
1789     xfs_dir3_leaf_log_header(args, lbp);
1790     xfs_dir3_leaf_log_bests(args, lbp, 0, be32_to_cpu(ltp->bestcount) - 1);
1791     xfs_dir3_leaf_log_tail(args, lbp);
1792     xfs_dir3_leaf_check(dp, lbp);
1793 
1794     /*
1795      * Get rid of the freespace block.
1796      */
1797     error = xfs_dir2_shrink_inode(args,
1798             xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET),
1799             fbp);
1800     if (error) {
1801         /*
1802          * This can't fail here because it can only happen when
1803          * punching out the middle of an extent, and this is an
1804          * isolated block.
1805          */
1806         ASSERT(error != -ENOSPC);
1807         return error;
1808     }
1809     fbp = NULL;
1810     /*
1811      * Now see if we can convert the single-leaf directory
1812      * down to a block form directory.
1813      * This routine always kills the dabuf for the leaf, so
1814      * eliminate it from the path.
1815      */
1816     error = xfs_dir2_leaf_to_block(args, lbp, NULL);
1817     state->path.blk[0].bp = NULL;
1818     return error;
1819 }