linux/fs/xfs/libxfs/xfs_attr_leaf.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
   4 * Copyright (c) 2013 Red Hat, Inc.
   5 * All Rights Reserved.
   6 */
   7#include "xfs.h"
   8#include "xfs_fs.h"
   9#include "xfs_shared.h"
  10#include "xfs_format.h"
  11#include "xfs_log_format.h"
  12#include "xfs_trans_resv.h"
  13#include "xfs_sb.h"
  14#include "xfs_mount.h"
  15#include "xfs_da_format.h"
  16#include "xfs_da_btree.h"
  17#include "xfs_inode.h"
  18#include "xfs_trans.h"
  19#include "xfs_bmap_btree.h"
  20#include "xfs_bmap.h"
  21#include "xfs_attr_sf.h"
  22#include "xfs_attr_remote.h"
  23#include "xfs_attr.h"
  24#include "xfs_attr_leaf.h"
  25#include "xfs_error.h"
  26#include "xfs_trace.h"
  27#include "xfs_buf_item.h"
  28#include "xfs_dir2.h"
  29#include "xfs_log.h"
  30
  31
  32/*
  33 * xfs_attr_leaf.c
  34 *
  35 * Routines to implement leaf blocks of attributes as Btrees of hashed names.
  36 */
  37
  38/*========================================================================
  39 * Function prototypes for the kernel.
  40 *========================================================================*/
  41
  42/*
  43 * Routines used for growing the Btree.
  44 */
  45STATIC int xfs_attr3_leaf_create(struct xfs_da_args *args,
  46                                 xfs_dablk_t which_block, struct xfs_buf **bpp);
  47STATIC int xfs_attr3_leaf_add_work(struct xfs_buf *leaf_buffer,
  48                                   struct xfs_attr3_icleaf_hdr *ichdr,
  49                                   struct xfs_da_args *args, int freemap_index);
  50STATIC void xfs_attr3_leaf_compact(struct xfs_da_args *args,
  51                                   struct xfs_attr3_icleaf_hdr *ichdr,
  52                                   struct xfs_buf *leaf_buffer);
  53STATIC void xfs_attr3_leaf_rebalance(xfs_da_state_t *state,
  54                                                   xfs_da_state_blk_t *blk1,
  55                                                   xfs_da_state_blk_t *blk2);
  56STATIC int xfs_attr3_leaf_figure_balance(xfs_da_state_t *state,
  57                        xfs_da_state_blk_t *leaf_blk_1,
  58                        struct xfs_attr3_icleaf_hdr *ichdr1,
  59                        xfs_da_state_blk_t *leaf_blk_2,
  60                        struct xfs_attr3_icleaf_hdr *ichdr2,
  61                        int *number_entries_in_blk1,
  62                        int *number_usedbytes_in_blk1);
  63
  64/*
  65 * Utility routines.
  66 */
  67STATIC void xfs_attr3_leaf_moveents(struct xfs_da_args *args,
  68                        struct xfs_attr_leafblock *src_leaf,
  69                        struct xfs_attr3_icleaf_hdr *src_ichdr, int src_start,
  70                        struct xfs_attr_leafblock *dst_leaf,
  71                        struct xfs_attr3_icleaf_hdr *dst_ichdr, int dst_start,
  72                        int move_count);
  73STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index);
  74
  75/*
  76 * attr3 block 'firstused' conversion helpers.
  77 *
  78 * firstused refers to the offset of the first used byte of the nameval region
  79 * of an attr leaf block. The region starts at the tail of the block and expands
  80 * backwards towards the middle. As such, firstused is initialized to the block
  81 * size for an empty leaf block and is reduced from there.
  82 *
  83 * The attr3 block size is pegged to the fsb size and the maximum fsb is 64k.
  84 * The in-core firstused field is 32-bit and thus supports the maximum fsb size.
  85 * The on-disk field is only 16-bit, however, and overflows at 64k. Since this
  86 * only occurs at exactly 64k, we use zero as a magic on-disk value to represent
  87 * the attr block size. The following helpers manage the conversion between the
  88 * in-core and on-disk formats.
  89 */
  90
  91static void
  92xfs_attr3_leaf_firstused_from_disk(
  93        struct xfs_da_geometry          *geo,
  94        struct xfs_attr3_icleaf_hdr     *to,
  95        struct xfs_attr_leafblock       *from)
  96{
  97        struct xfs_attr3_leaf_hdr       *hdr3;
  98
  99        if (from->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) {
 100                hdr3 = (struct xfs_attr3_leaf_hdr *) from;
 101                to->firstused = be16_to_cpu(hdr3->firstused);
 102        } else {
 103                to->firstused = be16_to_cpu(from->hdr.firstused);
 104        }
 105
 106        /*
 107         * Convert from the magic fsb size value to actual blocksize. This
 108         * should only occur for empty blocks when the block size overflows
 109         * 16-bits.
 110         */
 111        if (to->firstused == XFS_ATTR3_LEAF_NULLOFF) {
 112                ASSERT(!to->count && !to->usedbytes);
 113                ASSERT(geo->blksize > USHRT_MAX);
 114                to->firstused = geo->blksize;
 115        }
 116}
 117
 118static void
 119xfs_attr3_leaf_firstused_to_disk(
 120        struct xfs_da_geometry          *geo,
 121        struct xfs_attr_leafblock       *to,
 122        struct xfs_attr3_icleaf_hdr     *from)
 123{
 124        struct xfs_attr3_leaf_hdr       *hdr3;
 125        uint32_t                        firstused;
 126
 127        /* magic value should only be seen on disk */
 128        ASSERT(from->firstused != XFS_ATTR3_LEAF_NULLOFF);
 129
 130        /*
 131         * Scale down the 32-bit in-core firstused value to the 16-bit on-disk
 132         * value. This only overflows at the max supported value of 64k. Use the
 133         * magic on-disk value to represent block size in this case.
 134         */
 135        firstused = from->firstused;
 136        if (firstused > USHRT_MAX) {
 137                ASSERT(from->firstused == geo->blksize);
 138                firstused = XFS_ATTR3_LEAF_NULLOFF;
 139        }
 140
 141        if (from->magic == XFS_ATTR3_LEAF_MAGIC) {
 142                hdr3 = (struct xfs_attr3_leaf_hdr *) to;
 143                hdr3->firstused = cpu_to_be16(firstused);
 144        } else {
 145                to->hdr.firstused = cpu_to_be16(firstused);
 146        }
 147}
 148
 149void
 150xfs_attr3_leaf_hdr_from_disk(
 151        struct xfs_da_geometry          *geo,
 152        struct xfs_attr3_icleaf_hdr     *to,
 153        struct xfs_attr_leafblock       *from)
 154{
 155        int     i;
 156
 157        ASSERT(from->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC) ||
 158               from->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC));
 159
 160        if (from->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) {
 161                struct xfs_attr3_leaf_hdr *hdr3 = (struct xfs_attr3_leaf_hdr *)from;
 162
 163                to->forw = be32_to_cpu(hdr3->info.hdr.forw);
 164                to->back = be32_to_cpu(hdr3->info.hdr.back);
 165                to->magic = be16_to_cpu(hdr3->info.hdr.magic);
 166                to->count = be16_to_cpu(hdr3->count);
 167                to->usedbytes = be16_to_cpu(hdr3->usedbytes);
 168                xfs_attr3_leaf_firstused_from_disk(geo, to, from);
 169                to->holes = hdr3->holes;
 170
 171                for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) {
 172                        to->freemap[i].base = be16_to_cpu(hdr3->freemap[i].base);
 173                        to->freemap[i].size = be16_to_cpu(hdr3->freemap[i].size);
 174                }
 175                return;
 176        }
 177        to->forw = be32_to_cpu(from->hdr.info.forw);
 178        to->back = be32_to_cpu(from->hdr.info.back);
 179        to->magic = be16_to_cpu(from->hdr.info.magic);
 180        to->count = be16_to_cpu(from->hdr.count);
 181        to->usedbytes = be16_to_cpu(from->hdr.usedbytes);
 182        xfs_attr3_leaf_firstused_from_disk(geo, to, from);
 183        to->holes = from->hdr.holes;
 184
 185        for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) {
 186                to->freemap[i].base = be16_to_cpu(from->hdr.freemap[i].base);
 187                to->freemap[i].size = be16_to_cpu(from->hdr.freemap[i].size);
 188        }
 189}
 190
 191void
 192xfs_attr3_leaf_hdr_to_disk(
 193        struct xfs_da_geometry          *geo,
 194        struct xfs_attr_leafblock       *to,
 195        struct xfs_attr3_icleaf_hdr     *from)
 196{
 197        int                             i;
 198
 199        ASSERT(from->magic == XFS_ATTR_LEAF_MAGIC ||
 200               from->magic == XFS_ATTR3_LEAF_MAGIC);
 201
 202        if (from->magic == XFS_ATTR3_LEAF_MAGIC) {
 203                struct xfs_attr3_leaf_hdr *hdr3 = (struct xfs_attr3_leaf_hdr *)to;
 204
 205                hdr3->info.hdr.forw = cpu_to_be32(from->forw);
 206                hdr3->info.hdr.back = cpu_to_be32(from->back);
 207                hdr3->info.hdr.magic = cpu_to_be16(from->magic);
 208                hdr3->count = cpu_to_be16(from->count);
 209                hdr3->usedbytes = cpu_to_be16(from->usedbytes);
 210                xfs_attr3_leaf_firstused_to_disk(geo, to, from);
 211                hdr3->holes = from->holes;
 212                hdr3->pad1 = 0;
 213
 214                for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) {
 215                        hdr3->freemap[i].base = cpu_to_be16(from->freemap[i].base);
 216                        hdr3->freemap[i].size = cpu_to_be16(from->freemap[i].size);
 217                }
 218                return;
 219        }
 220        to->hdr.info.forw = cpu_to_be32(from->forw);
 221        to->hdr.info.back = cpu_to_be32(from->back);
 222        to->hdr.info.magic = cpu_to_be16(from->magic);
 223        to->hdr.count = cpu_to_be16(from->count);
 224        to->hdr.usedbytes = cpu_to_be16(from->usedbytes);
 225        xfs_attr3_leaf_firstused_to_disk(geo, to, from);
 226        to->hdr.holes = from->holes;
 227        to->hdr.pad1 = 0;
 228
 229        for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) {
 230                to->hdr.freemap[i].base = cpu_to_be16(from->freemap[i].base);
 231                to->hdr.freemap[i].size = cpu_to_be16(from->freemap[i].size);
 232        }
 233}
 234
 235static xfs_failaddr_t
 236xfs_attr3_leaf_verify_entry(
 237        struct xfs_mount                        *mp,
 238        char                                    *buf_end,
 239        struct xfs_attr_leafblock               *leaf,
 240        struct xfs_attr3_icleaf_hdr             *leafhdr,
 241        struct xfs_attr_leaf_entry              *ent,
 242        int                                     idx,
 243        __u32                                   *last_hashval)
 244{
 245        struct xfs_attr_leaf_name_local         *lentry;
 246        struct xfs_attr_leaf_name_remote        *rentry;
 247        char                                    *name_end;
 248        unsigned int                            nameidx;
 249        unsigned int                            namesize;
 250        __u32                                   hashval;
 251
 252        /* hash order check */
 253        hashval = be32_to_cpu(ent->hashval);
 254        if (hashval < *last_hashval)
 255                return __this_address;
 256        *last_hashval = hashval;
 257
 258        nameidx = be16_to_cpu(ent->nameidx);
 259        if (nameidx < leafhdr->firstused || nameidx >= mp->m_attr_geo->blksize)
 260                return __this_address;
 261
 262        /*
 263         * Check the name information.  The namelen fields are u8 so we can't
 264         * possibly exceed the maximum name length of 255 bytes.
 265         */
 266        if (ent->flags & XFS_ATTR_LOCAL) {
 267                lentry = xfs_attr3_leaf_name_local(leaf, idx);
 268                namesize = xfs_attr_leaf_entsize_local(lentry->namelen,
 269                                be16_to_cpu(lentry->valuelen));
 270                name_end = (char *)lentry + namesize;
 271                if (lentry->namelen == 0)
 272                        return __this_address;
 273        } else {
 274                rentry = xfs_attr3_leaf_name_remote(leaf, idx);
 275                namesize = xfs_attr_leaf_entsize_remote(rentry->namelen);
 276                name_end = (char *)rentry + namesize;
 277                if (rentry->namelen == 0)
 278                        return __this_address;
 279                if (!(ent->flags & XFS_ATTR_INCOMPLETE) &&
 280                    rentry->valueblk == 0)
 281                        return __this_address;
 282        }
 283
 284        if (name_end > buf_end)
 285                return __this_address;
 286
 287        return NULL;
 288}
 289
 290static xfs_failaddr_t
 291xfs_attr3_leaf_verify(
 292        struct xfs_buf                  *bp)
 293{
 294        struct xfs_attr3_icleaf_hdr     ichdr;
 295        struct xfs_mount                *mp = bp->b_mount;
 296        struct xfs_attr_leafblock       *leaf = bp->b_addr;
 297        struct xfs_attr_leaf_entry      *entries;
 298        struct xfs_attr_leaf_entry      *ent;
 299        char                            *buf_end;
 300        uint32_t                        end;    /* must be 32bit - see below */
 301        __u32                           last_hashval = 0;
 302        int                             i;
 303        xfs_failaddr_t                  fa;
 304
 305        xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr, leaf);
 306
 307        fa = xfs_da3_blkinfo_verify(bp, bp->b_addr);
 308        if (fa)
 309                return fa;
 310
 311        /*
 312         * firstused is the block offset of the first name info structure.
 313         * Make sure it doesn't go off the block or crash into the header.
 314         */
 315        if (ichdr.firstused > mp->m_attr_geo->blksize)
 316                return __this_address;
 317        if (ichdr.firstused < xfs_attr3_leaf_hdr_size(leaf))
 318                return __this_address;
 319
 320        /* Make sure the entries array doesn't crash into the name info. */
 321        entries = xfs_attr3_leaf_entryp(bp->b_addr);
 322        if ((char *)&entries[ichdr.count] >
 323            (char *)bp->b_addr + ichdr.firstused)
 324                return __this_address;
 325
 326        /*
 327         * NOTE: This verifier historically failed empty leaf buffers because
 328         * we expect the fork to be in another format. Empty attr fork format
 329         * conversions are possible during xattr set, however, and format
 330         * conversion is not atomic with the xattr set that triggers it. We
 331         * cannot assume leaf blocks are non-empty until that is addressed.
 332        */
 333        buf_end = (char *)bp->b_addr + mp->m_attr_geo->blksize;
 334        for (i = 0, ent = entries; i < ichdr.count; ent++, i++) {
 335                fa = xfs_attr3_leaf_verify_entry(mp, buf_end, leaf, &ichdr,
 336                                ent, i, &last_hashval);
 337                if (fa)
 338                        return fa;
 339        }
 340
 341        /*
 342         * Quickly check the freemap information.  Attribute data has to be
 343         * aligned to 4-byte boundaries, and likewise for the free space.
 344         *
 345         * Note that for 64k block size filesystems, the freemap entries cannot
 346         * overflow as they are only be16 fields. However, when checking end
 347         * pointer of the freemap, we have to be careful to detect overflows and
 348         * so use uint32_t for those checks.
 349         */
 350        for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) {
 351                if (ichdr.freemap[i].base > mp->m_attr_geo->blksize)
 352                        return __this_address;
 353                if (ichdr.freemap[i].base & 0x3)
 354                        return __this_address;
 355                if (ichdr.freemap[i].size > mp->m_attr_geo->blksize)
 356                        return __this_address;
 357                if (ichdr.freemap[i].size & 0x3)
 358                        return __this_address;
 359
 360                /* be care of 16 bit overflows here */
 361                end = (uint32_t)ichdr.freemap[i].base + ichdr.freemap[i].size;
 362                if (end < ichdr.freemap[i].base)
 363                        return __this_address;
 364                if (end > mp->m_attr_geo->blksize)
 365                        return __this_address;
 366        }
 367
 368        return NULL;
 369}
 370
 371static void
 372xfs_attr3_leaf_write_verify(
 373        struct xfs_buf  *bp)
 374{
 375        struct xfs_mount        *mp = bp->b_mount;
 376        struct xfs_buf_log_item *bip = bp->b_log_item;
 377        struct xfs_attr3_leaf_hdr *hdr3 = bp->b_addr;
 378        xfs_failaddr_t          fa;
 379
 380        fa = xfs_attr3_leaf_verify(bp);
 381        if (fa) {
 382                xfs_verifier_error(bp, -EFSCORRUPTED, fa);
 383                return;
 384        }
 385
 386        if (!xfs_sb_version_hascrc(&mp->m_sb))
 387                return;
 388
 389        if (bip)
 390                hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn);
 391
 392        xfs_buf_update_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF);
 393}
 394
 395/*
 396 * leaf/node format detection on trees is sketchy, so a node read can be done on
 397 * leaf level blocks when detection identifies the tree as a node format tree
 398 * incorrectly. In this case, we need to swap the verifier to match the correct
 399 * format of the block being read.
 400 */
 401static void
 402xfs_attr3_leaf_read_verify(
 403        struct xfs_buf          *bp)
 404{
 405        struct xfs_mount        *mp = bp->b_mount;
 406        xfs_failaddr_t          fa;
 407
 408        if (xfs_sb_version_hascrc(&mp->m_sb) &&
 409             !xfs_buf_verify_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF))
 410                xfs_verifier_error(bp, -EFSBADCRC, __this_address);
 411        else {
 412                fa = xfs_attr3_leaf_verify(bp);
 413                if (fa)
 414                        xfs_verifier_error(bp, -EFSCORRUPTED, fa);
 415        }
 416}
 417
 418const struct xfs_buf_ops xfs_attr3_leaf_buf_ops = {
 419        .name = "xfs_attr3_leaf",
 420        .magic16 = { cpu_to_be16(XFS_ATTR_LEAF_MAGIC),
 421                     cpu_to_be16(XFS_ATTR3_LEAF_MAGIC) },
 422        .verify_read = xfs_attr3_leaf_read_verify,
 423        .verify_write = xfs_attr3_leaf_write_verify,
 424        .verify_struct = xfs_attr3_leaf_verify,
 425};
 426
 427int
 428xfs_attr3_leaf_read(
 429        struct xfs_trans        *tp,
 430        struct xfs_inode        *dp,
 431        xfs_dablk_t             bno,
 432        struct xfs_buf          **bpp)
 433{
 434        int                     err;
 435
 436        err = xfs_da_read_buf(tp, dp, bno, 0, bpp, XFS_ATTR_FORK,
 437                        &xfs_attr3_leaf_buf_ops);
 438        if (!err && tp && *bpp)
 439                xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_ATTR_LEAF_BUF);
 440        return err;
 441}
 442
 443/*========================================================================
 444 * Namespace helper routines
 445 *========================================================================*/
 446
 447static bool
 448xfs_attr_match(
 449        struct xfs_da_args      *args,
 450        uint8_t                 namelen,
 451        unsigned char           *name,
 452        int                     flags)
 453{
 454        if (args->namelen != namelen)
 455                return false;
 456        if (memcmp(args->name, name, namelen) != 0)
 457                return false;
 458        /*
 459         * If we are looking for incomplete entries, show only those, else only
 460         * show complete entries.
 461         */
 462        if (args->attr_filter !=
 463            (flags & (XFS_ATTR_NSP_ONDISK_MASK | XFS_ATTR_INCOMPLETE)))
 464                return false;
 465        return true;
 466}
 467
 468static int
 469xfs_attr_copy_value(
 470        struct xfs_da_args      *args,
 471        unsigned char           *value,
 472        int                     valuelen)
 473{
 474        /*
 475         * No copy if all we have to do is get the length
 476         */
 477        if (!args->valuelen) {
 478                args->valuelen = valuelen;
 479                return 0;
 480        }
 481
 482        /*
 483         * No copy if the length of the existing buffer is too small
 484         */
 485        if (args->valuelen < valuelen) {
 486                args->valuelen = valuelen;
 487                return -ERANGE;
 488        }
 489
 490        if (!args->value) {
 491                args->value = kmem_alloc_large(valuelen, KM_NOLOCKDEP);
 492                if (!args->value)
 493                        return -ENOMEM;
 494        }
 495        args->valuelen = valuelen;
 496
 497        /* remote block xattr requires IO for copy-in */
 498        if (args->rmtblkno)
 499                return xfs_attr_rmtval_get(args);
 500
 501        /*
 502         * This is to prevent a GCC warning because the remote xattr case
 503         * doesn't have a value to pass in. In that case, we never reach here,
 504         * but GCC can't work that out and so throws a "passing NULL to
 505         * memcpy" warning.
 506         */
 507        if (!value)
 508                return -EINVAL;
 509        memcpy(args->value, value, valuelen);
 510        return 0;
 511}
 512
 513/*========================================================================
 514 * External routines when attribute fork size < XFS_LITINO(mp).
 515 *========================================================================*/
 516
 517/*
 518 * Query whether the requested number of additional bytes of extended
 519 * attribute space will be able to fit inline.
 520 *
 521 * Returns zero if not, else the di_forkoff fork offset to be used in the
 522 * literal area for attribute data once the new bytes have been added.
 523 *
 524 * di_forkoff must be 8 byte aligned, hence is stored as a >>3 value;
 525 * special case for dev/uuid inodes, they have fixed size data forks.
 526 */
 527int
 528xfs_attr_shortform_bytesfit(
 529        struct xfs_inode        *dp,
 530        int                     bytes)
 531{
 532        struct xfs_mount        *mp = dp->i_mount;
 533        int64_t                 dsize;
 534        int                     minforkoff;
 535        int                     maxforkoff;
 536        int                     offset;
 537
 538        /* rounded down */
 539        offset = (XFS_LITINO(mp) - bytes) >> 3;
 540
 541        if (dp->i_df.if_format == XFS_DINODE_FMT_DEV) {
 542                minforkoff = roundup(sizeof(xfs_dev_t), 8) >> 3;
 543                return (offset >= minforkoff) ? minforkoff : 0;
 544        }
 545
 546        /*
 547         * If the requested numbers of bytes is smaller or equal to the
 548         * current attribute fork size we can always proceed.
 549         *
 550         * Note that if_bytes in the data fork might actually be larger than
 551         * the current data fork size is due to delalloc extents. In that
 552         * case either the extent count will go down when they are converted
 553         * to real extents, or the delalloc conversion will take care of the
 554         * literal area rebalancing.
 555         */
 556        if (bytes <= XFS_IFORK_ASIZE(dp))
 557                return dp->i_d.di_forkoff;
 558
 559        /*
 560         * For attr2 we can try to move the forkoff if there is space in the
 561         * literal area, but for the old format we are done if there is no
 562         * space in the fixed attribute fork.
 563         */
 564        if (!(mp->m_flags & XFS_MOUNT_ATTR2))
 565                return 0;
 566
 567        dsize = dp->i_df.if_bytes;
 568
 569        switch (dp->i_df.if_format) {
 570        case XFS_DINODE_FMT_EXTENTS:
 571                /*
 572                 * If there is no attr fork and the data fork is extents, 
 573                 * determine if creating the default attr fork will result
 574                 * in the extents form migrating to btree. If so, the
 575                 * minimum offset only needs to be the space required for
 576                 * the btree root.
 577                 */
 578                if (!dp->i_d.di_forkoff && dp->i_df.if_bytes >
 579                    xfs_default_attroffset(dp))
 580                        dsize = XFS_BMDR_SPACE_CALC(MINDBTPTRS);
 581                break;
 582        case XFS_DINODE_FMT_BTREE:
 583                /*
 584                 * If we have a data btree then keep forkoff if we have one,
 585                 * otherwise we are adding a new attr, so then we set
 586                 * minforkoff to where the btree root can finish so we have
 587                 * plenty of room for attrs
 588                 */
 589                if (dp->i_d.di_forkoff) {
 590                        if (offset < dp->i_d.di_forkoff)
 591                                return 0;
 592                        return dp->i_d.di_forkoff;
 593                }
 594                dsize = XFS_BMAP_BROOT_SPACE(mp, dp->i_df.if_broot);
 595                break;
 596        }
 597
 598        /*
 599         * A data fork btree root must have space for at least
 600         * MINDBTPTRS key/ptr pairs if the data fork is small or empty.
 601         */
 602        minforkoff = max_t(int64_t, dsize, XFS_BMDR_SPACE_CALC(MINDBTPTRS));
 603        minforkoff = roundup(minforkoff, 8) >> 3;
 604
 605        /* attr fork btree root can have at least this many key/ptr pairs */
 606        maxforkoff = XFS_LITINO(mp) - XFS_BMDR_SPACE_CALC(MINABTPTRS);
 607        maxforkoff = maxforkoff >> 3;   /* rounded down */
 608
 609        if (offset >= maxforkoff)
 610                return maxforkoff;
 611        if (offset >= minforkoff)
 612                return offset;
 613        return 0;
 614}
 615
 616/*
 617 * Switch on the ATTR2 superblock bit (implies also FEATURES2)
 618 */
 619STATIC void
 620xfs_sbversion_add_attr2(xfs_mount_t *mp, xfs_trans_t *tp)
 621{
 622        if ((mp->m_flags & XFS_MOUNT_ATTR2) &&
 623            !(xfs_sb_version_hasattr2(&mp->m_sb))) {
 624                spin_lock(&mp->m_sb_lock);
 625                if (!xfs_sb_version_hasattr2(&mp->m_sb)) {
 626                        xfs_sb_version_addattr2(&mp->m_sb);
 627                        spin_unlock(&mp->m_sb_lock);
 628                        xfs_log_sb(tp);
 629                } else
 630                        spin_unlock(&mp->m_sb_lock);
 631        }
 632}
 633
 634/*
 635 * Create the initial contents of a shortform attribute list.
 636 */
 637void
 638xfs_attr_shortform_create(
 639        struct xfs_da_args      *args)
 640{
 641        struct xfs_inode        *dp = args->dp;
 642        struct xfs_ifork        *ifp = dp->i_afp;
 643        struct xfs_attr_sf_hdr  *hdr;
 644
 645        trace_xfs_attr_sf_create(args);
 646
 647        ASSERT(ifp->if_bytes == 0);
 648        if (ifp->if_format == XFS_DINODE_FMT_EXTENTS) {
 649                ifp->if_flags &= ~XFS_IFEXTENTS;        /* just in case */
 650                ifp->if_format = XFS_DINODE_FMT_LOCAL;
 651                ifp->if_flags |= XFS_IFINLINE;
 652        } else {
 653                ASSERT(ifp->if_flags & XFS_IFINLINE);
 654        }
 655        xfs_idata_realloc(dp, sizeof(*hdr), XFS_ATTR_FORK);
 656        hdr = (struct xfs_attr_sf_hdr *)ifp->if_u1.if_data;
 657        memset(hdr, 0, sizeof(*hdr));
 658        hdr->totsize = cpu_to_be16(sizeof(*hdr));
 659        xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA);
 660}
 661
 662/*
 663 * Return -EEXIST if attr is found, or -ENOATTR if not
 664 * args:  args containing attribute name and namelen
 665 * sfep:  If not null, pointer will be set to the last attr entry found on
 666          -EEXIST.  On -ENOATTR pointer is left at the last entry in the list
 667 * basep: If not null, pointer is set to the byte offset of the entry in the
 668 *        list on -EEXIST.  On -ENOATTR, pointer is left at the byte offset of
 669 *        the last entry in the list
 670 */
 671int
 672xfs_attr_sf_findname(
 673        struct xfs_da_args       *args,
 674        struct xfs_attr_sf_entry **sfep,
 675        unsigned int             *basep)
 676{
 677        struct xfs_attr_shortform *sf;
 678        struct xfs_attr_sf_entry *sfe;
 679        unsigned int            base = sizeof(struct xfs_attr_sf_hdr);
 680        int                     size = 0;
 681        int                     end;
 682        int                     i;
 683
 684        sf = (struct xfs_attr_shortform *)args->dp->i_afp->if_u1.if_data;
 685        sfe = &sf->list[0];
 686        end = sf->hdr.count;
 687        for (i = 0; i < end; sfe = XFS_ATTR_SF_NEXTENTRY(sfe),
 688                             base += size, i++) {
 689                size = XFS_ATTR_SF_ENTSIZE(sfe);
 690                if (!xfs_attr_match(args, sfe->namelen, sfe->nameval,
 691                                    sfe->flags))
 692                        continue;
 693                break;
 694        }
 695
 696        if (sfep != NULL)
 697                *sfep = sfe;
 698
 699        if (basep != NULL)
 700                *basep = base;
 701
 702        if (i == end)
 703                return -ENOATTR;
 704        return -EEXIST;
 705}
 706
 707/*
 708 * Add a name/value pair to the shortform attribute list.
 709 * Overflow from the inode has already been checked for.
 710 */
 711void
 712xfs_attr_shortform_add(
 713        struct xfs_da_args              *args,
 714        int                             forkoff)
 715{
 716        struct xfs_attr_shortform       *sf;
 717        struct xfs_attr_sf_entry        *sfe;
 718        int                             offset, size;
 719        struct xfs_mount                *mp;
 720        struct xfs_inode                *dp;
 721        struct xfs_ifork                *ifp;
 722
 723        trace_xfs_attr_sf_add(args);
 724
 725        dp = args->dp;
 726        mp = dp->i_mount;
 727        dp->i_d.di_forkoff = forkoff;
 728
 729        ifp = dp->i_afp;
 730        ASSERT(ifp->if_flags & XFS_IFINLINE);
 731        sf = (xfs_attr_shortform_t *)ifp->if_u1.if_data;
 732        if (xfs_attr_sf_findname(args, &sfe, NULL) == -EEXIST)
 733                ASSERT(0);
 734
 735        offset = (char *)sfe - (char *)sf;
 736        size = XFS_ATTR_SF_ENTSIZE_BYNAME(args->namelen, args->valuelen);
 737        xfs_idata_realloc(dp, size, XFS_ATTR_FORK);
 738        sf = (xfs_attr_shortform_t *)ifp->if_u1.if_data;
 739        sfe = (xfs_attr_sf_entry_t *)((char *)sf + offset);
 740
 741        sfe->namelen = args->namelen;
 742        sfe->valuelen = args->valuelen;
 743        sfe->flags = args->attr_filter;
 744        memcpy(sfe->nameval, args->name, args->namelen);
 745        memcpy(&sfe->nameval[args->namelen], args->value, args->valuelen);
 746        sf->hdr.count++;
 747        be16_add_cpu(&sf->hdr.totsize, size);
 748        xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA);
 749
 750        xfs_sbversion_add_attr2(mp, args->trans);
 751}
 752
 753/*
 754 * After the last attribute is removed revert to original inode format,
 755 * making all literal area available to the data fork once more.
 756 */
 757void
 758xfs_attr_fork_remove(
 759        struct xfs_inode        *ip,
 760        struct xfs_trans        *tp)
 761{
 762        ASSERT(ip->i_afp->if_nextents == 0);
 763
 764        xfs_idestroy_fork(ip->i_afp);
 765        kmem_cache_free(xfs_ifork_zone, ip->i_afp);
 766        ip->i_afp = NULL;
 767        ip->i_d.di_forkoff = 0;
 768        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
 769}
 770
 771/*
 772 * Remove an attribute from the shortform attribute list structure.
 773 */
 774int
 775xfs_attr_shortform_remove(
 776        struct xfs_da_args              *args)
 777{
 778        struct xfs_attr_shortform       *sf;
 779        struct xfs_attr_sf_entry        *sfe;
 780        int                             size = 0, end, totsize;
 781        unsigned int                    base;
 782        struct xfs_mount                *mp;
 783        struct xfs_inode                *dp;
 784        int                             error;
 785
 786        trace_xfs_attr_sf_remove(args);
 787
 788        dp = args->dp;
 789        mp = dp->i_mount;
 790        sf = (xfs_attr_shortform_t *)dp->i_afp->if_u1.if_data;
 791
 792        error = xfs_attr_sf_findname(args, &sfe, &base);
 793        if (error != -EEXIST)
 794                return error;
 795        size = XFS_ATTR_SF_ENTSIZE(sfe);
 796
 797        /*
 798         * Fix up the attribute fork data, covering the hole
 799         */
 800        end = base + size;
 801        totsize = be16_to_cpu(sf->hdr.totsize);
 802        if (end != totsize)
 803                memmove(&((char *)sf)[base], &((char *)sf)[end], totsize - end);
 804        sf->hdr.count--;
 805        be16_add_cpu(&sf->hdr.totsize, -size);
 806
 807        /*
 808         * Fix up the start offset of the attribute fork
 809         */
 810        totsize -= size;
 811        if (totsize == sizeof(xfs_attr_sf_hdr_t) &&
 812            (mp->m_flags & XFS_MOUNT_ATTR2) &&
 813            (dp->i_df.if_format != XFS_DINODE_FMT_BTREE) &&
 814            !(args->op_flags & XFS_DA_OP_ADDNAME)) {
 815                xfs_attr_fork_remove(dp, args->trans);
 816        } else {
 817                xfs_idata_realloc(dp, -size, XFS_ATTR_FORK);
 818                dp->i_d.di_forkoff = xfs_attr_shortform_bytesfit(dp, totsize);
 819                ASSERT(dp->i_d.di_forkoff);
 820                ASSERT(totsize > sizeof(xfs_attr_sf_hdr_t) ||
 821                                (args->op_flags & XFS_DA_OP_ADDNAME) ||
 822                                !(mp->m_flags & XFS_MOUNT_ATTR2) ||
 823                                dp->i_df.if_format == XFS_DINODE_FMT_BTREE);
 824                xfs_trans_log_inode(args->trans, dp,
 825                                        XFS_ILOG_CORE | XFS_ILOG_ADATA);
 826        }
 827
 828        xfs_sbversion_add_attr2(mp, args->trans);
 829
 830        return 0;
 831}
 832
 833/*
 834 * Look up a name in a shortform attribute list structure.
 835 */
 836/*ARGSUSED*/
 837int
 838xfs_attr_shortform_lookup(xfs_da_args_t *args)
 839{
 840        xfs_attr_shortform_t *sf;
 841        xfs_attr_sf_entry_t *sfe;
 842        int i;
 843        struct xfs_ifork *ifp;
 844
 845        trace_xfs_attr_sf_lookup(args);
 846
 847        ifp = args->dp->i_afp;
 848        ASSERT(ifp->if_flags & XFS_IFINLINE);
 849        sf = (xfs_attr_shortform_t *)ifp->if_u1.if_data;
 850        sfe = &sf->list[0];
 851        for (i = 0; i < sf->hdr.count;
 852                                sfe = XFS_ATTR_SF_NEXTENTRY(sfe), i++) {
 853                if (xfs_attr_match(args, sfe->namelen, sfe->nameval,
 854                                sfe->flags))
 855                        return -EEXIST;
 856        }
 857        return -ENOATTR;
 858}
 859
 860/*
 861 * Retrieve the attribute value and length.
 862 *
 863 * If args->valuelen is zero, only the length needs to be returned.  Unlike a
 864 * lookup, we only return an error if the attribute does not exist or we can't
 865 * retrieve the value.
 866 */
 867int
 868xfs_attr_shortform_getvalue(
 869        struct xfs_da_args      *args)
 870{
 871        struct xfs_attr_shortform *sf;
 872        struct xfs_attr_sf_entry *sfe;
 873        int                     i;
 874
 875        ASSERT(args->dp->i_afp->if_flags == XFS_IFINLINE);
 876        sf = (xfs_attr_shortform_t *)args->dp->i_afp->if_u1.if_data;
 877        sfe = &sf->list[0];
 878        for (i = 0; i < sf->hdr.count;
 879                                sfe = XFS_ATTR_SF_NEXTENTRY(sfe), i++) {
 880                if (xfs_attr_match(args, sfe->namelen, sfe->nameval,
 881                                sfe->flags))
 882                        return xfs_attr_copy_value(args,
 883                                &sfe->nameval[args->namelen], sfe->valuelen);
 884        }
 885        return -ENOATTR;
 886}
 887
 888/*
 889 * Convert from using the shortform to the leaf.  On success, return the
 890 * buffer so that we can keep it locked until we're totally done with it.
 891 */
 892int
 893xfs_attr_shortform_to_leaf(
 894        struct xfs_da_args              *args,
 895        struct xfs_buf                  **leaf_bp)
 896{
 897        struct xfs_inode                *dp;
 898        struct xfs_attr_shortform       *sf;
 899        struct xfs_attr_sf_entry        *sfe;
 900        struct xfs_da_args              nargs;
 901        char                            *tmpbuffer;
 902        int                             error, i, size;
 903        xfs_dablk_t                     blkno;
 904        struct xfs_buf                  *bp;
 905        struct xfs_ifork                *ifp;
 906
 907        trace_xfs_attr_sf_to_leaf(args);
 908
 909        dp = args->dp;
 910        ifp = dp->i_afp;
 911        sf = (xfs_attr_shortform_t *)ifp->if_u1.if_data;
 912        size = be16_to_cpu(sf->hdr.totsize);
 913        tmpbuffer = kmem_alloc(size, 0);
 914        ASSERT(tmpbuffer != NULL);
 915        memcpy(tmpbuffer, ifp->if_u1.if_data, size);
 916        sf = (xfs_attr_shortform_t *)tmpbuffer;
 917
 918        xfs_idata_realloc(dp, -size, XFS_ATTR_FORK);
 919        xfs_bmap_local_to_extents_empty(args->trans, dp, XFS_ATTR_FORK);
 920
 921        bp = NULL;
 922        error = xfs_da_grow_inode(args, &blkno);
 923        if (error)
 924                goto out;
 925
 926        ASSERT(blkno == 0);
 927        error = xfs_attr3_leaf_create(args, blkno, &bp);
 928        if (error)
 929                goto out;
 930
 931        memset((char *)&nargs, 0, sizeof(nargs));
 932        nargs.dp = dp;
 933        nargs.geo = args->geo;
 934        nargs.total = args->total;
 935        nargs.whichfork = XFS_ATTR_FORK;
 936        nargs.trans = args->trans;
 937        nargs.op_flags = XFS_DA_OP_OKNOENT;
 938
 939        sfe = &sf->list[0];
 940        for (i = 0; i < sf->hdr.count; i++) {
 941                nargs.name = sfe->nameval;
 942                nargs.namelen = sfe->namelen;
 943                nargs.value = &sfe->nameval[nargs.namelen];
 944                nargs.valuelen = sfe->valuelen;
 945                nargs.hashval = xfs_da_hashname(sfe->nameval,
 946                                                sfe->namelen);
 947                nargs.attr_filter = sfe->flags & XFS_ATTR_NSP_ONDISK_MASK;
 948                error = xfs_attr3_leaf_lookup_int(bp, &nargs); /* set a->index */
 949                ASSERT(error == -ENOATTR);
 950                error = xfs_attr3_leaf_add(bp, &nargs);
 951                ASSERT(error != -ENOSPC);
 952                if (error)
 953                        goto out;
 954                sfe = XFS_ATTR_SF_NEXTENTRY(sfe);
 955        }
 956        error = 0;
 957        *leaf_bp = bp;
 958out:
 959        kmem_free(tmpbuffer);
 960        return error;
 961}
 962
 963/*
 964 * Check a leaf attribute block to see if all the entries would fit into
 965 * a shortform attribute list.
 966 */
 967int
 968xfs_attr_shortform_allfit(
 969        struct xfs_buf          *bp,
 970        struct xfs_inode        *dp)
 971{
 972        struct xfs_attr_leafblock *leaf;
 973        struct xfs_attr_leaf_entry *entry;
 974        xfs_attr_leaf_name_local_t *name_loc;
 975        struct xfs_attr3_icleaf_hdr leafhdr;
 976        int                     bytes;
 977        int                     i;
 978        struct xfs_mount        *mp = bp->b_mount;
 979
 980        leaf = bp->b_addr;
 981        xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &leafhdr, leaf);
 982        entry = xfs_attr3_leaf_entryp(leaf);
 983
 984        bytes = sizeof(struct xfs_attr_sf_hdr);
 985        for (i = 0; i < leafhdr.count; entry++, i++) {
 986                if (entry->flags & XFS_ATTR_INCOMPLETE)
 987                        continue;               /* don't copy partial entries */
 988                if (!(entry->flags & XFS_ATTR_LOCAL))
 989                        return 0;
 990                name_loc = xfs_attr3_leaf_name_local(leaf, i);
 991                if (name_loc->namelen >= XFS_ATTR_SF_ENTSIZE_MAX)
 992                        return 0;
 993                if (be16_to_cpu(name_loc->valuelen) >= XFS_ATTR_SF_ENTSIZE_MAX)
 994                        return 0;
 995                bytes += sizeof(struct xfs_attr_sf_entry) - 1
 996                                + name_loc->namelen
 997                                + be16_to_cpu(name_loc->valuelen);
 998        }
 999        if ((dp->i_mount->m_flags & XFS_MOUNT_ATTR2) &&
1000            (dp->i_df.if_format != XFS_DINODE_FMT_BTREE) &&
1001            (bytes == sizeof(struct xfs_attr_sf_hdr)))
1002                return -1;
1003        return xfs_attr_shortform_bytesfit(dp, bytes);
1004}
1005
1006/* Verify the consistency of an inline attribute fork. */
1007xfs_failaddr_t
1008xfs_attr_shortform_verify(
1009        struct xfs_inode                *ip)
1010{
1011        struct xfs_attr_shortform       *sfp;
1012        struct xfs_attr_sf_entry        *sfep;
1013        struct xfs_attr_sf_entry        *next_sfep;
1014        char                            *endp;
1015        struct xfs_ifork                *ifp;
1016        int                             i;
1017        int64_t                         size;
1018
1019        ASSERT(ip->i_afp->if_format == XFS_DINODE_FMT_LOCAL);
1020        ifp = XFS_IFORK_PTR(ip, XFS_ATTR_FORK);
1021        sfp = (struct xfs_attr_shortform *)ifp->if_u1.if_data;
1022        size = ifp->if_bytes;
1023
1024        /*
1025         * Give up if the attribute is way too short.
1026         */
1027        if (size < sizeof(struct xfs_attr_sf_hdr))
1028                return __this_address;
1029
1030        endp = (char *)sfp + size;
1031
1032        /* Check all reported entries */
1033        sfep = &sfp->list[0];
1034        for (i = 0; i < sfp->hdr.count; i++) {
1035                /*
1036                 * struct xfs_attr_sf_entry has a variable length.
1037                 * Check the fixed-offset parts of the structure are
1038                 * within the data buffer.
1039                 * xfs_attr_sf_entry is defined with a 1-byte variable
1040                 * array at the end, so we must subtract that off.
1041                 */
1042                if (((char *)sfep + sizeof(*sfep) - 1) >= endp)
1043                        return __this_address;
1044
1045                /* Don't allow names with known bad length. */
1046                if (sfep->namelen == 0)
1047                        return __this_address;
1048
1049                /*
1050                 * Check that the variable-length part of the structure is
1051                 * within the data buffer.  The next entry starts after the
1052                 * name component, so nextentry is an acceptable test.
1053                 */
1054                next_sfep = XFS_ATTR_SF_NEXTENTRY(sfep);
1055                if ((char *)next_sfep > endp)
1056                        return __this_address;
1057
1058                /*
1059                 * Check for unknown flags.  Short form doesn't support
1060                 * the incomplete or local bits, so we can use the namespace
1061                 * mask here.
1062                 */
1063                if (sfep->flags & ~XFS_ATTR_NSP_ONDISK_MASK)
1064                        return __this_address;
1065
1066                /*
1067                 * Check for invalid namespace combinations.  We only allow
1068                 * one namespace flag per xattr, so we can just count the
1069                 * bits (i.e. hweight) here.
1070                 */
1071                if (hweight8(sfep->flags & XFS_ATTR_NSP_ONDISK_MASK) > 1)
1072                        return __this_address;
1073
1074                sfep = next_sfep;
1075        }
1076        if ((void *)sfep != (void *)endp)
1077                return __this_address;
1078
1079        return NULL;
1080}
1081
1082/*
1083 * Convert a leaf attribute list to shortform attribute list
1084 */
1085int
1086xfs_attr3_leaf_to_shortform(
1087        struct xfs_buf          *bp,
1088        struct xfs_da_args      *args,
1089        int                     forkoff)
1090{
1091        struct xfs_attr_leafblock *leaf;
1092        struct xfs_attr3_icleaf_hdr ichdr;
1093        struct xfs_attr_leaf_entry *entry;
1094        struct xfs_attr_leaf_name_local *name_loc;
1095        struct xfs_da_args      nargs;
1096        struct xfs_inode        *dp = args->dp;
1097        char                    *tmpbuffer;
1098        int                     error;
1099        int                     i;
1100
1101        trace_xfs_attr_leaf_to_sf(args);
1102
1103        tmpbuffer = kmem_alloc(args->geo->blksize, 0);
1104        if (!tmpbuffer)
1105                return -ENOMEM;
1106
1107        memcpy(tmpbuffer, bp->b_addr, args->geo->blksize);
1108
1109        leaf = (xfs_attr_leafblock_t *)tmpbuffer;
1110        xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
1111        entry = xfs_attr3_leaf_entryp(leaf);
1112
1113        /* XXX (dgc): buffer is about to be marked stale - why zero it? */
1114        memset(bp->b_addr, 0, args->geo->blksize);
1115
1116        /*
1117         * Clean out the prior contents of the attribute list.
1118         */
1119        error = xfs_da_shrink_inode(args, 0, bp);
1120        if (error)
1121                goto out;
1122
1123        if (forkoff == -1) {
1124                ASSERT(dp->i_mount->m_flags & XFS_MOUNT_ATTR2);
1125                ASSERT(dp->i_df.if_format != XFS_DINODE_FMT_BTREE);
1126                xfs_attr_fork_remove(dp, args->trans);
1127                goto out;
1128        }
1129
1130        xfs_attr_shortform_create(args);
1131
1132        /*
1133         * Copy the attributes
1134         */
1135        memset((char *)&nargs, 0, sizeof(nargs));
1136        nargs.geo = args->geo;
1137        nargs.dp = dp;
1138        nargs.total = args->total;
1139        nargs.whichfork = XFS_ATTR_FORK;
1140        nargs.trans = args->trans;
1141        nargs.op_flags = XFS_DA_OP_OKNOENT;
1142
1143        for (i = 0; i < ichdr.count; entry++, i++) {
1144                if (entry->flags & XFS_ATTR_INCOMPLETE)
1145                        continue;       /* don't copy partial entries */
1146                if (!entry->nameidx)
1147                        continue;
1148                ASSERT(entry->flags & XFS_ATTR_LOCAL);
1149                name_loc = xfs_attr3_leaf_name_local(leaf, i);
1150                nargs.name = name_loc->nameval;
1151                nargs.namelen = name_loc->namelen;
1152                nargs.value = &name_loc->nameval[nargs.namelen];
1153                nargs.valuelen = be16_to_cpu(name_loc->valuelen);
1154                nargs.hashval = be32_to_cpu(entry->hashval);
1155                nargs.attr_filter = entry->flags & XFS_ATTR_NSP_ONDISK_MASK;
1156                xfs_attr_shortform_add(&nargs, forkoff);
1157        }
1158        error = 0;
1159
1160out:
1161        kmem_free(tmpbuffer);
1162        return error;
1163}
1164
1165/*
1166 * Convert from using a single leaf to a root node and a leaf.
1167 */
1168int
1169xfs_attr3_leaf_to_node(
1170        struct xfs_da_args      *args)
1171{
1172        struct xfs_attr_leafblock *leaf;
1173        struct xfs_attr3_icleaf_hdr icleafhdr;
1174        struct xfs_attr_leaf_entry *entries;
1175        struct xfs_da3_icnode_hdr icnodehdr;
1176        struct xfs_da_intnode   *node;
1177        struct xfs_inode        *dp = args->dp;
1178        struct xfs_mount        *mp = dp->i_mount;
1179        struct xfs_buf          *bp1 = NULL;
1180        struct xfs_buf          *bp2 = NULL;
1181        xfs_dablk_t             blkno;
1182        int                     error;
1183
1184        trace_xfs_attr_leaf_to_node(args);
1185
1186        error = xfs_da_grow_inode(args, &blkno);
1187        if (error)
1188                goto out;
1189        error = xfs_attr3_leaf_read(args->trans, dp, 0, &bp1);
1190        if (error)
1191                goto out;
1192
1193        error = xfs_da_get_buf(args->trans, dp, blkno, &bp2, XFS_ATTR_FORK);
1194        if (error)
1195                goto out;
1196
1197        /* copy leaf to new buffer, update identifiers */
1198        xfs_trans_buf_set_type(args->trans, bp2, XFS_BLFT_ATTR_LEAF_BUF);
1199        bp2->b_ops = bp1->b_ops;
1200        memcpy(bp2->b_addr, bp1->b_addr, args->geo->blksize);
1201        if (xfs_sb_version_hascrc(&mp->m_sb)) {
1202                struct xfs_da3_blkinfo *hdr3 = bp2->b_addr;
1203                hdr3->blkno = cpu_to_be64(bp2->b_bn);
1204        }
1205        xfs_trans_log_buf(args->trans, bp2, 0, args->geo->blksize - 1);
1206
1207        /*
1208         * Set up the new root node.
1209         */
1210        error = xfs_da3_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK);
1211        if (error)
1212                goto out;
1213        node = bp1->b_addr;
1214        xfs_da3_node_hdr_from_disk(mp, &icnodehdr, node);
1215
1216        leaf = bp2->b_addr;
1217        xfs_attr3_leaf_hdr_from_disk(args->geo, &icleafhdr, leaf);
1218        entries = xfs_attr3_leaf_entryp(leaf);
1219
1220        /* both on-disk, don't endian-flip twice */
1221        icnodehdr.btree[0].hashval = entries[icleafhdr.count - 1].hashval;
1222        icnodehdr.btree[0].before = cpu_to_be32(blkno);
1223        icnodehdr.count = 1;
1224        xfs_da3_node_hdr_to_disk(dp->i_mount, node, &icnodehdr);
1225        xfs_trans_log_buf(args->trans, bp1, 0, args->geo->blksize - 1);
1226        error = 0;
1227out:
1228        return error;
1229}
1230
1231/*========================================================================
1232 * Routines used for growing the Btree.
1233 *========================================================================*/
1234
1235/*
1236 * Create the initial contents of a leaf attribute list
1237 * or a leaf in a node attribute list.
1238 */
1239STATIC int
1240xfs_attr3_leaf_create(
1241        struct xfs_da_args      *args,
1242        xfs_dablk_t             blkno,
1243        struct xfs_buf          **bpp)
1244{
1245        struct xfs_attr_leafblock *leaf;
1246        struct xfs_attr3_icleaf_hdr ichdr;
1247        struct xfs_inode        *dp = args->dp;
1248        struct xfs_mount        *mp = dp->i_mount;
1249        struct xfs_buf          *bp;
1250        int                     error;
1251
1252        trace_xfs_attr_leaf_create(args);
1253
1254        error = xfs_da_get_buf(args->trans, args->dp, blkno, &bp,
1255                                            XFS_ATTR_FORK);
1256        if (error)
1257                return error;
1258        bp->b_ops = &xfs_attr3_leaf_buf_ops;
1259        xfs_trans_buf_set_type(args->trans, bp, XFS_BLFT_ATTR_LEAF_BUF);
1260        leaf = bp->b_addr;
1261        memset(leaf, 0, args->geo->blksize);
1262
1263        memset(&ichdr, 0, sizeof(ichdr));
1264        ichdr.firstused = args->geo->blksize;
1265
1266        if (xfs_sb_version_hascrc(&mp->m_sb)) {
1267                struct xfs_da3_blkinfo *hdr3 = bp->b_addr;
1268
1269                ichdr.magic = XFS_ATTR3_LEAF_MAGIC;
1270
1271                hdr3->blkno = cpu_to_be64(bp->b_bn);
1272                hdr3->owner = cpu_to_be64(dp->i_ino);
1273                uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid);
1274
1275                ichdr.freemap[0].base = sizeof(struct xfs_attr3_leaf_hdr);
1276        } else {
1277                ichdr.magic = XFS_ATTR_LEAF_MAGIC;
1278                ichdr.freemap[0].base = sizeof(struct xfs_attr_leaf_hdr);
1279        }
1280        ichdr.freemap[0].size = ichdr.firstused - ichdr.freemap[0].base;
1281
1282        xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr);
1283        xfs_trans_log_buf(args->trans, bp, 0, args->geo->blksize - 1);
1284
1285        *bpp = bp;
1286        return 0;
1287}
1288
1289/*
1290 * Split the leaf node, rebalance, then add the new entry.
1291 */
1292int
1293xfs_attr3_leaf_split(
1294        struct xfs_da_state     *state,
1295        struct xfs_da_state_blk *oldblk,
1296        struct xfs_da_state_blk *newblk)
1297{
1298        xfs_dablk_t blkno;
1299        int error;
1300
1301        trace_xfs_attr_leaf_split(state->args);
1302
1303        /*
1304         * Allocate space for a new leaf node.
1305         */
1306        ASSERT(oldblk->magic == XFS_ATTR_LEAF_MAGIC);
1307        error = xfs_da_grow_inode(state->args, &blkno);
1308        if (error)
1309                return error;
1310        error = xfs_attr3_leaf_create(state->args, blkno, &newblk->bp);
1311        if (error)
1312                return error;
1313        newblk->blkno = blkno;
1314        newblk->magic = XFS_ATTR_LEAF_MAGIC;
1315
1316        /*
1317         * Rebalance the entries across the two leaves.
1318         * NOTE: rebalance() currently depends on the 2nd block being empty.
1319         */
1320        xfs_attr3_leaf_rebalance(state, oldblk, newblk);
1321        error = xfs_da3_blk_link(state, oldblk, newblk);
1322        if (error)
1323                return error;
1324
1325        /*
1326         * Save info on "old" attribute for "atomic rename" ops, leaf_add()
1327         * modifies the index/blkno/rmtblk/rmtblkcnt fields to show the
1328         * "new" attrs info.  Will need the "old" info to remove it later.
1329         *
1330         * Insert the "new" entry in the correct block.
1331         */
1332        if (state->inleaf) {
1333                trace_xfs_attr_leaf_add_old(state->args);
1334                error = xfs_attr3_leaf_add(oldblk->bp, state->args);
1335        } else {
1336                trace_xfs_attr_leaf_add_new(state->args);
1337                error = xfs_attr3_leaf_add(newblk->bp, state->args);
1338        }
1339
1340        /*
1341         * Update last hashval in each block since we added the name.
1342         */
1343        oldblk->hashval = xfs_attr_leaf_lasthash(oldblk->bp, NULL);
1344        newblk->hashval = xfs_attr_leaf_lasthash(newblk->bp, NULL);
1345        return error;
1346}
1347
1348/*
1349 * Add a name to the leaf attribute list structure.
1350 */
1351int
1352xfs_attr3_leaf_add(
1353        struct xfs_buf          *bp,
1354        struct xfs_da_args      *args)
1355{
1356        struct xfs_attr_leafblock *leaf;
1357        struct xfs_attr3_icleaf_hdr ichdr;
1358        int                     tablesize;
1359        int                     entsize;
1360        int                     sum;
1361        int                     tmp;
1362        int                     i;
1363
1364        trace_xfs_attr_leaf_add(args);
1365
1366        leaf = bp->b_addr;
1367        xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
1368        ASSERT(args->index >= 0 && args->index <= ichdr.count);
1369        entsize = xfs_attr_leaf_newentsize(args, NULL);
1370
1371        /*
1372         * Search through freemap for first-fit on new name length.
1373         * (may need to figure in size of entry struct too)
1374         */
1375        tablesize = (ichdr.count + 1) * sizeof(xfs_attr_leaf_entry_t)
1376                                        + xfs_attr3_leaf_hdr_size(leaf);
1377        for (sum = 0, i = XFS_ATTR_LEAF_MAPSIZE - 1; i >= 0; i--) {
1378                if (tablesize > ichdr.firstused) {
1379                        sum += ichdr.freemap[i].size;
1380                        continue;
1381                }
1382                if (!ichdr.freemap[i].size)
1383                        continue;       /* no space in this map */
1384                tmp = entsize;
1385                if (ichdr.freemap[i].base < ichdr.firstused)
1386                        tmp += sizeof(xfs_attr_leaf_entry_t);
1387                if (ichdr.freemap[i].size >= tmp) {
1388                        tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, i);
1389                        goto out_log_hdr;
1390                }
1391                sum += ichdr.freemap[i].size;
1392        }
1393
1394        /*
1395         * If there are no holes in the address space of the block,
1396         * and we don't have enough freespace, then compaction will do us
1397         * no good and we should just give up.
1398         */
1399        if (!ichdr.holes && sum < entsize)
1400                return -ENOSPC;
1401
1402        /*
1403         * Compact the entries to coalesce free space.
1404         * This may change the hdr->count via dropping INCOMPLETE entries.
1405         */
1406        xfs_attr3_leaf_compact(args, &ichdr, bp);
1407
1408        /*
1409         * After compaction, the block is guaranteed to have only one
1410         * free region, in freemap[0].  If it is not big enough, give up.
1411         */
1412        if (ichdr.freemap[0].size < (entsize + sizeof(xfs_attr_leaf_entry_t))) {
1413                tmp = -ENOSPC;
1414                goto out_log_hdr;
1415        }
1416
1417        tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, 0);
1418
1419out_log_hdr:
1420        xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr);
1421        xfs_trans_log_buf(args->trans, bp,
1422                XFS_DA_LOGRANGE(leaf, &leaf->hdr,
1423                                xfs_attr3_leaf_hdr_size(leaf)));
1424        return tmp;
1425}
1426
1427/*
1428 * Add a name to a leaf attribute list structure.
1429 */
1430STATIC int
1431xfs_attr3_leaf_add_work(
1432        struct xfs_buf          *bp,
1433        struct xfs_attr3_icleaf_hdr *ichdr,
1434        struct xfs_da_args      *args,
1435        int                     mapindex)
1436{
1437        struct xfs_attr_leafblock *leaf;
1438        struct xfs_attr_leaf_entry *entry;
1439        struct xfs_attr_leaf_name_local *name_loc;
1440        struct xfs_attr_leaf_name_remote *name_rmt;
1441        struct xfs_mount        *mp;
1442        int                     tmp;
1443        int                     i;
1444
1445        trace_xfs_attr_leaf_add_work(args);
1446
1447        leaf = bp->b_addr;
1448        ASSERT(mapindex >= 0 && mapindex < XFS_ATTR_LEAF_MAPSIZE);
1449        ASSERT(args->index >= 0 && args->index <= ichdr->count);
1450
1451        /*
1452         * Force open some space in the entry array and fill it in.
1453         */
1454        entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
1455        if (args->index < ichdr->count) {
1456                tmp  = ichdr->count - args->index;
1457                tmp *= sizeof(xfs_attr_leaf_entry_t);
1458                memmove(entry + 1, entry, tmp);
1459                xfs_trans_log_buf(args->trans, bp,
1460                    XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(*entry)));
1461        }
1462        ichdr->count++;
1463
1464        /*
1465         * Allocate space for the new string (at the end of the run).
1466         */
1467        mp = args->trans->t_mountp;
1468        ASSERT(ichdr->freemap[mapindex].base < args->geo->blksize);
1469        ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0);
1470        ASSERT(ichdr->freemap[mapindex].size >=
1471                xfs_attr_leaf_newentsize(args, NULL));
1472        ASSERT(ichdr->freemap[mapindex].size < args->geo->blksize);
1473        ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0);
1474
1475        ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args, &tmp);
1476
1477        entry->nameidx = cpu_to_be16(ichdr->freemap[mapindex].base +
1478                                     ichdr->freemap[mapindex].size);
1479        entry->hashval = cpu_to_be32(args->hashval);
1480        entry->flags = args->attr_filter;
1481        if (tmp)
1482                entry->flags |= XFS_ATTR_LOCAL;
1483        if (args->op_flags & XFS_DA_OP_RENAME) {
1484                entry->flags |= XFS_ATTR_INCOMPLETE;
1485                if ((args->blkno2 == args->blkno) &&
1486                    (args->index2 <= args->index)) {
1487                        args->index2++;
1488                }
1489        }
1490        xfs_trans_log_buf(args->trans, bp,
1491                          XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry)));
1492        ASSERT((args->index == 0) ||
1493               (be32_to_cpu(entry->hashval) >= be32_to_cpu((entry-1)->hashval)));
1494        ASSERT((args->index == ichdr->count - 1) ||
1495               (be32_to_cpu(entry->hashval) <= be32_to_cpu((entry+1)->hashval)));
1496
1497        /*
1498         * For "remote" attribute values, simply note that we need to
1499         * allocate space for the "remote" value.  We can't actually
1500         * allocate the extents in this transaction, and we can't decide
1501         * which blocks they should be as we might allocate more blocks
1502         * as part of this transaction (a split operation for example).
1503         */
1504        if (entry->flags & XFS_ATTR_LOCAL) {
1505                name_loc = xfs_attr3_leaf_name_local(leaf, args->index);
1506                name_loc->namelen = args->namelen;
1507                name_loc->valuelen = cpu_to_be16(args->valuelen);
1508                memcpy((char *)name_loc->nameval, args->name, args->namelen);
1509                memcpy((char *)&name_loc->nameval[args->namelen], args->value,
1510                                   be16_to_cpu(name_loc->valuelen));
1511        } else {
1512                name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
1513                name_rmt->namelen = args->namelen;
1514                memcpy((char *)name_rmt->name, args->name, args->namelen);
1515                entry->flags |= XFS_ATTR_INCOMPLETE;
1516                /* just in case */
1517                name_rmt->valuelen = 0;
1518                name_rmt->valueblk = 0;
1519                args->rmtblkno = 1;
1520                args->rmtblkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen);
1521                args->rmtvaluelen = args->valuelen;
1522        }
1523        xfs_trans_log_buf(args->trans, bp,
1524             XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index),
1525                                   xfs_attr_leaf_entsize(leaf, args->index)));
1526
1527        /*
1528         * Update the control info for this leaf node
1529         */
1530        if (be16_to_cpu(entry->nameidx) < ichdr->firstused)
1531                ichdr->firstused = be16_to_cpu(entry->nameidx);
1532
1533        ASSERT(ichdr->firstused >= ichdr->count * sizeof(xfs_attr_leaf_entry_t)
1534                                        + xfs_attr3_leaf_hdr_size(leaf));
1535        tmp = (ichdr->count - 1) * sizeof(xfs_attr_leaf_entry_t)
1536                                        + xfs_attr3_leaf_hdr_size(leaf);
1537
1538        for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) {
1539                if (ichdr->freemap[i].base == tmp) {
1540                        ichdr->freemap[i].base += sizeof(xfs_attr_leaf_entry_t);
1541                        ichdr->freemap[i].size -=
1542                                min_t(uint16_t, ichdr->freemap[i].size,
1543                                                sizeof(xfs_attr_leaf_entry_t));
1544                }
1545        }
1546        ichdr->usedbytes += xfs_attr_leaf_entsize(leaf, args->index);
1547        return 0;
1548}
1549
1550/*
1551 * Garbage collect a leaf attribute list block by copying it to a new buffer.
1552 */
1553STATIC void
1554xfs_attr3_leaf_compact(
1555        struct xfs_da_args      *args,
1556        struct xfs_attr3_icleaf_hdr *ichdr_dst,
1557        struct xfs_buf          *bp)
1558{
1559        struct xfs_attr_leafblock *leaf_src;
1560        struct xfs_attr_leafblock *leaf_dst;
1561        struct xfs_attr3_icleaf_hdr ichdr_src;
1562        struct xfs_trans        *trans = args->trans;
1563        char                    *tmpbuffer;
1564
1565        trace_xfs_attr_leaf_compact(args);
1566
1567        tmpbuffer = kmem_alloc(args->geo->blksize, 0);
1568        memcpy(tmpbuffer, bp->b_addr, args->geo->blksize);
1569        memset(bp->b_addr, 0, args->geo->blksize);
1570        leaf_src = (xfs_attr_leafblock_t *)tmpbuffer;
1571        leaf_dst = bp->b_addr;
1572
1573        /*
1574         * Copy the on-disk header back into the destination buffer to ensure
1575         * all the information in the header that is not part of the incore
1576         * header structure is preserved.
1577         */
1578        memcpy(bp->b_addr, tmpbuffer, xfs_attr3_leaf_hdr_size(leaf_src));
1579
1580        /* Initialise the incore headers */
1581        ichdr_src = *ichdr_dst; /* struct copy */
1582        ichdr_dst->firstused = args->geo->blksize;
1583        ichdr_dst->usedbytes = 0;
1584        ichdr_dst->count = 0;
1585        ichdr_dst->holes = 0;
1586        ichdr_dst->freemap[0].base = xfs_attr3_leaf_hdr_size(leaf_src);
1587        ichdr_dst->freemap[0].size = ichdr_dst->firstused -
1588                                                ichdr_dst->freemap[0].base;
1589
1590        /* write the header back to initialise the underlying buffer */
1591        xfs_attr3_leaf_hdr_to_disk(args->geo, leaf_dst, ichdr_dst);
1592
1593        /*
1594         * Copy all entry's in the same (sorted) order,
1595         * but allocate name/value pairs packed and in sequence.
1596         */
1597        xfs_attr3_leaf_moveents(args, leaf_src, &ichdr_src, 0,
1598                                leaf_dst, ichdr_dst, 0, ichdr_src.count);
1599        /*
1600         * this logs the entire buffer, but the caller must write the header
1601         * back to the buffer when it is finished modifying it.
1602         */
1603        xfs_trans_log_buf(trans, bp, 0, args->geo->blksize - 1);
1604
1605        kmem_free(tmpbuffer);
1606}
1607
1608/*
1609 * Compare two leaf blocks "order".
1610 * Return 0 unless leaf2 should go before leaf1.
1611 */
1612static int
1613xfs_attr3_leaf_order(
1614        struct xfs_buf  *leaf1_bp,
1615        struct xfs_attr3_icleaf_hdr *leaf1hdr,
1616        struct xfs_buf  *leaf2_bp,
1617        struct xfs_attr3_icleaf_hdr *leaf2hdr)
1618{
1619        struct xfs_attr_leaf_entry *entries1;
1620        struct xfs_attr_leaf_entry *entries2;
1621
1622        entries1 = xfs_attr3_leaf_entryp(leaf1_bp->b_addr);
1623        entries2 = xfs_attr3_leaf_entryp(leaf2_bp->b_addr);
1624        if (leaf1hdr->count > 0 && leaf2hdr->count > 0 &&
1625            ((be32_to_cpu(entries2[0].hashval) <
1626              be32_to_cpu(entries1[0].hashval)) ||
1627             (be32_to_cpu(entries2[leaf2hdr->count - 1].hashval) <
1628              be32_to_cpu(entries1[leaf1hdr->count - 1].hashval)))) {
1629                return 1;
1630        }
1631        return 0;
1632}
1633
1634int
1635xfs_attr_leaf_order(
1636        struct xfs_buf  *leaf1_bp,
1637        struct xfs_buf  *leaf2_bp)
1638{
1639        struct xfs_attr3_icleaf_hdr ichdr1;
1640        struct xfs_attr3_icleaf_hdr ichdr2;
1641        struct xfs_mount *mp = leaf1_bp->b_mount;
1642
1643        xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr1, leaf1_bp->b_addr);
1644        xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr2, leaf2_bp->b_addr);
1645        return xfs_attr3_leaf_order(leaf1_bp, &ichdr1, leaf2_bp, &ichdr2);
1646}
1647
1648/*
1649 * Redistribute the attribute list entries between two leaf nodes,
1650 * taking into account the size of the new entry.
1651 *
1652 * NOTE: if new block is empty, then it will get the upper half of the
1653 * old block.  At present, all (one) callers pass in an empty second block.
1654 *
1655 * This code adjusts the args->index/blkno and args->index2/blkno2 fields
1656 * to match what it is doing in splitting the attribute leaf block.  Those
1657 * values are used in "atomic rename" operations on attributes.  Note that
1658 * the "new" and "old" values can end up in different blocks.
1659 */
1660STATIC void
1661xfs_attr3_leaf_rebalance(
1662        struct xfs_da_state     *state,
1663        struct xfs_da_state_blk *blk1,
1664        struct xfs_da_state_blk *blk2)
1665{
1666        struct xfs_da_args      *args;
1667        struct xfs_attr_leafblock *leaf1;
1668        struct xfs_attr_leafblock *leaf2;
1669        struct xfs_attr3_icleaf_hdr ichdr1;
1670        struct xfs_attr3_icleaf_hdr ichdr2;
1671        struct xfs_attr_leaf_entry *entries1;
1672        struct xfs_attr_leaf_entry *entries2;
1673        int                     count;
1674        int                     totallen;
1675        int                     max;
1676        int                     space;
1677        int                     swap;
1678
1679        /*
1680         * Set up environment.
1681         */
1682        ASSERT(blk1->magic == XFS_ATTR_LEAF_MAGIC);
1683        ASSERT(blk2->magic == XFS_ATTR_LEAF_MAGIC);
1684        leaf1 = blk1->bp->b_addr;
1685        leaf2 = blk2->bp->b_addr;
1686        xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr1, leaf1);
1687        xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr2, leaf2);
1688        ASSERT(ichdr2.count == 0);
1689        args = state->args;
1690
1691        trace_xfs_attr_leaf_rebalance(args);
1692
1693        /*
1694         * Check ordering of blocks, reverse if it makes things simpler.
1695         *
1696         * NOTE: Given that all (current) callers pass in an empty
1697         * second block, this code should never set "swap".
1698         */
1699        swap = 0;
1700        if (xfs_attr3_leaf_order(blk1->bp, &ichdr1, blk2->bp, &ichdr2)) {
1701                swap(blk1, blk2);
1702
1703                /* swap structures rather than reconverting them */
1704                swap(ichdr1, ichdr2);
1705
1706                leaf1 = blk1->bp->b_addr;
1707                leaf2 = blk2->bp->b_addr;
1708                swap = 1;
1709        }
1710
1711        /*
1712         * Examine entries until we reduce the absolute difference in
1713         * byte usage between the two blocks to a minimum.  Then get
1714         * the direction to copy and the number of elements to move.
1715         *
1716         * "inleaf" is true if the new entry should be inserted into blk1.
1717         * If "swap" is also true, then reverse the sense of "inleaf".
1718         */
1719        state->inleaf = xfs_attr3_leaf_figure_balance(state, blk1, &ichdr1,
1720                                                      blk2, &ichdr2,
1721                                                      &count, &totallen);
1722        if (swap)
1723                state->inleaf = !state->inleaf;
1724
1725        /*
1726         * Move any entries required from leaf to leaf:
1727         */
1728        if (count < ichdr1.count) {
1729                /*
1730                 * Figure the total bytes to be added to the destination leaf.
1731                 */
1732                /* number entries being moved */
1733                count = ichdr1.count - count;
1734                space  = ichdr1.usedbytes - totallen;
1735                space += count * sizeof(xfs_attr_leaf_entry_t);
1736
1737                /*
1738                 * leaf2 is the destination, compact it if it looks tight.
1739                 */
1740                max  = ichdr2.firstused - xfs_attr3_leaf_hdr_size(leaf1);
1741                max -= ichdr2.count * sizeof(xfs_attr_leaf_entry_t);
1742                if (space > max)
1743                        xfs_attr3_leaf_compact(args, &ichdr2, blk2->bp);
1744
1745                /*
1746                 * Move high entries from leaf1 to low end of leaf2.
1747                 */
1748                xfs_attr3_leaf_moveents(args, leaf1, &ichdr1,
1749                                ichdr1.count - count, leaf2, &ichdr2, 0, count);
1750
1751        } else if (count > ichdr1.count) {
1752                /*
1753                 * I assert that since all callers pass in an empty
1754                 * second buffer, this code should never execute.
1755                 */
1756                ASSERT(0);
1757
1758                /*
1759                 * Figure the total bytes to be added to the destination leaf.
1760                 */
1761                /* number entries being moved */
1762                count -= ichdr1.count;
1763                space  = totallen - ichdr1.usedbytes;
1764                space += count * sizeof(xfs_attr_leaf_entry_t);
1765
1766                /*
1767                 * leaf1 is the destination, compact it if it looks tight.
1768                 */
1769                max  = ichdr1.firstused - xfs_attr3_leaf_hdr_size(leaf1);
1770                max -= ichdr1.count * sizeof(xfs_attr_leaf_entry_t);
1771                if (space > max)
1772                        xfs_attr3_leaf_compact(args, &ichdr1, blk1->bp);
1773
1774                /*
1775                 * Move low entries from leaf2 to high end of leaf1.
1776                 */
1777                xfs_attr3_leaf_moveents(args, leaf2, &ichdr2, 0, leaf1, &ichdr1,
1778                                        ichdr1.count, count);
1779        }
1780
1781        xfs_attr3_leaf_hdr_to_disk(state->args->geo, leaf1, &ichdr1);
1782        xfs_attr3_leaf_hdr_to_disk(state->args->geo, leaf2, &ichdr2);
1783        xfs_trans_log_buf(args->trans, blk1->bp, 0, args->geo->blksize - 1);
1784        xfs_trans_log_buf(args->trans, blk2->bp, 0, args->geo->blksize - 1);
1785
1786        /*
1787         * Copy out last hashval in each block for B-tree code.
1788         */
1789        entries1 = xfs_attr3_leaf_entryp(leaf1);
1790        entries2 = xfs_attr3_leaf_entryp(leaf2);
1791        blk1->hashval = be32_to_cpu(entries1[ichdr1.count - 1].hashval);
1792        blk2->hashval = be32_to_cpu(entries2[ichdr2.count - 1].hashval);
1793
1794        /*
1795         * Adjust the expected index for insertion.
1796         * NOTE: this code depends on the (current) situation that the
1797         * second block was originally empty.
1798         *
1799         * If the insertion point moved to the 2nd block, we must adjust
1800         * the index.  We must also track the entry just following the
1801         * new entry for use in an "atomic rename" operation, that entry
1802         * is always the "old" entry and the "new" entry is what we are
1803         * inserting.  The index/blkno fields refer to the "old" entry,
1804         * while the index2/blkno2 fields refer to the "new" entry.
1805         */
1806        if (blk1->index > ichdr1.count) {
1807                ASSERT(state->inleaf == 0);
1808                blk2->index = blk1->index - ichdr1.count;
1809                args->index = args->index2 = blk2->index;
1810                args->blkno = args->blkno2 = blk2->blkno;
1811        } else if (blk1->index == ichdr1.count) {
1812                if (state->inleaf) {
1813                        args->index = blk1->index;
1814                        args->blkno = blk1->blkno;
1815                        args->index2 = 0;
1816                        args->blkno2 = blk2->blkno;
1817                } else {
1818                        /*
1819                         * On a double leaf split, the original attr location
1820                         * is already stored in blkno2/index2, so don't
1821                         * overwrite it overwise we corrupt the tree.
1822                         */
1823                        blk2->index = blk1->index - ichdr1.count;
1824                        args->index = blk2->index;
1825                        args->blkno = blk2->blkno;
1826                        if (!state->extravalid) {
1827                                /*
1828                                 * set the new attr location to match the old
1829                                 * one and let the higher level split code
1830                                 * decide where in the leaf to place it.
1831                                 */
1832                                args->index2 = blk2->index;
1833                                args->blkno2 = blk2->blkno;
1834                        }
1835                }
1836        } else {
1837                ASSERT(state->inleaf == 1);
1838                args->index = args->index2 = blk1->index;
1839                args->blkno = args->blkno2 = blk1->blkno;
1840        }
1841}
1842
1843/*
1844 * Examine entries until we reduce the absolute difference in
1845 * byte usage between the two blocks to a minimum.
1846 * GROT: Is this really necessary?  With other than a 512 byte blocksize,
1847 * GROT: there will always be enough room in either block for a new entry.
1848 * GROT: Do a double-split for this case?
1849 */
1850STATIC int
1851xfs_attr3_leaf_figure_balance(
1852        struct xfs_da_state             *state,
1853        struct xfs_da_state_blk         *blk1,
1854        struct xfs_attr3_icleaf_hdr     *ichdr1,
1855        struct xfs_da_state_blk         *blk2,
1856        struct xfs_attr3_icleaf_hdr     *ichdr2,
1857        int                             *countarg,
1858        int                             *usedbytesarg)
1859{
1860        struct xfs_attr_leafblock       *leaf1 = blk1->bp->b_addr;
1861        struct xfs_attr_leafblock       *leaf2 = blk2->bp->b_addr;
1862        struct xfs_attr_leaf_entry      *entry;
1863        int                             count;
1864        int                             max;
1865        int                             index;
1866        int                             totallen = 0;
1867        int                             half;
1868        int                             lastdelta;
1869        int                             foundit = 0;
1870        int                             tmp;
1871
1872        /*
1873         * Examine entries until we reduce the absolute difference in
1874         * byte usage between the two blocks to a minimum.
1875         */
1876        max = ichdr1->count + ichdr2->count;
1877        half = (max + 1) * sizeof(*entry);
1878        half += ichdr1->usedbytes + ichdr2->usedbytes +
1879                        xfs_attr_leaf_newentsize(state->args, NULL);
1880        half /= 2;
1881        lastdelta = state->args->geo->blksize;
1882        entry = xfs_attr3_leaf_entryp(leaf1);
1883        for (count = index = 0; count < max; entry++, index++, count++) {
1884
1885#define XFS_ATTR_ABS(A) (((A) < 0) ? -(A) : (A))
1886                /*
1887                 * The new entry is in the first block, account for it.
1888                 */
1889                if (count == blk1->index) {
1890                        tmp = totallen + sizeof(*entry) +
1891                                xfs_attr_leaf_newentsize(state->args, NULL);
1892                        if (XFS_ATTR_ABS(half - tmp) > lastdelta)
1893                                break;
1894                        lastdelta = XFS_ATTR_ABS(half - tmp);
1895                        totallen = tmp;
1896                        foundit = 1;
1897                }
1898
1899                /*
1900                 * Wrap around into the second block if necessary.
1901                 */
1902                if (count == ichdr1->count) {
1903                        leaf1 = leaf2;
1904                        entry = xfs_attr3_leaf_entryp(leaf1);
1905                        index = 0;
1906                }
1907
1908                /*
1909                 * Figure out if next leaf entry would be too much.
1910                 */
1911                tmp = totallen + sizeof(*entry) + xfs_attr_leaf_entsize(leaf1,
1912                                                                        index);
1913                if (XFS_ATTR_ABS(half - tmp) > lastdelta)
1914                        break;
1915                lastdelta = XFS_ATTR_ABS(half - tmp);
1916                totallen = tmp;
1917#undef XFS_ATTR_ABS
1918        }
1919
1920        /*
1921         * Calculate the number of usedbytes that will end up in lower block.
1922         * If new entry not in lower block, fix up the count.
1923         */
1924        totallen -= count * sizeof(*entry);
1925        if (foundit) {
1926                totallen -= sizeof(*entry) +
1927                                xfs_attr_leaf_newentsize(state->args, NULL);
1928        }
1929
1930        *countarg = count;
1931        *usedbytesarg = totallen;
1932        return foundit;
1933}
1934
1935/*========================================================================
1936 * Routines used for shrinking the Btree.
1937 *========================================================================*/
1938
1939/*
1940 * Check a leaf block and its neighbors to see if the block should be
1941 * collapsed into one or the other neighbor.  Always keep the block
1942 * with the smaller block number.
1943 * If the current block is over 50% full, don't try to join it, return 0.
1944 * If the block is empty, fill in the state structure and return 2.
1945 * If it can be collapsed, fill in the state structure and return 1.
1946 * If nothing can be done, return 0.
1947 *
1948 * GROT: allow for INCOMPLETE entries in calculation.
1949 */
1950int
1951xfs_attr3_leaf_toosmall(
1952        struct xfs_da_state     *state,
1953        int                     *action)
1954{
1955        struct xfs_attr_leafblock *leaf;
1956        struct xfs_da_state_blk *blk;
1957        struct xfs_attr3_icleaf_hdr ichdr;
1958        struct xfs_buf          *bp;
1959        xfs_dablk_t             blkno;
1960        int                     bytes;
1961        int                     forward;
1962        int                     error;
1963        int                     retval;
1964        int                     i;
1965
1966        trace_xfs_attr_leaf_toosmall(state->args);
1967
1968        /*
1969         * Check for the degenerate case of the block being over 50% full.
1970         * If so, it's not worth even looking to see if we might be able
1971         * to coalesce with a sibling.
1972         */
1973        blk = &state->path.blk[ state->path.active-1 ];
1974        leaf = blk->bp->b_addr;
1975        xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr, leaf);
1976        bytes = xfs_attr3_leaf_hdr_size(leaf) +
1977                ichdr.count * sizeof(xfs_attr_leaf_entry_t) +
1978                ichdr.usedbytes;
1979        if (bytes > (state->args->geo->blksize >> 1)) {
1980                *action = 0;    /* blk over 50%, don't try to join */
1981                return 0;
1982        }
1983
1984        /*
1985         * Check for the degenerate case of the block being empty.
1986         * If the block is empty, we'll simply delete it, no need to
1987         * coalesce it with a sibling block.  We choose (arbitrarily)
1988         * to merge with the forward block unless it is NULL.
1989         */
1990        if (ichdr.count == 0) {
1991                /*
1992                 * Make altpath point to the block we want to keep and
1993                 * path point to the block we want to drop (this one).
1994                 */
1995                forward = (ichdr.forw != 0);
1996                memcpy(&state->altpath, &state->path, sizeof(state->path));
1997                error = xfs_da3_path_shift(state, &state->altpath, forward,
1998                                                 0, &retval);
1999                if (error)
2000                        return error;
2001                if (retval) {
2002                        *action = 0;
2003                } else {
2004                        *action = 2;
2005                }
2006                return 0;
2007        }
2008
2009        /*
2010         * Examine each sibling block to see if we can coalesce with
2011         * at least 25% free space to spare.  We need to figure out
2012         * whether to merge with the forward or the backward block.
2013         * We prefer coalescing with the lower numbered sibling so as
2014         * to shrink an attribute list over time.
2015         */
2016        /* start with smaller blk num */
2017        forward = ichdr.forw < ichdr.back;
2018        for (i = 0; i < 2; forward = !forward, i++) {
2019                struct xfs_attr3_icleaf_hdr ichdr2;
2020                if (forward)
2021                        blkno = ichdr.forw;
2022                else
2023                        blkno = ichdr.back;
2024                if (blkno == 0)
2025                        continue;
2026                error = xfs_attr3_leaf_read(state->args->trans, state->args->dp,
2027                                        blkno, &bp);
2028                if (error)
2029                        return error;
2030
2031                xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr2, bp->b_addr);
2032
2033                bytes = state->args->geo->blksize -
2034                        (state->args->geo->blksize >> 2) -
2035                        ichdr.usedbytes - ichdr2.usedbytes -
2036                        ((ichdr.count + ichdr2.count) *
2037                                        sizeof(xfs_attr_leaf_entry_t)) -
2038                        xfs_attr3_leaf_hdr_size(leaf);
2039
2040                xfs_trans_brelse(state->args->trans, bp);
2041                if (bytes >= 0)
2042                        break;  /* fits with at least 25% to spare */
2043        }
2044        if (i >= 2) {
2045                *action = 0;
2046                return 0;
2047        }
2048
2049        /*
2050         * Make altpath point to the block we want to keep (the lower
2051         * numbered block) and path point to the block we want to drop.
2052         */
2053        memcpy(&state->altpath, &state->path, sizeof(state->path));
2054        if (blkno < blk->blkno) {
2055                error = xfs_da3_path_shift(state, &state->altpath, forward,
2056                                                 0, &retval);
2057        } else {
2058                error = xfs_da3_path_shift(state, &state->path, forward,
2059                                                 0, &retval);
2060        }
2061        if (error)
2062                return error;
2063        if (retval) {
2064                *action = 0;
2065        } else {
2066                *action = 1;
2067        }
2068        return 0;
2069}
2070
2071/*
2072 * Remove a name from the leaf attribute list structure.
2073 *
2074 * Return 1 if leaf is less than 37% full, 0 if >= 37% full.
2075 * If two leaves are 37% full, when combined they will leave 25% free.
2076 */
2077int
2078xfs_attr3_leaf_remove(
2079        struct xfs_buf          *bp,
2080        struct xfs_da_args      *args)
2081{
2082        struct xfs_attr_leafblock *leaf;
2083        struct xfs_attr3_icleaf_hdr ichdr;
2084        struct xfs_attr_leaf_entry *entry;
2085        int                     before;
2086        int                     after;
2087        int                     smallest;
2088        int                     entsize;
2089        int                     tablesize;
2090        int                     tmp;
2091        int                     i;
2092
2093        trace_xfs_attr_leaf_remove(args);
2094
2095        leaf = bp->b_addr;
2096        xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2097
2098        ASSERT(ichdr.count > 0 && ichdr.count < args->geo->blksize / 8);
2099        ASSERT(args->index >= 0 && args->index < ichdr.count);
2100        ASSERT(ichdr.firstused >= ichdr.count * sizeof(*entry) +
2101                                        xfs_attr3_leaf_hdr_size(leaf));
2102
2103        entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
2104
2105        ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused);
2106        ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize);
2107
2108        /*
2109         * Scan through free region table:
2110         *    check for adjacency of free'd entry with an existing one,
2111         *    find smallest free region in case we need to replace it,
2112         *    adjust any map that borders the entry table,
2113         */
2114        tablesize = ichdr.count * sizeof(xfs_attr_leaf_entry_t)
2115                                        + xfs_attr3_leaf_hdr_size(leaf);
2116        tmp = ichdr.freemap[0].size;
2117        before = after = -1;
2118        smallest = XFS_ATTR_LEAF_MAPSIZE - 1;
2119        entsize = xfs_attr_leaf_entsize(leaf, args->index);
2120        for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) {
2121                ASSERT(ichdr.freemap[i].base < args->geo->blksize);
2122                ASSERT(ichdr.freemap[i].size < args->geo->blksize);
2123                if (ichdr.freemap[i].base == tablesize) {
2124                        ichdr.freemap[i].base -= sizeof(xfs_attr_leaf_entry_t);
2125                        ichdr.freemap[i].size += sizeof(xfs_attr_leaf_entry_t);
2126                }
2127
2128                if (ichdr.freemap[i].base + ichdr.freemap[i].size ==
2129                                be16_to_cpu(entry->nameidx)) {
2130                        before = i;
2131                } else if (ichdr.freemap[i].base ==
2132                                (be16_to_cpu(entry->nameidx) + entsize)) {
2133                        after = i;
2134                } else if (ichdr.freemap[i].size < tmp) {
2135                        tmp = ichdr.freemap[i].size;
2136                        smallest = i;
2137                }
2138        }
2139
2140        /*
2141         * Coalesce adjacent freemap regions,
2142         * or replace the smallest region.
2143         */
2144        if ((before >= 0) || (after >= 0)) {
2145                if ((before >= 0) && (after >= 0)) {
2146                        ichdr.freemap[before].size += entsize;
2147                        ichdr.freemap[before].size += ichdr.freemap[after].size;
2148                        ichdr.freemap[after].base = 0;
2149                        ichdr.freemap[after].size = 0;
2150                } else if (before >= 0) {
2151                        ichdr.freemap[before].size += entsize;
2152                } else {
2153                        ichdr.freemap[after].base = be16_to_cpu(entry->nameidx);
2154                        ichdr.freemap[after].size += entsize;
2155                }
2156        } else {
2157                /*
2158                 * Replace smallest region (if it is smaller than free'd entry)
2159                 */
2160                if (ichdr.freemap[smallest].size < entsize) {
2161                        ichdr.freemap[smallest].base = be16_to_cpu(entry->nameidx);
2162                        ichdr.freemap[smallest].size = entsize;
2163                }
2164        }
2165
2166        /*
2167         * Did we remove the first entry?
2168         */
2169        if (be16_to_cpu(entry->nameidx) == ichdr.firstused)
2170                smallest = 1;
2171        else
2172                smallest = 0;
2173
2174        /*
2175         * Compress the remaining entries and zero out the removed stuff.
2176         */
2177        memset(xfs_attr3_leaf_name(leaf, args->index), 0, entsize);
2178        ichdr.usedbytes -= entsize;
2179        xfs_trans_log_buf(args->trans, bp,
2180             XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index),
2181                                   entsize));
2182
2183        tmp = (ichdr.count - args->index) * sizeof(xfs_attr_leaf_entry_t);
2184        memmove(entry, entry + 1, tmp);
2185        ichdr.count--;
2186        xfs_trans_log_buf(args->trans, bp,
2187            XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(xfs_attr_leaf_entry_t)));
2188
2189        entry = &xfs_attr3_leaf_entryp(leaf)[ichdr.count];
2190        memset(entry, 0, sizeof(xfs_attr_leaf_entry_t));
2191
2192        /*
2193         * If we removed the first entry, re-find the first used byte
2194         * in the name area.  Note that if the entry was the "firstused",
2195         * then we don't have a "hole" in our block resulting from
2196         * removing the name.
2197         */
2198        if (smallest) {
2199                tmp = args->geo->blksize;
2200                entry = xfs_attr3_leaf_entryp(leaf);
2201                for (i = ichdr.count - 1; i >= 0; entry++, i--) {
2202                        ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused);
2203                        ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize);
2204
2205                        if (be16_to_cpu(entry->nameidx) < tmp)
2206                                tmp = be16_to_cpu(entry->nameidx);
2207                }
2208                ichdr.firstused = tmp;
2209                ASSERT(ichdr.firstused != 0);
2210        } else {
2211                ichdr.holes = 1;        /* mark as needing compaction */
2212        }
2213        xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr);
2214        xfs_trans_log_buf(args->trans, bp,
2215                          XFS_DA_LOGRANGE(leaf, &leaf->hdr,
2216                                          xfs_attr3_leaf_hdr_size(leaf)));
2217
2218        /*
2219         * Check if leaf is less than 50% full, caller may want to
2220         * "join" the leaf with a sibling if so.
2221         */
2222        tmp = ichdr.usedbytes + xfs_attr3_leaf_hdr_size(leaf) +
2223              ichdr.count * sizeof(xfs_attr_leaf_entry_t);
2224
2225        return tmp < args->geo->magicpct; /* leaf is < 37% full */
2226}
2227
2228/*
2229 * Move all the attribute list entries from drop_leaf into save_leaf.
2230 */
2231void
2232xfs_attr3_leaf_unbalance(
2233        struct xfs_da_state     *state,
2234        struct xfs_da_state_blk *drop_blk,
2235        struct xfs_da_state_blk *save_blk)
2236{
2237        struct xfs_attr_leafblock *drop_leaf = drop_blk->bp->b_addr;
2238        struct xfs_attr_leafblock *save_leaf = save_blk->bp->b_addr;
2239        struct xfs_attr3_icleaf_hdr drophdr;
2240        struct xfs_attr3_icleaf_hdr savehdr;
2241        struct xfs_attr_leaf_entry *entry;
2242
2243        trace_xfs_attr_leaf_unbalance(state->args);
2244
2245        drop_leaf = drop_blk->bp->b_addr;
2246        save_leaf = save_blk->bp->b_addr;
2247        xfs_attr3_leaf_hdr_from_disk(state->args->geo, &drophdr, drop_leaf);
2248        xfs_attr3_leaf_hdr_from_disk(state->args->geo, &savehdr, save_leaf);
2249        entry = xfs_attr3_leaf_entryp(drop_leaf);
2250
2251        /*
2252         * Save last hashval from dying block for later Btree fixup.
2253         */
2254        drop_blk->hashval = be32_to_cpu(entry[drophdr.count - 1].hashval);
2255
2256        /*
2257         * Check if we need a temp buffer, or can we do it in place.
2258         * Note that we don't check "leaf" for holes because we will
2259         * always be dropping it, toosmall() decided that for us already.
2260         */
2261        if (savehdr.holes == 0) {
2262                /*
2263                 * dest leaf has no holes, so we add there.  May need
2264                 * to make some room in the entry array.
2265                 */
2266                if (xfs_attr3_leaf_order(save_blk->bp, &savehdr,
2267                                         drop_blk->bp, &drophdr)) {
2268                        xfs_attr3_leaf_moveents(state->args,
2269                                                drop_leaf, &drophdr, 0,
2270                                                save_leaf, &savehdr, 0,
2271                                                drophdr.count);
2272                } else {
2273                        xfs_attr3_leaf_moveents(state->args,
2274                                                drop_leaf, &drophdr, 0,
2275                                                save_leaf, &savehdr,
2276                                                savehdr.count, drophdr.count);
2277                }
2278        } else {
2279                /*
2280                 * Destination has holes, so we make a temporary copy
2281                 * of the leaf and add them both to that.
2282                 */
2283                struct xfs_attr_leafblock *tmp_leaf;
2284                struct xfs_attr3_icleaf_hdr tmphdr;
2285
2286                tmp_leaf = kmem_zalloc(state->args->geo->blksize, 0);
2287
2288                /*
2289                 * Copy the header into the temp leaf so that all the stuff
2290                 * not in the incore header is present and gets copied back in
2291                 * once we've moved all the entries.
2292                 */
2293                memcpy(tmp_leaf, save_leaf, xfs_attr3_leaf_hdr_size(save_leaf));
2294
2295                memset(&tmphdr, 0, sizeof(tmphdr));
2296                tmphdr.magic = savehdr.magic;
2297                tmphdr.forw = savehdr.forw;
2298                tmphdr.back = savehdr.back;
2299                tmphdr.firstused = state->args->geo->blksize;
2300
2301                /* write the header to the temp buffer to initialise it */
2302                xfs_attr3_leaf_hdr_to_disk(state->args->geo, tmp_leaf, &tmphdr);
2303
2304                if (xfs_attr3_leaf_order(save_blk->bp, &savehdr,
2305                                         drop_blk->bp, &drophdr)) {
2306                        xfs_attr3_leaf_moveents(state->args,
2307                                                drop_leaf, &drophdr, 0,
2308                                                tmp_leaf, &tmphdr, 0,
2309                                                drophdr.count);
2310                        xfs_attr3_leaf_moveents(state->args,
2311                                                save_leaf, &savehdr, 0,
2312                                                tmp_leaf, &tmphdr, tmphdr.count,
2313                                                savehdr.count);
2314                } else {
2315                        xfs_attr3_leaf_moveents(state->args,
2316                                                save_leaf, &savehdr, 0,
2317                                                tmp_leaf, &tmphdr, 0,
2318                                                savehdr.count);
2319                        xfs_attr3_leaf_moveents(state->args,
2320                                                drop_leaf, &drophdr, 0,
2321                                                tmp_leaf, &tmphdr, tmphdr.count,
2322                                                drophdr.count);
2323                }
2324                memcpy(save_leaf, tmp_leaf, state->args->geo->blksize);
2325                savehdr = tmphdr; /* struct copy */
2326                kmem_free(tmp_leaf);
2327        }
2328
2329        xfs_attr3_leaf_hdr_to_disk(state->args->geo, save_leaf, &savehdr);
2330        xfs_trans_log_buf(state->args->trans, save_blk->bp, 0,
2331                                           state->args->geo->blksize - 1);
2332
2333        /*
2334         * Copy out last hashval in each block for B-tree code.
2335         */
2336        entry = xfs_attr3_leaf_entryp(save_leaf);
2337        save_blk->hashval = be32_to_cpu(entry[savehdr.count - 1].hashval);
2338}
2339
2340/*========================================================================
2341 * Routines used for finding things in the Btree.
2342 *========================================================================*/
2343
2344/*
2345 * Look up a name in a leaf attribute list structure.
2346 * This is the internal routine, it uses the caller's buffer.
2347 *
2348 * Note that duplicate keys are allowed, but only check within the
2349 * current leaf node.  The Btree code must check in adjacent leaf nodes.
2350 *
2351 * Return in args->index the index into the entry[] array of either
2352 * the found entry, or where the entry should have been (insert before
2353 * that entry).
2354 *
2355 * Don't change the args->value unless we find the attribute.
2356 */
2357int
2358xfs_attr3_leaf_lookup_int(
2359        struct xfs_buf          *bp,
2360        struct xfs_da_args      *args)
2361{
2362        struct xfs_attr_leafblock *leaf;
2363        struct xfs_attr3_icleaf_hdr ichdr;
2364        struct xfs_attr_leaf_entry *entry;
2365        struct xfs_attr_leaf_entry *entries;
2366        struct xfs_attr_leaf_name_local *name_loc;
2367        struct xfs_attr_leaf_name_remote *name_rmt;
2368        xfs_dahash_t            hashval;
2369        int                     probe;
2370        int                     span;
2371
2372        trace_xfs_attr_leaf_lookup(args);
2373
2374        leaf = bp->b_addr;
2375        xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2376        entries = xfs_attr3_leaf_entryp(leaf);
2377        if (ichdr.count >= args->geo->blksize / 8) {
2378                xfs_buf_mark_corrupt(bp);
2379                return -EFSCORRUPTED;
2380        }
2381
2382        /*
2383         * Binary search.  (note: small blocks will skip this loop)
2384         */
2385        hashval = args->hashval;
2386        probe = span = ichdr.count / 2;
2387        for (entry = &entries[probe]; span > 4; entry = &entries[probe]) {
2388                span /= 2;
2389                if (be32_to_cpu(entry->hashval) < hashval)
2390                        probe += span;
2391                else if (be32_to_cpu(entry->hashval) > hashval)
2392                        probe -= span;
2393                else
2394                        break;
2395        }
2396        if (!(probe >= 0 && (!ichdr.count || probe < ichdr.count))) {
2397                xfs_buf_mark_corrupt(bp);
2398                return -EFSCORRUPTED;
2399        }
2400        if (!(span <= 4 || be32_to_cpu(entry->hashval) == hashval)) {
2401                xfs_buf_mark_corrupt(bp);
2402                return -EFSCORRUPTED;
2403        }
2404
2405        /*
2406         * Since we may have duplicate hashval's, find the first matching
2407         * hashval in the leaf.
2408         */
2409        while (probe > 0 && be32_to_cpu(entry->hashval) >= hashval) {
2410                entry--;
2411                probe--;
2412        }
2413        while (probe < ichdr.count &&
2414               be32_to_cpu(entry->hashval) < hashval) {
2415                entry++;
2416                probe++;
2417        }
2418        if (probe == ichdr.count || be32_to_cpu(entry->hashval) != hashval) {
2419                args->index = probe;
2420                return -ENOATTR;
2421        }
2422
2423        /*
2424         * Duplicate keys may be present, so search all of them for a match.
2425         */
2426        for (; probe < ichdr.count && (be32_to_cpu(entry->hashval) == hashval);
2427                        entry++, probe++) {
2428/*
2429 * GROT: Add code to remove incomplete entries.
2430 */
2431                if (entry->flags & XFS_ATTR_LOCAL) {
2432                        name_loc = xfs_attr3_leaf_name_local(leaf, probe);
2433                        if (!xfs_attr_match(args, name_loc->namelen,
2434                                        name_loc->nameval, entry->flags))
2435                                continue;
2436                        args->index = probe;
2437                        return -EEXIST;
2438                } else {
2439                        name_rmt = xfs_attr3_leaf_name_remote(leaf, probe);
2440                        if (!xfs_attr_match(args, name_rmt->namelen,
2441                                        name_rmt->name, entry->flags))
2442                                continue;
2443                        args->index = probe;
2444                        args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen);
2445                        args->rmtblkno = be32_to_cpu(name_rmt->valueblk);
2446                        args->rmtblkcnt = xfs_attr3_rmt_blocks(
2447                                                        args->dp->i_mount,
2448                                                        args->rmtvaluelen);
2449                        return -EEXIST;
2450                }
2451        }
2452        args->index = probe;
2453        return -ENOATTR;
2454}
2455
2456/*
2457 * Get the value associated with an attribute name from a leaf attribute
2458 * list structure.
2459 *
2460 * If args->valuelen is zero, only the length needs to be returned.  Unlike a
2461 * lookup, we only return an error if the attribute does not exist or we can't
2462 * retrieve the value.
2463 */
2464int
2465xfs_attr3_leaf_getvalue(
2466        struct xfs_buf          *bp,
2467        struct xfs_da_args      *args)
2468{
2469        struct xfs_attr_leafblock *leaf;
2470        struct xfs_attr3_icleaf_hdr ichdr;
2471        struct xfs_attr_leaf_entry *entry;
2472        struct xfs_attr_leaf_name_local *name_loc;
2473        struct xfs_attr_leaf_name_remote *name_rmt;
2474
2475        leaf = bp->b_addr;
2476        xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2477        ASSERT(ichdr.count < args->geo->blksize / 8);
2478        ASSERT(args->index < ichdr.count);
2479
2480        entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
2481        if (entry->flags & XFS_ATTR_LOCAL) {
2482                name_loc = xfs_attr3_leaf_name_local(leaf, args->index);
2483                ASSERT(name_loc->namelen == args->namelen);
2484                ASSERT(memcmp(args->name, name_loc->nameval, args->namelen) == 0);
2485                return xfs_attr_copy_value(args,
2486                                        &name_loc->nameval[args->namelen],
2487                                        be16_to_cpu(name_loc->valuelen));
2488        }
2489
2490        name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
2491        ASSERT(name_rmt->namelen == args->namelen);
2492        ASSERT(memcmp(args->name, name_rmt->name, args->namelen) == 0);
2493        args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen);
2494        args->rmtblkno = be32_to_cpu(name_rmt->valueblk);
2495        args->rmtblkcnt = xfs_attr3_rmt_blocks(args->dp->i_mount,
2496                                               args->rmtvaluelen);
2497        return xfs_attr_copy_value(args, NULL, args->rmtvaluelen);
2498}
2499
2500/*========================================================================
2501 * Utility routines.
2502 *========================================================================*/
2503
2504/*
2505 * Move the indicated entries from one leaf to another.
2506 * NOTE: this routine modifies both source and destination leaves.
2507 */
2508/*ARGSUSED*/
2509STATIC void
2510xfs_attr3_leaf_moveents(
2511        struct xfs_da_args              *args,
2512        struct xfs_attr_leafblock       *leaf_s,
2513        struct xfs_attr3_icleaf_hdr     *ichdr_s,
2514        int                             start_s,
2515        struct xfs_attr_leafblock       *leaf_d,
2516        struct xfs_attr3_icleaf_hdr     *ichdr_d,
2517        int                             start_d,
2518        int                             count)
2519{
2520        struct xfs_attr_leaf_entry      *entry_s;
2521        struct xfs_attr_leaf_entry      *entry_d;
2522        int                             desti;
2523        int                             tmp;
2524        int                             i;
2525
2526        /*
2527         * Check for nothing to do.
2528         */
2529        if (count == 0)
2530                return;
2531
2532        /*
2533         * Set up environment.
2534         */
2535        ASSERT(ichdr_s->magic == XFS_ATTR_LEAF_MAGIC ||
2536               ichdr_s->magic == XFS_ATTR3_LEAF_MAGIC);
2537        ASSERT(ichdr_s->magic == ichdr_d->magic);
2538        ASSERT(ichdr_s->count > 0 && ichdr_s->count < args->geo->blksize / 8);
2539        ASSERT(ichdr_s->firstused >= (ichdr_s->count * sizeof(*entry_s))
2540                                        + xfs_attr3_leaf_hdr_size(leaf_s));
2541        ASSERT(ichdr_d->count < args->geo->blksize / 8);
2542        ASSERT(ichdr_d->firstused >= (ichdr_d->count * sizeof(*entry_d))
2543                                        + xfs_attr3_leaf_hdr_size(leaf_d));
2544
2545        ASSERT(start_s < ichdr_s->count);
2546        ASSERT(start_d <= ichdr_d->count);
2547        ASSERT(count <= ichdr_s->count);
2548
2549
2550        /*
2551         * Move the entries in the destination leaf up to make a hole?
2552         */
2553        if (start_d < ichdr_d->count) {
2554                tmp  = ichdr_d->count - start_d;
2555                tmp *= sizeof(xfs_attr_leaf_entry_t);
2556                entry_s = &xfs_attr3_leaf_entryp(leaf_d)[start_d];
2557                entry_d = &xfs_attr3_leaf_entryp(leaf_d)[start_d + count];
2558                memmove(entry_d, entry_s, tmp);
2559        }
2560
2561        /*
2562         * Copy all entry's in the same (sorted) order,
2563         * but allocate attribute info packed and in sequence.
2564         */
2565        entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s];
2566        entry_d = &xfs_attr3_leaf_entryp(leaf_d)[start_d];
2567        desti = start_d;
2568        for (i = 0; i < count; entry_s++, entry_d++, desti++, i++) {
2569                ASSERT(be16_to_cpu(entry_s->nameidx) >= ichdr_s->firstused);
2570                tmp = xfs_attr_leaf_entsize(leaf_s, start_s + i);
2571#ifdef GROT
2572                /*
2573                 * Code to drop INCOMPLETE entries.  Difficult to use as we
2574                 * may also need to change the insertion index.  Code turned
2575                 * off for 6.2, should be revisited later.
2576                 */
2577                if (entry_s->flags & XFS_ATTR_INCOMPLETE) { /* skip partials? */
2578                        memset(xfs_attr3_leaf_name(leaf_s, start_s + i), 0, tmp);
2579                        ichdr_s->usedbytes -= tmp;
2580                        ichdr_s->count -= 1;
2581                        entry_d--;      /* to compensate for ++ in loop hdr */
2582                        desti--;
2583                        if ((start_s + i) < offset)
2584                                result++;       /* insertion index adjustment */
2585                } else {
2586#endif /* GROT */
2587                        ichdr_d->firstused -= tmp;
2588                        /* both on-disk, don't endian flip twice */
2589                        entry_d->hashval = entry_s->hashval;
2590                        entry_d->nameidx = cpu_to_be16(ichdr_d->firstused);
2591                        entry_d->flags = entry_s->flags;
2592                        ASSERT(be16_to_cpu(entry_d->nameidx) + tmp
2593                                                        <= args->geo->blksize);
2594                        memmove(xfs_attr3_leaf_name(leaf_d, desti),
2595                                xfs_attr3_leaf_name(leaf_s, start_s + i), tmp);
2596                        ASSERT(be16_to_cpu(entry_s->nameidx) + tmp
2597                                                        <= args->geo->blksize);
2598                        memset(xfs_attr3_leaf_name(leaf_s, start_s + i), 0, tmp);
2599                        ichdr_s->usedbytes -= tmp;
2600                        ichdr_d->usedbytes += tmp;
2601                        ichdr_s->count -= 1;
2602                        ichdr_d->count += 1;
2603                        tmp = ichdr_d->count * sizeof(xfs_attr_leaf_entry_t)
2604                                        + xfs_attr3_leaf_hdr_size(leaf_d);
2605                        ASSERT(ichdr_d->firstused >= tmp);
2606#ifdef GROT
2607                }
2608#endif /* GROT */
2609        }
2610
2611        /*
2612         * Zero out the entries we just copied.
2613         */
2614        if (start_s == ichdr_s->count) {
2615                tmp = count * sizeof(xfs_attr_leaf_entry_t);
2616                entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s];
2617                ASSERT(((char *)entry_s + tmp) <=
2618                       ((char *)leaf_s + args->geo->blksize));
2619                memset(entry_s, 0, tmp);
2620        } else {
2621                /*
2622                 * Move the remaining entries down to fill the hole,
2623                 * then zero the entries at the top.
2624                 */
2625                tmp  = (ichdr_s->count - count) * sizeof(xfs_attr_leaf_entry_t);
2626                entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s + count];
2627                entry_d = &xfs_attr3_leaf_entryp(leaf_s)[start_s];
2628                memmove(entry_d, entry_s, tmp);
2629
2630                tmp = count * sizeof(xfs_attr_leaf_entry_t);
2631                entry_s = &xfs_attr3_leaf_entryp(leaf_s)[ichdr_s->count];
2632                ASSERT(((char *)entry_s + tmp) <=
2633                       ((char *)leaf_s + args->geo->blksize));
2634                memset(entry_s, 0, tmp);
2635        }
2636
2637        /*
2638         * Fill in the freemap information
2639         */
2640        ichdr_d->freemap[0].base = xfs_attr3_leaf_hdr_size(leaf_d);
2641        ichdr_d->freemap[0].base += ichdr_d->count * sizeof(xfs_attr_leaf_entry_t);
2642        ichdr_d->freemap[0].size = ichdr_d->firstused - ichdr_d->freemap[0].base;
2643        ichdr_d->freemap[1].base = 0;
2644        ichdr_d->freemap[2].base = 0;
2645        ichdr_d->freemap[1].size = 0;
2646        ichdr_d->freemap[2].size = 0;
2647        ichdr_s->holes = 1;     /* leaf may not be compact */
2648}
2649
2650/*
2651 * Pick up the last hashvalue from a leaf block.
2652 */
2653xfs_dahash_t
2654xfs_attr_leaf_lasthash(
2655        struct xfs_buf  *bp,
2656        int             *count)
2657{
2658        struct xfs_attr3_icleaf_hdr ichdr;
2659        struct xfs_attr_leaf_entry *entries;
2660        struct xfs_mount *mp = bp->b_mount;
2661
2662        xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr, bp->b_addr);
2663        entries = xfs_attr3_leaf_entryp(bp->b_addr);
2664        if (count)
2665                *count = ichdr.count;
2666        if (!ichdr.count)
2667                return 0;
2668        return be32_to_cpu(entries[ichdr.count - 1].hashval);
2669}
2670
2671/*
2672 * Calculate the number of bytes used to store the indicated attribute
2673 * (whether local or remote only calculate bytes in this block).
2674 */
2675STATIC int
2676xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index)
2677{
2678        struct xfs_attr_leaf_entry *entries;
2679        xfs_attr_leaf_name_local_t *name_loc;
2680        xfs_attr_leaf_name_remote_t *name_rmt;
2681        int size;
2682
2683        entries = xfs_attr3_leaf_entryp(leaf);
2684        if (entries[index].flags & XFS_ATTR_LOCAL) {
2685                name_loc = xfs_attr3_leaf_name_local(leaf, index);
2686                size = xfs_attr_leaf_entsize_local(name_loc->namelen,
2687                                                   be16_to_cpu(name_loc->valuelen));
2688        } else {
2689                name_rmt = xfs_attr3_leaf_name_remote(leaf, index);
2690                size = xfs_attr_leaf_entsize_remote(name_rmt->namelen);
2691        }
2692        return size;
2693}
2694
2695/*
2696 * Calculate the number of bytes that would be required to store the new
2697 * attribute (whether local or remote only calculate bytes in this block).
2698 * This routine decides as a side effect whether the attribute will be
2699 * a "local" or a "remote" attribute.
2700 */
2701int
2702xfs_attr_leaf_newentsize(
2703        struct xfs_da_args      *args,
2704        int                     *local)
2705{
2706        int                     size;
2707
2708        size = xfs_attr_leaf_entsize_local(args->namelen, args->valuelen);
2709        if (size < xfs_attr_leaf_entsize_local_max(args->geo->blksize)) {
2710                if (local)
2711                        *local = 1;
2712                return size;
2713        }
2714        if (local)
2715                *local = 0;
2716        return xfs_attr_leaf_entsize_remote(args->namelen);
2717}
2718
2719
2720/*========================================================================
2721 * Manage the INCOMPLETE flag in a leaf entry
2722 *========================================================================*/
2723
2724/*
2725 * Clear the INCOMPLETE flag on an entry in a leaf block.
2726 */
2727int
2728xfs_attr3_leaf_clearflag(
2729        struct xfs_da_args      *args)
2730{
2731        struct xfs_attr_leafblock *leaf;
2732        struct xfs_attr_leaf_entry *entry;
2733        struct xfs_attr_leaf_name_remote *name_rmt;
2734        struct xfs_buf          *bp;
2735        int                     error;
2736#ifdef DEBUG
2737        struct xfs_attr3_icleaf_hdr ichdr;
2738        xfs_attr_leaf_name_local_t *name_loc;
2739        int namelen;
2740        char *name;
2741#endif /* DEBUG */
2742
2743        trace_xfs_attr_leaf_clearflag(args);
2744        /*
2745         * Set up the operation.
2746         */
2747        error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, &bp);
2748        if (error)
2749                return error;
2750
2751        leaf = bp->b_addr;
2752        entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
2753        ASSERT(entry->flags & XFS_ATTR_INCOMPLETE);
2754
2755#ifdef DEBUG
2756        xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2757        ASSERT(args->index < ichdr.count);
2758        ASSERT(args->index >= 0);
2759
2760        if (entry->flags & XFS_ATTR_LOCAL) {
2761                name_loc = xfs_attr3_leaf_name_local(leaf, args->index);
2762                namelen = name_loc->namelen;
2763                name = (char *)name_loc->nameval;
2764        } else {
2765                name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
2766                namelen = name_rmt->namelen;
2767                name = (char *)name_rmt->name;
2768        }
2769        ASSERT(be32_to_cpu(entry->hashval) == args->hashval);
2770        ASSERT(namelen == args->namelen);
2771        ASSERT(memcmp(name, args->name, namelen) == 0);
2772#endif /* DEBUG */
2773
2774        entry->flags &= ~XFS_ATTR_INCOMPLETE;
2775        xfs_trans_log_buf(args->trans, bp,
2776                         XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry)));
2777
2778        if (args->rmtblkno) {
2779                ASSERT((entry->flags & XFS_ATTR_LOCAL) == 0);
2780                name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
2781                name_rmt->valueblk = cpu_to_be32(args->rmtblkno);
2782                name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen);
2783                xfs_trans_log_buf(args->trans, bp,
2784                         XFS_DA_LOGRANGE(leaf, name_rmt, sizeof(*name_rmt)));
2785        }
2786
2787        return 0;
2788}
2789
2790/*
2791 * Set the INCOMPLETE flag on an entry in a leaf block.
2792 */
2793int
2794xfs_attr3_leaf_setflag(
2795        struct xfs_da_args      *args)
2796{
2797        struct xfs_attr_leafblock *leaf;
2798        struct xfs_attr_leaf_entry *entry;
2799        struct xfs_attr_leaf_name_remote *name_rmt;
2800        struct xfs_buf          *bp;
2801        int error;
2802#ifdef DEBUG
2803        struct xfs_attr3_icleaf_hdr ichdr;
2804#endif
2805
2806        trace_xfs_attr_leaf_setflag(args);
2807
2808        /*
2809         * Set up the operation.
2810         */
2811        error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, &bp);
2812        if (error)
2813                return error;
2814
2815        leaf = bp->b_addr;
2816#ifdef DEBUG
2817        xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2818        ASSERT(args->index < ichdr.count);
2819        ASSERT(args->index >= 0);
2820#endif
2821        entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
2822
2823        ASSERT((entry->flags & XFS_ATTR_INCOMPLETE) == 0);
2824        entry->flags |= XFS_ATTR_INCOMPLETE;
2825        xfs_trans_log_buf(args->trans, bp,
2826                        XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry)));
2827        if ((entry->flags & XFS_ATTR_LOCAL) == 0) {
2828                name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
2829                name_rmt->valueblk = 0;
2830                name_rmt->valuelen = 0;
2831                xfs_trans_log_buf(args->trans, bp,
2832                         XFS_DA_LOGRANGE(leaf, name_rmt, sizeof(*name_rmt)));
2833        }
2834
2835        return 0;
2836}
2837
2838/*
2839 * In a single transaction, clear the INCOMPLETE flag on the leaf entry
2840 * given by args->blkno/index and set the INCOMPLETE flag on the leaf
2841 * entry given by args->blkno2/index2.
2842 *
2843 * Note that they could be in different blocks, or in the same block.
2844 */
2845int
2846xfs_attr3_leaf_flipflags(
2847        struct xfs_da_args      *args)
2848{
2849        struct xfs_attr_leafblock *leaf1;
2850        struct xfs_attr_leafblock *leaf2;
2851        struct xfs_attr_leaf_entry *entry1;
2852        struct xfs_attr_leaf_entry *entry2;
2853        struct xfs_attr_leaf_name_remote *name_rmt;
2854        struct xfs_buf          *bp1;
2855        struct xfs_buf          *bp2;
2856        int error;
2857#ifdef DEBUG
2858        struct xfs_attr3_icleaf_hdr ichdr1;
2859        struct xfs_attr3_icleaf_hdr ichdr2;
2860        xfs_attr_leaf_name_local_t *name_loc;
2861        int namelen1, namelen2;
2862        char *name1, *name2;
2863#endif /* DEBUG */
2864
2865        trace_xfs_attr_leaf_flipflags(args);
2866
2867        /*
2868         * Read the block containing the "old" attr
2869         */
2870        error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, &bp1);
2871        if (error)
2872                return error;
2873
2874        /*
2875         * Read the block containing the "new" attr, if it is different
2876         */
2877        if (args->blkno2 != args->blkno) {
2878                error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno2,
2879                                           &bp2);
2880                if (error)
2881                        return error;
2882        } else {
2883                bp2 = bp1;
2884        }
2885
2886        leaf1 = bp1->b_addr;
2887        entry1 = &xfs_attr3_leaf_entryp(leaf1)[args->index];
2888
2889        leaf2 = bp2->b_addr;
2890        entry2 = &xfs_attr3_leaf_entryp(leaf2)[args->index2];
2891
2892#ifdef DEBUG
2893        xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr1, leaf1);
2894        ASSERT(args->index < ichdr1.count);
2895        ASSERT(args->index >= 0);
2896
2897        xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr2, leaf2);
2898        ASSERT(args->index2 < ichdr2.count);
2899        ASSERT(args->index2 >= 0);
2900
2901        if (entry1->flags & XFS_ATTR_LOCAL) {
2902                name_loc = xfs_attr3_leaf_name_local(leaf1, args->index);
2903                namelen1 = name_loc->namelen;
2904                name1 = (char *)name_loc->nameval;
2905        } else {
2906                name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index);
2907                namelen1 = name_rmt->namelen;
2908                name1 = (char *)name_rmt->name;
2909        }
2910        if (entry2->flags & XFS_ATTR_LOCAL) {
2911                name_loc = xfs_attr3_leaf_name_local(leaf2, args->index2);
2912                namelen2 = name_loc->namelen;
2913                name2 = (char *)name_loc->nameval;
2914        } else {
2915                name_rmt = xfs_attr3_leaf_name_remote(leaf2, args->index2);
2916                namelen2 = name_rmt->namelen;
2917                name2 = (char *)name_rmt->name;
2918        }
2919        ASSERT(be32_to_cpu(entry1->hashval) == be32_to_cpu(entry2->hashval));
2920        ASSERT(namelen1 == namelen2);
2921        ASSERT(memcmp(name1, name2, namelen1) == 0);
2922#endif /* DEBUG */
2923
2924        ASSERT(entry1->flags & XFS_ATTR_INCOMPLETE);
2925        ASSERT((entry2->flags & XFS_ATTR_INCOMPLETE) == 0);
2926
2927        entry1->flags &= ~XFS_ATTR_INCOMPLETE;
2928        xfs_trans_log_buf(args->trans, bp1,
2929                          XFS_DA_LOGRANGE(leaf1, entry1, sizeof(*entry1)));
2930        if (args->rmtblkno) {
2931                ASSERT((entry1->flags & XFS_ATTR_LOCAL) == 0);
2932                name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index);
2933                name_rmt->valueblk = cpu_to_be32(args->rmtblkno);
2934                name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen);
2935                xfs_trans_log_buf(args->trans, bp1,
2936                         XFS_DA_LOGRANGE(leaf1, name_rmt, sizeof(*name_rmt)));
2937        }
2938
2939        entry2->flags |= XFS_ATTR_INCOMPLETE;
2940        xfs_trans_log_buf(args->trans, bp2,
2941                          XFS_DA_LOGRANGE(leaf2, entry2, sizeof(*entry2)));
2942        if ((entry2->flags & XFS_ATTR_LOCAL) == 0) {
2943                name_rmt = xfs_attr3_leaf_name_remote(leaf2, args->index2);
2944                name_rmt->valueblk = 0;
2945                name_rmt->valuelen = 0;
2946                xfs_trans_log_buf(args->trans, bp2,
2947                         XFS_DA_LOGRANGE(leaf2, name_rmt, sizeof(*name_rmt)));
2948        }
2949
2950        return 0;
2951}
2952