Linux Audio

Check our new training course

Yocto / OpenEmbedded training

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