linux/fs/xfs/libxfs/xfs_dir2_leaf.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
   3 * Copyright (c) 2013 Red Hat, Inc.
   4 * All Rights Reserved.
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public License as
   8 * published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it would be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 *
  15 * You should have received a copy of the GNU General Public License
  16 * along with this program; if not, write the Free Software Foundation,
  17 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  18 */
  19#include "xfs.h"
  20#include "xfs_fs.h"
  21#include "xfs_format.h"
  22#include "xfs_log_format.h"
  23#include "xfs_trans_resv.h"
  24#include "xfs_mount.h"
  25#include "xfs_da_format.h"
  26#include "xfs_da_btree.h"
  27#include "xfs_inode.h"
  28#include "xfs_bmap.h"
  29#include "xfs_dir2.h"
  30#include "xfs_dir2_priv.h"
  31#include "xfs_error.h"
  32#include "xfs_trace.h"
  33#include "xfs_trans.h"
  34#include "xfs_buf_item.h"
  35#include "xfs_cksum.h"
  36#include "xfs_log.h"
  37
  38/*
  39 * Local function declarations.
  40 */
  41static int xfs_dir2_leaf_lookup_int(xfs_da_args_t *args, struct xfs_buf **lbpp,
  42                                    int *indexp, struct xfs_buf **dbpp);
  43static void xfs_dir3_leaf_log_bests(struct xfs_da_args *args,
  44                                    struct xfs_buf *bp, int first, int last);
  45static void xfs_dir3_leaf_log_tail(struct xfs_da_args *args,
  46                                   struct xfs_buf *bp);
  47
  48/*
  49 * Check the internal consistency of a leaf1 block.
  50 * Pop an assert if something is wrong.
  51 */
  52#ifdef DEBUG
  53static xfs_failaddr_t
  54xfs_dir3_leaf1_check(
  55        struct xfs_inode        *dp,
  56        struct xfs_buf          *bp)
  57{
  58        struct xfs_dir2_leaf    *leaf = bp->b_addr;
  59        struct xfs_dir3_icleaf_hdr leafhdr;
  60
  61        dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
  62
  63        if (leafhdr.magic == XFS_DIR3_LEAF1_MAGIC) {
  64                struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr;
  65                if (be64_to_cpu(leaf3->info.blkno) != bp->b_bn)
  66                        return __this_address;
  67        } else if (leafhdr.magic != XFS_DIR2_LEAF1_MAGIC)
  68                return __this_address;
  69
  70        return xfs_dir3_leaf_check_int(dp->i_mount, dp, &leafhdr, leaf);
  71}
  72
  73static inline void
  74xfs_dir3_leaf_check(
  75        struct xfs_inode        *dp,
  76        struct xfs_buf          *bp)
  77{
  78        xfs_failaddr_t          fa;
  79
  80        fa = xfs_dir3_leaf1_check(dp, bp);
  81        if (!fa)
  82                return;
  83        xfs_corruption_error(__func__, XFS_ERRLEVEL_LOW, dp->i_mount,
  84                        bp->b_addr, __FILE__, __LINE__, fa);
  85        ASSERT(0);
  86}
  87#else
  88#define xfs_dir3_leaf_check(dp, bp)
  89#endif
  90
  91xfs_failaddr_t
  92xfs_dir3_leaf_check_int(
  93        struct xfs_mount        *mp,
  94        struct xfs_inode        *dp,
  95        struct xfs_dir3_icleaf_hdr *hdr,
  96        struct xfs_dir2_leaf    *leaf)
  97{
  98        struct xfs_dir2_leaf_entry *ents;
  99        xfs_dir2_leaf_tail_t    *ltp;
 100        int                     stale;
 101        int                     i;
 102        const struct xfs_dir_ops *ops;
 103        struct xfs_dir3_icleaf_hdr leafhdr;
 104        struct xfs_da_geometry  *geo = mp->m_dir_geo;
 105
 106        /*
 107         * we can be passed a null dp here from a verifier, so we need to go the
 108         * hard way to get them.
 109         */
 110        ops = xfs_dir_get_ops(mp, dp);
 111
 112        if (!hdr) {
 113                ops->leaf_hdr_from_disk(&leafhdr, leaf);
 114                hdr = &leafhdr;
 115        }
 116
 117        ents = ops->leaf_ents_p(leaf);
 118        ltp = xfs_dir2_leaf_tail_p(geo, leaf);
 119
 120        /*
 121         * XXX (dgc): This value is not restrictive enough.
 122         * Should factor in the size of the bests table as well.
 123         * We can deduce a value for that from di_size.
 124         */
 125        if (hdr->count > ops->leaf_max_ents(geo))
 126                return __this_address;
 127
 128        /* Leaves and bests don't overlap in leaf format. */
 129        if ((hdr->magic == XFS_DIR2_LEAF1_MAGIC ||
 130             hdr->magic == XFS_DIR3_LEAF1_MAGIC) &&
 131            (char *)&ents[hdr->count] > (char *)xfs_dir2_leaf_bests_p(ltp))
 132                return __this_address;
 133
 134        /* Check hash value order, count stale entries.  */
 135        for (i = stale = 0; i < hdr->count; i++) {
 136                if (i + 1 < hdr->count) {
 137                        if (be32_to_cpu(ents[i].hashval) >
 138                                        be32_to_cpu(ents[i + 1].hashval))
 139                                return __this_address;
 140                }
 141                if (ents[i].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR))
 142                        stale++;
 143        }
 144        if (hdr->stale != stale)
 145                return __this_address;
 146        return NULL;
 147}
 148
 149/*
 150 * We verify the magic numbers before decoding the leaf header so that on debug
 151 * kernels we don't get assertion failures in xfs_dir3_leaf_hdr_from_disk() due
 152 * to incorrect magic numbers.
 153 */
 154static xfs_failaddr_t
 155xfs_dir3_leaf_verify(
 156        struct xfs_buf          *bp,
 157        uint16_t                magic)
 158{
 159        struct xfs_mount        *mp = bp->b_target->bt_mount;
 160        struct xfs_dir2_leaf    *leaf = bp->b_addr;
 161
 162        ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC);
 163
 164        if (xfs_sb_version_hascrc(&mp->m_sb)) {
 165                struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr;
 166                uint16_t                magic3;
 167
 168                magic3 = (magic == XFS_DIR2_LEAF1_MAGIC) ? XFS_DIR3_LEAF1_MAGIC
 169                                                         : XFS_DIR3_LEAFN_MAGIC;
 170
 171                if (leaf3->info.hdr.magic != cpu_to_be16(magic3))
 172                        return __this_address;
 173                if (!uuid_equal(&leaf3->info.uuid, &mp->m_sb.sb_meta_uuid))
 174                        return __this_address;
 175                if (be64_to_cpu(leaf3->info.blkno) != bp->b_bn)
 176                        return __this_address;
 177                if (!xfs_log_check_lsn(mp, be64_to_cpu(leaf3->info.lsn)))
 178                        return __this_address;
 179        } else {
 180                if (leaf->hdr.info.magic != cpu_to_be16(magic))
 181                        return __this_address;
 182        }
 183
 184        return xfs_dir3_leaf_check_int(mp, NULL, NULL, leaf);
 185}
 186
 187static void
 188__read_verify(
 189        struct xfs_buf  *bp,
 190        uint16_t        magic)
 191{
 192        struct xfs_mount        *mp = bp->b_target->bt_mount;
 193        xfs_failaddr_t          fa;
 194
 195        if (xfs_sb_version_hascrc(&mp->m_sb) &&
 196             !xfs_buf_verify_cksum(bp, XFS_DIR3_LEAF_CRC_OFF))
 197                xfs_verifier_error(bp, -EFSBADCRC, __this_address);
 198        else {
 199                fa = xfs_dir3_leaf_verify(bp, magic);
 200                if (fa)
 201                        xfs_verifier_error(bp, -EFSCORRUPTED, fa);
 202        }
 203}
 204
 205static void
 206__write_verify(
 207        struct xfs_buf  *bp,
 208        uint16_t        magic)
 209{
 210        struct xfs_mount        *mp = bp->b_target->bt_mount;
 211        struct xfs_buf_log_item *bip = bp->b_log_item;
 212        struct xfs_dir3_leaf_hdr *hdr3 = bp->b_addr;
 213        xfs_failaddr_t          fa;
 214
 215        fa = xfs_dir3_leaf_verify(bp, magic);
 216        if (fa) {
 217                xfs_verifier_error(bp, -EFSCORRUPTED, fa);
 218                return;
 219        }
 220
 221        if (!xfs_sb_version_hascrc(&mp->m_sb))
 222                return;
 223
 224        if (bip)
 225                hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn);
 226
 227        xfs_buf_update_cksum(bp, XFS_DIR3_LEAF_CRC_OFF);
 228}
 229
 230static xfs_failaddr_t
 231xfs_dir3_leaf1_verify(
 232        struct xfs_buf  *bp)
 233{
 234        return xfs_dir3_leaf_verify(bp, XFS_DIR2_LEAF1_MAGIC);
 235}
 236
 237static void
 238xfs_dir3_leaf1_read_verify(
 239        struct xfs_buf  *bp)
 240{
 241        __read_verify(bp, XFS_DIR2_LEAF1_MAGIC);
 242}
 243
 244static void
 245xfs_dir3_leaf1_write_verify(
 246        struct xfs_buf  *bp)
 247{
 248        __write_verify(bp, XFS_DIR2_LEAF1_MAGIC);
 249}
 250
 251static xfs_failaddr_t
 252xfs_dir3_leafn_verify(
 253        struct xfs_buf  *bp)
 254{
 255        return xfs_dir3_leaf_verify(bp, XFS_DIR2_LEAFN_MAGIC);
 256}
 257
 258static void
 259xfs_dir3_leafn_read_verify(
 260        struct xfs_buf  *bp)
 261{
 262        __read_verify(bp, XFS_DIR2_LEAFN_MAGIC);
 263}
 264
 265static void
 266xfs_dir3_leafn_write_verify(
 267        struct xfs_buf  *bp)
 268{
 269        __write_verify(bp, XFS_DIR2_LEAFN_MAGIC);
 270}
 271
 272const struct xfs_buf_ops xfs_dir3_leaf1_buf_ops = {
 273        .name = "xfs_dir3_leaf1",
 274        .verify_read = xfs_dir3_leaf1_read_verify,
 275        .verify_write = xfs_dir3_leaf1_write_verify,
 276        .verify_struct = xfs_dir3_leaf1_verify,
 277};
 278
 279const struct xfs_buf_ops xfs_dir3_leafn_buf_ops = {
 280        .name = "xfs_dir3_leafn",
 281        .verify_read = xfs_dir3_leafn_read_verify,
 282        .verify_write = xfs_dir3_leafn_write_verify,
 283        .verify_struct = xfs_dir3_leafn_verify,
 284};
 285
 286int
 287xfs_dir3_leaf_read(
 288        struct xfs_trans        *tp,
 289        struct xfs_inode        *dp,
 290        xfs_dablk_t             fbno,
 291        xfs_daddr_t             mappedbno,
 292        struct xfs_buf          **bpp)
 293{
 294        int                     err;
 295
 296        err = xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp,
 297                                XFS_DATA_FORK, &xfs_dir3_leaf1_buf_ops);
 298        if (!err && tp && *bpp)
 299                xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_LEAF1_BUF);
 300        return err;
 301}
 302
 303int
 304xfs_dir3_leafn_read(
 305        struct xfs_trans        *tp,
 306        struct xfs_inode        *dp,
 307        xfs_dablk_t             fbno,
 308        xfs_daddr_t             mappedbno,
 309        struct xfs_buf          **bpp)
 310{
 311        int                     err;
 312
 313        err = xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp,
 314                                XFS_DATA_FORK, &xfs_dir3_leafn_buf_ops);
 315        if (!err && tp && *bpp)
 316                xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_LEAFN_BUF);
 317        return err;
 318}
 319
 320/*
 321 * Initialize a new leaf block, leaf1 or leafn magic accepted.
 322 */
 323static void
 324xfs_dir3_leaf_init(
 325        struct xfs_mount        *mp,
 326        struct xfs_trans        *tp,
 327        struct xfs_buf          *bp,
 328        xfs_ino_t               owner,
 329        uint16_t                type)
 330{
 331        struct xfs_dir2_leaf    *leaf = bp->b_addr;
 332
 333        ASSERT(type == XFS_DIR2_LEAF1_MAGIC || type == XFS_DIR2_LEAFN_MAGIC);
 334
 335        if (xfs_sb_version_hascrc(&mp->m_sb)) {
 336                struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr;
 337
 338                memset(leaf3, 0, sizeof(*leaf3));
 339
 340                leaf3->info.hdr.magic = (type == XFS_DIR2_LEAF1_MAGIC)
 341                                         ? cpu_to_be16(XFS_DIR3_LEAF1_MAGIC)
 342                                         : cpu_to_be16(XFS_DIR3_LEAFN_MAGIC);
 343                leaf3->info.blkno = cpu_to_be64(bp->b_bn);
 344                leaf3->info.owner = cpu_to_be64(owner);
 345                uuid_copy(&leaf3->info.uuid, &mp->m_sb.sb_meta_uuid);
 346        } else {
 347                memset(leaf, 0, sizeof(*leaf));
 348                leaf->hdr.info.magic = cpu_to_be16(type);
 349        }
 350
 351        /*
 352         * If it's a leaf-format directory initialize the tail.
 353         * Caller is responsible for initialising the bests table.
 354         */
 355        if (type == XFS_DIR2_LEAF1_MAGIC) {
 356                struct xfs_dir2_leaf_tail *ltp;
 357
 358                ltp = xfs_dir2_leaf_tail_p(mp->m_dir_geo, leaf);
 359                ltp->bestcount = 0;
 360                bp->b_ops = &xfs_dir3_leaf1_buf_ops;
 361                xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAF1_BUF);
 362        } else {
 363                bp->b_ops = &xfs_dir3_leafn_buf_ops;
 364                xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAFN_BUF);
 365        }
 366}
 367
 368int
 369xfs_dir3_leaf_get_buf(
 370        xfs_da_args_t           *args,
 371        xfs_dir2_db_t           bno,
 372        struct xfs_buf          **bpp,
 373        uint16_t                magic)
 374{
 375        struct xfs_inode        *dp = args->dp;
 376        struct xfs_trans        *tp = args->trans;
 377        struct xfs_mount        *mp = dp->i_mount;
 378        struct xfs_buf          *bp;
 379        int                     error;
 380
 381        ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC);
 382        ASSERT(bno >= xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET) &&
 383               bno < xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET));
 384
 385        error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, bno),
 386                               -1, &bp, XFS_DATA_FORK);
 387        if (error)
 388                return error;
 389
 390        xfs_dir3_leaf_init(mp, tp, bp, dp->i_ino, magic);
 391        xfs_dir3_leaf_log_header(args, bp);
 392        if (magic == XFS_DIR2_LEAF1_MAGIC)
 393                xfs_dir3_leaf_log_tail(args, bp);
 394        *bpp = bp;
 395        return 0;
 396}
 397
 398/*
 399 * Convert a block form directory to a leaf form directory.
 400 */
 401int                                             /* error */
 402xfs_dir2_block_to_leaf(
 403        xfs_da_args_t           *args,          /* operation arguments */
 404        struct xfs_buf          *dbp)           /* input block's buffer */
 405{
 406        __be16                  *bestsp;        /* leaf's bestsp entries */
 407        xfs_dablk_t             blkno;          /* leaf block's bno */
 408        xfs_dir2_data_hdr_t     *hdr;           /* block header */
 409        xfs_dir2_leaf_entry_t   *blp;           /* block's leaf entries */
 410        xfs_dir2_block_tail_t   *btp;           /* block's tail */
 411        xfs_inode_t             *dp;            /* incore directory inode */
 412        int                     error;          /* error return code */
 413        struct xfs_buf          *lbp;           /* leaf block's buffer */
 414        xfs_dir2_db_t           ldb;            /* leaf block's bno */
 415        xfs_dir2_leaf_t         *leaf;          /* leaf structure */
 416        xfs_dir2_leaf_tail_t    *ltp;           /* leaf's tail */
 417        int                     needlog;        /* need to log block header */
 418        int                     needscan;       /* need to rescan bestfree */
 419        xfs_trans_t             *tp;            /* transaction pointer */
 420        struct xfs_dir2_data_free *bf;
 421        struct xfs_dir2_leaf_entry *ents;
 422        struct xfs_dir3_icleaf_hdr leafhdr;
 423
 424        trace_xfs_dir2_block_to_leaf(args);
 425
 426        dp = args->dp;
 427        tp = args->trans;
 428        /*
 429         * Add the leaf block to the inode.
 430         * This interface will only put blocks in the leaf/node range.
 431         * Since that's empty now, we'll get the root (block 0 in range).
 432         */
 433        if ((error = xfs_da_grow_inode(args, &blkno))) {
 434                return error;
 435        }
 436        ldb = xfs_dir2_da_to_db(args->geo, blkno);
 437        ASSERT(ldb == xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET));
 438        /*
 439         * Initialize the leaf block, get a buffer for it.
 440         */
 441        error = xfs_dir3_leaf_get_buf(args, ldb, &lbp, XFS_DIR2_LEAF1_MAGIC);
 442        if (error)
 443                return error;
 444
 445        leaf = lbp->b_addr;
 446        hdr = dbp->b_addr;
 447        xfs_dir3_data_check(dp, dbp);
 448        btp = xfs_dir2_block_tail_p(args->geo, hdr);
 449        blp = xfs_dir2_block_leaf_p(btp);
 450        bf = dp->d_ops->data_bestfree_p(hdr);
 451        ents = dp->d_ops->leaf_ents_p(leaf);
 452
 453        /*
 454         * Set the counts in the leaf header.
 455         */
 456        dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
 457        leafhdr.count = be32_to_cpu(btp->count);
 458        leafhdr.stale = be32_to_cpu(btp->stale);
 459        dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr);
 460        xfs_dir3_leaf_log_header(args, lbp);
 461
 462        /*
 463         * Could compact these but I think we always do the conversion
 464         * after squeezing out stale entries.
 465         */
 466        memcpy(ents, blp, be32_to_cpu(btp->count) * sizeof(xfs_dir2_leaf_entry_t));
 467        xfs_dir3_leaf_log_ents(args, lbp, 0, leafhdr.count - 1);
 468        needscan = 0;
 469        needlog = 1;
 470        /*
 471         * Make the space formerly occupied by the leaf entries and block
 472         * tail be free.
 473         */
 474        xfs_dir2_data_make_free(args, dbp,
 475                (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr),
 476                (xfs_dir2_data_aoff_t)((char *)hdr + args->geo->blksize -
 477                                       (char *)blp),
 478                &needlog, &needscan);
 479        /*
 480         * Fix up the block header, make it a data block.
 481         */
 482        dbp->b_ops = &xfs_dir3_data_buf_ops;
 483        xfs_trans_buf_set_type(tp, dbp, XFS_BLFT_DIR_DATA_BUF);
 484        if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC))
 485                hdr->magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC);
 486        else
 487                hdr->magic = cpu_to_be32(XFS_DIR3_DATA_MAGIC);
 488
 489        if (needscan)
 490                xfs_dir2_data_freescan(dp, hdr, &needlog);
 491        /*
 492         * Set up leaf tail and bests table.
 493         */
 494        ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
 495        ltp->bestcount = cpu_to_be32(1);
 496        bestsp = xfs_dir2_leaf_bests_p(ltp);
 497        bestsp[0] =  bf[0].length;
 498        /*
 499         * Log the data header and leaf bests table.
 500         */
 501        if (needlog)
 502                xfs_dir2_data_log_header(args, dbp);
 503        xfs_dir3_leaf_check(dp, lbp);
 504        xfs_dir3_data_check(dp, dbp);
 505        xfs_dir3_leaf_log_bests(args, lbp, 0, 0);
 506        return 0;
 507}
 508
 509STATIC void
 510xfs_dir3_leaf_find_stale(
 511        struct xfs_dir3_icleaf_hdr *leafhdr,
 512        struct xfs_dir2_leaf_entry *ents,
 513        int                     index,
 514        int                     *lowstale,
 515        int                     *highstale)
 516{
 517        /*
 518         * Find the first stale entry before our index, if any.
 519         */
 520        for (*lowstale = index - 1; *lowstale >= 0; --*lowstale) {
 521                if (ents[*lowstale].address ==
 522                    cpu_to_be32(XFS_DIR2_NULL_DATAPTR))
 523                        break;
 524        }
 525
 526        /*
 527         * Find the first stale entry at or after our index, if any.
 528         * Stop if the result would require moving more entries than using
 529         * lowstale.
 530         */
 531        for (*highstale = index; *highstale < leafhdr->count; ++*highstale) {
 532                if (ents[*highstale].address ==
 533                    cpu_to_be32(XFS_DIR2_NULL_DATAPTR))
 534                        break;
 535                if (*lowstale >= 0 && index - *lowstale <= *highstale - index)
 536                        break;
 537        }
 538}
 539
 540struct xfs_dir2_leaf_entry *
 541xfs_dir3_leaf_find_entry(
 542        struct xfs_dir3_icleaf_hdr *leafhdr,
 543        struct xfs_dir2_leaf_entry *ents,
 544        int                     index,          /* leaf table position */
 545        int                     compact,        /* need to compact leaves */
 546        int                     lowstale,       /* index of prev stale leaf */
 547        int                     highstale,      /* index of next stale leaf */
 548        int                     *lfloglow,      /* low leaf logging index */
 549        int                     *lfloghigh)     /* high leaf logging index */
 550{
 551        if (!leafhdr->stale) {
 552                xfs_dir2_leaf_entry_t   *lep;   /* leaf entry table pointer */
 553
 554                /*
 555                 * Now we need to make room to insert the leaf entry.
 556                 *
 557                 * If there are no stale entries, just insert a hole at index.
 558                 */
 559                lep = &ents[index];
 560                if (index < leafhdr->count)
 561                        memmove(lep + 1, lep,
 562                                (leafhdr->count - index) * sizeof(*lep));
 563
 564                /*
 565                 * Record low and high logging indices for the leaf.
 566                 */
 567                *lfloglow = index;
 568                *lfloghigh = leafhdr->count++;
 569                return lep;
 570        }
 571
 572        /*
 573         * There are stale entries.
 574         *
 575         * We will use one of them for the new entry.  It's probably not at
 576         * the right location, so we'll have to shift some up or down first.
 577         *
 578         * If we didn't compact before, we need to find the nearest stale
 579         * entries before and after our insertion point.
 580         */
 581        if (compact == 0)
 582                xfs_dir3_leaf_find_stale(leafhdr, ents, index,
 583                                         &lowstale, &highstale);
 584
 585        /*
 586         * If the low one is better, use it.
 587         */
 588        if (lowstale >= 0 &&
 589            (highstale == leafhdr->count ||
 590             index - lowstale - 1 < highstale - index)) {
 591                ASSERT(index - lowstale - 1 >= 0);
 592                ASSERT(ents[lowstale].address ==
 593                       cpu_to_be32(XFS_DIR2_NULL_DATAPTR));
 594
 595                /*
 596                 * Copy entries up to cover the stale entry and make room
 597                 * for the new entry.
 598                 */
 599                if (index - lowstale - 1 > 0) {
 600                        memmove(&ents[lowstale], &ents[lowstale + 1],
 601                                (index - lowstale - 1) *
 602                                        sizeof(xfs_dir2_leaf_entry_t));
 603                }
 604                *lfloglow = MIN(lowstale, *lfloglow);
 605                *lfloghigh = MAX(index - 1, *lfloghigh);
 606                leafhdr->stale--;
 607                return &ents[index - 1];
 608        }
 609
 610        /*
 611         * The high one is better, so use that one.
 612         */
 613        ASSERT(highstale - index >= 0);
 614        ASSERT(ents[highstale].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR));
 615
 616        /*
 617         * Copy entries down to cover the stale entry and make room for the
 618         * new entry.
 619         */
 620        if (highstale - index > 0) {
 621                memmove(&ents[index + 1], &ents[index],
 622                        (highstale - index) * sizeof(xfs_dir2_leaf_entry_t));
 623        }
 624        *lfloglow = MIN(index, *lfloglow);
 625        *lfloghigh = MAX(highstale, *lfloghigh);
 626        leafhdr->stale--;
 627        return &ents[index];
 628}
 629
 630/*
 631 * Add an entry to a leaf form directory.
 632 */
 633int                                             /* error */
 634xfs_dir2_leaf_addname(
 635        xfs_da_args_t           *args)          /* operation arguments */
 636{
 637        __be16                  *bestsp;        /* freespace table in leaf */
 638        int                     compact;        /* need to compact leaves */
 639        xfs_dir2_data_hdr_t     *hdr;           /* data block header */
 640        struct xfs_buf          *dbp;           /* data block buffer */
 641        xfs_dir2_data_entry_t   *dep;           /* data block entry */
 642        xfs_inode_t             *dp;            /* incore directory inode */
 643        xfs_dir2_data_unused_t  *dup;           /* data unused entry */
 644        int                     error;          /* error return value */
 645        int                     grown;          /* allocated new data block */
 646        int                     highstale;      /* index of next stale leaf */
 647        int                     i;              /* temporary, index */
 648        int                     index;          /* leaf table position */
 649        struct xfs_buf          *lbp;           /* leaf's buffer */
 650        xfs_dir2_leaf_t         *leaf;          /* leaf structure */
 651        int                     length;         /* length of new entry */
 652        xfs_dir2_leaf_entry_t   *lep;           /* leaf entry table pointer */
 653        int                     lfloglow;       /* low leaf logging index */
 654        int                     lfloghigh;      /* high leaf logging index */
 655        int                     lowstale;       /* index of prev stale leaf */
 656        xfs_dir2_leaf_tail_t    *ltp;           /* leaf tail pointer */
 657        int                     needbytes;      /* leaf block bytes needed */
 658        int                     needlog;        /* need to log data header */
 659        int                     needscan;       /* need to rescan data free */
 660        __be16                  *tagp;          /* end of data entry */
 661        xfs_trans_t             *tp;            /* transaction pointer */
 662        xfs_dir2_db_t           use_block;      /* data block number */
 663        struct xfs_dir2_data_free *bf;          /* bestfree table */
 664        struct xfs_dir2_leaf_entry *ents;
 665        struct xfs_dir3_icleaf_hdr leafhdr;
 666
 667        trace_xfs_dir2_leaf_addname(args);
 668
 669        dp = args->dp;
 670        tp = args->trans;
 671
 672        error = xfs_dir3_leaf_read(tp, dp, args->geo->leafblk, -1, &lbp);
 673        if (error)
 674                return error;
 675
 676        /*
 677         * Look up the entry by hash value and name.
 678         * We know it's not there, our caller has already done a lookup.
 679         * So the index is of the entry to insert in front of.
 680         * But if there are dup hash values the index is of the first of those.
 681         */
 682        index = xfs_dir2_leaf_search_hash(args, lbp);
 683        leaf = lbp->b_addr;
 684        ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
 685        ents = dp->d_ops->leaf_ents_p(leaf);
 686        dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
 687        bestsp = xfs_dir2_leaf_bests_p(ltp);
 688        length = dp->d_ops->data_entsize(args->namelen);
 689
 690        /*
 691         * See if there are any entries with the same hash value
 692         * and space in their block for the new entry.
 693         * This is good because it puts multiple same-hash value entries
 694         * in a data block, improving the lookup of those entries.
 695         */
 696        for (use_block = -1, lep = &ents[index];
 697             index < leafhdr.count && be32_to_cpu(lep->hashval) == args->hashval;
 698             index++, lep++) {
 699                if (be32_to_cpu(lep->address) == XFS_DIR2_NULL_DATAPTR)
 700                        continue;
 701                i = xfs_dir2_dataptr_to_db(args->geo, be32_to_cpu(lep->address));
 702                ASSERT(i < be32_to_cpu(ltp->bestcount));
 703                ASSERT(bestsp[i] != cpu_to_be16(NULLDATAOFF));
 704                if (be16_to_cpu(bestsp[i]) >= length) {
 705                        use_block = i;
 706                        break;
 707                }
 708        }
 709        /*
 710         * Didn't find a block yet, linear search all the data blocks.
 711         */
 712        if (use_block == -1) {
 713                for (i = 0; i < be32_to_cpu(ltp->bestcount); i++) {
 714                        /*
 715                         * Remember a block we see that's missing.
 716                         */
 717                        if (bestsp[i] == cpu_to_be16(NULLDATAOFF) &&
 718                            use_block == -1)
 719                                use_block = i;
 720                        else if (be16_to_cpu(bestsp[i]) >= length) {
 721                                use_block = i;
 722                                break;
 723                        }
 724                }
 725        }
 726        /*
 727         * How many bytes do we need in the leaf block?
 728         */
 729        needbytes = 0;
 730        if (!leafhdr.stale)
 731                needbytes += sizeof(xfs_dir2_leaf_entry_t);
 732        if (use_block == -1)
 733                needbytes += sizeof(xfs_dir2_data_off_t);
 734
 735        /*
 736         * Now kill use_block if it refers to a missing block, so we
 737         * can use it as an indication of allocation needed.
 738         */
 739        if (use_block != -1 && bestsp[use_block] == cpu_to_be16(NULLDATAOFF))
 740                use_block = -1;
 741        /*
 742         * If we don't have enough free bytes but we can make enough
 743         * by compacting out stale entries, we'll do that.
 744         */
 745        if ((char *)bestsp - (char *)&ents[leafhdr.count] < needbytes &&
 746            leafhdr.stale > 1)
 747                compact = 1;
 748
 749        /*
 750         * Otherwise if we don't have enough free bytes we need to
 751         * convert to node form.
 752         */
 753        else if ((char *)bestsp - (char *)&ents[leafhdr.count] < needbytes) {
 754                /*
 755                 * Just checking or no space reservation, give up.
 756                 */
 757                if ((args->op_flags & XFS_DA_OP_JUSTCHECK) ||
 758                                                        args->total == 0) {
 759                        xfs_trans_brelse(tp, lbp);
 760                        return -ENOSPC;
 761                }
 762                /*
 763                 * Convert to node form.
 764                 */
 765                error = xfs_dir2_leaf_to_node(args, lbp);
 766                if (error)
 767                        return error;
 768                /*
 769                 * Then add the new entry.
 770                 */
 771                return xfs_dir2_node_addname(args);
 772        }
 773        /*
 774         * Otherwise it will fit without compaction.
 775         */
 776        else
 777                compact = 0;
 778        /*
 779         * If just checking, then it will fit unless we needed to allocate
 780         * a new data block.
 781         */
 782        if (args->op_flags & XFS_DA_OP_JUSTCHECK) {
 783                xfs_trans_brelse(tp, lbp);
 784                return use_block == -1 ? -ENOSPC : 0;
 785        }
 786        /*
 787         * If no allocations are allowed, return now before we've
 788         * changed anything.
 789         */
 790        if (args->total == 0 && use_block == -1) {
 791                xfs_trans_brelse(tp, lbp);
 792                return -ENOSPC;
 793        }
 794        /*
 795         * Need to compact the leaf entries, removing stale ones.
 796         * Leave one stale entry behind - the one closest to our
 797         * insertion index - and we'll shift that one to our insertion
 798         * point later.
 799         */
 800        if (compact) {
 801                xfs_dir3_leaf_compact_x1(&leafhdr, ents, &index, &lowstale,
 802                        &highstale, &lfloglow, &lfloghigh);
 803        }
 804        /*
 805         * There are stale entries, so we'll need log-low and log-high
 806         * impossibly bad values later.
 807         */
 808        else if (leafhdr.stale) {
 809                lfloglow = leafhdr.count;
 810                lfloghigh = -1;
 811        }
 812        /*
 813         * If there was no data block space found, we need to allocate
 814         * a new one.
 815         */
 816        if (use_block == -1) {
 817                /*
 818                 * Add the new data block.
 819                 */
 820                if ((error = xfs_dir2_grow_inode(args, XFS_DIR2_DATA_SPACE,
 821                                &use_block))) {
 822                        xfs_trans_brelse(tp, lbp);
 823                        return error;
 824                }
 825                /*
 826                 * Initialize the block.
 827                 */
 828                if ((error = xfs_dir3_data_init(args, use_block, &dbp))) {
 829                        xfs_trans_brelse(tp, lbp);
 830                        return error;
 831                }
 832                /*
 833                 * If we're adding a new data block on the end we need to
 834                 * extend the bests table.  Copy it up one entry.
 835                 */
 836                if (use_block >= be32_to_cpu(ltp->bestcount)) {
 837                        bestsp--;
 838                        memmove(&bestsp[0], &bestsp[1],
 839                                be32_to_cpu(ltp->bestcount) * sizeof(bestsp[0]));
 840                        be32_add_cpu(&ltp->bestcount, 1);
 841                        xfs_dir3_leaf_log_tail(args, lbp);
 842                        xfs_dir3_leaf_log_bests(args, lbp, 0,
 843                                                be32_to_cpu(ltp->bestcount) - 1);
 844                }
 845                /*
 846                 * If we're filling in a previously empty block just log it.
 847                 */
 848                else
 849                        xfs_dir3_leaf_log_bests(args, lbp, use_block, use_block);
 850                hdr = dbp->b_addr;
 851                bf = dp->d_ops->data_bestfree_p(hdr);
 852                bestsp[use_block] = bf[0].length;
 853                grown = 1;
 854        } else {
 855                /*
 856                 * Already had space in some data block.
 857                 * Just read that one in.
 858                 */
 859                error = xfs_dir3_data_read(tp, dp,
 860                                   xfs_dir2_db_to_da(args->geo, use_block),
 861                                   -1, &dbp);
 862                if (error) {
 863                        xfs_trans_brelse(tp, lbp);
 864                        return error;
 865                }
 866                hdr = dbp->b_addr;
 867                bf = dp->d_ops->data_bestfree_p(hdr);
 868                grown = 0;
 869        }
 870        /*
 871         * Point to the biggest freespace in our data block.
 872         */
 873        dup = (xfs_dir2_data_unused_t *)
 874              ((char *)hdr + be16_to_cpu(bf[0].offset));
 875        ASSERT(be16_to_cpu(dup->length) >= length);
 876        needscan = needlog = 0;
 877        /*
 878         * Mark the initial part of our freespace in use for the new entry.
 879         */
 880        xfs_dir2_data_use_free(args, dbp, dup,
 881                (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), length,
 882                &needlog, &needscan);
 883        /*
 884         * Initialize our new entry (at last).
 885         */
 886        dep = (xfs_dir2_data_entry_t *)dup;
 887        dep->inumber = cpu_to_be64(args->inumber);
 888        dep->namelen = args->namelen;
 889        memcpy(dep->name, args->name, dep->namelen);
 890        dp->d_ops->data_put_ftype(dep, args->filetype);
 891        tagp = dp->d_ops->data_entry_tag_p(dep);
 892        *tagp = cpu_to_be16((char *)dep - (char *)hdr);
 893        /*
 894         * Need to scan fix up the bestfree table.
 895         */
 896        if (needscan)
 897                xfs_dir2_data_freescan(dp, hdr, &needlog);
 898        /*
 899         * Need to log the data block's header.
 900         */
 901        if (needlog)
 902                xfs_dir2_data_log_header(args, dbp);
 903        xfs_dir2_data_log_entry(args, dbp, dep);
 904        /*
 905         * If the bests table needs to be changed, do it.
 906         * Log the change unless we've already done that.
 907         */
 908        if (be16_to_cpu(bestsp[use_block]) != be16_to_cpu(bf[0].length)) {
 909                bestsp[use_block] = bf[0].length;
 910                if (!grown)
 911                        xfs_dir3_leaf_log_bests(args, lbp, use_block, use_block);
 912        }
 913
 914        lep = xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale,
 915                                       highstale, &lfloglow, &lfloghigh);
 916
 917        /*
 918         * Fill in the new leaf entry.
 919         */
 920        lep->hashval = cpu_to_be32(args->hashval);
 921        lep->address = cpu_to_be32(
 922                                xfs_dir2_db_off_to_dataptr(args->geo, use_block,
 923                                be16_to_cpu(*tagp)));
 924        /*
 925         * Log the leaf fields and give up the buffers.
 926         */
 927        dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr);
 928        xfs_dir3_leaf_log_header(args, lbp);
 929        xfs_dir3_leaf_log_ents(args, lbp, lfloglow, lfloghigh);
 930        xfs_dir3_leaf_check(dp, lbp);
 931        xfs_dir3_data_check(dp, dbp);
 932        return 0;
 933}
 934
 935/*
 936 * Compact out any stale entries in the leaf.
 937 * Log the header and changed leaf entries, if any.
 938 */
 939void
 940xfs_dir3_leaf_compact(
 941        xfs_da_args_t   *args,          /* operation arguments */
 942        struct xfs_dir3_icleaf_hdr *leafhdr,
 943        struct xfs_buf  *bp)            /* leaf buffer */
 944{
 945        int             from;           /* source leaf index */
 946        xfs_dir2_leaf_t *leaf;          /* leaf structure */
 947        int             loglow;         /* first leaf entry to log */
 948        int             to;             /* target leaf index */
 949        struct xfs_dir2_leaf_entry *ents;
 950        struct xfs_inode *dp = args->dp;
 951
 952        leaf = bp->b_addr;
 953        if (!leafhdr->stale)
 954                return;
 955
 956        /*
 957         * Compress out the stale entries in place.
 958         */
 959        ents = dp->d_ops->leaf_ents_p(leaf);
 960        for (from = to = 0, loglow = -1; from < leafhdr->count; from++) {
 961                if (ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR))
 962                        continue;
 963                /*
 964                 * Only actually copy the entries that are different.
 965                 */
 966                if (from > to) {
 967                        if (loglow == -1)
 968                                loglow = to;
 969                        ents[to] = ents[from];
 970                }
 971                to++;
 972        }
 973        /*
 974         * Update and log the header, log the leaf entries.
 975         */
 976        ASSERT(leafhdr->stale == from - to);
 977        leafhdr->count -= leafhdr->stale;
 978        leafhdr->stale = 0;
 979
 980        dp->d_ops->leaf_hdr_to_disk(leaf, leafhdr);
 981        xfs_dir3_leaf_log_header(args, bp);
 982        if (loglow != -1)
 983                xfs_dir3_leaf_log_ents(args, bp, loglow, to - 1);
 984}
 985
 986/*
 987 * Compact the leaf entries, removing stale ones.
 988 * Leave one stale entry behind - the one closest to our
 989 * insertion index - and the caller will shift that one to our insertion
 990 * point later.
 991 * Return new insertion index, where the remaining stale entry is,
 992 * and leaf logging indices.
 993 */
 994void
 995xfs_dir3_leaf_compact_x1(
 996        struct xfs_dir3_icleaf_hdr *leafhdr,
 997        struct xfs_dir2_leaf_entry *ents,
 998        int             *indexp,        /* insertion index */
 999        int             *lowstalep,     /* out: stale entry before us */
1000        int             *highstalep,    /* out: stale entry after us */
1001        int             *lowlogp,       /* out: low log index */
1002        int             *highlogp)      /* out: high log index */
1003{
1004        int             from;           /* source copy index */
1005        int             highstale;      /* stale entry at/after index */
1006        int             index;          /* insertion index */
1007        int             keepstale;      /* source index of kept stale */
1008        int             lowstale;       /* stale entry before index */
1009        int             newindex=0;     /* new insertion index */
1010        int             to;             /* destination copy index */
1011
1012        ASSERT(leafhdr->stale > 1);
1013        index = *indexp;
1014
1015        xfs_dir3_leaf_find_stale(leafhdr, ents, index, &lowstale, &highstale);
1016
1017        /*
1018         * Pick the better of lowstale and highstale.
1019         */
1020        if (lowstale >= 0 &&
1021            (highstale == leafhdr->count ||
1022             index - lowstale <= highstale - index))
1023                keepstale = lowstale;
1024        else
1025                keepstale = highstale;
1026        /*
1027         * Copy the entries in place, removing all the stale entries
1028         * except keepstale.
1029         */
1030        for (from = to = 0; from < leafhdr->count; from++) {
1031                /*
1032                 * Notice the new value of index.
1033                 */
1034                if (index == from)
1035                        newindex = to;
1036                if (from != keepstale &&
1037                    ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) {
1038                        if (from == to)
1039                                *lowlogp = to;
1040                        continue;
1041                }
1042                /*
1043                 * Record the new keepstale value for the insertion.
1044                 */
1045                if (from == keepstale)
1046                        lowstale = highstale = to;
1047                /*
1048                 * Copy only the entries that have moved.
1049                 */
1050                if (from > to)
1051                        ents[to] = ents[from];
1052                to++;
1053        }
1054        ASSERT(from > to);
1055        /*
1056         * If the insertion point was past the last entry,
1057         * set the new insertion point accordingly.
1058         */
1059        if (index == from)
1060                newindex = to;
1061        *indexp = newindex;
1062        /*
1063         * Adjust the leaf header values.
1064         */
1065        leafhdr->count -= from - to;
1066        leafhdr->stale = 1;
1067        /*
1068         * Remember the low/high stale value only in the "right"
1069         * direction.
1070         */
1071        if (lowstale >= newindex)
1072                lowstale = -1;
1073        else
1074                highstale = leafhdr->count;
1075        *highlogp = leafhdr->count - 1;
1076        *lowstalep = lowstale;
1077        *highstalep = highstale;
1078}
1079
1080/*
1081 * Log the bests entries indicated from a leaf1 block.
1082 */
1083static void
1084xfs_dir3_leaf_log_bests(
1085        struct xfs_da_args      *args,
1086        struct xfs_buf          *bp,            /* leaf buffer */
1087        int                     first,          /* first entry to log */
1088        int                     last)           /* last entry to log */
1089{
1090        __be16                  *firstb;        /* pointer to first entry */
1091        __be16                  *lastb;         /* pointer to last entry */
1092        struct xfs_dir2_leaf    *leaf = bp->b_addr;
1093        xfs_dir2_leaf_tail_t    *ltp;           /* leaf tail structure */
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
1098        ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
1099        firstb = xfs_dir2_leaf_bests_p(ltp) + first;
1100        lastb = xfs_dir2_leaf_bests_p(ltp) + last;
1101        xfs_trans_log_buf(args->trans, bp,
1102                (uint)((char *)firstb - (char *)leaf),
1103                (uint)((char *)lastb - (char *)leaf + sizeof(*lastb) - 1));
1104}
1105
1106/*
1107 * Log the leaf entries indicated from a leaf1 or leafn block.
1108 */
1109void
1110xfs_dir3_leaf_log_ents(
1111        struct xfs_da_args      *args,
1112        struct xfs_buf          *bp,
1113        int                     first,
1114        int                     last)
1115{
1116        xfs_dir2_leaf_entry_t   *firstlep;      /* pointer to first entry */
1117        xfs_dir2_leaf_entry_t   *lastlep;       /* pointer to last entry */
1118        struct xfs_dir2_leaf    *leaf = bp->b_addr;
1119        struct xfs_dir2_leaf_entry *ents;
1120
1121        ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) ||
1122               leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) ||
1123               leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
1124               leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC));
1125
1126        ents = args->dp->d_ops->leaf_ents_p(leaf);
1127        firstlep = &ents[first];
1128        lastlep = &ents[last];
1129        xfs_trans_log_buf(args->trans, bp,
1130                (uint)((char *)firstlep - (char *)leaf),
1131                (uint)((char *)lastlep - (char *)leaf + sizeof(*lastlep) - 1));
1132}
1133
1134/*
1135 * Log the header of the leaf1 or leafn block.
1136 */
1137void
1138xfs_dir3_leaf_log_header(
1139        struct xfs_da_args      *args,
1140        struct xfs_buf          *bp)
1141{
1142        struct xfs_dir2_leaf    *leaf = bp->b_addr;
1143
1144        ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) ||
1145               leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) ||
1146               leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
1147               leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC));
1148
1149        xfs_trans_log_buf(args->trans, bp,
1150                          (uint)((char *)&leaf->hdr - (char *)leaf),
1151                          args->dp->d_ops->leaf_hdr_size - 1);
1152}
1153
1154/*
1155 * Log the tail of the leaf1 block.
1156 */
1157STATIC void
1158xfs_dir3_leaf_log_tail(
1159        struct xfs_da_args      *args,
1160        struct xfs_buf          *bp)
1161{
1162        struct xfs_dir2_leaf    *leaf = bp->b_addr;
1163        xfs_dir2_leaf_tail_t    *ltp;           /* leaf tail structure */
1164
1165        ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) ||
1166               leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) ||
1167               leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
1168               leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC));
1169
1170        ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
1171        xfs_trans_log_buf(args->trans, bp, (uint)((char *)ltp - (char *)leaf),
1172                (uint)(args->geo->blksize - 1));
1173}
1174
1175/*
1176 * Look up the entry referred to by args in the leaf format directory.
1177 * Most of the work is done by the xfs_dir2_leaf_lookup_int routine which
1178 * is also used by the node-format code.
1179 */
1180int
1181xfs_dir2_leaf_lookup(
1182        xfs_da_args_t           *args)          /* operation arguments */
1183{
1184        struct xfs_buf          *dbp;           /* data block buffer */
1185        xfs_dir2_data_entry_t   *dep;           /* data block entry */
1186        xfs_inode_t             *dp;            /* incore directory inode */
1187        int                     error;          /* error return code */
1188        int                     index;          /* found entry index */
1189        struct xfs_buf          *lbp;           /* leaf buffer */
1190        xfs_dir2_leaf_t         *leaf;          /* leaf structure */
1191        xfs_dir2_leaf_entry_t   *lep;           /* leaf entry */
1192        xfs_trans_t             *tp;            /* transaction pointer */
1193        struct xfs_dir2_leaf_entry *ents;
1194
1195        trace_xfs_dir2_leaf_lookup(args);
1196
1197        /*
1198         * Look up name in the leaf block, returning both buffers and index.
1199         */
1200        if ((error = xfs_dir2_leaf_lookup_int(args, &lbp, &index, &dbp))) {
1201                return error;
1202        }
1203        tp = args->trans;
1204        dp = args->dp;
1205        xfs_dir3_leaf_check(dp, lbp);
1206        leaf = lbp->b_addr;
1207        ents = dp->d_ops->leaf_ents_p(leaf);
1208        /*
1209         * Get to the leaf entry and contained data entry address.
1210         */
1211        lep = &ents[index];
1212
1213        /*
1214         * Point to the data entry.
1215         */
1216        dep = (xfs_dir2_data_entry_t *)
1217              ((char *)dbp->b_addr +
1218               xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address)));
1219        /*
1220         * Return the found inode number & CI name if appropriate
1221         */
1222        args->inumber = be64_to_cpu(dep->inumber);
1223        args->filetype = dp->d_ops->data_get_ftype(dep);
1224        error = xfs_dir_cilookup_result(args, dep->name, dep->namelen);
1225        xfs_trans_brelse(tp, dbp);
1226        xfs_trans_brelse(tp, lbp);
1227        return error;
1228}
1229
1230/*
1231 * Look up name/hash in the leaf block.
1232 * Fill in indexp with the found index, and dbpp with the data buffer.
1233 * If not found dbpp will be NULL, and ENOENT comes back.
1234 * lbpp will always be filled in with the leaf buffer unless there's an error.
1235 */
1236static int                                      /* error */
1237xfs_dir2_leaf_lookup_int(
1238        xfs_da_args_t           *args,          /* operation arguments */
1239        struct xfs_buf          **lbpp,         /* out: leaf buffer */
1240        int                     *indexp,        /* out: index in leaf block */
1241        struct xfs_buf          **dbpp)         /* out: data buffer */
1242{
1243        xfs_dir2_db_t           curdb = -1;     /* current data block number */
1244        struct xfs_buf          *dbp = NULL;    /* data buffer */
1245        xfs_dir2_data_entry_t   *dep;           /* data entry */
1246        xfs_inode_t             *dp;            /* incore directory inode */
1247        int                     error;          /* error return code */
1248        int                     index;          /* index in leaf block */
1249        struct xfs_buf          *lbp;           /* leaf buffer */
1250        xfs_dir2_leaf_entry_t   *lep;           /* leaf entry */
1251        xfs_dir2_leaf_t         *leaf;          /* leaf structure */
1252        xfs_mount_t             *mp;            /* filesystem mount point */
1253        xfs_dir2_db_t           newdb;          /* new data block number */
1254        xfs_trans_t             *tp;            /* transaction pointer */
1255        xfs_dir2_db_t           cidb = -1;      /* case match data block no. */
1256        enum xfs_dacmp          cmp;            /* name compare result */
1257        struct xfs_dir2_leaf_entry *ents;
1258        struct xfs_dir3_icleaf_hdr leafhdr;
1259
1260        dp = args->dp;
1261        tp = args->trans;
1262        mp = dp->i_mount;
1263
1264        error = xfs_dir3_leaf_read(tp, dp, args->geo->leafblk, -1, &lbp);
1265        if (error)
1266                return error;
1267
1268        *lbpp = lbp;
1269        leaf = lbp->b_addr;
1270        xfs_dir3_leaf_check(dp, lbp);
1271        ents = dp->d_ops->leaf_ents_p(leaf);
1272        dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
1273
1274        /*
1275         * Look for the first leaf entry with our hash value.
1276         */
1277        index = xfs_dir2_leaf_search_hash(args, lbp);
1278        /*
1279         * Loop over all the entries with the right hash value
1280         * looking to match the name.
1281         */
1282        for (lep = &ents[index];
1283             index < leafhdr.count && be32_to_cpu(lep->hashval) == args->hashval;
1284             lep++, index++) {
1285                /*
1286                 * Skip over stale leaf entries.
1287                 */
1288                if (be32_to_cpu(lep->address) == XFS_DIR2_NULL_DATAPTR)
1289                        continue;
1290                /*
1291                 * Get the new data block number.
1292                 */
1293                newdb = xfs_dir2_dataptr_to_db(args->geo,
1294                                               be32_to_cpu(lep->address));
1295                /*
1296                 * If it's not the same as the old data block number,
1297                 * need to pitch the old one and read the new one.
1298                 */
1299                if (newdb != curdb) {
1300                        if (dbp)
1301                                xfs_trans_brelse(tp, dbp);
1302                        error = xfs_dir3_data_read(tp, dp,
1303                                           xfs_dir2_db_to_da(args->geo, newdb),
1304                                           -1, &dbp);
1305                        if (error) {
1306                                xfs_trans_brelse(tp, lbp);
1307                                return error;
1308                        }
1309                        curdb = newdb;
1310                }
1311                /*
1312                 * Point to the data entry.
1313                 */
1314                dep = (xfs_dir2_data_entry_t *)((char *)dbp->b_addr +
1315                        xfs_dir2_dataptr_to_off(args->geo,
1316                                                be32_to_cpu(lep->address)));
1317                /*
1318                 * Compare name and if it's an exact match, return the index
1319                 * and buffer. If it's the first case-insensitive match, store
1320                 * the index and buffer and continue looking for an exact match.
1321                 */
1322                cmp = mp->m_dirnameops->compname(args, dep->name, dep->namelen);
1323                if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) {
1324                        args->cmpresult = cmp;
1325                        *indexp = index;
1326                        /* case exact match: return the current buffer. */
1327                        if (cmp == XFS_CMP_EXACT) {
1328                                *dbpp = dbp;
1329                                return 0;
1330                        }
1331                        cidb = curdb;
1332                }
1333        }
1334        ASSERT(args->op_flags & XFS_DA_OP_OKNOENT);
1335        /*
1336         * Here, we can only be doing a lookup (not a rename or remove).
1337         * If a case-insensitive match was found earlier, re-read the
1338         * appropriate data block if required and return it.
1339         */
1340        if (args->cmpresult == XFS_CMP_CASE) {
1341                ASSERT(cidb != -1);
1342                if (cidb != curdb) {
1343                        xfs_trans_brelse(tp, dbp);
1344                        error = xfs_dir3_data_read(tp, dp,
1345                                           xfs_dir2_db_to_da(args->geo, cidb),
1346                                           -1, &dbp);
1347                        if (error) {
1348                                xfs_trans_brelse(tp, lbp);
1349                                return error;
1350                        }
1351                }
1352                *dbpp = dbp;
1353                return 0;
1354        }
1355        /*
1356         * No match found, return -ENOENT.
1357         */
1358        ASSERT(cidb == -1);
1359        if (dbp)
1360                xfs_trans_brelse(tp, dbp);
1361        xfs_trans_brelse(tp, lbp);
1362        return -ENOENT;
1363}
1364
1365/*
1366 * Remove an entry from a leaf format directory.
1367 */
1368int                                             /* error */
1369xfs_dir2_leaf_removename(
1370        xfs_da_args_t           *args)          /* operation arguments */
1371{
1372        __be16                  *bestsp;        /* leaf block best freespace */
1373        xfs_dir2_data_hdr_t     *hdr;           /* data block header */
1374        xfs_dir2_db_t           db;             /* data block number */
1375        struct xfs_buf          *dbp;           /* data block buffer */
1376        xfs_dir2_data_entry_t   *dep;           /* data entry structure */
1377        xfs_inode_t             *dp;            /* incore directory inode */
1378        int                     error;          /* error return code */
1379        xfs_dir2_db_t           i;              /* temporary data block # */
1380        int                     index;          /* index into leaf entries */
1381        struct xfs_buf          *lbp;           /* leaf buffer */
1382        xfs_dir2_leaf_t         *leaf;          /* leaf structure */
1383        xfs_dir2_leaf_entry_t   *lep;           /* leaf entry */
1384        xfs_dir2_leaf_tail_t    *ltp;           /* leaf tail structure */
1385        int                     needlog;        /* need to log data header */
1386        int                     needscan;       /* need to rescan data frees */
1387        xfs_dir2_data_off_t     oldbest;        /* old value of best free */
1388        struct xfs_dir2_data_free *bf;          /* bestfree table */
1389        struct xfs_dir2_leaf_entry *ents;
1390        struct xfs_dir3_icleaf_hdr leafhdr;
1391
1392        trace_xfs_dir2_leaf_removename(args);
1393
1394        /*
1395         * Lookup the leaf entry, get the leaf and data blocks read in.
1396         */
1397        if ((error = xfs_dir2_leaf_lookup_int(args, &lbp, &index, &dbp))) {
1398                return error;
1399        }
1400        dp = args->dp;
1401        leaf = lbp->b_addr;
1402        hdr = dbp->b_addr;
1403        xfs_dir3_data_check(dp, dbp);
1404        bf = dp->d_ops->data_bestfree_p(hdr);
1405        dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
1406        ents = dp->d_ops->leaf_ents_p(leaf);
1407        /*
1408         * Point to the leaf entry, use that to point to the data entry.
1409         */
1410        lep = &ents[index];
1411        db = xfs_dir2_dataptr_to_db(args->geo, be32_to_cpu(lep->address));
1412        dep = (xfs_dir2_data_entry_t *)((char *)hdr +
1413                xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address)));
1414        needscan = needlog = 0;
1415        oldbest = be16_to_cpu(bf[0].length);
1416        ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
1417        bestsp = xfs_dir2_leaf_bests_p(ltp);
1418        ASSERT(be16_to_cpu(bestsp[db]) == oldbest);
1419        /*
1420         * Mark the former data entry unused.
1421         */
1422        xfs_dir2_data_make_free(args, dbp,
1423                (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr),
1424                dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan);
1425        /*
1426         * We just mark the leaf entry stale by putting a null in it.
1427         */
1428        leafhdr.stale++;
1429        dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr);
1430        xfs_dir3_leaf_log_header(args, lbp);
1431
1432        lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR);
1433        xfs_dir3_leaf_log_ents(args, lbp, index, index);
1434
1435        /*
1436         * Scan the freespace in the data block again if necessary,
1437         * log the data block header if necessary.
1438         */
1439        if (needscan)
1440                xfs_dir2_data_freescan(dp, hdr, &needlog);
1441        if (needlog)
1442                xfs_dir2_data_log_header(args, dbp);
1443        /*
1444         * If the longest freespace in the data block has changed,
1445         * put the new value in the bests table and log that.
1446         */
1447        if (be16_to_cpu(bf[0].length) != oldbest) {
1448                bestsp[db] = bf[0].length;
1449                xfs_dir3_leaf_log_bests(args, lbp, db, db);
1450        }
1451        xfs_dir3_data_check(dp, dbp);
1452        /*
1453         * If the data block is now empty then get rid of the data block.
1454         */
1455        if (be16_to_cpu(bf[0].length) ==
1456                        args->geo->blksize - dp->d_ops->data_entry_offset) {
1457                ASSERT(db != args->geo->datablk);
1458                if ((error = xfs_dir2_shrink_inode(args, db, dbp))) {
1459                        /*
1460                         * Nope, can't get rid of it because it caused
1461                         * allocation of a bmap btree block to do so.
1462                         * Just go on, returning success, leaving the
1463                         * empty block in place.
1464                         */
1465                        if (error == -ENOSPC && args->total == 0)
1466                                error = 0;
1467                        xfs_dir3_leaf_check(dp, lbp);
1468                        return error;
1469                }
1470                dbp = NULL;
1471                /*
1472                 * If this is the last data block then compact the
1473                 * bests table by getting rid of entries.
1474                 */
1475                if (db == be32_to_cpu(ltp->bestcount) - 1) {
1476                        /*
1477                         * Look for the last active entry (i).
1478                         */
1479                        for (i = db - 1; i > 0; i--) {
1480                                if (bestsp[i] != cpu_to_be16(NULLDATAOFF))
1481                                        break;
1482                        }
1483                        /*
1484                         * Copy the table down so inactive entries at the
1485                         * end are removed.
1486                         */
1487                        memmove(&bestsp[db - i], bestsp,
1488                                (be32_to_cpu(ltp->bestcount) - (db - i)) * sizeof(*bestsp));
1489                        be32_add_cpu(&ltp->bestcount, -(db - i));
1490                        xfs_dir3_leaf_log_tail(args, lbp);
1491                        xfs_dir3_leaf_log_bests(args, lbp, 0,
1492                                                be32_to_cpu(ltp->bestcount) - 1);
1493                } else
1494                        bestsp[db] = cpu_to_be16(NULLDATAOFF);
1495        }
1496        /*
1497         * If the data block was not the first one, drop it.
1498         */
1499        else if (db != args->geo->datablk)
1500                dbp = NULL;
1501
1502        xfs_dir3_leaf_check(dp, lbp);
1503        /*
1504         * See if we can convert to block form.
1505         */
1506        return xfs_dir2_leaf_to_block(args, lbp, dbp);
1507}
1508
1509/*
1510 * Replace the inode number in a leaf format directory entry.
1511 */
1512int                                             /* error */
1513xfs_dir2_leaf_replace(
1514        xfs_da_args_t           *args)          /* operation arguments */
1515{
1516        struct xfs_buf          *dbp;           /* data block buffer */
1517        xfs_dir2_data_entry_t   *dep;           /* data block entry */
1518        xfs_inode_t             *dp;            /* incore directory inode */
1519        int                     error;          /* error return code */
1520        int                     index;          /* index of leaf entry */
1521        struct xfs_buf          *lbp;           /* leaf buffer */
1522        xfs_dir2_leaf_t         *leaf;          /* leaf structure */
1523        xfs_dir2_leaf_entry_t   *lep;           /* leaf entry */
1524        xfs_trans_t             *tp;            /* transaction pointer */
1525        struct xfs_dir2_leaf_entry *ents;
1526
1527        trace_xfs_dir2_leaf_replace(args);
1528
1529        /*
1530         * Look up the entry.
1531         */
1532        if ((error = xfs_dir2_leaf_lookup_int(args, &lbp, &index, &dbp))) {
1533                return error;
1534        }
1535        dp = args->dp;
1536        leaf = lbp->b_addr;
1537        ents = dp->d_ops->leaf_ents_p(leaf);
1538        /*
1539         * Point to the leaf entry, get data address from it.
1540         */
1541        lep = &ents[index];
1542        /*
1543         * Point to the data entry.
1544         */
1545        dep = (xfs_dir2_data_entry_t *)
1546              ((char *)dbp->b_addr +
1547               xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address)));
1548        ASSERT(args->inumber != be64_to_cpu(dep->inumber));
1549        /*
1550         * Put the new inode number in, log it.
1551         */
1552        dep->inumber = cpu_to_be64(args->inumber);
1553        dp->d_ops->data_put_ftype(dep, args->filetype);
1554        tp = args->trans;
1555        xfs_dir2_data_log_entry(args, dbp, dep);
1556        xfs_dir3_leaf_check(dp, lbp);
1557        xfs_trans_brelse(tp, lbp);
1558        return 0;
1559}
1560
1561/*
1562 * Return index in the leaf block (lbp) which is either the first
1563 * one with this hash value, or if there are none, the insert point
1564 * for that hash value.
1565 */
1566int                                             /* index value */
1567xfs_dir2_leaf_search_hash(
1568        xfs_da_args_t           *args,          /* operation arguments */
1569        struct xfs_buf          *lbp)           /* leaf buffer */
1570{
1571        xfs_dahash_t            hash=0;         /* hash from this entry */
1572        xfs_dahash_t            hashwant;       /* hash value looking for */
1573        int                     high;           /* high leaf index */
1574        int                     low;            /* low leaf index */
1575        xfs_dir2_leaf_t         *leaf;          /* leaf structure */
1576        xfs_dir2_leaf_entry_t   *lep;           /* leaf entry */
1577        int                     mid=0;          /* current leaf index */
1578        struct xfs_dir2_leaf_entry *ents;
1579        struct xfs_dir3_icleaf_hdr leafhdr;
1580
1581        leaf = lbp->b_addr;
1582        ents = args->dp->d_ops->leaf_ents_p(leaf);
1583        args->dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
1584
1585        /*
1586         * Note, the table cannot be empty, so we have to go through the loop.
1587         * Binary search the leaf entries looking for our hash value.
1588         */
1589        for (lep = ents, low = 0, high = leafhdr.count - 1,
1590                hashwant = args->hashval;
1591             low <= high; ) {
1592                mid = (low + high) >> 1;
1593                if ((hash = be32_to_cpu(lep[mid].hashval)) == hashwant)
1594                        break;
1595                if (hash < hashwant)
1596                        low = mid + 1;
1597                else
1598                        high = mid - 1;
1599        }
1600        /*
1601         * Found one, back up through all the equal hash values.
1602         */
1603        if (hash == hashwant) {
1604                while (mid > 0 && be32_to_cpu(lep[mid - 1].hashval) == hashwant) {
1605                        mid--;
1606                }
1607        }
1608        /*
1609         * Need to point to an entry higher than ours.
1610         */
1611        else if (hash < hashwant)
1612                mid++;
1613        return mid;
1614}
1615
1616/*
1617 * Trim off a trailing data block.  We know it's empty since the leaf
1618 * freespace table says so.
1619 */
1620int                                             /* error */
1621xfs_dir2_leaf_trim_data(
1622        xfs_da_args_t           *args,          /* operation arguments */
1623        struct xfs_buf          *lbp,           /* leaf buffer */
1624        xfs_dir2_db_t           db)             /* data block number */
1625{
1626        __be16                  *bestsp;        /* leaf bests table */
1627        struct xfs_buf          *dbp;           /* data block buffer */
1628        xfs_inode_t             *dp;            /* incore directory inode */
1629        int                     error;          /* error return value */
1630        xfs_dir2_leaf_t         *leaf;          /* leaf structure */
1631        xfs_dir2_leaf_tail_t    *ltp;           /* leaf tail structure */
1632        xfs_trans_t             *tp;            /* transaction pointer */
1633
1634        dp = args->dp;
1635        tp = args->trans;
1636        /*
1637         * Read the offending data block.  We need its buffer.
1638         */
1639        error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(args->geo, db),
1640                                   -1, &dbp);
1641        if (error)
1642                return error;
1643
1644        leaf = lbp->b_addr;
1645        ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
1646
1647#ifdef DEBUG
1648{
1649        struct xfs_dir2_data_hdr *hdr = dbp->b_addr;
1650        struct xfs_dir2_data_free *bf = dp->d_ops->data_bestfree_p(hdr);
1651
1652        ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) ||
1653               hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC));
1654        ASSERT(be16_to_cpu(bf[0].length) ==
1655               args->geo->blksize - dp->d_ops->data_entry_offset);
1656        ASSERT(db == be32_to_cpu(ltp->bestcount) - 1);
1657}
1658#endif
1659
1660        /*
1661         * Get rid of the data block.
1662         */
1663        if ((error = xfs_dir2_shrink_inode(args, db, dbp))) {
1664                ASSERT(error != -ENOSPC);
1665                xfs_trans_brelse(tp, dbp);
1666                return error;
1667        }
1668        /*
1669         * Eliminate the last bests entry from the table.
1670         */
1671        bestsp = xfs_dir2_leaf_bests_p(ltp);
1672        be32_add_cpu(&ltp->bestcount, -1);
1673        memmove(&bestsp[1], &bestsp[0], be32_to_cpu(ltp->bestcount) * sizeof(*bestsp));
1674        xfs_dir3_leaf_log_tail(args, lbp);
1675        xfs_dir3_leaf_log_bests(args, lbp, 0, be32_to_cpu(ltp->bestcount) - 1);
1676        return 0;
1677}
1678
1679static inline size_t
1680xfs_dir3_leaf_size(
1681        struct xfs_dir3_icleaf_hdr      *hdr,
1682        int                             counts)
1683{
1684        int     entries;
1685        int     hdrsize;
1686
1687        entries = hdr->count - hdr->stale;
1688        if (hdr->magic == XFS_DIR2_LEAF1_MAGIC ||
1689            hdr->magic == XFS_DIR2_LEAFN_MAGIC)
1690                hdrsize = sizeof(struct xfs_dir2_leaf_hdr);
1691        else
1692                hdrsize = sizeof(struct xfs_dir3_leaf_hdr);
1693
1694        return hdrsize + entries * sizeof(xfs_dir2_leaf_entry_t)
1695                       + counts * sizeof(xfs_dir2_data_off_t)
1696                       + sizeof(xfs_dir2_leaf_tail_t);
1697}
1698
1699/*
1700 * Convert node form directory to leaf form directory.
1701 * The root of the node form dir needs to already be a LEAFN block.
1702 * Just return if we can't do anything.
1703 */
1704int                                             /* error */
1705xfs_dir2_node_to_leaf(
1706        xfs_da_state_t          *state)         /* directory operation state */
1707{
1708        xfs_da_args_t           *args;          /* operation arguments */
1709        xfs_inode_t             *dp;            /* incore directory inode */
1710        int                     error;          /* error return code */
1711        struct xfs_buf          *fbp;           /* buffer for freespace block */
1712        xfs_fileoff_t           fo;             /* freespace file offset */
1713        xfs_dir2_free_t         *free;          /* freespace structure */
1714        struct xfs_buf          *lbp;           /* buffer for leaf block */
1715        xfs_dir2_leaf_tail_t    *ltp;           /* tail of leaf structure */
1716        xfs_dir2_leaf_t         *leaf;          /* leaf structure */
1717        xfs_mount_t             *mp;            /* filesystem mount point */
1718        int                     rval;           /* successful free trim? */
1719        xfs_trans_t             *tp;            /* transaction pointer */
1720        struct xfs_dir3_icleaf_hdr leafhdr;
1721        struct xfs_dir3_icfree_hdr freehdr;
1722
1723        /*
1724         * There's more than a leaf level in the btree, so there must
1725         * be multiple leafn blocks.  Give up.
1726         */
1727        if (state->path.active > 1)
1728                return 0;
1729        args = state->args;
1730
1731        trace_xfs_dir2_node_to_leaf(args);
1732
1733        mp = state->mp;
1734        dp = args->dp;
1735        tp = args->trans;
1736        /*
1737         * Get the last offset in the file.
1738         */
1739        if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) {
1740                return error;
1741        }
1742        fo -= args->geo->fsbcount;
1743        /*
1744         * If there are freespace blocks other than the first one,
1745         * take this opportunity to remove trailing empty freespace blocks
1746         * that may have been left behind during no-space-reservation
1747         * operations.
1748         */
1749        while (fo > args->geo->freeblk) {
1750                if ((error = xfs_dir2_node_trim_free(args, fo, &rval))) {
1751                        return error;
1752                }
1753                if (rval)
1754                        fo -= args->geo->fsbcount;
1755                else
1756                        return 0;
1757        }
1758        /*
1759         * Now find the block just before the freespace block.
1760         */
1761        if ((error = xfs_bmap_last_before(tp, dp, &fo, XFS_DATA_FORK))) {
1762                return error;
1763        }
1764        /*
1765         * If it's not the single leaf block, give up.
1766         */
1767        if (XFS_FSB_TO_B(mp, fo) > XFS_DIR2_LEAF_OFFSET + args->geo->blksize)
1768                return 0;
1769        lbp = state->path.blk[0].bp;
1770        leaf = lbp->b_addr;
1771        dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
1772
1773        ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC ||
1774               leafhdr.magic == XFS_DIR3_LEAFN_MAGIC);
1775
1776        /*
1777         * Read the freespace block.
1778         */
1779        error = xfs_dir2_free_read(tp, dp,  args->geo->freeblk, &fbp);
1780        if (error)
1781                return error;
1782        free = fbp->b_addr;
1783        dp->d_ops->free_hdr_from_disk(&freehdr, free);
1784
1785        ASSERT(!freehdr.firstdb);
1786
1787        /*
1788         * Now see if the leafn and free data will fit in a leaf1.
1789         * If not, release the buffer and give up.
1790         */
1791        if (xfs_dir3_leaf_size(&leafhdr, freehdr.nvalid) > args->geo->blksize) {
1792                xfs_trans_brelse(tp, fbp);
1793                return 0;
1794        }
1795
1796        /*
1797         * If the leaf has any stale entries in it, compress them out.
1798         */
1799        if (leafhdr.stale)
1800                xfs_dir3_leaf_compact(args, &leafhdr, lbp);
1801
1802        lbp->b_ops = &xfs_dir3_leaf1_buf_ops;
1803        xfs_trans_buf_set_type(tp, lbp, XFS_BLFT_DIR_LEAF1_BUF);
1804        leafhdr.magic = (leafhdr.magic == XFS_DIR2_LEAFN_MAGIC)
1805                                        ? XFS_DIR2_LEAF1_MAGIC
1806                                        : XFS_DIR3_LEAF1_MAGIC;
1807
1808        /*
1809         * Set up the leaf tail from the freespace block.
1810         */
1811        ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
1812        ltp->bestcount = cpu_to_be32(freehdr.nvalid);
1813
1814        /*
1815         * Set up the leaf bests table.
1816         */
1817        memcpy(xfs_dir2_leaf_bests_p(ltp), dp->d_ops->free_bests_p(free),
1818                freehdr.nvalid * sizeof(xfs_dir2_data_off_t));
1819
1820        dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr);
1821        xfs_dir3_leaf_log_header(args, lbp);
1822        xfs_dir3_leaf_log_bests(args, lbp, 0, be32_to_cpu(ltp->bestcount) - 1);
1823        xfs_dir3_leaf_log_tail(args, lbp);
1824        xfs_dir3_leaf_check(dp, lbp);
1825
1826        /*
1827         * Get rid of the freespace block.
1828         */
1829        error = xfs_dir2_shrink_inode(args,
1830                        xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET),
1831                        fbp);
1832        if (error) {
1833                /*
1834                 * This can't fail here because it can only happen when
1835                 * punching out the middle of an extent, and this is an
1836                 * isolated block.
1837                 */
1838                ASSERT(error != -ENOSPC);
1839                return error;
1840        }
1841        fbp = NULL;
1842        /*
1843         * Now see if we can convert the single-leaf directory
1844         * down to a block form directory.
1845         * This routine always kills the dabuf for the leaf, so
1846         * eliminate it from the path.
1847         */
1848        error = xfs_dir2_leaf_to_block(args, lbp, NULL);
1849        state->path.blk[0].bp = NULL;
1850        return error;
1851}
1852