linux/fs/xfs/libxfs/xfs_dir2_block.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_trans.h"
  29#include "xfs_inode_item.h"
  30#include "xfs_bmap.h"
  31#include "xfs_buf_item.h"
  32#include "xfs_dir2.h"
  33#include "xfs_dir2_priv.h"
  34#include "xfs_error.h"
  35#include "xfs_trace.h"
  36#include "xfs_cksum.h"
  37#include "xfs_log.h"
  38
  39/*
  40 * Local function prototypes.
  41 */
  42static void xfs_dir2_block_log_leaf(xfs_trans_t *tp, struct xfs_buf *bp,
  43                                    int first, int last);
  44static void xfs_dir2_block_log_tail(xfs_trans_t *tp, struct xfs_buf *bp);
  45static int xfs_dir2_block_lookup_int(xfs_da_args_t *args, struct xfs_buf **bpp,
  46                                     int *entno);
  47static int xfs_dir2_block_sort(const void *a, const void *b);
  48
  49static xfs_dahash_t xfs_dir_hash_dot, xfs_dir_hash_dotdot;
  50
  51/*
  52 * One-time startup routine called from xfs_init().
  53 */
  54void
  55xfs_dir_startup(void)
  56{
  57        xfs_dir_hash_dot = xfs_da_hashname((unsigned char *)".", 1);
  58        xfs_dir_hash_dotdot = xfs_da_hashname((unsigned char *)"..", 2);
  59}
  60
  61static bool
  62xfs_dir3_block_verify(
  63        struct xfs_buf          *bp)
  64{
  65        struct xfs_mount        *mp = bp->b_target->bt_mount;
  66        struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr;
  67
  68        if (xfs_sb_version_hascrc(&mp->m_sb)) {
  69                if (hdr3->magic != cpu_to_be32(XFS_DIR3_BLOCK_MAGIC))
  70                        return false;
  71                if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_meta_uuid))
  72                        return false;
  73                if (be64_to_cpu(hdr3->blkno) != bp->b_bn)
  74                        return false;
  75                if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr3->lsn)))
  76                        return false;
  77        } else {
  78                if (hdr3->magic != cpu_to_be32(XFS_DIR2_BLOCK_MAGIC))
  79                        return false;
  80        }
  81        if (__xfs_dir3_data_check(NULL, bp))
  82                return false;
  83        return true;
  84}
  85
  86static void
  87xfs_dir3_block_read_verify(
  88        struct xfs_buf  *bp)
  89{
  90        struct xfs_mount        *mp = bp->b_target->bt_mount;
  91
  92        if (xfs_sb_version_hascrc(&mp->m_sb) &&
  93             !xfs_buf_verify_cksum(bp, XFS_DIR3_DATA_CRC_OFF))
  94                xfs_buf_ioerror(bp, -EFSBADCRC);
  95        else if (!xfs_dir3_block_verify(bp))
  96                xfs_buf_ioerror(bp, -EFSCORRUPTED);
  97
  98        if (bp->b_error)
  99                xfs_verifier_error(bp);
 100}
 101
 102static void
 103xfs_dir3_block_write_verify(
 104        struct xfs_buf  *bp)
 105{
 106        struct xfs_mount        *mp = bp->b_target->bt_mount;
 107        struct xfs_buf_log_item *bip = bp->b_fspriv;
 108        struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr;
 109
 110        if (!xfs_dir3_block_verify(bp)) {
 111                xfs_buf_ioerror(bp, -EFSCORRUPTED);
 112                xfs_verifier_error(bp);
 113                return;
 114        }
 115
 116        if (!xfs_sb_version_hascrc(&mp->m_sb))
 117                return;
 118
 119        if (bip)
 120                hdr3->lsn = cpu_to_be64(bip->bli_item.li_lsn);
 121
 122        xfs_buf_update_cksum(bp, XFS_DIR3_DATA_CRC_OFF);
 123}
 124
 125const struct xfs_buf_ops xfs_dir3_block_buf_ops = {
 126        .verify_read = xfs_dir3_block_read_verify,
 127        .verify_write = xfs_dir3_block_write_verify,
 128};
 129
 130int
 131xfs_dir3_block_read(
 132        struct xfs_trans        *tp,
 133        struct xfs_inode        *dp,
 134        struct xfs_buf          **bpp)
 135{
 136        struct xfs_mount        *mp = dp->i_mount;
 137        int                     err;
 138
 139        err = xfs_da_read_buf(tp, dp, mp->m_dir_geo->datablk, -1, bpp,
 140                                XFS_DATA_FORK, &xfs_dir3_block_buf_ops);
 141        if (!err && tp)
 142                xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_BLOCK_BUF);
 143        return err;
 144}
 145
 146static void
 147xfs_dir3_block_init(
 148        struct xfs_mount        *mp,
 149        struct xfs_trans        *tp,
 150        struct xfs_buf          *bp,
 151        struct xfs_inode        *dp)
 152{
 153        struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr;
 154
 155        bp->b_ops = &xfs_dir3_block_buf_ops;
 156        xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_BLOCK_BUF);
 157
 158        if (xfs_sb_version_hascrc(&mp->m_sb)) {
 159                memset(hdr3, 0, sizeof(*hdr3));
 160                hdr3->magic = cpu_to_be32(XFS_DIR3_BLOCK_MAGIC);
 161                hdr3->blkno = cpu_to_be64(bp->b_bn);
 162                hdr3->owner = cpu_to_be64(dp->i_ino);
 163                uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid);
 164                return;
 165
 166        }
 167        hdr3->magic = cpu_to_be32(XFS_DIR2_BLOCK_MAGIC);
 168}
 169
 170static void
 171xfs_dir2_block_need_space(
 172        struct xfs_inode                *dp,
 173        struct xfs_dir2_data_hdr        *hdr,
 174        struct xfs_dir2_block_tail      *btp,
 175        struct xfs_dir2_leaf_entry      *blp,
 176        __be16                          **tagpp,
 177        struct xfs_dir2_data_unused     **dupp,
 178        struct xfs_dir2_data_unused     **enddupp,
 179        int                             *compact,
 180        int                             len)
 181{
 182        struct xfs_dir2_data_free       *bf;
 183        __be16                          *tagp = NULL;
 184        struct xfs_dir2_data_unused     *dup = NULL;
 185        struct xfs_dir2_data_unused     *enddup = NULL;
 186
 187        *compact = 0;
 188        bf = dp->d_ops->data_bestfree_p(hdr);
 189
 190        /*
 191         * If there are stale entries we'll use one for the leaf.
 192         */
 193        if (btp->stale) {
 194                if (be16_to_cpu(bf[0].length) >= len) {
 195                        /*
 196                         * The biggest entry enough to avoid compaction.
 197                         */
 198                        dup = (xfs_dir2_data_unused_t *)
 199                              ((char *)hdr + be16_to_cpu(bf[0].offset));
 200                        goto out;
 201                }
 202
 203                /*
 204                 * Will need to compact to make this work.
 205                 * Tag just before the first leaf entry.
 206                 */
 207                *compact = 1;
 208                tagp = (__be16 *)blp - 1;
 209
 210                /* Data object just before the first leaf entry.  */
 211                dup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp));
 212
 213                /*
 214                 * If it's not free then the data will go where the
 215                 * leaf data starts now, if it works at all.
 216                 */
 217                if (be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG) {
 218                        if (be16_to_cpu(dup->length) + (be32_to_cpu(btp->stale) - 1) *
 219                            (uint)sizeof(*blp) < len)
 220                                dup = NULL;
 221                } else if ((be32_to_cpu(btp->stale) - 1) * (uint)sizeof(*blp) < len)
 222                        dup = NULL;
 223                else
 224                        dup = (xfs_dir2_data_unused_t *)blp;
 225                goto out;
 226        }
 227
 228        /*
 229         * no stale entries, so just use free space.
 230         * Tag just before the first leaf entry.
 231         */
 232        tagp = (__be16 *)blp - 1;
 233
 234        /* Data object just before the first leaf entry.  */
 235        enddup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp));
 236
 237        /*
 238         * If it's not free then can't do this add without cleaning up:
 239         * the space before the first leaf entry needs to be free so it
 240         * can be expanded to hold the pointer to the new entry.
 241         */
 242        if (be16_to_cpu(enddup->freetag) == XFS_DIR2_DATA_FREE_TAG) {
 243                /*
 244                 * Check out the biggest freespace and see if it's the same one.
 245                 */
 246                dup = (xfs_dir2_data_unused_t *)
 247                      ((char *)hdr + be16_to_cpu(bf[0].offset));
 248                if (dup != enddup) {
 249                        /*
 250                         * Not the same free entry, just check its length.
 251                         */
 252                        if (be16_to_cpu(dup->length) < len)
 253                                dup = NULL;
 254                        goto out;
 255                }
 256
 257                /*
 258                 * It is the biggest freespace, can it hold the leaf too?
 259                 */
 260                if (be16_to_cpu(dup->length) < len + (uint)sizeof(*blp)) {
 261                        /*
 262                         * Yes, use the second-largest entry instead if it works.
 263                         */
 264                        if (be16_to_cpu(bf[1].length) >= len)
 265                                dup = (xfs_dir2_data_unused_t *)
 266                                      ((char *)hdr + be16_to_cpu(bf[1].offset));
 267                        else
 268                                dup = NULL;
 269                }
 270        }
 271out:
 272        *tagpp = tagp;
 273        *dupp = dup;
 274        *enddupp = enddup;
 275}
 276
 277/*
 278 * compact the leaf entries.
 279 * Leave the highest-numbered stale entry stale.
 280 * XXX should be the one closest to mid but mid is not yet computed.
 281 */
 282static void
 283xfs_dir2_block_compact(
 284        struct xfs_da_args              *args,
 285        struct xfs_buf                  *bp,
 286        struct xfs_dir2_data_hdr        *hdr,
 287        struct xfs_dir2_block_tail      *btp,
 288        struct xfs_dir2_leaf_entry      *blp,
 289        int                             *needlog,
 290        int                             *lfloghigh,
 291        int                             *lfloglow)
 292{
 293        int                     fromidx;        /* source leaf index */
 294        int                     toidx;          /* target leaf index */
 295        int                     needscan = 0;
 296        int                     highstale;      /* high stale index */
 297
 298        fromidx = toidx = be32_to_cpu(btp->count) - 1;
 299        highstale = *lfloghigh = -1;
 300        for (; fromidx >= 0; fromidx--) {
 301                if (blp[fromidx].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) {
 302                        if (highstale == -1)
 303                                highstale = toidx;
 304                        else {
 305                                if (*lfloghigh == -1)
 306                                        *lfloghigh = toidx;
 307                                continue;
 308                        }
 309                }
 310                if (fromidx < toidx)
 311                        blp[toidx] = blp[fromidx];
 312                toidx--;
 313        }
 314        *lfloglow = toidx + 1 - (be32_to_cpu(btp->stale) - 1);
 315        *lfloghigh -= be32_to_cpu(btp->stale) - 1;
 316        be32_add_cpu(&btp->count, -(be32_to_cpu(btp->stale) - 1));
 317        xfs_dir2_data_make_free(args, bp,
 318                (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr),
 319                (xfs_dir2_data_aoff_t)((be32_to_cpu(btp->stale) - 1) * sizeof(*blp)),
 320                needlog, &needscan);
 321        btp->stale = cpu_to_be32(1);
 322        /*
 323         * If we now need to rebuild the bestfree map, do so.
 324         * This needs to happen before the next call to use_free.
 325         */
 326        if (needscan)
 327                xfs_dir2_data_freescan(args->dp, hdr, needlog);
 328}
 329
 330/*
 331 * Add an entry to a block directory.
 332 */
 333int                                             /* error */
 334xfs_dir2_block_addname(
 335        xfs_da_args_t           *args)          /* directory op arguments */
 336{
 337        xfs_dir2_data_hdr_t     *hdr;           /* block header */
 338        xfs_dir2_leaf_entry_t   *blp;           /* block leaf entries */
 339        struct xfs_buf          *bp;            /* buffer for block */
 340        xfs_dir2_block_tail_t   *btp;           /* block tail */
 341        int                     compact;        /* need to compact leaf ents */
 342        xfs_dir2_data_entry_t   *dep;           /* block data entry */
 343        xfs_inode_t             *dp;            /* directory inode */
 344        xfs_dir2_data_unused_t  *dup;           /* block unused entry */
 345        int                     error;          /* error return value */
 346        xfs_dir2_data_unused_t  *enddup=NULL;   /* unused at end of data */
 347        xfs_dahash_t            hash;           /* hash value of found entry */
 348        int                     high;           /* high index for binary srch */
 349        int                     highstale;      /* high stale index */
 350        int                     lfloghigh=0;    /* last final leaf to log */
 351        int                     lfloglow=0;     /* first final leaf to log */
 352        int                     len;            /* length of the new entry */
 353        int                     low;            /* low index for binary srch */
 354        int                     lowstale;       /* low stale index */
 355        int                     mid=0;          /* midpoint for binary srch */
 356        int                     needlog;        /* need to log header */
 357        int                     needscan;       /* need to rescan freespace */
 358        __be16                  *tagp;          /* pointer to tag value */
 359        xfs_trans_t             *tp;            /* transaction structure */
 360
 361        trace_xfs_dir2_block_addname(args);
 362
 363        dp = args->dp;
 364        tp = args->trans;
 365
 366        /* Read the (one and only) directory block into bp. */
 367        error = xfs_dir3_block_read(tp, dp, &bp);
 368        if (error)
 369                return error;
 370
 371        len = dp->d_ops->data_entsize(args->namelen);
 372
 373        /*
 374         * Set up pointers to parts of the block.
 375         */
 376        hdr = bp->b_addr;
 377        btp = xfs_dir2_block_tail_p(args->geo, hdr);
 378        blp = xfs_dir2_block_leaf_p(btp);
 379
 380        /*
 381         * Find out if we can reuse stale entries or whether we need extra
 382         * space for entry and new leaf.
 383         */
 384        xfs_dir2_block_need_space(dp, hdr, btp, blp, &tagp, &dup,
 385                                  &enddup, &compact, len);
 386
 387        /*
 388         * Done everything we need for a space check now.
 389         */
 390        if (args->op_flags & XFS_DA_OP_JUSTCHECK) {
 391                xfs_trans_brelse(tp, bp);
 392                if (!dup)
 393                        return -ENOSPC;
 394                return 0;
 395        }
 396
 397        /*
 398         * If we don't have space for the new entry & leaf ...
 399         */
 400        if (!dup) {
 401                /* Don't have a space reservation: return no-space.  */
 402                if (args->total == 0)
 403                        return -ENOSPC;
 404                /*
 405                 * Convert to the next larger format.
 406                 * Then add the new entry in that format.
 407                 */
 408                error = xfs_dir2_block_to_leaf(args, bp);
 409                if (error)
 410                        return error;
 411                return xfs_dir2_leaf_addname(args);
 412        }
 413
 414        needlog = needscan = 0;
 415
 416        /*
 417         * If need to compact the leaf entries, do it now.
 418         */
 419        if (compact) {
 420                xfs_dir2_block_compact(args, bp, hdr, btp, blp, &needlog,
 421                                      &lfloghigh, &lfloglow);
 422                /* recalculate blp post-compaction */
 423                blp = xfs_dir2_block_leaf_p(btp);
 424        } else if (btp->stale) {
 425                /*
 426                 * Set leaf logging boundaries to impossible state.
 427                 * For the no-stale case they're set explicitly.
 428                 */
 429                lfloglow = be32_to_cpu(btp->count);
 430                lfloghigh = -1;
 431        }
 432
 433        /*
 434         * Find the slot that's first lower than our hash value, -1 if none.
 435         */
 436        for (low = 0, high = be32_to_cpu(btp->count) - 1; low <= high; ) {
 437                mid = (low + high) >> 1;
 438                if ((hash = be32_to_cpu(blp[mid].hashval)) == args->hashval)
 439                        break;
 440                if (hash < args->hashval)
 441                        low = mid + 1;
 442                else
 443                        high = mid - 1;
 444        }
 445        while (mid >= 0 && be32_to_cpu(blp[mid].hashval) >= args->hashval) {
 446                mid--;
 447        }
 448        /*
 449         * No stale entries, will use enddup space to hold new leaf.
 450         */
 451        if (!btp->stale) {
 452                /*
 453                 * Mark the space needed for the new leaf entry, now in use.
 454                 */
 455                xfs_dir2_data_use_free(args, bp, enddup,
 456                        (xfs_dir2_data_aoff_t)
 457                        ((char *)enddup - (char *)hdr + be16_to_cpu(enddup->length) -
 458                         sizeof(*blp)),
 459                        (xfs_dir2_data_aoff_t)sizeof(*blp),
 460                        &needlog, &needscan);
 461                /*
 462                 * Update the tail (entry count).
 463                 */
 464                be32_add_cpu(&btp->count, 1);
 465                /*
 466                 * If we now need to rebuild the bestfree map, do so.
 467                 * This needs to happen before the next call to use_free.
 468                 */
 469                if (needscan) {
 470                        xfs_dir2_data_freescan(dp, hdr, &needlog);
 471                        needscan = 0;
 472                }
 473                /*
 474                 * Adjust pointer to the first leaf entry, we're about to move
 475                 * the table up one to open up space for the new leaf entry.
 476                 * Then adjust our index to match.
 477                 */
 478                blp--;
 479                mid++;
 480                if (mid)
 481                        memmove(blp, &blp[1], mid * sizeof(*blp));
 482                lfloglow = 0;
 483                lfloghigh = mid;
 484        }
 485        /*
 486         * Use a stale leaf for our new entry.
 487         */
 488        else {
 489                for (lowstale = mid;
 490                     lowstale >= 0 &&
 491                        blp[lowstale].address !=
 492                        cpu_to_be32(XFS_DIR2_NULL_DATAPTR);
 493                     lowstale--)
 494                        continue;
 495                for (highstale = mid + 1;
 496                     highstale < be32_to_cpu(btp->count) &&
 497                        blp[highstale].address !=
 498                        cpu_to_be32(XFS_DIR2_NULL_DATAPTR) &&
 499                        (lowstale < 0 || mid - lowstale > highstale - mid);
 500                     highstale++)
 501                        continue;
 502                /*
 503                 * Move entries toward the low-numbered stale entry.
 504                 */
 505                if (lowstale >= 0 &&
 506                    (highstale == be32_to_cpu(btp->count) ||
 507                     mid - lowstale <= highstale - mid)) {
 508                        if (mid - lowstale)
 509                                memmove(&blp[lowstale], &blp[lowstale + 1],
 510                                        (mid - lowstale) * sizeof(*blp));
 511                        lfloglow = MIN(lowstale, lfloglow);
 512                        lfloghigh = MAX(mid, lfloghigh);
 513                }
 514                /*
 515                 * Move entries toward the high-numbered stale entry.
 516                 */
 517                else {
 518                        ASSERT(highstale < be32_to_cpu(btp->count));
 519                        mid++;
 520                        if (highstale - mid)
 521                                memmove(&blp[mid + 1], &blp[mid],
 522                                        (highstale - mid) * sizeof(*blp));
 523                        lfloglow = MIN(mid, lfloglow);
 524                        lfloghigh = MAX(highstale, lfloghigh);
 525                }
 526                be32_add_cpu(&btp->stale, -1);
 527        }
 528        /*
 529         * Point to the new data entry.
 530         */
 531        dep = (xfs_dir2_data_entry_t *)dup;
 532        /*
 533         * Fill in the leaf entry.
 534         */
 535        blp[mid].hashval = cpu_to_be32(args->hashval);
 536        blp[mid].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(
 537                                (char *)dep - (char *)hdr));
 538        xfs_dir2_block_log_leaf(tp, bp, lfloglow, lfloghigh);
 539        /*
 540         * Mark space for the data entry used.
 541         */
 542        xfs_dir2_data_use_free(args, bp, dup,
 543                (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr),
 544                (xfs_dir2_data_aoff_t)len, &needlog, &needscan);
 545        /*
 546         * Create the new data entry.
 547         */
 548        dep->inumber = cpu_to_be64(args->inumber);
 549        dep->namelen = args->namelen;
 550        memcpy(dep->name, args->name, args->namelen);
 551        dp->d_ops->data_put_ftype(dep, args->filetype);
 552        tagp = dp->d_ops->data_entry_tag_p(dep);
 553        *tagp = cpu_to_be16((char *)dep - (char *)hdr);
 554        /*
 555         * Clean up the bestfree array and log the header, tail, and entry.
 556         */
 557        if (needscan)
 558                xfs_dir2_data_freescan(dp, hdr, &needlog);
 559        if (needlog)
 560                xfs_dir2_data_log_header(args, bp);
 561        xfs_dir2_block_log_tail(tp, bp);
 562        xfs_dir2_data_log_entry(args, bp, dep);
 563        xfs_dir3_data_check(dp, bp);
 564        return 0;
 565}
 566
 567/*
 568 * Log leaf entries from the block.
 569 */
 570static void
 571xfs_dir2_block_log_leaf(
 572        xfs_trans_t             *tp,            /* transaction structure */
 573        struct xfs_buf          *bp,            /* block buffer */
 574        int                     first,          /* index of first logged leaf */
 575        int                     last)           /* index of last logged leaf */
 576{
 577        xfs_dir2_data_hdr_t     *hdr = bp->b_addr;
 578        xfs_dir2_leaf_entry_t   *blp;
 579        xfs_dir2_block_tail_t   *btp;
 580
 581        btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr);
 582        blp = xfs_dir2_block_leaf_p(btp);
 583        xfs_trans_log_buf(tp, bp, (uint)((char *)&blp[first] - (char *)hdr),
 584                (uint)((char *)&blp[last + 1] - (char *)hdr - 1));
 585}
 586
 587/*
 588 * Log the block tail.
 589 */
 590static void
 591xfs_dir2_block_log_tail(
 592        xfs_trans_t             *tp,            /* transaction structure */
 593        struct xfs_buf          *bp)            /* block buffer */
 594{
 595        xfs_dir2_data_hdr_t     *hdr = bp->b_addr;
 596        xfs_dir2_block_tail_t   *btp;
 597
 598        btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr);
 599        xfs_trans_log_buf(tp, bp, (uint)((char *)btp - (char *)hdr),
 600                (uint)((char *)(btp + 1) - (char *)hdr - 1));
 601}
 602
 603/*
 604 * Look up an entry in the block.  This is the external routine,
 605 * xfs_dir2_block_lookup_int does the real work.
 606 */
 607int                                             /* error */
 608xfs_dir2_block_lookup(
 609        xfs_da_args_t           *args)          /* dir lookup arguments */
 610{
 611        xfs_dir2_data_hdr_t     *hdr;           /* block header */
 612        xfs_dir2_leaf_entry_t   *blp;           /* block leaf entries */
 613        struct xfs_buf          *bp;            /* block buffer */
 614        xfs_dir2_block_tail_t   *btp;           /* block tail */
 615        xfs_dir2_data_entry_t   *dep;           /* block data entry */
 616        xfs_inode_t             *dp;            /* incore inode */
 617        int                     ent;            /* entry index */
 618        int                     error;          /* error return value */
 619
 620        trace_xfs_dir2_block_lookup(args);
 621
 622        /*
 623         * Get the buffer, look up the entry.
 624         * If not found (ENOENT) then return, have no buffer.
 625         */
 626        if ((error = xfs_dir2_block_lookup_int(args, &bp, &ent)))
 627                return error;
 628        dp = args->dp;
 629        hdr = bp->b_addr;
 630        xfs_dir3_data_check(dp, bp);
 631        btp = xfs_dir2_block_tail_p(args->geo, hdr);
 632        blp = xfs_dir2_block_leaf_p(btp);
 633        /*
 634         * Get the offset from the leaf entry, to point to the data.
 635         */
 636        dep = (xfs_dir2_data_entry_t *)((char *)hdr +
 637                        xfs_dir2_dataptr_to_off(args->geo,
 638                                                be32_to_cpu(blp[ent].address)));
 639        /*
 640         * Fill in inode number, CI name if appropriate, release the block.
 641         */
 642        args->inumber = be64_to_cpu(dep->inumber);
 643        args->filetype = dp->d_ops->data_get_ftype(dep);
 644        error = xfs_dir_cilookup_result(args, dep->name, dep->namelen);
 645        xfs_trans_brelse(args->trans, bp);
 646        return error;
 647}
 648
 649/*
 650 * Internal block lookup routine.
 651 */
 652static int                                      /* error */
 653xfs_dir2_block_lookup_int(
 654        xfs_da_args_t           *args,          /* dir lookup arguments */
 655        struct xfs_buf          **bpp,          /* returned block buffer */
 656        int                     *entno)         /* returned entry number */
 657{
 658        xfs_dir2_dataptr_t      addr;           /* data entry address */
 659        xfs_dir2_data_hdr_t     *hdr;           /* block header */
 660        xfs_dir2_leaf_entry_t   *blp;           /* block leaf entries */
 661        struct xfs_buf          *bp;            /* block buffer */
 662        xfs_dir2_block_tail_t   *btp;           /* block tail */
 663        xfs_dir2_data_entry_t   *dep;           /* block data entry */
 664        xfs_inode_t             *dp;            /* incore inode */
 665        int                     error;          /* error return value */
 666        xfs_dahash_t            hash;           /* found hash value */
 667        int                     high;           /* binary search high index */
 668        int                     low;            /* binary search low index */
 669        int                     mid;            /* binary search current idx */
 670        xfs_mount_t             *mp;            /* filesystem mount point */
 671        xfs_trans_t             *tp;            /* transaction pointer */
 672        enum xfs_dacmp          cmp;            /* comparison result */
 673
 674        dp = args->dp;
 675        tp = args->trans;
 676        mp = dp->i_mount;
 677
 678        error = xfs_dir3_block_read(tp, dp, &bp);
 679        if (error)
 680                return error;
 681
 682        hdr = bp->b_addr;
 683        xfs_dir3_data_check(dp, bp);
 684        btp = xfs_dir2_block_tail_p(args->geo, hdr);
 685        blp = xfs_dir2_block_leaf_p(btp);
 686        /*
 687         * Loop doing a binary search for our hash value.
 688         * Find our entry, ENOENT if it's not there.
 689         */
 690        for (low = 0, high = be32_to_cpu(btp->count) - 1; ; ) {
 691                ASSERT(low <= high);
 692                mid = (low + high) >> 1;
 693                if ((hash = be32_to_cpu(blp[mid].hashval)) == args->hashval)
 694                        break;
 695                if (hash < args->hashval)
 696                        low = mid + 1;
 697                else
 698                        high = mid - 1;
 699                if (low > high) {
 700                        ASSERT(args->op_flags & XFS_DA_OP_OKNOENT);
 701                        xfs_trans_brelse(tp, bp);
 702                        return -ENOENT;
 703                }
 704        }
 705        /*
 706         * Back up to the first one with the right hash value.
 707         */
 708        while (mid > 0 && be32_to_cpu(blp[mid - 1].hashval) == args->hashval) {
 709                mid--;
 710        }
 711        /*
 712         * Now loop forward through all the entries with the
 713         * right hash value looking for our name.
 714         */
 715        do {
 716                if ((addr = be32_to_cpu(blp[mid].address)) == XFS_DIR2_NULL_DATAPTR)
 717                        continue;
 718                /*
 719                 * Get pointer to the entry from the leaf.
 720                 */
 721                dep = (xfs_dir2_data_entry_t *)
 722                        ((char *)hdr + xfs_dir2_dataptr_to_off(args->geo, addr));
 723                /*
 724                 * Compare name and if it's an exact match, return the index
 725                 * and buffer. If it's the first case-insensitive match, store
 726                 * the index and buffer and continue looking for an exact match.
 727                 */
 728                cmp = mp->m_dirnameops->compname(args, dep->name, dep->namelen);
 729                if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) {
 730                        args->cmpresult = cmp;
 731                        *bpp = bp;
 732                        *entno = mid;
 733                        if (cmp == XFS_CMP_EXACT)
 734                                return 0;
 735                }
 736        } while (++mid < be32_to_cpu(btp->count) &&
 737                        be32_to_cpu(blp[mid].hashval) == hash);
 738
 739        ASSERT(args->op_flags & XFS_DA_OP_OKNOENT);
 740        /*
 741         * Here, we can only be doing a lookup (not a rename or replace).
 742         * If a case-insensitive match was found earlier, return success.
 743         */
 744        if (args->cmpresult == XFS_CMP_CASE)
 745                return 0;
 746        /*
 747         * No match, release the buffer and return ENOENT.
 748         */
 749        xfs_trans_brelse(tp, bp);
 750        return -ENOENT;
 751}
 752
 753/*
 754 * Remove an entry from a block format directory.
 755 * If that makes the block small enough to fit in shortform, transform it.
 756 */
 757int                                             /* error */
 758xfs_dir2_block_removename(
 759        xfs_da_args_t           *args)          /* directory operation args */
 760{
 761        xfs_dir2_data_hdr_t     *hdr;           /* block header */
 762        xfs_dir2_leaf_entry_t   *blp;           /* block leaf pointer */
 763        struct xfs_buf          *bp;            /* block buffer */
 764        xfs_dir2_block_tail_t   *btp;           /* block tail */
 765        xfs_dir2_data_entry_t   *dep;           /* block data entry */
 766        xfs_inode_t             *dp;            /* incore inode */
 767        int                     ent;            /* block leaf entry index */
 768        int                     error;          /* error return value */
 769        int                     needlog;        /* need to log block header */
 770        int                     needscan;       /* need to fixup bestfree */
 771        xfs_dir2_sf_hdr_t       sfh;            /* shortform header */
 772        int                     size;           /* shortform size */
 773        xfs_trans_t             *tp;            /* transaction pointer */
 774
 775        trace_xfs_dir2_block_removename(args);
 776
 777        /*
 778         * Look up the entry in the block.  Gets the buffer and entry index.
 779         * It will always be there, the vnodeops level does a lookup first.
 780         */
 781        if ((error = xfs_dir2_block_lookup_int(args, &bp, &ent))) {
 782                return error;
 783        }
 784        dp = args->dp;
 785        tp = args->trans;
 786        hdr = bp->b_addr;
 787        btp = xfs_dir2_block_tail_p(args->geo, hdr);
 788        blp = xfs_dir2_block_leaf_p(btp);
 789        /*
 790         * Point to the data entry using the leaf entry.
 791         */
 792        dep = (xfs_dir2_data_entry_t *)((char *)hdr +
 793                        xfs_dir2_dataptr_to_off(args->geo,
 794                                                be32_to_cpu(blp[ent].address)));
 795        /*
 796         * Mark the data entry's space free.
 797         */
 798        needlog = needscan = 0;
 799        xfs_dir2_data_make_free(args, bp,
 800                (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr),
 801                dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan);
 802        /*
 803         * Fix up the block tail.
 804         */
 805        be32_add_cpu(&btp->stale, 1);
 806        xfs_dir2_block_log_tail(tp, bp);
 807        /*
 808         * Remove the leaf entry by marking it stale.
 809         */
 810        blp[ent].address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR);
 811        xfs_dir2_block_log_leaf(tp, bp, ent, ent);
 812        /*
 813         * Fix up bestfree, log the header if necessary.
 814         */
 815        if (needscan)
 816                xfs_dir2_data_freescan(dp, hdr, &needlog);
 817        if (needlog)
 818                xfs_dir2_data_log_header(args, bp);
 819        xfs_dir3_data_check(dp, bp);
 820        /*
 821         * See if the size as a shortform is good enough.
 822         */
 823        size = xfs_dir2_block_sfsize(dp, hdr, &sfh);
 824        if (size > XFS_IFORK_DSIZE(dp))
 825                return 0;
 826
 827        /*
 828         * If it works, do the conversion.
 829         */
 830        return xfs_dir2_block_to_sf(args, bp, size, &sfh);
 831}
 832
 833/*
 834 * Replace an entry in a V2 block directory.
 835 * Change the inode number to the new value.
 836 */
 837int                                             /* error */
 838xfs_dir2_block_replace(
 839        xfs_da_args_t           *args)          /* directory operation args */
 840{
 841        xfs_dir2_data_hdr_t     *hdr;           /* block header */
 842        xfs_dir2_leaf_entry_t   *blp;           /* block leaf entries */
 843        struct xfs_buf          *bp;            /* block buffer */
 844        xfs_dir2_block_tail_t   *btp;           /* block tail */
 845        xfs_dir2_data_entry_t   *dep;           /* block data entry */
 846        xfs_inode_t             *dp;            /* incore inode */
 847        int                     ent;            /* leaf entry index */
 848        int                     error;          /* error return value */
 849
 850        trace_xfs_dir2_block_replace(args);
 851
 852        /*
 853         * Lookup the entry in the directory.  Get buffer and entry index.
 854         * This will always succeed since the caller has already done a lookup.
 855         */
 856        if ((error = xfs_dir2_block_lookup_int(args, &bp, &ent))) {
 857                return error;
 858        }
 859        dp = args->dp;
 860        hdr = bp->b_addr;
 861        btp = xfs_dir2_block_tail_p(args->geo, hdr);
 862        blp = xfs_dir2_block_leaf_p(btp);
 863        /*
 864         * Point to the data entry we need to change.
 865         */
 866        dep = (xfs_dir2_data_entry_t *)((char *)hdr +
 867                        xfs_dir2_dataptr_to_off(args->geo,
 868                                                be32_to_cpu(blp[ent].address)));
 869        ASSERT(be64_to_cpu(dep->inumber) != args->inumber);
 870        /*
 871         * Change the inode number to the new value.
 872         */
 873        dep->inumber = cpu_to_be64(args->inumber);
 874        dp->d_ops->data_put_ftype(dep, args->filetype);
 875        xfs_dir2_data_log_entry(args, bp, dep);
 876        xfs_dir3_data_check(dp, bp);
 877        return 0;
 878}
 879
 880/*
 881 * Qsort comparison routine for the block leaf entries.
 882 */
 883static int                                      /* sort order */
 884xfs_dir2_block_sort(
 885        const void                      *a,     /* first leaf entry */
 886        const void                      *b)     /* second leaf entry */
 887{
 888        const xfs_dir2_leaf_entry_t     *la;    /* first leaf entry */
 889        const xfs_dir2_leaf_entry_t     *lb;    /* second leaf entry */
 890
 891        la = a;
 892        lb = b;
 893        return be32_to_cpu(la->hashval) < be32_to_cpu(lb->hashval) ? -1 :
 894                (be32_to_cpu(la->hashval) > be32_to_cpu(lb->hashval) ? 1 : 0);
 895}
 896
 897/*
 898 * Convert a V2 leaf directory to a V2 block directory if possible.
 899 */
 900int                                             /* error */
 901xfs_dir2_leaf_to_block(
 902        xfs_da_args_t           *args,          /* operation arguments */
 903        struct xfs_buf          *lbp,           /* leaf buffer */
 904        struct xfs_buf          *dbp)           /* data buffer */
 905{
 906        __be16                  *bestsp;        /* leaf bests table */
 907        xfs_dir2_data_hdr_t     *hdr;           /* block header */
 908        xfs_dir2_block_tail_t   *btp;           /* block tail */
 909        xfs_inode_t             *dp;            /* incore directory inode */
 910        xfs_dir2_data_unused_t  *dup;           /* unused data entry */
 911        int                     error;          /* error return value */
 912        int                     from;           /* leaf from index */
 913        xfs_dir2_leaf_t         *leaf;          /* leaf structure */
 914        xfs_dir2_leaf_entry_t   *lep;           /* leaf entry */
 915        xfs_dir2_leaf_tail_t    *ltp;           /* leaf tail structure */
 916        xfs_mount_t             *mp;            /* file system mount point */
 917        int                     needlog;        /* need to log data header */
 918        int                     needscan;       /* need to scan for bestfree */
 919        xfs_dir2_sf_hdr_t       sfh;            /* shortform header */
 920        int                     size;           /* bytes used */
 921        __be16                  *tagp;          /* end of entry (tag) */
 922        int                     to;             /* block/leaf to index */
 923        xfs_trans_t             *tp;            /* transaction pointer */
 924        struct xfs_dir2_leaf_entry *ents;
 925        struct xfs_dir3_icleaf_hdr leafhdr;
 926
 927        trace_xfs_dir2_leaf_to_block(args);
 928
 929        dp = args->dp;
 930        tp = args->trans;
 931        mp = dp->i_mount;
 932        leaf = lbp->b_addr;
 933        dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
 934        ents = dp->d_ops->leaf_ents_p(leaf);
 935        ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
 936
 937        ASSERT(leafhdr.magic == XFS_DIR2_LEAF1_MAGIC ||
 938               leafhdr.magic == XFS_DIR3_LEAF1_MAGIC);
 939        /*
 940         * If there are data blocks other than the first one, take this
 941         * opportunity to remove trailing empty data blocks that may have
 942         * been left behind during no-space-reservation operations.
 943         * These will show up in the leaf bests table.
 944         */
 945        while (dp->i_d.di_size > args->geo->blksize) {
 946                int hdrsz;
 947
 948                hdrsz = dp->d_ops->data_entry_offset;
 949                bestsp = xfs_dir2_leaf_bests_p(ltp);
 950                if (be16_to_cpu(bestsp[be32_to_cpu(ltp->bestcount) - 1]) ==
 951                                            args->geo->blksize - hdrsz) {
 952                        if ((error =
 953                            xfs_dir2_leaf_trim_data(args, lbp,
 954                                    (xfs_dir2_db_t)(be32_to_cpu(ltp->bestcount) - 1))))
 955                                return error;
 956                } else
 957                        return 0;
 958        }
 959        /*
 960         * Read the data block if we don't already have it, give up if it fails.
 961         */
 962        if (!dbp) {
 963                error = xfs_dir3_data_read(tp, dp, args->geo->datablk, -1, &dbp);
 964                if (error)
 965                        return error;
 966        }
 967        hdr = dbp->b_addr;
 968        ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) ||
 969               hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC));
 970
 971        /*
 972         * Size of the "leaf" area in the block.
 973         */
 974        size = (uint)sizeof(xfs_dir2_block_tail_t) +
 975               (uint)sizeof(*lep) * (leafhdr.count - leafhdr.stale);
 976        /*
 977         * Look at the last data entry.
 978         */
 979        tagp = (__be16 *)((char *)hdr + args->geo->blksize) - 1;
 980        dup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp));
 981        /*
 982         * If it's not free or is too short we can't do it.
 983         */
 984        if (be16_to_cpu(dup->freetag) != XFS_DIR2_DATA_FREE_TAG ||
 985            be16_to_cpu(dup->length) < size)
 986                return 0;
 987
 988        /*
 989         * Start converting it to block form.
 990         */
 991        xfs_dir3_block_init(mp, tp, dbp, dp);
 992
 993        needlog = 1;
 994        needscan = 0;
 995        /*
 996         * Use up the space at the end of the block (blp/btp).
 997         */
 998        xfs_dir2_data_use_free(args, dbp, dup, args->geo->blksize - size, size,
 999                &needlog, &needscan);
1000        /*
1001         * Initialize the block tail.
1002         */
1003        btp = xfs_dir2_block_tail_p(args->geo, hdr);
1004        btp->count = cpu_to_be32(leafhdr.count - leafhdr.stale);
1005        btp->stale = 0;
1006        xfs_dir2_block_log_tail(tp, dbp);
1007        /*
1008         * Initialize the block leaf area.  We compact out stale entries.
1009         */
1010        lep = xfs_dir2_block_leaf_p(btp);
1011        for (from = to = 0; from < leafhdr.count; from++) {
1012                if (ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR))
1013                        continue;
1014                lep[to++] = ents[from];
1015        }
1016        ASSERT(to == be32_to_cpu(btp->count));
1017        xfs_dir2_block_log_leaf(tp, dbp, 0, be32_to_cpu(btp->count) - 1);
1018        /*
1019         * Scan the bestfree if we need it and log the data block header.
1020         */
1021        if (needscan)
1022                xfs_dir2_data_freescan(dp, hdr, &needlog);
1023        if (needlog)
1024                xfs_dir2_data_log_header(args, dbp);
1025        /*
1026         * Pitch the old leaf block.
1027         */
1028        error = xfs_da_shrink_inode(args, args->geo->leafblk, lbp);
1029        if (error)
1030                return error;
1031
1032        /*
1033         * Now see if the resulting block can be shrunken to shortform.
1034         */
1035        size = xfs_dir2_block_sfsize(dp, hdr, &sfh);
1036        if (size > XFS_IFORK_DSIZE(dp))
1037                return 0;
1038
1039        return xfs_dir2_block_to_sf(args, dbp, size, &sfh);
1040}
1041
1042/*
1043 * Convert the shortform directory to block form.
1044 */
1045int                                             /* error */
1046xfs_dir2_sf_to_block(
1047        xfs_da_args_t           *args)          /* operation arguments */
1048{
1049        xfs_dir2_db_t           blkno;          /* dir-relative block # (0) */
1050        xfs_dir2_data_hdr_t     *hdr;           /* block header */
1051        xfs_dir2_leaf_entry_t   *blp;           /* block leaf entries */
1052        struct xfs_buf          *bp;            /* block buffer */
1053        xfs_dir2_block_tail_t   *btp;           /* block tail pointer */
1054        xfs_dir2_data_entry_t   *dep;           /* data entry pointer */
1055        xfs_inode_t             *dp;            /* incore directory inode */
1056        int                     dummy;          /* trash */
1057        xfs_dir2_data_unused_t  *dup;           /* unused entry pointer */
1058        int                     endoffset;      /* end of data objects */
1059        int                     error;          /* error return value */
1060        int                     i;              /* index */
1061        xfs_mount_t             *mp;            /* filesystem mount point */
1062        int                     needlog;        /* need to log block header */
1063        int                     needscan;       /* need to scan block freespc */
1064        int                     newoffset;      /* offset from current entry */
1065        int                     offset;         /* target block offset */
1066        xfs_dir2_sf_entry_t     *sfep;          /* sf entry pointer */
1067        xfs_dir2_sf_hdr_t       *oldsfp;        /* old shortform header  */
1068        xfs_dir2_sf_hdr_t       *sfp;           /* shortform header  */
1069        __be16                  *tagp;          /* end of data entry */
1070        xfs_trans_t             *tp;            /* transaction pointer */
1071        struct xfs_name         name;
1072        struct xfs_ifork        *ifp;
1073
1074        trace_xfs_dir2_sf_to_block(args);
1075
1076        dp = args->dp;
1077        tp = args->trans;
1078        mp = dp->i_mount;
1079        ifp = XFS_IFORK_PTR(dp, XFS_DATA_FORK);
1080        ASSERT(ifp->if_flags & XFS_IFINLINE);
1081        /*
1082         * Bomb out if the shortform directory is way too short.
1083         */
1084        if (dp->i_d.di_size < offsetof(xfs_dir2_sf_hdr_t, parent)) {
1085                ASSERT(XFS_FORCED_SHUTDOWN(mp));
1086                return -EIO;
1087        }
1088
1089        oldsfp = (xfs_dir2_sf_hdr_t *)ifp->if_u1.if_data;
1090
1091        ASSERT(ifp->if_bytes == dp->i_d.di_size);
1092        ASSERT(ifp->if_u1.if_data != NULL);
1093        ASSERT(dp->i_d.di_size >= xfs_dir2_sf_hdr_size(oldsfp->i8count));
1094        ASSERT(dp->i_d.di_nextents == 0);
1095
1096        /*
1097         * Copy the directory into a temporary buffer.
1098         * Then pitch the incore inode data so we can make extents.
1099         */
1100        sfp = kmem_alloc(ifp->if_bytes, KM_SLEEP);
1101        memcpy(sfp, oldsfp, ifp->if_bytes);
1102
1103        xfs_idata_realloc(dp, -ifp->if_bytes, XFS_DATA_FORK);
1104        xfs_bmap_local_to_extents_empty(dp, XFS_DATA_FORK);
1105        dp->i_d.di_size = 0;
1106
1107        /*
1108         * Add block 0 to the inode.
1109         */
1110        error = xfs_dir2_grow_inode(args, XFS_DIR2_DATA_SPACE, &blkno);
1111        if (error) {
1112                kmem_free(sfp);
1113                return error;
1114        }
1115        /*
1116         * Initialize the data block, then convert it to block format.
1117         */
1118        error = xfs_dir3_data_init(args, blkno, &bp);
1119        if (error) {
1120                kmem_free(sfp);
1121                return error;
1122        }
1123        xfs_dir3_block_init(mp, tp, bp, dp);
1124        hdr = bp->b_addr;
1125
1126        /*
1127         * Compute size of block "tail" area.
1128         */
1129        i = (uint)sizeof(*btp) +
1130            (sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t);
1131        /*
1132         * The whole thing is initialized to free by the init routine.
1133         * Say we're using the leaf and tail area.
1134         */
1135        dup = dp->d_ops->data_unused_p(hdr);
1136        needlog = needscan = 0;
1137        xfs_dir2_data_use_free(args, bp, dup, args->geo->blksize - i,
1138                               i, &needlog, &needscan);
1139        ASSERT(needscan == 0);
1140        /*
1141         * Fill in the tail.
1142         */
1143        btp = xfs_dir2_block_tail_p(args->geo, hdr);
1144        btp->count = cpu_to_be32(sfp->count + 2);       /* ., .. */
1145        btp->stale = 0;
1146        blp = xfs_dir2_block_leaf_p(btp);
1147        endoffset = (uint)((char *)blp - (char *)hdr);
1148        /*
1149         * Remove the freespace, we'll manage it.
1150         */
1151        xfs_dir2_data_use_free(args, bp, dup,
1152                (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr),
1153                be16_to_cpu(dup->length), &needlog, &needscan);
1154        /*
1155         * Create entry for .
1156         */
1157        dep = dp->d_ops->data_dot_entry_p(hdr);
1158        dep->inumber = cpu_to_be64(dp->i_ino);
1159        dep->namelen = 1;
1160        dep->name[0] = '.';
1161        dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR);
1162        tagp = dp->d_ops->data_entry_tag_p(dep);
1163        *tagp = cpu_to_be16((char *)dep - (char *)hdr);
1164        xfs_dir2_data_log_entry(args, bp, dep);
1165        blp[0].hashval = cpu_to_be32(xfs_dir_hash_dot);
1166        blp[0].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(
1167                                (char *)dep - (char *)hdr));
1168        /*
1169         * Create entry for ..
1170         */
1171        dep = dp->d_ops->data_dotdot_entry_p(hdr);
1172        dep->inumber = cpu_to_be64(dp->d_ops->sf_get_parent_ino(sfp));
1173        dep->namelen = 2;
1174        dep->name[0] = dep->name[1] = '.';
1175        dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR);
1176        tagp = dp->d_ops->data_entry_tag_p(dep);
1177        *tagp = cpu_to_be16((char *)dep - (char *)hdr);
1178        xfs_dir2_data_log_entry(args, bp, dep);
1179        blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot);
1180        blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(
1181                                (char *)dep - (char *)hdr));
1182        offset = dp->d_ops->data_first_offset;
1183        /*
1184         * Loop over existing entries, stuff them in.
1185         */
1186        i = 0;
1187        if (!sfp->count)
1188                sfep = NULL;
1189        else
1190                sfep = xfs_dir2_sf_firstentry(sfp);
1191        /*
1192         * Need to preserve the existing offset values in the sf directory.
1193         * Insert holes (unused entries) where necessary.
1194         */
1195        while (offset < endoffset) {
1196                /*
1197                 * sfep is null when we reach the end of the list.
1198                 */
1199                if (sfep == NULL)
1200                        newoffset = endoffset;
1201                else
1202                        newoffset = xfs_dir2_sf_get_offset(sfep);
1203                /*
1204                 * There should be a hole here, make one.
1205                 */
1206                if (offset < newoffset) {
1207                        dup = (xfs_dir2_data_unused_t *)((char *)hdr + offset);
1208                        dup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG);
1209                        dup->length = cpu_to_be16(newoffset - offset);
1210                        *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16(
1211                                ((char *)dup - (char *)hdr));
1212                        xfs_dir2_data_log_unused(args, bp, dup);
1213                        xfs_dir2_data_freeinsert(hdr,
1214                                                 dp->d_ops->data_bestfree_p(hdr),
1215                                                 dup, &dummy);
1216                        offset += be16_to_cpu(dup->length);
1217                        continue;
1218                }
1219                /*
1220                 * Copy a real entry.
1221                 */
1222                dep = (xfs_dir2_data_entry_t *)((char *)hdr + newoffset);
1223                dep->inumber = cpu_to_be64(dp->d_ops->sf_get_ino(sfp, sfep));
1224                dep->namelen = sfep->namelen;
1225                dp->d_ops->data_put_ftype(dep, dp->d_ops->sf_get_ftype(sfep));
1226                memcpy(dep->name, sfep->name, dep->namelen);
1227                tagp = dp->d_ops->data_entry_tag_p(dep);
1228                *tagp = cpu_to_be16((char *)dep - (char *)hdr);
1229                xfs_dir2_data_log_entry(args, bp, dep);
1230                name.name = sfep->name;
1231                name.len = sfep->namelen;
1232                blp[2 + i].hashval = cpu_to_be32(mp->m_dirnameops->
1233                                                        hashname(&name));
1234                blp[2 + i].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(
1235                                                 (char *)dep - (char *)hdr));
1236                offset = (int)((char *)(tagp + 1) - (char *)hdr);
1237                if (++i == sfp->count)
1238                        sfep = NULL;
1239                else
1240                        sfep = dp->d_ops->sf_nextentry(sfp, sfep);
1241        }
1242        /* Done with the temporary buffer */
1243        kmem_free(sfp);
1244        /*
1245         * Sort the leaf entries by hash value.
1246         */
1247        xfs_sort(blp, be32_to_cpu(btp->count), sizeof(*blp), xfs_dir2_block_sort);
1248        /*
1249         * Log the leaf entry area and tail.
1250         * Already logged the header in data_init, ignore needlog.
1251         */
1252        ASSERT(needscan == 0);
1253        xfs_dir2_block_log_leaf(tp, bp, 0, be32_to_cpu(btp->count) - 1);
1254        xfs_dir2_block_log_tail(tp, bp);
1255        xfs_dir3_data_check(dp, bp);
1256        return 0;
1257}
1258