Linux Audio

Check our new training course

Loading...
v6.9.4
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
   4 * Copyright (c) 2013 Red Hat, Inc.
   5 * All Rights Reserved.
   6 */
   7#include "xfs.h"
   8#include "xfs_fs.h"
   9#include "xfs_shared.h"
  10#include "xfs_format.h"
  11#include "xfs_log_format.h"
  12#include "xfs_trans_resv.h"
  13#include "xfs_bit.h"
  14#include "xfs_mount.h"
  15#include "xfs_inode.h"
  16#include "xfs_dir2.h"
  17#include "xfs_dir2_priv.h"
  18#include "xfs_trans.h"
  19#include "xfs_bmap.h"
  20#include "xfs_attr_leaf.h"
  21#include "xfs_error.h"
  22#include "xfs_trace.h"
  23#include "xfs_buf_item.h"
  24#include "xfs_log.h"
  25#include "xfs_errortag.h"
  26#include "xfs_health.h"
  27
  28/*
  29 * xfs_da_btree.c
  30 *
  31 * Routines to implement directories as Btrees of hashed names.
  32 */
  33
  34/*========================================================================
  35 * Function prototypes for the kernel.
  36 *========================================================================*/
  37
  38/*
  39 * Routines used for growing the Btree.
  40 */
  41STATIC int xfs_da3_root_split(xfs_da_state_t *state,
  42					    xfs_da_state_blk_t *existing_root,
  43					    xfs_da_state_blk_t *new_child);
  44STATIC int xfs_da3_node_split(xfs_da_state_t *state,
  45					    xfs_da_state_blk_t *existing_blk,
  46					    xfs_da_state_blk_t *split_blk,
  47					    xfs_da_state_blk_t *blk_to_add,
  48					    int treelevel,
  49					    int *result);
  50STATIC void xfs_da3_node_rebalance(xfs_da_state_t *state,
  51					 xfs_da_state_blk_t *node_blk_1,
  52					 xfs_da_state_blk_t *node_blk_2);
  53STATIC void xfs_da3_node_add(xfs_da_state_t *state,
  54				   xfs_da_state_blk_t *old_node_blk,
  55				   xfs_da_state_blk_t *new_node_blk);
  56
  57/*
  58 * Routines used for shrinking the Btree.
  59 */
  60STATIC int xfs_da3_root_join(xfs_da_state_t *state,
  61					   xfs_da_state_blk_t *root_blk);
  62STATIC int xfs_da3_node_toosmall(xfs_da_state_t *state, int *retval);
  63STATIC void xfs_da3_node_remove(xfs_da_state_t *state,
  64					      xfs_da_state_blk_t *drop_blk);
  65STATIC void xfs_da3_node_unbalance(xfs_da_state_t *state,
  66					 xfs_da_state_blk_t *src_node_blk,
  67					 xfs_da_state_blk_t *dst_node_blk);
  68
  69/*
  70 * Utility routines.
  71 */
  72STATIC int	xfs_da3_blk_unlink(xfs_da_state_t *state,
  73				  xfs_da_state_blk_t *drop_blk,
  74				  xfs_da_state_blk_t *save_blk);
  75
  76
  77struct kmem_cache	*xfs_da_state_cache;	/* anchor for dir/attr state */
  78
  79/*
  80 * Allocate a dir-state structure.
  81 * We don't put them on the stack since they're large.
  82 */
  83struct xfs_da_state *
  84xfs_da_state_alloc(
  85	struct xfs_da_args	*args)
  86{
  87	struct xfs_da_state	*state;
  88
  89	state = kmem_cache_zalloc(xfs_da_state_cache,
  90			GFP_KERNEL | __GFP_NOLOCKDEP | __GFP_NOFAIL);
  91	state->args = args;
  92	state->mp = args->dp->i_mount;
  93	return state;
  94}
  95
  96/*
  97 * Kill the altpath contents of a da-state structure.
  98 */
  99STATIC void
 100xfs_da_state_kill_altpath(xfs_da_state_t *state)
 101{
 102	int	i;
 103
 104	for (i = 0; i < state->altpath.active; i++)
 105		state->altpath.blk[i].bp = NULL;
 106	state->altpath.active = 0;
 107}
 108
 109/*
 110 * Free a da-state structure.
 111 */
 112void
 113xfs_da_state_free(xfs_da_state_t *state)
 114{
 115	xfs_da_state_kill_altpath(state);
 116#ifdef DEBUG
 117	memset((char *)state, 0, sizeof(*state));
 118#endif /* DEBUG */
 119	kmem_cache_free(xfs_da_state_cache, state);
 120}
 121
 122void
 123xfs_da_state_reset(
 124	struct xfs_da_state	*state,
 125	struct xfs_da_args	*args)
 126{
 127	xfs_da_state_kill_altpath(state);
 128	memset(state, 0, sizeof(struct xfs_da_state));
 129	state->args = args;
 130	state->mp = state->args->dp->i_mount;
 131}
 132
 133static inline int xfs_dabuf_nfsb(struct xfs_mount *mp, int whichfork)
 134{
 135	if (whichfork == XFS_DATA_FORK)
 136		return mp->m_dir_geo->fsbcount;
 137	return mp->m_attr_geo->fsbcount;
 138}
 139
 140void
 141xfs_da3_node_hdr_from_disk(
 142	struct xfs_mount		*mp,
 143	struct xfs_da3_icnode_hdr	*to,
 144	struct xfs_da_intnode		*from)
 145{
 146	if (xfs_has_crc(mp)) {
 147		struct xfs_da3_intnode	*from3 = (struct xfs_da3_intnode *)from;
 148
 149		to->forw = be32_to_cpu(from3->hdr.info.hdr.forw);
 150		to->back = be32_to_cpu(from3->hdr.info.hdr.back);
 151		to->magic = be16_to_cpu(from3->hdr.info.hdr.magic);
 152		to->count = be16_to_cpu(from3->hdr.__count);
 153		to->level = be16_to_cpu(from3->hdr.__level);
 154		to->btree = from3->__btree;
 155		ASSERT(to->magic == XFS_DA3_NODE_MAGIC);
 156	} else {
 157		to->forw = be32_to_cpu(from->hdr.info.forw);
 158		to->back = be32_to_cpu(from->hdr.info.back);
 159		to->magic = be16_to_cpu(from->hdr.info.magic);
 160		to->count = be16_to_cpu(from->hdr.__count);
 161		to->level = be16_to_cpu(from->hdr.__level);
 162		to->btree = from->__btree;
 163		ASSERT(to->magic == XFS_DA_NODE_MAGIC);
 164	}
 165}
 166
 167void
 168xfs_da3_node_hdr_to_disk(
 169	struct xfs_mount		*mp,
 170	struct xfs_da_intnode		*to,
 171	struct xfs_da3_icnode_hdr	*from)
 172{
 173	if (xfs_has_crc(mp)) {
 174		struct xfs_da3_intnode	*to3 = (struct xfs_da3_intnode *)to;
 175
 176		ASSERT(from->magic == XFS_DA3_NODE_MAGIC);
 177		to3->hdr.info.hdr.forw = cpu_to_be32(from->forw);
 178		to3->hdr.info.hdr.back = cpu_to_be32(from->back);
 179		to3->hdr.info.hdr.magic = cpu_to_be16(from->magic);
 180		to3->hdr.__count = cpu_to_be16(from->count);
 181		to3->hdr.__level = cpu_to_be16(from->level);
 182	} else {
 183		ASSERT(from->magic == XFS_DA_NODE_MAGIC);
 184		to->hdr.info.forw = cpu_to_be32(from->forw);
 185		to->hdr.info.back = cpu_to_be32(from->back);
 186		to->hdr.info.magic = cpu_to_be16(from->magic);
 187		to->hdr.__count = cpu_to_be16(from->count);
 188		to->hdr.__level = cpu_to_be16(from->level);
 189	}
 190}
 191
 192/*
 193 * Verify an xfs_da3_blkinfo structure. Note that the da3 fields are only
 194 * accessible on v5 filesystems. This header format is common across da node,
 195 * attr leaf and dir leaf blocks.
 196 */
 197xfs_failaddr_t
 198xfs_da3_blkinfo_verify(
 199	struct xfs_buf		*bp,
 200	struct xfs_da3_blkinfo	*hdr3)
 201{
 202	struct xfs_mount	*mp = bp->b_mount;
 203	struct xfs_da_blkinfo	*hdr = &hdr3->hdr;
 204
 205	if (!xfs_verify_magic16(bp, hdr->magic))
 206		return __this_address;
 207
 208	if (xfs_has_crc(mp)) {
 209		if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_meta_uuid))
 210			return __this_address;
 211		if (be64_to_cpu(hdr3->blkno) != xfs_buf_daddr(bp))
 212			return __this_address;
 213		if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr3->lsn)))
 214			return __this_address;
 215	}
 216
 217	return NULL;
 218}
 219
 220static xfs_failaddr_t
 221xfs_da3_node_verify(
 222	struct xfs_buf		*bp)
 223{
 224	struct xfs_mount	*mp = bp->b_mount;
 225	struct xfs_da_intnode	*hdr = bp->b_addr;
 226	struct xfs_da3_icnode_hdr ichdr;
 227	xfs_failaddr_t		fa;
 228
 229	xfs_da3_node_hdr_from_disk(mp, &ichdr, hdr);
 230
 231	fa = xfs_da3_blkinfo_verify(bp, bp->b_addr);
 232	if (fa)
 233		return fa;
 234
 235	if (ichdr.level == 0)
 236		return __this_address;
 237	if (ichdr.level > XFS_DA_NODE_MAXDEPTH)
 238		return __this_address;
 239	if (ichdr.count == 0)
 240		return __this_address;
 241
 242	/*
 243	 * we don't know if the node is for and attribute or directory tree,
 244	 * so only fail if the count is outside both bounds
 245	 */
 246	if (ichdr.count > mp->m_dir_geo->node_ents &&
 247	    ichdr.count > mp->m_attr_geo->node_ents)
 248		return __this_address;
 249
 250	/* XXX: hash order check? */
 251
 252	return NULL;
 253}
 254
 255static void
 256xfs_da3_node_write_verify(
 257	struct xfs_buf	*bp)
 258{
 259	struct xfs_mount	*mp = bp->b_mount;
 260	struct xfs_buf_log_item	*bip = bp->b_log_item;
 261	struct xfs_da3_node_hdr *hdr3 = bp->b_addr;
 262	xfs_failaddr_t		fa;
 263
 264	fa = xfs_da3_node_verify(bp);
 265	if (fa) {
 266		xfs_verifier_error(bp, -EFSCORRUPTED, fa);
 267		return;
 268	}
 269
 270	if (!xfs_has_crc(mp))
 271		return;
 272
 273	if (bip)
 274		hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn);
 275
 276	xfs_buf_update_cksum(bp, XFS_DA3_NODE_CRC_OFF);
 277}
 278
 279/*
 280 * leaf/node format detection on trees is sketchy, so a node read can be done on
 281 * leaf level blocks when detection identifies the tree as a node format tree
 282 * incorrectly. In this case, we need to swap the verifier to match the correct
 283 * format of the block being read.
 284 */
 285static void
 286xfs_da3_node_read_verify(
 287	struct xfs_buf		*bp)
 288{
 289	struct xfs_da_blkinfo	*info = bp->b_addr;
 290	xfs_failaddr_t		fa;
 291
 292	switch (be16_to_cpu(info->magic)) {
 293		case XFS_DA3_NODE_MAGIC:
 294			if (!xfs_buf_verify_cksum(bp, XFS_DA3_NODE_CRC_OFF)) {
 295				xfs_verifier_error(bp, -EFSBADCRC,
 296						__this_address);
 297				break;
 298			}
 299			fallthrough;
 300		case XFS_DA_NODE_MAGIC:
 301			fa = xfs_da3_node_verify(bp);
 302			if (fa)
 303				xfs_verifier_error(bp, -EFSCORRUPTED, fa);
 304			return;
 305		case XFS_ATTR_LEAF_MAGIC:
 306		case XFS_ATTR3_LEAF_MAGIC:
 307			bp->b_ops = &xfs_attr3_leaf_buf_ops;
 308			bp->b_ops->verify_read(bp);
 309			return;
 310		case XFS_DIR2_LEAFN_MAGIC:
 311		case XFS_DIR3_LEAFN_MAGIC:
 312			bp->b_ops = &xfs_dir3_leafn_buf_ops;
 313			bp->b_ops->verify_read(bp);
 314			return;
 315		default:
 316			xfs_verifier_error(bp, -EFSCORRUPTED, __this_address);
 317			break;
 318	}
 319}
 320
 321/* Verify the structure of a da3 block. */
 322static xfs_failaddr_t
 323xfs_da3_node_verify_struct(
 324	struct xfs_buf		*bp)
 325{
 326	struct xfs_da_blkinfo	*info = bp->b_addr;
 327
 328	switch (be16_to_cpu(info->magic)) {
 329	case XFS_DA3_NODE_MAGIC:
 330	case XFS_DA_NODE_MAGIC:
 331		return xfs_da3_node_verify(bp);
 332	case XFS_ATTR_LEAF_MAGIC:
 333	case XFS_ATTR3_LEAF_MAGIC:
 334		bp->b_ops = &xfs_attr3_leaf_buf_ops;
 335		return bp->b_ops->verify_struct(bp);
 336	case XFS_DIR2_LEAFN_MAGIC:
 337	case XFS_DIR3_LEAFN_MAGIC:
 338		bp->b_ops = &xfs_dir3_leafn_buf_ops;
 339		return bp->b_ops->verify_struct(bp);
 340	default:
 341		return __this_address;
 342	}
 343}
 344
 345const struct xfs_buf_ops xfs_da3_node_buf_ops = {
 346	.name = "xfs_da3_node",
 347	.magic16 = { cpu_to_be16(XFS_DA_NODE_MAGIC),
 348		     cpu_to_be16(XFS_DA3_NODE_MAGIC) },
 349	.verify_read = xfs_da3_node_read_verify,
 350	.verify_write = xfs_da3_node_write_verify,
 351	.verify_struct = xfs_da3_node_verify_struct,
 352};
 353
 354static int
 355xfs_da3_node_set_type(
 356	struct xfs_trans	*tp,
 357	struct xfs_inode	*dp,
 358	int			whichfork,
 359	struct xfs_buf		*bp)
 360{
 361	struct xfs_da_blkinfo	*info = bp->b_addr;
 362
 363	switch (be16_to_cpu(info->magic)) {
 364	case XFS_DA_NODE_MAGIC:
 365	case XFS_DA3_NODE_MAGIC:
 366		xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DA_NODE_BUF);
 367		return 0;
 368	case XFS_ATTR_LEAF_MAGIC:
 369	case XFS_ATTR3_LEAF_MAGIC:
 370		xfs_trans_buf_set_type(tp, bp, XFS_BLFT_ATTR_LEAF_BUF);
 371		return 0;
 372	case XFS_DIR2_LEAFN_MAGIC:
 373	case XFS_DIR3_LEAFN_MAGIC:
 374		xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAFN_BUF);
 375		return 0;
 376	default:
 377		XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, tp->t_mountp,
 378				info, sizeof(*info));
 379		xfs_trans_brelse(tp, bp);
 380		xfs_dirattr_mark_sick(dp, whichfork);
 381		return -EFSCORRUPTED;
 382	}
 383}
 384
 385int
 386xfs_da3_node_read(
 387	struct xfs_trans	*tp,
 388	struct xfs_inode	*dp,
 389	xfs_dablk_t		bno,
 390	struct xfs_buf		**bpp,
 391	int			whichfork)
 392{
 393	int			error;
 394
 395	error = xfs_da_read_buf(tp, dp, bno, 0, bpp, whichfork,
 396			&xfs_da3_node_buf_ops);
 397	if (error || !*bpp || !tp)
 398		return error;
 399	return xfs_da3_node_set_type(tp, dp, whichfork, *bpp);
 400}
 401
 402int
 403xfs_da3_node_read_mapped(
 404	struct xfs_trans	*tp,
 405	struct xfs_inode	*dp,
 406	xfs_daddr_t		mappedbno,
 407	struct xfs_buf		**bpp,
 408	int			whichfork)
 409{
 410	struct xfs_mount	*mp = dp->i_mount;
 411	int			error;
 412
 413	error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, mappedbno,
 414			XFS_FSB_TO_BB(mp, xfs_dabuf_nfsb(mp, whichfork)), 0,
 415			bpp, &xfs_da3_node_buf_ops);
 416	if (xfs_metadata_is_sick(error))
 417		xfs_dirattr_mark_sick(dp, whichfork);
 418	if (error || !*bpp)
 419		return error;
 420
 421	if (whichfork == XFS_ATTR_FORK)
 422		xfs_buf_set_ref(*bpp, XFS_ATTR_BTREE_REF);
 423	else
 424		xfs_buf_set_ref(*bpp, XFS_DIR_BTREE_REF);
 425
 426	if (!tp)
 427		return 0;
 428	return xfs_da3_node_set_type(tp, dp, whichfork, *bpp);
 429}
 430
 431/*
 432 * Copy src directory/attr leaf/node buffer to the dst.
 433 * For v5 file systems make sure the right blkno is stamped in.
 434 */
 435void
 436xfs_da_buf_copy(
 437	struct xfs_buf *dst,
 438	struct xfs_buf *src,
 439	size_t size)
 440{
 441	struct xfs_da3_blkinfo *da3 = dst->b_addr;
 442
 443	memcpy(dst->b_addr, src->b_addr, size);
 444	dst->b_ops = src->b_ops;
 445	xfs_trans_buf_copy_type(dst, src);
 446	if (xfs_has_crc(dst->b_mount))
 447		da3->blkno = cpu_to_be64(xfs_buf_daddr(dst));
 448}
 449
 450/*========================================================================
 451 * Routines used for growing the Btree.
 452 *========================================================================*/
 453
 454/*
 455 * Create the initial contents of an intermediate node.
 456 */
 457int
 458xfs_da3_node_create(
 459	struct xfs_da_args	*args,
 460	xfs_dablk_t		blkno,
 461	int			level,
 462	struct xfs_buf		**bpp,
 463	int			whichfork)
 464{
 465	struct xfs_da_intnode	*node;
 466	struct xfs_trans	*tp = args->trans;
 467	struct xfs_mount	*mp = tp->t_mountp;
 468	struct xfs_da3_icnode_hdr ichdr = {0};
 469	struct xfs_buf		*bp;
 470	int			error;
 471	struct xfs_inode	*dp = args->dp;
 472
 473	trace_xfs_da_node_create(args);
 474	ASSERT(level <= XFS_DA_NODE_MAXDEPTH);
 475
 476	error = xfs_da_get_buf(tp, dp, blkno, &bp, whichfork);
 477	if (error)
 478		return error;
 479	bp->b_ops = &xfs_da3_node_buf_ops;
 480	xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DA_NODE_BUF);
 481	node = bp->b_addr;
 482
 483	if (xfs_has_crc(mp)) {
 484		struct xfs_da3_node_hdr *hdr3 = bp->b_addr;
 485
 486		memset(hdr3, 0, sizeof(struct xfs_da3_node_hdr));
 487		ichdr.magic = XFS_DA3_NODE_MAGIC;
 488		hdr3->info.blkno = cpu_to_be64(xfs_buf_daddr(bp));
 489		hdr3->info.owner = cpu_to_be64(args->dp->i_ino);
 490		uuid_copy(&hdr3->info.uuid, &mp->m_sb.sb_meta_uuid);
 491	} else {
 492		ichdr.magic = XFS_DA_NODE_MAGIC;
 493	}
 494	ichdr.level = level;
 495
 496	xfs_da3_node_hdr_to_disk(dp->i_mount, node, &ichdr);
 497	xfs_trans_log_buf(tp, bp,
 498		XFS_DA_LOGRANGE(node, &node->hdr, args->geo->node_hdr_size));
 499
 500	*bpp = bp;
 501	return 0;
 502}
 503
 504/*
 505 * Split a leaf node, rebalance, then possibly split
 506 * intermediate nodes, rebalance, etc.
 507 */
 508int							/* error */
 509xfs_da3_split(
 510	struct xfs_da_state	*state)
 511{
 512	struct xfs_da_state_blk	*oldblk;
 513	struct xfs_da_state_blk	*newblk;
 514	struct xfs_da_state_blk	*addblk;
 515	struct xfs_da_intnode	*node;
 516	int			max;
 517	int			action = 0;
 518	int			error;
 519	int			i;
 520
 521	trace_xfs_da_split(state->args);
 522
 523	if (XFS_TEST_ERROR(false, state->mp, XFS_ERRTAG_DA_LEAF_SPLIT))
 524		return -EIO;
 525
 526	/*
 527	 * Walk back up the tree splitting/inserting/adjusting as necessary.
 528	 * If we need to insert and there isn't room, split the node, then
 529	 * decide which fragment to insert the new block from below into.
 530	 * Note that we may split the root this way, but we need more fixup.
 531	 */
 532	max = state->path.active - 1;
 533	ASSERT((max >= 0) && (max < XFS_DA_NODE_MAXDEPTH));
 534	ASSERT(state->path.blk[max].magic == XFS_ATTR_LEAF_MAGIC ||
 535	       state->path.blk[max].magic == XFS_DIR2_LEAFN_MAGIC);
 536
 537	addblk = &state->path.blk[max];		/* initial dummy value */
 538	for (i = max; (i >= 0) && addblk; state->path.active--, i--) {
 539		oldblk = &state->path.blk[i];
 540		newblk = &state->altpath.blk[i];
 541
 542		/*
 543		 * If a leaf node then
 544		 *     Allocate a new leaf node, then rebalance across them.
 545		 * else if an intermediate node then
 546		 *     We split on the last layer, must we split the node?
 547		 */
 548		switch (oldblk->magic) {
 549		case XFS_ATTR_LEAF_MAGIC:
 550			error = xfs_attr3_leaf_split(state, oldblk, newblk);
 551			if ((error != 0) && (error != -ENOSPC)) {
 552				return error;	/* GROT: attr is inconsistent */
 553			}
 554			if (!error) {
 555				addblk = newblk;
 556				break;
 557			}
 558			/*
 559			 * Entry wouldn't fit, split the leaf again. The new
 560			 * extrablk will be consumed by xfs_da3_node_split if
 561			 * the node is split.
 562			 */
 563			state->extravalid = 1;
 564			if (state->inleaf) {
 565				state->extraafter = 0;	/* before newblk */
 566				trace_xfs_attr_leaf_split_before(state->args);
 567				error = xfs_attr3_leaf_split(state, oldblk,
 568							    &state->extrablk);
 569			} else {
 570				state->extraafter = 1;	/* after newblk */
 571				trace_xfs_attr_leaf_split_after(state->args);
 572				error = xfs_attr3_leaf_split(state, newblk,
 573							    &state->extrablk);
 574			}
 575			if (error)
 576				return error;	/* GROT: attr inconsistent */
 577			addblk = newblk;
 578			break;
 579		case XFS_DIR2_LEAFN_MAGIC:
 580			error = xfs_dir2_leafn_split(state, oldblk, newblk);
 581			if (error)
 582				return error;
 583			addblk = newblk;
 584			break;
 585		case XFS_DA_NODE_MAGIC:
 586			error = xfs_da3_node_split(state, oldblk, newblk, addblk,
 587							 max - i, &action);
 588			addblk->bp = NULL;
 589			if (error)
 590				return error;	/* GROT: dir is inconsistent */
 591			/*
 592			 * Record the newly split block for the next time thru?
 593			 */
 594			if (action)
 595				addblk = newblk;
 596			else
 597				addblk = NULL;
 598			break;
 599		}
 600
 601		/*
 602		 * Update the btree to show the new hashval for this child.
 603		 */
 604		xfs_da3_fixhashpath(state, &state->path);
 605	}
 606	if (!addblk)
 607		return 0;
 608
 609	/*
 610	 * xfs_da3_node_split() should have consumed any extra blocks we added
 611	 * during a double leaf split in the attr fork. This is guaranteed as
 612	 * we can't be here if the attr fork only has a single leaf block.
 613	 */
 614	ASSERT(state->extravalid == 0 ||
 615	       state->path.blk[max].magic == XFS_DIR2_LEAFN_MAGIC);
 616
 617	/*
 618	 * Split the root node.
 619	 */
 620	ASSERT(state->path.active == 0);
 621	oldblk = &state->path.blk[0];
 622	error = xfs_da3_root_split(state, oldblk, addblk);
 623	if (error)
 624		goto out;
 625
 626	/*
 627	 * Update pointers to the node which used to be block 0 and just got
 628	 * bumped because of the addition of a new root node.  Note that the
 629	 * original block 0 could be at any position in the list of blocks in
 630	 * the tree.
 631	 *
 632	 * Note: the magic numbers and sibling pointers are in the same physical
 633	 * place for both v2 and v3 headers (by design). Hence it doesn't matter
 634	 * which version of the xfs_da_intnode structure we use here as the
 635	 * result will be the same using either structure.
 636	 */
 637	node = oldblk->bp->b_addr;
 638	if (node->hdr.info.forw) {
 639		if (be32_to_cpu(node->hdr.info.forw) != addblk->blkno) {
 640			xfs_buf_mark_corrupt(oldblk->bp);
 641			xfs_da_mark_sick(state->args);
 642			error = -EFSCORRUPTED;
 643			goto out;
 644		}
 645		node = addblk->bp->b_addr;
 646		node->hdr.info.back = cpu_to_be32(oldblk->blkno);
 647		xfs_trans_log_buf(state->args->trans, addblk->bp,
 648				  XFS_DA_LOGRANGE(node, &node->hdr.info,
 649				  sizeof(node->hdr.info)));
 650	}
 651	node = oldblk->bp->b_addr;
 652	if (node->hdr.info.back) {
 653		if (be32_to_cpu(node->hdr.info.back) != addblk->blkno) {
 654			xfs_buf_mark_corrupt(oldblk->bp);
 655			xfs_da_mark_sick(state->args);
 656			error = -EFSCORRUPTED;
 657			goto out;
 658		}
 659		node = addblk->bp->b_addr;
 660		node->hdr.info.forw = cpu_to_be32(oldblk->blkno);
 661		xfs_trans_log_buf(state->args->trans, addblk->bp,
 662				  XFS_DA_LOGRANGE(node, &node->hdr.info,
 663				  sizeof(node->hdr.info)));
 664	}
 665out:
 666	addblk->bp = NULL;
 667	return error;
 668}
 669
 670/*
 671 * Split the root.  We have to create a new root and point to the two
 672 * parts (the split old root) that we just created.  Copy block zero to
 673 * the EOF, extending the inode in process.
 674 */
 675STATIC int						/* error */
 676xfs_da3_root_split(
 677	struct xfs_da_state	*state,
 678	struct xfs_da_state_blk	*blk1,
 679	struct xfs_da_state_blk	*blk2)
 680{
 681	struct xfs_da_intnode	*node;
 682	struct xfs_da_intnode	*oldroot;
 683	struct xfs_da_node_entry *btree;
 684	struct xfs_da3_icnode_hdr nodehdr;
 685	struct xfs_da_args	*args;
 686	struct xfs_buf		*bp;
 687	struct xfs_inode	*dp;
 688	struct xfs_trans	*tp;
 689	struct xfs_dir2_leaf	*leaf;
 690	xfs_dablk_t		blkno;
 691	int			level;
 692	int			error;
 693	int			size;
 694
 695	trace_xfs_da_root_split(state->args);
 696
 697	/*
 698	 * Copy the existing (incorrect) block from the root node position
 699	 * to a free space somewhere.
 700	 */
 701	args = state->args;
 702	error = xfs_da_grow_inode(args, &blkno);
 703	if (error)
 704		return error;
 705
 706	dp = args->dp;
 707	tp = args->trans;
 708	error = xfs_da_get_buf(tp, dp, blkno, &bp, args->whichfork);
 709	if (error)
 710		return error;
 711	node = bp->b_addr;
 712	oldroot = blk1->bp->b_addr;
 713	if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC) ||
 714	    oldroot->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) {
 715		struct xfs_da3_icnode_hdr icnodehdr;
 716
 717		xfs_da3_node_hdr_from_disk(dp->i_mount, &icnodehdr, oldroot);
 718		btree = icnodehdr.btree;
 719		size = (int)((char *)&btree[icnodehdr.count] - (char *)oldroot);
 720		level = icnodehdr.level;
 
 
 
 
 
 
 721	} else {
 722		struct xfs_dir3_icleaf_hdr leafhdr;
 723
 724		leaf = (xfs_dir2_leaf_t *)oldroot;
 725		xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr, leaf);
 726
 727		ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC ||
 728		       leafhdr.magic == XFS_DIR3_LEAFN_MAGIC);
 729		size = (int)((char *)&leafhdr.ents[leafhdr.count] -
 730			(char *)leaf);
 731		level = 0;
 
 
 
 
 
 
 732	}
 733
 734	/*
 735	 * Copy old root to new buffer and log it.
 
 
 
 736	 */
 737	xfs_da_buf_copy(bp, blk1->bp, size);
 
 
 
 
 
 
 738	xfs_trans_log_buf(tp, bp, 0, size - 1);
 739
 740	/*
 741	 * Update blk1 to point to new buffer.
 742	 */
 743	blk1->bp = bp;
 744	blk1->blkno = blkno;
 745
 746	/*
 747	 * Set up the new root node.
 748	 */
 749	error = xfs_da3_node_create(args,
 750		(args->whichfork == XFS_DATA_FORK) ? args->geo->leafblk : 0,
 751		level + 1, &bp, args->whichfork);
 752	if (error)
 753		return error;
 754
 755	node = bp->b_addr;
 756	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, node);
 757	btree = nodehdr.btree;
 758	btree[0].hashval = cpu_to_be32(blk1->hashval);
 759	btree[0].before = cpu_to_be32(blk1->blkno);
 760	btree[1].hashval = cpu_to_be32(blk2->hashval);
 761	btree[1].before = cpu_to_be32(blk2->blkno);
 762	nodehdr.count = 2;
 763	xfs_da3_node_hdr_to_disk(dp->i_mount, node, &nodehdr);
 764
 765#ifdef DEBUG
 766	if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
 767	    oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) {
 768		ASSERT(blk1->blkno >= args->geo->leafblk &&
 769		       blk1->blkno < args->geo->freeblk);
 770		ASSERT(blk2->blkno >= args->geo->leafblk &&
 771		       blk2->blkno < args->geo->freeblk);
 772	}
 773#endif
 774
 775	/* Header is already logged by xfs_da_node_create */
 776	xfs_trans_log_buf(tp, bp,
 777		XFS_DA_LOGRANGE(node, btree, sizeof(xfs_da_node_entry_t) * 2));
 778
 779	return 0;
 780}
 781
 782/*
 783 * Split the node, rebalance, then add the new entry.
 784 */
 785STATIC int						/* error */
 786xfs_da3_node_split(
 787	struct xfs_da_state	*state,
 788	struct xfs_da_state_blk	*oldblk,
 789	struct xfs_da_state_blk	*newblk,
 790	struct xfs_da_state_blk	*addblk,
 791	int			treelevel,
 792	int			*result)
 793{
 794	struct xfs_da_intnode	*node;
 795	struct xfs_da3_icnode_hdr nodehdr;
 796	xfs_dablk_t		blkno;
 797	int			newcount;
 798	int			error;
 799	int			useextra;
 800	struct xfs_inode	*dp = state->args->dp;
 801
 802	trace_xfs_da_node_split(state->args);
 803
 804	node = oldblk->bp->b_addr;
 805	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, node);
 806
 807	/*
 808	 * With V2 dirs the extra block is data or freespace.
 809	 */
 810	useextra = state->extravalid && state->args->whichfork == XFS_ATTR_FORK;
 811	newcount = 1 + useextra;
 812	/*
 813	 * Do we have to split the node?
 814	 */
 815	if (nodehdr.count + newcount > state->args->geo->node_ents) {
 816		/*
 817		 * Allocate a new node, add to the doubly linked chain of
 818		 * nodes, then move some of our excess entries into it.
 819		 */
 820		error = xfs_da_grow_inode(state->args, &blkno);
 821		if (error)
 822			return error;	/* GROT: dir is inconsistent */
 823
 824		error = xfs_da3_node_create(state->args, blkno, treelevel,
 825					   &newblk->bp, state->args->whichfork);
 826		if (error)
 827			return error;	/* GROT: dir is inconsistent */
 828		newblk->blkno = blkno;
 829		newblk->magic = XFS_DA_NODE_MAGIC;
 830		xfs_da3_node_rebalance(state, oldblk, newblk);
 831		error = xfs_da3_blk_link(state, oldblk, newblk);
 832		if (error)
 833			return error;
 834		*result = 1;
 835	} else {
 836		*result = 0;
 837	}
 838
 839	/*
 840	 * Insert the new entry(s) into the correct block
 841	 * (updating last hashval in the process).
 842	 *
 843	 * xfs_da3_node_add() inserts BEFORE the given index,
 844	 * and as a result of using node_lookup_int() we always
 845	 * point to a valid entry (not after one), but a split
 846	 * operation always results in a new block whose hashvals
 847	 * FOLLOW the current block.
 848	 *
 849	 * If we had double-split op below us, then add the extra block too.
 850	 */
 851	node = oldblk->bp->b_addr;
 852	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, node);
 853	if (oldblk->index <= nodehdr.count) {
 854		oldblk->index++;
 855		xfs_da3_node_add(state, oldblk, addblk);
 856		if (useextra) {
 857			if (state->extraafter)
 858				oldblk->index++;
 859			xfs_da3_node_add(state, oldblk, &state->extrablk);
 860			state->extravalid = 0;
 861		}
 862	} else {
 863		newblk->index++;
 864		xfs_da3_node_add(state, newblk, addblk);
 865		if (useextra) {
 866			if (state->extraafter)
 867				newblk->index++;
 868			xfs_da3_node_add(state, newblk, &state->extrablk);
 869			state->extravalid = 0;
 870		}
 871	}
 872
 873	return 0;
 874}
 875
 876/*
 877 * Balance the btree elements between two intermediate nodes,
 878 * usually one full and one empty.
 879 *
 880 * NOTE: if blk2 is empty, then it will get the upper half of blk1.
 881 */
 882STATIC void
 883xfs_da3_node_rebalance(
 884	struct xfs_da_state	*state,
 885	struct xfs_da_state_blk	*blk1,
 886	struct xfs_da_state_blk	*blk2)
 887{
 888	struct xfs_da_intnode	*node1;
 889	struct xfs_da_intnode	*node2;
 
 890	struct xfs_da_node_entry *btree1;
 891	struct xfs_da_node_entry *btree2;
 892	struct xfs_da_node_entry *btree_s;
 893	struct xfs_da_node_entry *btree_d;
 894	struct xfs_da3_icnode_hdr nodehdr1;
 895	struct xfs_da3_icnode_hdr nodehdr2;
 896	struct xfs_trans	*tp;
 897	int			count;
 898	int			tmp;
 899	int			swap = 0;
 900	struct xfs_inode	*dp = state->args->dp;
 901
 902	trace_xfs_da_node_rebalance(state->args);
 903
 904	node1 = blk1->bp->b_addr;
 905	node2 = blk2->bp->b_addr;
 906	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr1, node1);
 907	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr2, node2);
 908	btree1 = nodehdr1.btree;
 909	btree2 = nodehdr2.btree;
 910
 911	/*
 912	 * Figure out how many entries need to move, and in which direction.
 913	 * Swap the nodes around if that makes it simpler.
 914	 */
 915	if (nodehdr1.count > 0 && nodehdr2.count > 0 &&
 916	    ((be32_to_cpu(btree2[0].hashval) < be32_to_cpu(btree1[0].hashval)) ||
 917	     (be32_to_cpu(btree2[nodehdr2.count - 1].hashval) <
 918			be32_to_cpu(btree1[nodehdr1.count - 1].hashval)))) {
 919		swap(node1, node2);
 
 
 920		xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr1, node1);
 921		xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr2, node2);
 922		btree1 = nodehdr1.btree;
 923		btree2 = nodehdr2.btree;
 924		swap = 1;
 925	}
 926
 927	count = (nodehdr1.count - nodehdr2.count) / 2;
 928	if (count == 0)
 929		return;
 930	tp = state->args->trans;
 931	/*
 932	 * Two cases: high-to-low and low-to-high.
 933	 */
 934	if (count > 0) {
 935		/*
 936		 * Move elements in node2 up to make a hole.
 937		 */
 938		tmp = nodehdr2.count;
 939		if (tmp > 0) {
 940			tmp *= (uint)sizeof(xfs_da_node_entry_t);
 941			btree_s = &btree2[0];
 942			btree_d = &btree2[count];
 943			memmove(btree_d, btree_s, tmp);
 944		}
 945
 946		/*
 947		 * Move the req'd B-tree elements from high in node1 to
 948		 * low in node2.
 949		 */
 950		nodehdr2.count += count;
 951		tmp = count * (uint)sizeof(xfs_da_node_entry_t);
 952		btree_s = &btree1[nodehdr1.count - count];
 953		btree_d = &btree2[0];
 954		memcpy(btree_d, btree_s, tmp);
 955		nodehdr1.count -= count;
 956	} else {
 957		/*
 958		 * Move the req'd B-tree elements from low in node2 to
 959		 * high in node1.
 960		 */
 961		count = -count;
 962		tmp = count * (uint)sizeof(xfs_da_node_entry_t);
 963		btree_s = &btree2[0];
 964		btree_d = &btree1[nodehdr1.count];
 965		memcpy(btree_d, btree_s, tmp);
 966		nodehdr1.count += count;
 967
 968		xfs_trans_log_buf(tp, blk1->bp,
 969			XFS_DA_LOGRANGE(node1, btree_d, tmp));
 970
 971		/*
 972		 * Move elements in node2 down to fill the hole.
 973		 */
 974		tmp  = nodehdr2.count - count;
 975		tmp *= (uint)sizeof(xfs_da_node_entry_t);
 976		btree_s = &btree2[count];
 977		btree_d = &btree2[0];
 978		memmove(btree_d, btree_s, tmp);
 979		nodehdr2.count -= count;
 980	}
 981
 982	/*
 983	 * Log header of node 1 and all current bits of node 2.
 984	 */
 985	xfs_da3_node_hdr_to_disk(dp->i_mount, node1, &nodehdr1);
 986	xfs_trans_log_buf(tp, blk1->bp,
 987		XFS_DA_LOGRANGE(node1, &node1->hdr,
 988				state->args->geo->node_hdr_size));
 989
 990	xfs_da3_node_hdr_to_disk(dp->i_mount, node2, &nodehdr2);
 991	xfs_trans_log_buf(tp, blk2->bp,
 992		XFS_DA_LOGRANGE(node2, &node2->hdr,
 993				state->args->geo->node_hdr_size +
 994				(sizeof(btree2[0]) * nodehdr2.count)));
 995
 996	/*
 997	 * Record the last hashval from each block for upward propagation.
 998	 * (note: don't use the swapped node pointers)
 999	 */
1000	if (swap) {
1001		node1 = blk1->bp->b_addr;
1002		node2 = blk2->bp->b_addr;
1003		xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr1, node1);
1004		xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr2, node2);
1005		btree1 = nodehdr1.btree;
1006		btree2 = nodehdr2.btree;
1007	}
1008	blk1->hashval = be32_to_cpu(btree1[nodehdr1.count - 1].hashval);
1009	blk2->hashval = be32_to_cpu(btree2[nodehdr2.count - 1].hashval);
1010
1011	/*
1012	 * Adjust the expected index for insertion.
1013	 */
1014	if (blk1->index >= nodehdr1.count) {
1015		blk2->index = blk1->index - nodehdr1.count;
1016		blk1->index = nodehdr1.count + 1;	/* make it invalid */
1017	}
1018}
1019
1020/*
1021 * Add a new entry to an intermediate node.
1022 */
1023STATIC void
1024xfs_da3_node_add(
1025	struct xfs_da_state	*state,
1026	struct xfs_da_state_blk	*oldblk,
1027	struct xfs_da_state_blk	*newblk)
1028{
1029	struct xfs_da_intnode	*node;
1030	struct xfs_da3_icnode_hdr nodehdr;
1031	struct xfs_da_node_entry *btree;
1032	int			tmp;
1033	struct xfs_inode	*dp = state->args->dp;
1034
1035	trace_xfs_da_node_add(state->args);
1036
1037	node = oldblk->bp->b_addr;
1038	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, node);
1039	btree = nodehdr.btree;
1040
1041	ASSERT(oldblk->index >= 0 && oldblk->index <= nodehdr.count);
1042	ASSERT(newblk->blkno != 0);
1043	if (state->args->whichfork == XFS_DATA_FORK)
1044		ASSERT(newblk->blkno >= state->args->geo->leafblk &&
1045		       newblk->blkno < state->args->geo->freeblk);
1046
1047	/*
1048	 * We may need to make some room before we insert the new node.
1049	 */
1050	tmp = 0;
1051	if (oldblk->index < nodehdr.count) {
1052		tmp = (nodehdr.count - oldblk->index) * (uint)sizeof(*btree);
1053		memmove(&btree[oldblk->index + 1], &btree[oldblk->index], tmp);
1054	}
1055	btree[oldblk->index].hashval = cpu_to_be32(newblk->hashval);
1056	btree[oldblk->index].before = cpu_to_be32(newblk->blkno);
1057	xfs_trans_log_buf(state->args->trans, oldblk->bp,
1058		XFS_DA_LOGRANGE(node, &btree[oldblk->index],
1059				tmp + sizeof(*btree)));
1060
1061	nodehdr.count += 1;
1062	xfs_da3_node_hdr_to_disk(dp->i_mount, node, &nodehdr);
1063	xfs_trans_log_buf(state->args->trans, oldblk->bp,
1064		XFS_DA_LOGRANGE(node, &node->hdr,
1065				state->args->geo->node_hdr_size));
1066
1067	/*
1068	 * Copy the last hash value from the oldblk to propagate upwards.
1069	 */
1070	oldblk->hashval = be32_to_cpu(btree[nodehdr.count - 1].hashval);
1071}
1072
1073/*========================================================================
1074 * Routines used for shrinking the Btree.
1075 *========================================================================*/
1076
1077/*
1078 * Deallocate an empty leaf node, remove it from its parent,
1079 * possibly deallocating that block, etc...
1080 */
1081int
1082xfs_da3_join(
1083	struct xfs_da_state	*state)
1084{
1085	struct xfs_da_state_blk	*drop_blk;
1086	struct xfs_da_state_blk	*save_blk;
1087	int			action = 0;
1088	int			error;
1089
1090	trace_xfs_da_join(state->args);
1091
1092	drop_blk = &state->path.blk[ state->path.active-1 ];
1093	save_blk = &state->altpath.blk[ state->path.active-1 ];
1094	ASSERT(state->path.blk[0].magic == XFS_DA_NODE_MAGIC);
1095	ASSERT(drop_blk->magic == XFS_ATTR_LEAF_MAGIC ||
1096	       drop_blk->magic == XFS_DIR2_LEAFN_MAGIC);
1097
1098	/*
1099	 * Walk back up the tree joining/deallocating as necessary.
1100	 * When we stop dropping blocks, break out.
1101	 */
1102	for (  ; state->path.active >= 2; drop_blk--, save_blk--,
1103		 state->path.active--) {
1104		/*
1105		 * See if we can combine the block with a neighbor.
1106		 *   (action == 0) => no options, just leave
1107		 *   (action == 1) => coalesce, then unlink
1108		 *   (action == 2) => block empty, unlink it
1109		 */
1110		switch (drop_blk->magic) {
1111		case XFS_ATTR_LEAF_MAGIC:
1112			error = xfs_attr3_leaf_toosmall(state, &action);
1113			if (error)
1114				return error;
1115			if (action == 0)
1116				return 0;
1117			xfs_attr3_leaf_unbalance(state, drop_blk, save_blk);
1118			break;
1119		case XFS_DIR2_LEAFN_MAGIC:
1120			error = xfs_dir2_leafn_toosmall(state, &action);
1121			if (error)
1122				return error;
1123			if (action == 0)
1124				return 0;
1125			xfs_dir2_leafn_unbalance(state, drop_blk, save_blk);
1126			break;
1127		case XFS_DA_NODE_MAGIC:
1128			/*
1129			 * Remove the offending node, fixup hashvals,
1130			 * check for a toosmall neighbor.
1131			 */
1132			xfs_da3_node_remove(state, drop_blk);
1133			xfs_da3_fixhashpath(state, &state->path);
1134			error = xfs_da3_node_toosmall(state, &action);
1135			if (error)
1136				return error;
1137			if (action == 0)
1138				return 0;
1139			xfs_da3_node_unbalance(state, drop_blk, save_blk);
1140			break;
1141		}
1142		xfs_da3_fixhashpath(state, &state->altpath);
1143		error = xfs_da3_blk_unlink(state, drop_blk, save_blk);
1144		xfs_da_state_kill_altpath(state);
1145		if (error)
1146			return error;
1147		error = xfs_da_shrink_inode(state->args, drop_blk->blkno,
1148							 drop_blk->bp);
1149		drop_blk->bp = NULL;
1150		if (error)
1151			return error;
1152	}
1153	/*
1154	 * We joined all the way to the top.  If it turns out that
1155	 * we only have one entry in the root, make the child block
1156	 * the new root.
1157	 */
1158	xfs_da3_node_remove(state, drop_blk);
1159	xfs_da3_fixhashpath(state, &state->path);
1160	error = xfs_da3_root_join(state, &state->path.blk[0]);
1161	return error;
1162}
1163
1164#ifdef	DEBUG
1165static void
1166xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkinfo *blkinfo, __u16 level)
1167{
1168	__be16	magic = blkinfo->magic;
1169
1170	if (level == 1) {
1171		ASSERT(magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
1172		       magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) ||
1173		       magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC) ||
1174		       magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC));
1175	} else {
1176		ASSERT(magic == cpu_to_be16(XFS_DA_NODE_MAGIC) ||
1177		       magic == cpu_to_be16(XFS_DA3_NODE_MAGIC));
1178	}
1179	ASSERT(!blkinfo->forw);
1180	ASSERT(!blkinfo->back);
1181}
1182#else	/* !DEBUG */
1183#define	xfs_da_blkinfo_onlychild_validate(blkinfo, level)
1184#endif	/* !DEBUG */
1185
1186/*
1187 * We have only one entry in the root.  Copy the only remaining child of
1188 * the old root to block 0 as the new root node.
1189 */
1190STATIC int
1191xfs_da3_root_join(
1192	struct xfs_da_state	*state,
1193	struct xfs_da_state_blk	*root_blk)
1194{
1195	struct xfs_da_intnode	*oldroot;
1196	struct xfs_da_args	*args;
1197	xfs_dablk_t		child;
1198	struct xfs_buf		*bp;
1199	struct xfs_da3_icnode_hdr oldroothdr;
1200	int			error;
1201	struct xfs_inode	*dp = state->args->dp;
1202
1203	trace_xfs_da_root_join(state->args);
1204
1205	ASSERT(root_blk->magic == XFS_DA_NODE_MAGIC);
1206
1207	args = state->args;
1208	oldroot = root_blk->bp->b_addr;
1209	xfs_da3_node_hdr_from_disk(dp->i_mount, &oldroothdr, oldroot);
1210	ASSERT(oldroothdr.forw == 0);
1211	ASSERT(oldroothdr.back == 0);
1212
1213	/*
1214	 * If the root has more than one child, then don't do anything.
1215	 */
1216	if (oldroothdr.count > 1)
1217		return 0;
1218
1219	/*
1220	 * Read in the (only) child block, then copy those bytes into
1221	 * the root block's buffer and free the original child block.
1222	 */
1223	child = be32_to_cpu(oldroothdr.btree[0].before);
1224	ASSERT(child != 0);
1225	error = xfs_da3_node_read(args->trans, dp, child, &bp, args->whichfork);
1226	if (error)
1227		return error;
1228	xfs_da_blkinfo_onlychild_validate(bp->b_addr, oldroothdr.level);
1229
1230	/*
1231	 * Copy child to root buffer and log it.
1232	 */
1233	xfs_da_buf_copy(root_blk->bp, bp, args->geo->blksize);
 
 
 
 
 
 
 
 
 
 
1234	xfs_trans_log_buf(args->trans, root_blk->bp, 0,
1235			  args->geo->blksize - 1);
1236	/*
1237	 * Now we can drop the child buffer.
1238	 */
1239	error = xfs_da_shrink_inode(args, child, bp);
1240	return error;
1241}
1242
1243/*
1244 * Check a node block and its neighbors to see if the block should be
1245 * collapsed into one or the other neighbor.  Always keep the block
1246 * with the smaller block number.
1247 * If the current block is over 50% full, don't try to join it, return 0.
1248 * If the block is empty, fill in the state structure and return 2.
1249 * If it can be collapsed, fill in the state structure and return 1.
1250 * If nothing can be done, return 0.
1251 */
1252STATIC int
1253xfs_da3_node_toosmall(
1254	struct xfs_da_state	*state,
1255	int			*action)
1256{
1257	struct xfs_da_intnode	*node;
1258	struct xfs_da_state_blk	*blk;
1259	struct xfs_da_blkinfo	*info;
1260	xfs_dablk_t		blkno;
1261	struct xfs_buf		*bp;
1262	struct xfs_da3_icnode_hdr nodehdr;
1263	int			count;
1264	int			forward;
1265	int			error;
1266	int			retval;
1267	int			i;
1268	struct xfs_inode	*dp = state->args->dp;
1269
1270	trace_xfs_da_node_toosmall(state->args);
1271
1272	/*
1273	 * Check for the degenerate case of the block being over 50% full.
1274	 * If so, it's not worth even looking to see if we might be able
1275	 * to coalesce with a sibling.
1276	 */
1277	blk = &state->path.blk[ state->path.active-1 ];
1278	info = blk->bp->b_addr;
1279	node = (xfs_da_intnode_t *)info;
1280	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, node);
1281	if (nodehdr.count > (state->args->geo->node_ents >> 1)) {
1282		*action = 0;	/* blk over 50%, don't try to join */
1283		return 0;	/* blk over 50%, don't try to join */
1284	}
1285
1286	/*
1287	 * Check for the degenerate case of the block being empty.
1288	 * If the block is empty, we'll simply delete it, no need to
1289	 * coalesce it with a sibling block.  We choose (arbitrarily)
1290	 * to merge with the forward block unless it is NULL.
1291	 */
1292	if (nodehdr.count == 0) {
1293		/*
1294		 * Make altpath point to the block we want to keep and
1295		 * path point to the block we want to drop (this one).
1296		 */
1297		forward = (info->forw != 0);
1298		memcpy(&state->altpath, &state->path, sizeof(state->path));
1299		error = xfs_da3_path_shift(state, &state->altpath, forward,
1300						 0, &retval);
1301		if (error)
1302			return error;
1303		if (retval) {
1304			*action = 0;
1305		} else {
1306			*action = 2;
1307		}
1308		return 0;
1309	}
1310
1311	/*
1312	 * Examine each sibling block to see if we can coalesce with
1313	 * at least 25% free space to spare.  We need to figure out
1314	 * whether to merge with the forward or the backward block.
1315	 * We prefer coalescing with the lower numbered sibling so as
1316	 * to shrink a directory over time.
1317	 */
1318	count  = state->args->geo->node_ents;
1319	count -= state->args->geo->node_ents >> 2;
1320	count -= nodehdr.count;
1321
1322	/* start with smaller blk num */
1323	forward = nodehdr.forw < nodehdr.back;
1324	for (i = 0; i < 2; forward = !forward, i++) {
1325		struct xfs_da3_icnode_hdr thdr;
1326		if (forward)
1327			blkno = nodehdr.forw;
1328		else
1329			blkno = nodehdr.back;
1330		if (blkno == 0)
1331			continue;
1332		error = xfs_da3_node_read(state->args->trans, dp, blkno, &bp,
1333				state->args->whichfork);
1334		if (error)
1335			return error;
1336
1337		node = bp->b_addr;
1338		xfs_da3_node_hdr_from_disk(dp->i_mount, &thdr, node);
1339		xfs_trans_brelse(state->args->trans, bp);
1340
1341		if (count - thdr.count >= 0)
1342			break;	/* fits with at least 25% to spare */
1343	}
1344	if (i >= 2) {
1345		*action = 0;
1346		return 0;
1347	}
1348
1349	/*
1350	 * Make altpath point to the block we want to keep (the lower
1351	 * numbered block) and path point to the block we want to drop.
1352	 */
1353	memcpy(&state->altpath, &state->path, sizeof(state->path));
1354	if (blkno < blk->blkno) {
1355		error = xfs_da3_path_shift(state, &state->altpath, forward,
1356						 0, &retval);
1357	} else {
1358		error = xfs_da3_path_shift(state, &state->path, forward,
1359						 0, &retval);
1360	}
1361	if (error)
1362		return error;
1363	if (retval) {
1364		*action = 0;
1365		return 0;
1366	}
1367	*action = 1;
1368	return 0;
1369}
1370
1371/*
1372 * Pick up the last hashvalue from an intermediate node.
1373 */
1374STATIC uint
1375xfs_da3_node_lasthash(
1376	struct xfs_inode	*dp,
1377	struct xfs_buf		*bp,
1378	int			*count)
1379{
1380	struct xfs_da3_icnode_hdr nodehdr;
1381
1382	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, bp->b_addr);
1383	if (count)
1384		*count = nodehdr.count;
1385	if (!nodehdr.count)
1386		return 0;
1387	return be32_to_cpu(nodehdr.btree[nodehdr.count - 1].hashval);
1388}
1389
1390/*
1391 * Walk back up the tree adjusting hash values as necessary,
1392 * when we stop making changes, return.
1393 */
1394void
1395xfs_da3_fixhashpath(
1396	struct xfs_da_state	*state,
1397	struct xfs_da_state_path *path)
1398{
1399	struct xfs_da_state_blk	*blk;
1400	struct xfs_da_intnode	*node;
1401	struct xfs_da_node_entry *btree;
1402	xfs_dahash_t		lasthash=0;
1403	int			level;
1404	int			count;
1405	struct xfs_inode	*dp = state->args->dp;
1406
1407	trace_xfs_da_fixhashpath(state->args);
1408
1409	level = path->active-1;
1410	blk = &path->blk[ level ];
1411	switch (blk->magic) {
1412	case XFS_ATTR_LEAF_MAGIC:
1413		lasthash = xfs_attr_leaf_lasthash(blk->bp, &count);
1414		if (count == 0)
1415			return;
1416		break;
1417	case XFS_DIR2_LEAFN_MAGIC:
1418		lasthash = xfs_dir2_leaf_lasthash(dp, blk->bp, &count);
1419		if (count == 0)
1420			return;
1421		break;
1422	case XFS_DA_NODE_MAGIC:
1423		lasthash = xfs_da3_node_lasthash(dp, blk->bp, &count);
1424		if (count == 0)
1425			return;
1426		break;
1427	}
1428	for (blk--, level--; level >= 0; blk--, level--) {
1429		struct xfs_da3_icnode_hdr nodehdr;
1430
1431		node = blk->bp->b_addr;
1432		xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, node);
1433		btree = nodehdr.btree;
1434		if (be32_to_cpu(btree[blk->index].hashval) == lasthash)
1435			break;
1436		blk->hashval = lasthash;
1437		btree[blk->index].hashval = cpu_to_be32(lasthash);
1438		xfs_trans_log_buf(state->args->trans, blk->bp,
1439				  XFS_DA_LOGRANGE(node, &btree[blk->index],
1440						  sizeof(*btree)));
1441
1442		lasthash = be32_to_cpu(btree[nodehdr.count - 1].hashval);
1443	}
1444}
1445
1446/*
1447 * Remove an entry from an intermediate node.
1448 */
1449STATIC void
1450xfs_da3_node_remove(
1451	struct xfs_da_state	*state,
1452	struct xfs_da_state_blk	*drop_blk)
1453{
1454	struct xfs_da_intnode	*node;
1455	struct xfs_da3_icnode_hdr nodehdr;
1456	struct xfs_da_node_entry *btree;
1457	int			index;
1458	int			tmp;
1459	struct xfs_inode	*dp = state->args->dp;
1460
1461	trace_xfs_da_node_remove(state->args);
1462
1463	node = drop_blk->bp->b_addr;
1464	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, node);
1465	ASSERT(drop_blk->index < nodehdr.count);
1466	ASSERT(drop_blk->index >= 0);
1467
1468	/*
1469	 * Copy over the offending entry, or just zero it out.
1470	 */
1471	index = drop_blk->index;
1472	btree = nodehdr.btree;
1473	if (index < nodehdr.count - 1) {
1474		tmp  = nodehdr.count - index - 1;
1475		tmp *= (uint)sizeof(xfs_da_node_entry_t);
1476		memmove(&btree[index], &btree[index + 1], tmp);
1477		xfs_trans_log_buf(state->args->trans, drop_blk->bp,
1478		    XFS_DA_LOGRANGE(node, &btree[index], tmp));
1479		index = nodehdr.count - 1;
1480	}
1481	memset(&btree[index], 0, sizeof(xfs_da_node_entry_t));
1482	xfs_trans_log_buf(state->args->trans, drop_blk->bp,
1483	    XFS_DA_LOGRANGE(node, &btree[index], sizeof(btree[index])));
1484	nodehdr.count -= 1;
1485	xfs_da3_node_hdr_to_disk(dp->i_mount, node, &nodehdr);
1486	xfs_trans_log_buf(state->args->trans, drop_blk->bp,
1487	    XFS_DA_LOGRANGE(node, &node->hdr, state->args->geo->node_hdr_size));
1488
1489	/*
1490	 * Copy the last hash value from the block to propagate upwards.
1491	 */
1492	drop_blk->hashval = be32_to_cpu(btree[index - 1].hashval);
1493}
1494
1495/*
1496 * Unbalance the elements between two intermediate nodes,
1497 * move all Btree elements from one node into another.
1498 */
1499STATIC void
1500xfs_da3_node_unbalance(
1501	struct xfs_da_state	*state,
1502	struct xfs_da_state_blk	*drop_blk,
1503	struct xfs_da_state_blk	*save_blk)
1504{
1505	struct xfs_da_intnode	*drop_node;
1506	struct xfs_da_intnode	*save_node;
1507	struct xfs_da_node_entry *drop_btree;
1508	struct xfs_da_node_entry *save_btree;
1509	struct xfs_da3_icnode_hdr drop_hdr;
1510	struct xfs_da3_icnode_hdr save_hdr;
1511	struct xfs_trans	*tp;
1512	int			sindex;
1513	int			tmp;
1514	struct xfs_inode	*dp = state->args->dp;
1515
1516	trace_xfs_da_node_unbalance(state->args);
1517
1518	drop_node = drop_blk->bp->b_addr;
1519	save_node = save_blk->bp->b_addr;
1520	xfs_da3_node_hdr_from_disk(dp->i_mount, &drop_hdr, drop_node);
1521	xfs_da3_node_hdr_from_disk(dp->i_mount, &save_hdr, save_node);
1522	drop_btree = drop_hdr.btree;
1523	save_btree = save_hdr.btree;
1524	tp = state->args->trans;
1525
1526	/*
1527	 * If the dying block has lower hashvals, then move all the
1528	 * elements in the remaining block up to make a hole.
1529	 */
1530	if ((be32_to_cpu(drop_btree[0].hashval) <
1531			be32_to_cpu(save_btree[0].hashval)) ||
1532	    (be32_to_cpu(drop_btree[drop_hdr.count - 1].hashval) <
1533			be32_to_cpu(save_btree[save_hdr.count - 1].hashval))) {
1534		/* XXX: check this - is memmove dst correct? */
1535		tmp = save_hdr.count * sizeof(xfs_da_node_entry_t);
1536		memmove(&save_btree[drop_hdr.count], &save_btree[0], tmp);
1537
1538		sindex = 0;
1539		xfs_trans_log_buf(tp, save_blk->bp,
1540			XFS_DA_LOGRANGE(save_node, &save_btree[0],
1541				(save_hdr.count + drop_hdr.count) *
1542						sizeof(xfs_da_node_entry_t)));
1543	} else {
1544		sindex = save_hdr.count;
1545		xfs_trans_log_buf(tp, save_blk->bp,
1546			XFS_DA_LOGRANGE(save_node, &save_btree[sindex],
1547				drop_hdr.count * sizeof(xfs_da_node_entry_t)));
1548	}
1549
1550	/*
1551	 * Move all the B-tree elements from drop_blk to save_blk.
1552	 */
1553	tmp = drop_hdr.count * (uint)sizeof(xfs_da_node_entry_t);
1554	memcpy(&save_btree[sindex], &drop_btree[0], tmp);
1555	save_hdr.count += drop_hdr.count;
1556
1557	xfs_da3_node_hdr_to_disk(dp->i_mount, save_node, &save_hdr);
1558	xfs_trans_log_buf(tp, save_blk->bp,
1559		XFS_DA_LOGRANGE(save_node, &save_node->hdr,
1560				state->args->geo->node_hdr_size));
1561
1562	/*
1563	 * Save the last hashval in the remaining block for upward propagation.
1564	 */
1565	save_blk->hashval = be32_to_cpu(save_btree[save_hdr.count - 1].hashval);
1566}
1567
1568/*========================================================================
1569 * Routines used for finding things in the Btree.
1570 *========================================================================*/
1571
1572/*
1573 * Walk down the Btree looking for a particular filename, filling
1574 * in the state structure as we go.
1575 *
1576 * We will set the state structure to point to each of the elements
1577 * in each of the nodes where either the hashval is or should be.
1578 *
1579 * We support duplicate hashval's so for each entry in the current
1580 * node that could contain the desired hashval, descend.  This is a
1581 * pruned depth-first tree search.
1582 */
1583int							/* error */
1584xfs_da3_node_lookup_int(
1585	struct xfs_da_state	*state,
1586	int			*result)
1587{
1588	struct xfs_da_state_blk	*blk;
1589	struct xfs_da_blkinfo	*curr;
1590	struct xfs_da_intnode	*node;
1591	struct xfs_da_node_entry *btree;
1592	struct xfs_da3_icnode_hdr nodehdr;
1593	struct xfs_da_args	*args;
1594	xfs_dablk_t		blkno;
1595	xfs_dahash_t		hashval;
1596	xfs_dahash_t		btreehashval;
1597	int			probe;
1598	int			span;
1599	int			max;
1600	int			error;
1601	int			retval;
1602	unsigned int		expected_level = 0;
1603	uint16_t		magic;
1604	struct xfs_inode	*dp = state->args->dp;
1605
1606	args = state->args;
1607
1608	/*
1609	 * Descend thru the B-tree searching each level for the right
1610	 * node to use, until the right hashval is found.
1611	 */
1612	blkno = args->geo->leafblk;
1613	for (blk = &state->path.blk[0], state->path.active = 1;
1614			 state->path.active <= XFS_DA_NODE_MAXDEPTH;
1615			 blk++, state->path.active++) {
1616		/*
1617		 * Read the next node down in the tree.
1618		 */
1619		blk->blkno = blkno;
1620		error = xfs_da3_node_read(args->trans, args->dp, blkno,
1621					&blk->bp, args->whichfork);
1622		if (error) {
1623			blk->blkno = 0;
1624			state->path.active--;
1625			return error;
1626		}
1627		curr = blk->bp->b_addr;
1628		magic = be16_to_cpu(curr->magic);
1629
1630		if (magic == XFS_ATTR_LEAF_MAGIC ||
1631		    magic == XFS_ATTR3_LEAF_MAGIC) {
1632			blk->magic = XFS_ATTR_LEAF_MAGIC;
1633			blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL);
1634			break;
1635		}
1636
1637		if (magic == XFS_DIR2_LEAFN_MAGIC ||
1638		    magic == XFS_DIR3_LEAFN_MAGIC) {
1639			blk->magic = XFS_DIR2_LEAFN_MAGIC;
1640			blk->hashval = xfs_dir2_leaf_lasthash(args->dp,
1641							      blk->bp, NULL);
1642			break;
1643		}
1644
1645		if (magic != XFS_DA_NODE_MAGIC && magic != XFS_DA3_NODE_MAGIC) {
1646			xfs_buf_mark_corrupt(blk->bp);
1647			xfs_da_mark_sick(args);
1648			return -EFSCORRUPTED;
1649		}
1650
1651		blk->magic = XFS_DA_NODE_MAGIC;
1652
1653		/*
1654		 * Search an intermediate node for a match.
1655		 */
1656		node = blk->bp->b_addr;
1657		xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, node);
1658		btree = nodehdr.btree;
1659
1660		/* Tree taller than we can handle; bail out! */
1661		if (nodehdr.level >= XFS_DA_NODE_MAXDEPTH) {
1662			xfs_buf_mark_corrupt(blk->bp);
1663			xfs_da_mark_sick(args);
1664			return -EFSCORRUPTED;
1665		}
1666
1667		/* Check the level from the root. */
1668		if (blkno == args->geo->leafblk)
1669			expected_level = nodehdr.level - 1;
1670		else if (expected_level != nodehdr.level) {
1671			xfs_buf_mark_corrupt(blk->bp);
1672			xfs_da_mark_sick(args);
1673			return -EFSCORRUPTED;
1674		} else
1675			expected_level--;
1676
1677		max = nodehdr.count;
1678		blk->hashval = be32_to_cpu(btree[max - 1].hashval);
1679
1680		/*
1681		 * Binary search.  (note: small blocks will skip loop)
1682		 */
1683		probe = span = max / 2;
1684		hashval = args->hashval;
1685		while (span > 4) {
1686			span /= 2;
1687			btreehashval = be32_to_cpu(btree[probe].hashval);
1688			if (btreehashval < hashval)
1689				probe += span;
1690			else if (btreehashval > hashval)
1691				probe -= span;
1692			else
1693				break;
1694		}
1695		ASSERT((probe >= 0) && (probe < max));
1696		ASSERT((span <= 4) ||
1697			(be32_to_cpu(btree[probe].hashval) == hashval));
1698
1699		/*
1700		 * Since we may have duplicate hashval's, find the first
1701		 * matching hashval in the node.
1702		 */
1703		while (probe > 0 &&
1704		       be32_to_cpu(btree[probe].hashval) >= hashval) {
1705			probe--;
1706		}
1707		while (probe < max &&
1708		       be32_to_cpu(btree[probe].hashval) < hashval) {
1709			probe++;
1710		}
1711
1712		/*
1713		 * Pick the right block to descend on.
1714		 */
1715		if (probe == max) {
1716			blk->index = max - 1;
1717			blkno = be32_to_cpu(btree[max - 1].before);
1718		} else {
1719			blk->index = probe;
1720			blkno = be32_to_cpu(btree[probe].before);
1721		}
1722
1723		/* We can't point back to the root. */
1724		if (XFS_IS_CORRUPT(dp->i_mount, blkno == args->geo->leafblk)) {
1725			xfs_da_mark_sick(args);
1726			return -EFSCORRUPTED;
1727		}
1728	}
1729
1730	if (XFS_IS_CORRUPT(dp->i_mount, expected_level != 0)) {
1731		xfs_da_mark_sick(args);
1732		return -EFSCORRUPTED;
1733	}
1734
1735	/*
1736	 * A leaf block that ends in the hashval that we are interested in
1737	 * (final hashval == search hashval) means that the next block may
1738	 * contain more entries with the same hashval, shift upward to the
1739	 * next leaf and keep searching.
1740	 */
1741	for (;;) {
1742		if (blk->magic == XFS_DIR2_LEAFN_MAGIC) {
1743			retval = xfs_dir2_leafn_lookup_int(blk->bp, args,
1744							&blk->index, state);
1745		} else if (blk->magic == XFS_ATTR_LEAF_MAGIC) {
1746			retval = xfs_attr3_leaf_lookup_int(blk->bp, args);
1747			blk->index = args->index;
1748			args->blkno = blk->blkno;
1749		} else {
1750			ASSERT(0);
1751			xfs_da_mark_sick(args);
1752			return -EFSCORRUPTED;
1753		}
1754		if (((retval == -ENOENT) || (retval == -ENOATTR)) &&
1755		    (blk->hashval == args->hashval)) {
1756			error = xfs_da3_path_shift(state, &state->path, 1, 1,
1757							 &retval);
1758			if (error)
1759				return error;
1760			if (retval == 0) {
1761				continue;
1762			} else if (blk->magic == XFS_ATTR_LEAF_MAGIC) {
1763				/* path_shift() gives ENOENT */
1764				retval = -ENOATTR;
1765			}
1766		}
1767		break;
1768	}
1769	*result = retval;
1770	return 0;
1771}
1772
1773/*========================================================================
1774 * Utility routines.
1775 *========================================================================*/
1776
1777/*
1778 * Compare two intermediate nodes for "order".
1779 */
1780STATIC int
1781xfs_da3_node_order(
1782	struct xfs_inode *dp,
1783	struct xfs_buf	*node1_bp,
1784	struct xfs_buf	*node2_bp)
1785{
1786	struct xfs_da_intnode	*node1;
1787	struct xfs_da_intnode	*node2;
1788	struct xfs_da_node_entry *btree1;
1789	struct xfs_da_node_entry *btree2;
1790	struct xfs_da3_icnode_hdr node1hdr;
1791	struct xfs_da3_icnode_hdr node2hdr;
1792
1793	node1 = node1_bp->b_addr;
1794	node2 = node2_bp->b_addr;
1795	xfs_da3_node_hdr_from_disk(dp->i_mount, &node1hdr, node1);
1796	xfs_da3_node_hdr_from_disk(dp->i_mount, &node2hdr, node2);
1797	btree1 = node1hdr.btree;
1798	btree2 = node2hdr.btree;
1799
1800	if (node1hdr.count > 0 && node2hdr.count > 0 &&
1801	    ((be32_to_cpu(btree2[0].hashval) < be32_to_cpu(btree1[0].hashval)) ||
1802	     (be32_to_cpu(btree2[node2hdr.count - 1].hashval) <
1803	      be32_to_cpu(btree1[node1hdr.count - 1].hashval)))) {
1804		return 1;
1805	}
1806	return 0;
1807}
1808
1809/*
1810 * Link a new block into a doubly linked list of blocks (of whatever type).
1811 */
1812int							/* error */
1813xfs_da3_blk_link(
1814	struct xfs_da_state	*state,
1815	struct xfs_da_state_blk	*old_blk,
1816	struct xfs_da_state_blk	*new_blk)
1817{
1818	struct xfs_da_blkinfo	*old_info;
1819	struct xfs_da_blkinfo	*new_info;
1820	struct xfs_da_blkinfo	*tmp_info;
1821	struct xfs_da_args	*args;
1822	struct xfs_buf		*bp;
1823	int			before = 0;
1824	int			error;
1825	struct xfs_inode	*dp = state->args->dp;
1826
1827	/*
1828	 * Set up environment.
1829	 */
1830	args = state->args;
1831	ASSERT(args != NULL);
1832	old_info = old_blk->bp->b_addr;
1833	new_info = new_blk->bp->b_addr;
1834	ASSERT(old_blk->magic == XFS_DA_NODE_MAGIC ||
1835	       old_blk->magic == XFS_DIR2_LEAFN_MAGIC ||
1836	       old_blk->magic == XFS_ATTR_LEAF_MAGIC);
1837
1838	switch (old_blk->magic) {
1839	case XFS_ATTR_LEAF_MAGIC:
1840		before = xfs_attr_leaf_order(old_blk->bp, new_blk->bp);
1841		break;
1842	case XFS_DIR2_LEAFN_MAGIC:
1843		before = xfs_dir2_leafn_order(dp, old_blk->bp, new_blk->bp);
1844		break;
1845	case XFS_DA_NODE_MAGIC:
1846		before = xfs_da3_node_order(dp, old_blk->bp, new_blk->bp);
1847		break;
1848	}
1849
1850	/*
1851	 * Link blocks in appropriate order.
1852	 */
1853	if (before) {
1854		/*
1855		 * Link new block in before existing block.
1856		 */
1857		trace_xfs_da_link_before(args);
1858		new_info->forw = cpu_to_be32(old_blk->blkno);
1859		new_info->back = old_info->back;
1860		if (old_info->back) {
1861			error = xfs_da3_node_read(args->trans, dp,
1862						be32_to_cpu(old_info->back),
1863						&bp, args->whichfork);
1864			if (error)
1865				return error;
1866			ASSERT(bp != NULL);
1867			tmp_info = bp->b_addr;
1868			ASSERT(tmp_info->magic == old_info->magic);
1869			ASSERT(be32_to_cpu(tmp_info->forw) == old_blk->blkno);
1870			tmp_info->forw = cpu_to_be32(new_blk->blkno);
1871			xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1);
1872		}
1873		old_info->back = cpu_to_be32(new_blk->blkno);
1874	} else {
1875		/*
1876		 * Link new block in after existing block.
1877		 */
1878		trace_xfs_da_link_after(args);
1879		new_info->forw = old_info->forw;
1880		new_info->back = cpu_to_be32(old_blk->blkno);
1881		if (old_info->forw) {
1882			error = xfs_da3_node_read(args->trans, dp,
1883						be32_to_cpu(old_info->forw),
1884						&bp, args->whichfork);
1885			if (error)
1886				return error;
1887			ASSERT(bp != NULL);
1888			tmp_info = bp->b_addr;
1889			ASSERT(tmp_info->magic == old_info->magic);
1890			ASSERT(be32_to_cpu(tmp_info->back) == old_blk->blkno);
1891			tmp_info->back = cpu_to_be32(new_blk->blkno);
1892			xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1);
1893		}
1894		old_info->forw = cpu_to_be32(new_blk->blkno);
1895	}
1896
1897	xfs_trans_log_buf(args->trans, old_blk->bp, 0, sizeof(*tmp_info) - 1);
1898	xfs_trans_log_buf(args->trans, new_blk->bp, 0, sizeof(*tmp_info) - 1);
1899	return 0;
1900}
1901
1902/*
1903 * Unlink a block from a doubly linked list of blocks.
1904 */
1905STATIC int						/* error */
1906xfs_da3_blk_unlink(
1907	struct xfs_da_state	*state,
1908	struct xfs_da_state_blk	*drop_blk,
1909	struct xfs_da_state_blk	*save_blk)
1910{
1911	struct xfs_da_blkinfo	*drop_info;
1912	struct xfs_da_blkinfo	*save_info;
1913	struct xfs_da_blkinfo	*tmp_info;
1914	struct xfs_da_args	*args;
1915	struct xfs_buf		*bp;
1916	int			error;
1917
1918	/*
1919	 * Set up environment.
1920	 */
1921	args = state->args;
1922	ASSERT(args != NULL);
1923	save_info = save_blk->bp->b_addr;
1924	drop_info = drop_blk->bp->b_addr;
1925	ASSERT(save_blk->magic == XFS_DA_NODE_MAGIC ||
1926	       save_blk->magic == XFS_DIR2_LEAFN_MAGIC ||
1927	       save_blk->magic == XFS_ATTR_LEAF_MAGIC);
1928	ASSERT(save_blk->magic == drop_blk->magic);
1929	ASSERT((be32_to_cpu(save_info->forw) == drop_blk->blkno) ||
1930	       (be32_to_cpu(save_info->back) == drop_blk->blkno));
1931	ASSERT((be32_to_cpu(drop_info->forw) == save_blk->blkno) ||
1932	       (be32_to_cpu(drop_info->back) == save_blk->blkno));
1933
1934	/*
1935	 * Unlink the leaf block from the doubly linked chain of leaves.
1936	 */
1937	if (be32_to_cpu(save_info->back) == drop_blk->blkno) {
1938		trace_xfs_da_unlink_back(args);
1939		save_info->back = drop_info->back;
1940		if (drop_info->back) {
1941			error = xfs_da3_node_read(args->trans, args->dp,
1942						be32_to_cpu(drop_info->back),
1943						&bp, args->whichfork);
1944			if (error)
1945				return error;
1946			ASSERT(bp != NULL);
1947			tmp_info = bp->b_addr;
1948			ASSERT(tmp_info->magic == save_info->magic);
1949			ASSERT(be32_to_cpu(tmp_info->forw) == drop_blk->blkno);
1950			tmp_info->forw = cpu_to_be32(save_blk->blkno);
1951			xfs_trans_log_buf(args->trans, bp, 0,
1952						    sizeof(*tmp_info) - 1);
1953		}
1954	} else {
1955		trace_xfs_da_unlink_forward(args);
1956		save_info->forw = drop_info->forw;
1957		if (drop_info->forw) {
1958			error = xfs_da3_node_read(args->trans, args->dp,
1959						be32_to_cpu(drop_info->forw),
1960						&bp, args->whichfork);
1961			if (error)
1962				return error;
1963			ASSERT(bp != NULL);
1964			tmp_info = bp->b_addr;
1965			ASSERT(tmp_info->magic == save_info->magic);
1966			ASSERT(be32_to_cpu(tmp_info->back) == drop_blk->blkno);
1967			tmp_info->back = cpu_to_be32(save_blk->blkno);
1968			xfs_trans_log_buf(args->trans, bp, 0,
1969						    sizeof(*tmp_info) - 1);
1970		}
1971	}
1972
1973	xfs_trans_log_buf(args->trans, save_blk->bp, 0, sizeof(*save_info) - 1);
1974	return 0;
1975}
1976
1977/*
1978 * Move a path "forward" or "!forward" one block at the current level.
1979 *
1980 * This routine will adjust a "path" to point to the next block
1981 * "forward" (higher hashvalues) or "!forward" (lower hashvals) in the
1982 * Btree, including updating pointers to the intermediate nodes between
1983 * the new bottom and the root.
1984 */
1985int							/* error */
1986xfs_da3_path_shift(
1987	struct xfs_da_state	*state,
1988	struct xfs_da_state_path *path,
1989	int			forward,
1990	int			release,
1991	int			*result)
1992{
1993	struct xfs_da_state_blk	*blk;
1994	struct xfs_da_blkinfo	*info;
1995	struct xfs_da_args	*args;
1996	struct xfs_da_node_entry *btree;
1997	struct xfs_da3_icnode_hdr nodehdr;
1998	struct xfs_buf		*bp;
1999	xfs_dablk_t		blkno = 0;
2000	int			level;
2001	int			error;
2002	struct xfs_inode	*dp = state->args->dp;
2003
2004	trace_xfs_da_path_shift(state->args);
2005
2006	/*
2007	 * Roll up the Btree looking for the first block where our
2008	 * current index is not at the edge of the block.  Note that
2009	 * we skip the bottom layer because we want the sibling block.
2010	 */
2011	args = state->args;
2012	ASSERT(args != NULL);
2013	ASSERT(path != NULL);
2014	ASSERT((path->active > 0) && (path->active < XFS_DA_NODE_MAXDEPTH));
2015	level = (path->active-1) - 1;	/* skip bottom layer in path */
2016	for (; level >= 0; level--) {
2017		blk = &path->blk[level];
2018		xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr,
2019					   blk->bp->b_addr);
2020
2021		if (forward && (blk->index < nodehdr.count - 1)) {
2022			blk->index++;
2023			blkno = be32_to_cpu(nodehdr.btree[blk->index].before);
2024			break;
2025		} else if (!forward && (blk->index > 0)) {
2026			blk->index--;
2027			blkno = be32_to_cpu(nodehdr.btree[blk->index].before);
2028			break;
2029		}
2030	}
2031	if (level < 0) {
2032		*result = -ENOENT;	/* we're out of our tree */
2033		ASSERT(args->op_flags & XFS_DA_OP_OKNOENT);
2034		return 0;
2035	}
2036
2037	/*
2038	 * Roll down the edge of the subtree until we reach the
2039	 * same depth we were at originally.
2040	 */
2041	for (blk++, level++; level < path->active; blk++, level++) {
2042		/*
2043		 * Read the next child block into a local buffer.
2044		 */
2045		error = xfs_da3_node_read(args->trans, dp, blkno, &bp,
2046					  args->whichfork);
2047		if (error)
2048			return error;
2049
2050		/*
2051		 * Release the old block (if it's dirty, the trans doesn't
2052		 * actually let go) and swap the local buffer into the path
2053		 * structure. This ensures failure of the above read doesn't set
2054		 * a NULL buffer in an active slot in the path.
2055		 */
2056		if (release)
2057			xfs_trans_brelse(args->trans, blk->bp);
2058		blk->blkno = blkno;
2059		blk->bp = bp;
2060
2061		info = blk->bp->b_addr;
2062		ASSERT(info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC) ||
2063		       info->magic == cpu_to_be16(XFS_DA3_NODE_MAGIC) ||
2064		       info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
2065		       info->magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) ||
2066		       info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC) ||
2067		       info->magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC));
2068
2069
2070		/*
2071		 * Note: we flatten the magic number to a single type so we
2072		 * don't have to compare against crc/non-crc types elsewhere.
2073		 */
2074		switch (be16_to_cpu(info->magic)) {
2075		case XFS_DA_NODE_MAGIC:
2076		case XFS_DA3_NODE_MAGIC:
2077			blk->magic = XFS_DA_NODE_MAGIC;
2078			xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr,
2079						   bp->b_addr);
2080			btree = nodehdr.btree;
2081			blk->hashval = be32_to_cpu(btree[nodehdr.count - 1].hashval);
2082			if (forward)
2083				blk->index = 0;
2084			else
2085				blk->index = nodehdr.count - 1;
2086			blkno = be32_to_cpu(btree[blk->index].before);
2087			break;
2088		case XFS_ATTR_LEAF_MAGIC:
2089		case XFS_ATTR3_LEAF_MAGIC:
2090			blk->magic = XFS_ATTR_LEAF_MAGIC;
2091			ASSERT(level == path->active-1);
2092			blk->index = 0;
2093			blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL);
2094			break;
2095		case XFS_DIR2_LEAFN_MAGIC:
2096		case XFS_DIR3_LEAFN_MAGIC:
2097			blk->magic = XFS_DIR2_LEAFN_MAGIC;
2098			ASSERT(level == path->active-1);
2099			blk->index = 0;
2100			blk->hashval = xfs_dir2_leaf_lasthash(args->dp,
2101							      blk->bp, NULL);
2102			break;
2103		default:
2104			ASSERT(0);
2105			break;
2106		}
2107	}
2108	*result = 0;
2109	return 0;
2110}
2111
2112
2113/*========================================================================
2114 * Utility routines.
2115 *========================================================================*/
2116
2117/*
2118 * Implement a simple hash on a character string.
2119 * Rotate the hash value by 7 bits, then XOR each character in.
2120 * This is implemented with some source-level loop unrolling.
2121 */
2122xfs_dahash_t
2123xfs_da_hashname(const uint8_t *name, int namelen)
2124{
2125	xfs_dahash_t hash;
2126
2127	/*
2128	 * Do four characters at a time as long as we can.
2129	 */
2130	for (hash = 0; namelen >= 4; namelen -= 4, name += 4)
2131		hash = (name[0] << 21) ^ (name[1] << 14) ^ (name[2] << 7) ^
2132		       (name[3] << 0) ^ rol32(hash, 7 * 4);
2133
2134	/*
2135	 * Now do the rest of the characters.
2136	 */
2137	switch (namelen) {
2138	case 3:
2139		return (name[0] << 14) ^ (name[1] << 7) ^ (name[2] << 0) ^
2140		       rol32(hash, 7 * 3);
2141	case 2:
2142		return (name[0] << 7) ^ (name[1] << 0) ^ rol32(hash, 7 * 2);
2143	case 1:
2144		return (name[0] << 0) ^ rol32(hash, 7 * 1);
2145	default: /* case 0: */
2146		return hash;
2147	}
2148}
2149
2150enum xfs_dacmp
2151xfs_da_compname(
2152	struct xfs_da_args *args,
2153	const unsigned char *name,
2154	int		len)
2155{
2156	return (args->namelen == len && memcmp(args->name, name, len) == 0) ?
2157					XFS_CMP_EXACT : XFS_CMP_DIFFERENT;
2158}
2159
2160int
2161xfs_da_grow_inode_int(
2162	struct xfs_da_args	*args,
2163	xfs_fileoff_t		*bno,
2164	int			count)
2165{
2166	struct xfs_trans	*tp = args->trans;
2167	struct xfs_inode	*dp = args->dp;
2168	int			w = args->whichfork;
2169	xfs_rfsblock_t		nblks = dp->i_nblocks;
2170	struct xfs_bmbt_irec	map, *mapp;
2171	int			nmap, error, got, i, mapi;
2172
2173	/*
2174	 * Find a spot in the file space to put the new block.
2175	 */
2176	error = xfs_bmap_first_unused(tp, dp, count, bno, w);
2177	if (error)
2178		return error;
2179
2180	/*
2181	 * Try mapping it in one filesystem block.
2182	 */
2183	nmap = 1;
2184	error = xfs_bmapi_write(tp, dp, *bno, count,
2185			xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA|XFS_BMAPI_CONTIG,
2186			args->total, &map, &nmap);
2187	if (error)
2188		return error;
2189
2190	ASSERT(nmap <= 1);
2191	if (nmap == 1) {
2192		mapp = &map;
2193		mapi = 1;
2194	} else if (nmap == 0 && count > 1) {
2195		xfs_fileoff_t		b;
2196		int			c;
2197
2198		/*
2199		 * If we didn't get it and the block might work if fragmented,
2200		 * try without the CONTIG flag.  Loop until we get it all.
2201		 */
2202		mapp = kmalloc(sizeof(*mapp) * count,
2203				GFP_KERNEL | __GFP_NOFAIL);
2204		for (b = *bno, mapi = 0; b < *bno + count; ) {
 
2205			c = (int)(*bno + count - b);
2206			nmap = min(XFS_BMAP_MAX_NMAP, c);
2207			error = xfs_bmapi_write(tp, dp, b, c,
2208					xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA,
2209					args->total, &mapp[mapi], &nmap);
2210			if (error)
2211				goto out_free_map;
2212			if (nmap < 1)
2213				break;
2214			mapi += nmap;
2215			b = mapp[mapi - 1].br_startoff +
2216			    mapp[mapi - 1].br_blockcount;
2217		}
2218	} else {
2219		mapi = 0;
2220		mapp = NULL;
2221	}
2222
2223	/*
2224	 * Count the blocks we got, make sure it matches the total.
2225	 */
2226	for (i = 0, got = 0; i < mapi; i++)
2227		got += mapp[i].br_blockcount;
2228	if (got != count || mapp[0].br_startoff != *bno ||
2229	    mapp[mapi - 1].br_startoff + mapp[mapi - 1].br_blockcount !=
2230	    *bno + count) {
2231		error = -ENOSPC;
2232		goto out_free_map;
2233	}
2234
2235	/* account for newly allocated blocks in reserved blocks total */
2236	args->total -= dp->i_nblocks - nblks;
2237
2238out_free_map:
2239	if (mapp != &map)
2240		kfree(mapp);
2241	return error;
2242}
2243
2244/*
2245 * Add a block to the btree ahead of the file.
2246 * Return the new block number to the caller.
2247 */
2248int
2249xfs_da_grow_inode(
2250	struct xfs_da_args	*args,
2251	xfs_dablk_t		*new_blkno)
2252{
2253	xfs_fileoff_t		bno;
2254	int			error;
2255
2256	trace_xfs_da_grow_inode(args);
2257
2258	bno = args->geo->leafblk;
2259	error = xfs_da_grow_inode_int(args, &bno, args->geo->fsbcount);
2260	if (!error)
2261		*new_blkno = (xfs_dablk_t)bno;
2262	return error;
2263}
2264
2265/*
2266 * Ick.  We need to always be able to remove a btree block, even
2267 * if there's no space reservation because the filesystem is full.
2268 * This is called if xfs_bunmapi on a btree block fails due to ENOSPC.
2269 * It swaps the target block with the last block in the file.  The
2270 * last block in the file can always be removed since it can't cause
2271 * a bmap btree split to do that.
2272 */
2273STATIC int
2274xfs_da3_swap_lastblock(
2275	struct xfs_da_args	*args,
2276	xfs_dablk_t		*dead_blknop,
2277	struct xfs_buf		**dead_bufp)
2278{
2279	struct xfs_da_blkinfo	*dead_info;
2280	struct xfs_da_blkinfo	*sib_info;
2281	struct xfs_da_intnode	*par_node;
2282	struct xfs_da_intnode	*dead_node;
2283	struct xfs_dir2_leaf	*dead_leaf2;
2284	struct xfs_da_node_entry *btree;
2285	struct xfs_da3_icnode_hdr par_hdr;
2286	struct xfs_inode	*dp;
2287	struct xfs_trans	*tp;
2288	struct xfs_mount	*mp;
2289	struct xfs_buf		*dead_buf;
2290	struct xfs_buf		*last_buf;
2291	struct xfs_buf		*sib_buf;
2292	struct xfs_buf		*par_buf;
2293	xfs_dahash_t		dead_hash;
2294	xfs_fileoff_t		lastoff;
2295	xfs_dablk_t		dead_blkno;
2296	xfs_dablk_t		last_blkno;
2297	xfs_dablk_t		sib_blkno;
2298	xfs_dablk_t		par_blkno;
2299	int			error;
2300	int			w;
2301	int			entno;
2302	int			level;
2303	int			dead_level;
2304
2305	trace_xfs_da_swap_lastblock(args);
2306
2307	dead_buf = *dead_bufp;
2308	dead_blkno = *dead_blknop;
2309	tp = args->trans;
2310	dp = args->dp;
2311	w = args->whichfork;
2312	ASSERT(w == XFS_DATA_FORK);
2313	mp = dp->i_mount;
2314	lastoff = args->geo->freeblk;
2315	error = xfs_bmap_last_before(tp, dp, &lastoff, w);
2316	if (error)
2317		return error;
2318	if (XFS_IS_CORRUPT(mp, lastoff == 0)) {
2319		xfs_da_mark_sick(args);
2320		return -EFSCORRUPTED;
2321	}
2322	/*
2323	 * Read the last block in the btree space.
2324	 */
2325	last_blkno = (xfs_dablk_t)lastoff - args->geo->fsbcount;
2326	error = xfs_da3_node_read(tp, dp, last_blkno, &last_buf, w);
2327	if (error)
2328		return error;
2329	/*
2330	 * Copy the last block into the dead buffer and log it.
2331	 */
2332	xfs_da_buf_copy(dead_buf, last_buf, args->geo->blksize);
2333	xfs_trans_log_buf(tp, dead_buf, 0, args->geo->blksize - 1);
2334	dead_info = dead_buf->b_addr;
2335
2336	/*
2337	 * Get values from the moved block.
2338	 */
2339	if (dead_info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
2340	    dead_info->magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) {
2341		struct xfs_dir3_icleaf_hdr leafhdr;
2342		struct xfs_dir2_leaf_entry *ents;
2343
2344		dead_leaf2 = (xfs_dir2_leaf_t *)dead_info;
2345		xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr,
2346					    dead_leaf2);
2347		ents = leafhdr.ents;
2348		dead_level = 0;
2349		dead_hash = be32_to_cpu(ents[leafhdr.count - 1].hashval);
2350	} else {
2351		struct xfs_da3_icnode_hdr deadhdr;
2352
2353		dead_node = (xfs_da_intnode_t *)dead_info;
2354		xfs_da3_node_hdr_from_disk(dp->i_mount, &deadhdr, dead_node);
2355		btree = deadhdr.btree;
2356		dead_level = deadhdr.level;
2357		dead_hash = be32_to_cpu(btree[deadhdr.count - 1].hashval);
2358	}
2359	sib_buf = par_buf = NULL;
2360	/*
2361	 * If the moved block has a left sibling, fix up the pointers.
2362	 */
2363	if ((sib_blkno = be32_to_cpu(dead_info->back))) {
2364		error = xfs_da3_node_read(tp, dp, sib_blkno, &sib_buf, w);
2365		if (error)
2366			goto done;
2367		sib_info = sib_buf->b_addr;
2368		if (XFS_IS_CORRUPT(mp,
2369				   be32_to_cpu(sib_info->forw) != last_blkno ||
2370				   sib_info->magic != dead_info->magic)) {
2371			xfs_da_mark_sick(args);
2372			error = -EFSCORRUPTED;
2373			goto done;
2374		}
2375		sib_info->forw = cpu_to_be32(dead_blkno);
2376		xfs_trans_log_buf(tp, sib_buf,
2377			XFS_DA_LOGRANGE(sib_info, &sib_info->forw,
2378					sizeof(sib_info->forw)));
2379		sib_buf = NULL;
2380	}
2381	/*
2382	 * If the moved block has a right sibling, fix up the pointers.
2383	 */
2384	if ((sib_blkno = be32_to_cpu(dead_info->forw))) {
2385		error = xfs_da3_node_read(tp, dp, sib_blkno, &sib_buf, w);
2386		if (error)
2387			goto done;
2388		sib_info = sib_buf->b_addr;
2389		if (XFS_IS_CORRUPT(mp,
2390				   be32_to_cpu(sib_info->back) != last_blkno ||
2391				   sib_info->magic != dead_info->magic)) {
2392			xfs_da_mark_sick(args);
2393			error = -EFSCORRUPTED;
2394			goto done;
2395		}
2396		sib_info->back = cpu_to_be32(dead_blkno);
2397		xfs_trans_log_buf(tp, sib_buf,
2398			XFS_DA_LOGRANGE(sib_info, &sib_info->back,
2399					sizeof(sib_info->back)));
2400		sib_buf = NULL;
2401	}
2402	par_blkno = args->geo->leafblk;
2403	level = -1;
2404	/*
2405	 * Walk down the tree looking for the parent of the moved block.
2406	 */
2407	for (;;) {
2408		error = xfs_da3_node_read(tp, dp, par_blkno, &par_buf, w);
2409		if (error)
2410			goto done;
2411		par_node = par_buf->b_addr;
2412		xfs_da3_node_hdr_from_disk(dp->i_mount, &par_hdr, par_node);
2413		if (XFS_IS_CORRUPT(mp,
2414				   level >= 0 && level != par_hdr.level + 1)) {
2415			xfs_da_mark_sick(args);
2416			error = -EFSCORRUPTED;
2417			goto done;
2418		}
2419		level = par_hdr.level;
2420		btree = par_hdr.btree;
2421		for (entno = 0;
2422		     entno < par_hdr.count &&
2423		     be32_to_cpu(btree[entno].hashval) < dead_hash;
2424		     entno++)
2425			continue;
2426		if (XFS_IS_CORRUPT(mp, entno == par_hdr.count)) {
2427			xfs_da_mark_sick(args);
2428			error = -EFSCORRUPTED;
2429			goto done;
2430		}
2431		par_blkno = be32_to_cpu(btree[entno].before);
2432		if (level == dead_level + 1)
2433			break;
2434		xfs_trans_brelse(tp, par_buf);
2435		par_buf = NULL;
2436	}
2437	/*
2438	 * We're in the right parent block.
2439	 * Look for the right entry.
2440	 */
2441	for (;;) {
2442		for (;
2443		     entno < par_hdr.count &&
2444		     be32_to_cpu(btree[entno].before) != last_blkno;
2445		     entno++)
2446			continue;
2447		if (entno < par_hdr.count)
2448			break;
2449		par_blkno = par_hdr.forw;
2450		xfs_trans_brelse(tp, par_buf);
2451		par_buf = NULL;
2452		if (XFS_IS_CORRUPT(mp, par_blkno == 0)) {
2453			xfs_da_mark_sick(args);
2454			error = -EFSCORRUPTED;
2455			goto done;
2456		}
2457		error = xfs_da3_node_read(tp, dp, par_blkno, &par_buf, w);
2458		if (error)
2459			goto done;
2460		par_node = par_buf->b_addr;
2461		xfs_da3_node_hdr_from_disk(dp->i_mount, &par_hdr, par_node);
2462		if (XFS_IS_CORRUPT(mp, par_hdr.level != level)) {
2463			xfs_da_mark_sick(args);
2464			error = -EFSCORRUPTED;
2465			goto done;
2466		}
2467		btree = par_hdr.btree;
2468		entno = 0;
2469	}
2470	/*
2471	 * Update the parent entry pointing to the moved block.
2472	 */
2473	btree[entno].before = cpu_to_be32(dead_blkno);
2474	xfs_trans_log_buf(tp, par_buf,
2475		XFS_DA_LOGRANGE(par_node, &btree[entno].before,
2476				sizeof(btree[entno].before)));
2477	*dead_blknop = last_blkno;
2478	*dead_bufp = last_buf;
2479	return 0;
2480done:
2481	if (par_buf)
2482		xfs_trans_brelse(tp, par_buf);
2483	if (sib_buf)
2484		xfs_trans_brelse(tp, sib_buf);
2485	xfs_trans_brelse(tp, last_buf);
2486	return error;
2487}
2488
2489/*
2490 * Remove a btree block from a directory or attribute.
2491 */
2492int
2493xfs_da_shrink_inode(
2494	struct xfs_da_args	*args,
2495	xfs_dablk_t		dead_blkno,
2496	struct xfs_buf		*dead_buf)
2497{
2498	struct xfs_inode	*dp;
2499	int			done, error, w, count;
2500	struct xfs_trans	*tp;
2501
2502	trace_xfs_da_shrink_inode(args);
2503
2504	dp = args->dp;
2505	w = args->whichfork;
2506	tp = args->trans;
2507	count = args->geo->fsbcount;
2508	for (;;) {
2509		/*
2510		 * Remove extents.  If we get ENOSPC for a dir we have to move
2511		 * the last block to the place we want to kill.
2512		 */
2513		error = xfs_bunmapi(tp, dp, dead_blkno, count,
2514				    xfs_bmapi_aflag(w), 0, &done);
2515		if (error == -ENOSPC) {
2516			if (w != XFS_DATA_FORK)
2517				break;
2518			error = xfs_da3_swap_lastblock(args, &dead_blkno,
2519						      &dead_buf);
2520			if (error)
2521				break;
2522		} else {
2523			break;
2524		}
2525	}
2526	xfs_trans_binval(tp, dead_buf);
2527	return error;
2528}
2529
2530static int
2531xfs_dabuf_map(
2532	struct xfs_inode	*dp,
2533	xfs_dablk_t		bno,
2534	unsigned int		flags,
2535	int			whichfork,
2536	struct xfs_buf_map	**mapp,
2537	int			*nmaps)
2538{
2539	struct xfs_mount	*mp = dp->i_mount;
2540	int			nfsb = xfs_dabuf_nfsb(mp, whichfork);
2541	struct xfs_bmbt_irec	irec, *irecs = &irec;
2542	struct xfs_buf_map	*map = *mapp;
2543	xfs_fileoff_t		off = bno;
2544	int			error = 0, nirecs, i;
2545
2546	if (nfsb > 1)
2547		irecs = kzalloc(sizeof(irec) * nfsb,
2548				GFP_KERNEL | __GFP_NOLOCKDEP | __GFP_NOFAIL);
2549
2550	nirecs = nfsb;
2551	error = xfs_bmapi_read(dp, bno, nfsb, irecs, &nirecs,
2552			xfs_bmapi_aflag(whichfork));
2553	if (error)
2554		goto out_free_irecs;
2555
2556	/*
2557	 * Use the caller provided map for the single map case, else allocate a
2558	 * larger one that needs to be free by the caller.
2559	 */
2560	if (nirecs > 1) {
2561		map = kzalloc(nirecs * sizeof(struct xfs_buf_map),
2562				GFP_KERNEL | __GFP_NOLOCKDEP | __GFP_NOFAIL);
2563		if (!map) {
2564			error = -ENOMEM;
2565			goto out_free_irecs;
2566		}
2567		*mapp = map;
2568	}
2569
2570	for (i = 0; i < nirecs; i++) {
2571		if (irecs[i].br_startblock == HOLESTARTBLOCK ||
2572		    irecs[i].br_startblock == DELAYSTARTBLOCK)
2573			goto invalid_mapping;
2574		if (off != irecs[i].br_startoff)
2575			goto invalid_mapping;
2576
2577		map[i].bm_bn = XFS_FSB_TO_DADDR(mp, irecs[i].br_startblock);
2578		map[i].bm_len = XFS_FSB_TO_BB(mp, irecs[i].br_blockcount);
2579		off += irecs[i].br_blockcount;
2580	}
2581
2582	if (off != bno + nfsb)
2583		goto invalid_mapping;
2584
2585	*nmaps = nirecs;
2586out_free_irecs:
2587	if (irecs != &irec)
2588		kfree(irecs);
2589	return error;
2590
2591invalid_mapping:
2592	/* Caller ok with no mapping. */
2593	if (XFS_IS_CORRUPT(mp, !(flags & XFS_DABUF_MAP_HOLE_OK))) {
2594		xfs_dirattr_mark_sick(dp, whichfork);
2595		error = -EFSCORRUPTED;
2596		if (xfs_error_level >= XFS_ERRLEVEL_LOW) {
2597			xfs_alert(mp, "%s: bno %u inode %llu",
2598					__func__, bno, dp->i_ino);
2599
2600			for (i = 0; i < nirecs; i++) {
2601				xfs_alert(mp,
2602"[%02d] br_startoff %lld br_startblock %lld br_blockcount %lld br_state %d",
2603					i, irecs[i].br_startoff,
2604					irecs[i].br_startblock,
2605					irecs[i].br_blockcount,
2606					irecs[i].br_state);
2607			}
2608		}
2609	} else {
2610		*nmaps = 0;
2611	}
2612	goto out_free_irecs;
2613}
2614
2615/*
2616 * Get a buffer for the dir/attr block.
2617 */
2618int
2619xfs_da_get_buf(
2620	struct xfs_trans	*tp,
2621	struct xfs_inode	*dp,
2622	xfs_dablk_t		bno,
2623	struct xfs_buf		**bpp,
2624	int			whichfork)
2625{
2626	struct xfs_mount	*mp = dp->i_mount;
2627	struct xfs_buf		*bp;
2628	struct xfs_buf_map	map, *mapp = &map;
2629	int			nmap = 1;
2630	int			error;
2631
2632	*bpp = NULL;
2633	error = xfs_dabuf_map(dp, bno, 0, whichfork, &mapp, &nmap);
2634	if (error || nmap == 0)
2635		goto out_free;
2636
2637	error = xfs_trans_get_buf_map(tp, mp->m_ddev_targp, mapp, nmap, 0, &bp);
2638	if (error)
2639		goto out_free;
2640
2641	*bpp = bp;
2642
2643out_free:
2644	if (mapp != &map)
2645		kfree(mapp);
2646
2647	return error;
2648}
2649
2650/*
2651 * Get a buffer for the dir/attr block, fill in the contents.
2652 */
2653int
2654xfs_da_read_buf(
2655	struct xfs_trans	*tp,
2656	struct xfs_inode	*dp,
2657	xfs_dablk_t		bno,
2658	unsigned int		flags,
2659	struct xfs_buf		**bpp,
2660	int			whichfork,
2661	const struct xfs_buf_ops *ops)
2662{
2663	struct xfs_mount	*mp = dp->i_mount;
2664	struct xfs_buf		*bp;
2665	struct xfs_buf_map	map, *mapp = &map;
2666	int			nmap = 1;
2667	int			error;
2668
2669	*bpp = NULL;
2670	error = xfs_dabuf_map(dp, bno, flags, whichfork, &mapp, &nmap);
2671	if (error || !nmap)
2672		goto out_free;
2673
2674	error = xfs_trans_read_buf_map(mp, tp, mp->m_ddev_targp, mapp, nmap, 0,
2675			&bp, ops);
2676	if (xfs_metadata_is_sick(error))
2677		xfs_dirattr_mark_sick(dp, whichfork);
2678	if (error)
2679		goto out_free;
2680
2681	if (whichfork == XFS_ATTR_FORK)
2682		xfs_buf_set_ref(bp, XFS_ATTR_BTREE_REF);
2683	else
2684		xfs_buf_set_ref(bp, XFS_DIR_BTREE_REF);
2685	*bpp = bp;
2686out_free:
2687	if (mapp != &map)
2688		kfree(mapp);
2689
2690	return error;
2691}
2692
2693/*
2694 * Readahead the dir/attr block.
2695 */
2696int
2697xfs_da_reada_buf(
2698	struct xfs_inode	*dp,
2699	xfs_dablk_t		bno,
2700	unsigned int		flags,
2701	int			whichfork,
2702	const struct xfs_buf_ops *ops)
2703{
2704	struct xfs_buf_map	map;
2705	struct xfs_buf_map	*mapp;
2706	int			nmap;
2707	int			error;
2708
2709	mapp = &map;
2710	nmap = 1;
2711	error = xfs_dabuf_map(dp, bno, flags, whichfork, &mapp, &nmap);
2712	if (error || !nmap)
2713		goto out_free;
2714
2715	xfs_buf_readahead_map(dp->i_mount->m_ddev_targp, mapp, nmap, ops);
2716
2717out_free:
2718	if (mapp != &map)
2719		kfree(mapp);
2720
2721	return error;
2722}
v5.9
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
   4 * Copyright (c) 2013 Red Hat, Inc.
   5 * All Rights Reserved.
   6 */
   7#include "xfs.h"
   8#include "xfs_fs.h"
   9#include "xfs_shared.h"
  10#include "xfs_format.h"
  11#include "xfs_log_format.h"
  12#include "xfs_trans_resv.h"
  13#include "xfs_bit.h"
  14#include "xfs_mount.h"
  15#include "xfs_inode.h"
  16#include "xfs_dir2.h"
  17#include "xfs_dir2_priv.h"
  18#include "xfs_trans.h"
  19#include "xfs_bmap.h"
  20#include "xfs_attr_leaf.h"
  21#include "xfs_error.h"
  22#include "xfs_trace.h"
  23#include "xfs_buf_item.h"
  24#include "xfs_log.h"
 
 
  25
  26/*
  27 * xfs_da_btree.c
  28 *
  29 * Routines to implement directories as Btrees of hashed names.
  30 */
  31
  32/*========================================================================
  33 * Function prototypes for the kernel.
  34 *========================================================================*/
  35
  36/*
  37 * Routines used for growing the Btree.
  38 */
  39STATIC int xfs_da3_root_split(xfs_da_state_t *state,
  40					    xfs_da_state_blk_t *existing_root,
  41					    xfs_da_state_blk_t *new_child);
  42STATIC int xfs_da3_node_split(xfs_da_state_t *state,
  43					    xfs_da_state_blk_t *existing_blk,
  44					    xfs_da_state_blk_t *split_blk,
  45					    xfs_da_state_blk_t *blk_to_add,
  46					    int treelevel,
  47					    int *result);
  48STATIC void xfs_da3_node_rebalance(xfs_da_state_t *state,
  49					 xfs_da_state_blk_t *node_blk_1,
  50					 xfs_da_state_blk_t *node_blk_2);
  51STATIC void xfs_da3_node_add(xfs_da_state_t *state,
  52				   xfs_da_state_blk_t *old_node_blk,
  53				   xfs_da_state_blk_t *new_node_blk);
  54
  55/*
  56 * Routines used for shrinking the Btree.
  57 */
  58STATIC int xfs_da3_root_join(xfs_da_state_t *state,
  59					   xfs_da_state_blk_t *root_blk);
  60STATIC int xfs_da3_node_toosmall(xfs_da_state_t *state, int *retval);
  61STATIC void xfs_da3_node_remove(xfs_da_state_t *state,
  62					      xfs_da_state_blk_t *drop_blk);
  63STATIC void xfs_da3_node_unbalance(xfs_da_state_t *state,
  64					 xfs_da_state_blk_t *src_node_blk,
  65					 xfs_da_state_blk_t *dst_node_blk);
  66
  67/*
  68 * Utility routines.
  69 */
  70STATIC int	xfs_da3_blk_unlink(xfs_da_state_t *state,
  71				  xfs_da_state_blk_t *drop_blk,
  72				  xfs_da_state_blk_t *save_blk);
  73
  74
  75kmem_zone_t *xfs_da_state_zone;	/* anchor for state struct zone */
  76
  77/*
  78 * Allocate a dir-state structure.
  79 * We don't put them on the stack since they're large.
  80 */
  81struct xfs_da_state *
  82xfs_da_state_alloc(
  83	struct xfs_da_args	*args)
  84{
  85	struct xfs_da_state	*state;
  86
  87	state = kmem_cache_zalloc(xfs_da_state_zone, GFP_NOFS | __GFP_NOFAIL);
 
  88	state->args = args;
  89	state->mp = args->dp->i_mount;
  90	return state;
  91}
  92
  93/*
  94 * Kill the altpath contents of a da-state structure.
  95 */
  96STATIC void
  97xfs_da_state_kill_altpath(xfs_da_state_t *state)
  98{
  99	int	i;
 100
 101	for (i = 0; i < state->altpath.active; i++)
 102		state->altpath.blk[i].bp = NULL;
 103	state->altpath.active = 0;
 104}
 105
 106/*
 107 * Free a da-state structure.
 108 */
 109void
 110xfs_da_state_free(xfs_da_state_t *state)
 111{
 112	xfs_da_state_kill_altpath(state);
 113#ifdef DEBUG
 114	memset((char *)state, 0, sizeof(*state));
 115#endif /* DEBUG */
 116	kmem_cache_free(xfs_da_state_zone, state);
 
 
 
 
 
 
 
 
 
 
 
 117}
 118
 119static inline int xfs_dabuf_nfsb(struct xfs_mount *mp, int whichfork)
 120{
 121	if (whichfork == XFS_DATA_FORK)
 122		return mp->m_dir_geo->fsbcount;
 123	return mp->m_attr_geo->fsbcount;
 124}
 125
 126void
 127xfs_da3_node_hdr_from_disk(
 128	struct xfs_mount		*mp,
 129	struct xfs_da3_icnode_hdr	*to,
 130	struct xfs_da_intnode		*from)
 131{
 132	if (xfs_sb_version_hascrc(&mp->m_sb)) {
 133		struct xfs_da3_intnode	*from3 = (struct xfs_da3_intnode *)from;
 134
 135		to->forw = be32_to_cpu(from3->hdr.info.hdr.forw);
 136		to->back = be32_to_cpu(from3->hdr.info.hdr.back);
 137		to->magic = be16_to_cpu(from3->hdr.info.hdr.magic);
 138		to->count = be16_to_cpu(from3->hdr.__count);
 139		to->level = be16_to_cpu(from3->hdr.__level);
 140		to->btree = from3->__btree;
 141		ASSERT(to->magic == XFS_DA3_NODE_MAGIC);
 142	} else {
 143		to->forw = be32_to_cpu(from->hdr.info.forw);
 144		to->back = be32_to_cpu(from->hdr.info.back);
 145		to->magic = be16_to_cpu(from->hdr.info.magic);
 146		to->count = be16_to_cpu(from->hdr.__count);
 147		to->level = be16_to_cpu(from->hdr.__level);
 148		to->btree = from->__btree;
 149		ASSERT(to->magic == XFS_DA_NODE_MAGIC);
 150	}
 151}
 152
 153void
 154xfs_da3_node_hdr_to_disk(
 155	struct xfs_mount		*mp,
 156	struct xfs_da_intnode		*to,
 157	struct xfs_da3_icnode_hdr	*from)
 158{
 159	if (xfs_sb_version_hascrc(&mp->m_sb)) {
 160		struct xfs_da3_intnode	*to3 = (struct xfs_da3_intnode *)to;
 161
 162		ASSERT(from->magic == XFS_DA3_NODE_MAGIC);
 163		to3->hdr.info.hdr.forw = cpu_to_be32(from->forw);
 164		to3->hdr.info.hdr.back = cpu_to_be32(from->back);
 165		to3->hdr.info.hdr.magic = cpu_to_be16(from->magic);
 166		to3->hdr.__count = cpu_to_be16(from->count);
 167		to3->hdr.__level = cpu_to_be16(from->level);
 168	} else {
 169		ASSERT(from->magic == XFS_DA_NODE_MAGIC);
 170		to->hdr.info.forw = cpu_to_be32(from->forw);
 171		to->hdr.info.back = cpu_to_be32(from->back);
 172		to->hdr.info.magic = cpu_to_be16(from->magic);
 173		to->hdr.__count = cpu_to_be16(from->count);
 174		to->hdr.__level = cpu_to_be16(from->level);
 175	}
 176}
 177
 178/*
 179 * Verify an xfs_da3_blkinfo structure. Note that the da3 fields are only
 180 * accessible on v5 filesystems. This header format is common across da node,
 181 * attr leaf and dir leaf blocks.
 182 */
 183xfs_failaddr_t
 184xfs_da3_blkinfo_verify(
 185	struct xfs_buf		*bp,
 186	struct xfs_da3_blkinfo	*hdr3)
 187{
 188	struct xfs_mount	*mp = bp->b_mount;
 189	struct xfs_da_blkinfo	*hdr = &hdr3->hdr;
 190
 191	if (!xfs_verify_magic16(bp, hdr->magic))
 192		return __this_address;
 193
 194	if (xfs_sb_version_hascrc(&mp->m_sb)) {
 195		if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_meta_uuid))
 196			return __this_address;
 197		if (be64_to_cpu(hdr3->blkno) != bp->b_bn)
 198			return __this_address;
 199		if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr3->lsn)))
 200			return __this_address;
 201	}
 202
 203	return NULL;
 204}
 205
 206static xfs_failaddr_t
 207xfs_da3_node_verify(
 208	struct xfs_buf		*bp)
 209{
 210	struct xfs_mount	*mp = bp->b_mount;
 211	struct xfs_da_intnode	*hdr = bp->b_addr;
 212	struct xfs_da3_icnode_hdr ichdr;
 213	xfs_failaddr_t		fa;
 214
 215	xfs_da3_node_hdr_from_disk(mp, &ichdr, hdr);
 216
 217	fa = xfs_da3_blkinfo_verify(bp, bp->b_addr);
 218	if (fa)
 219		return fa;
 220
 221	if (ichdr.level == 0)
 222		return __this_address;
 223	if (ichdr.level > XFS_DA_NODE_MAXDEPTH)
 224		return __this_address;
 225	if (ichdr.count == 0)
 226		return __this_address;
 227
 228	/*
 229	 * we don't know if the node is for and attribute or directory tree,
 230	 * so only fail if the count is outside both bounds
 231	 */
 232	if (ichdr.count > mp->m_dir_geo->node_ents &&
 233	    ichdr.count > mp->m_attr_geo->node_ents)
 234		return __this_address;
 235
 236	/* XXX: hash order check? */
 237
 238	return NULL;
 239}
 240
 241static void
 242xfs_da3_node_write_verify(
 243	struct xfs_buf	*bp)
 244{
 245	struct xfs_mount	*mp = bp->b_mount;
 246	struct xfs_buf_log_item	*bip = bp->b_log_item;
 247	struct xfs_da3_node_hdr *hdr3 = bp->b_addr;
 248	xfs_failaddr_t		fa;
 249
 250	fa = xfs_da3_node_verify(bp);
 251	if (fa) {
 252		xfs_verifier_error(bp, -EFSCORRUPTED, fa);
 253		return;
 254	}
 255
 256	if (!xfs_sb_version_hascrc(&mp->m_sb))
 257		return;
 258
 259	if (bip)
 260		hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn);
 261
 262	xfs_buf_update_cksum(bp, XFS_DA3_NODE_CRC_OFF);
 263}
 264
 265/*
 266 * leaf/node format detection on trees is sketchy, so a node read can be done on
 267 * leaf level blocks when detection identifies the tree as a node format tree
 268 * incorrectly. In this case, we need to swap the verifier to match the correct
 269 * format of the block being read.
 270 */
 271static void
 272xfs_da3_node_read_verify(
 273	struct xfs_buf		*bp)
 274{
 275	struct xfs_da_blkinfo	*info = bp->b_addr;
 276	xfs_failaddr_t		fa;
 277
 278	switch (be16_to_cpu(info->magic)) {
 279		case XFS_DA3_NODE_MAGIC:
 280			if (!xfs_buf_verify_cksum(bp, XFS_DA3_NODE_CRC_OFF)) {
 281				xfs_verifier_error(bp, -EFSBADCRC,
 282						__this_address);
 283				break;
 284			}
 285			/* fall through */
 286		case XFS_DA_NODE_MAGIC:
 287			fa = xfs_da3_node_verify(bp);
 288			if (fa)
 289				xfs_verifier_error(bp, -EFSCORRUPTED, fa);
 290			return;
 291		case XFS_ATTR_LEAF_MAGIC:
 292		case XFS_ATTR3_LEAF_MAGIC:
 293			bp->b_ops = &xfs_attr3_leaf_buf_ops;
 294			bp->b_ops->verify_read(bp);
 295			return;
 296		case XFS_DIR2_LEAFN_MAGIC:
 297		case XFS_DIR3_LEAFN_MAGIC:
 298			bp->b_ops = &xfs_dir3_leafn_buf_ops;
 299			bp->b_ops->verify_read(bp);
 300			return;
 301		default:
 302			xfs_verifier_error(bp, -EFSCORRUPTED, __this_address);
 303			break;
 304	}
 305}
 306
 307/* Verify the structure of a da3 block. */
 308static xfs_failaddr_t
 309xfs_da3_node_verify_struct(
 310	struct xfs_buf		*bp)
 311{
 312	struct xfs_da_blkinfo	*info = bp->b_addr;
 313
 314	switch (be16_to_cpu(info->magic)) {
 315	case XFS_DA3_NODE_MAGIC:
 316	case XFS_DA_NODE_MAGIC:
 317		return xfs_da3_node_verify(bp);
 318	case XFS_ATTR_LEAF_MAGIC:
 319	case XFS_ATTR3_LEAF_MAGIC:
 320		bp->b_ops = &xfs_attr3_leaf_buf_ops;
 321		return bp->b_ops->verify_struct(bp);
 322	case XFS_DIR2_LEAFN_MAGIC:
 323	case XFS_DIR3_LEAFN_MAGIC:
 324		bp->b_ops = &xfs_dir3_leafn_buf_ops;
 325		return bp->b_ops->verify_struct(bp);
 326	default:
 327		return __this_address;
 328	}
 329}
 330
 331const struct xfs_buf_ops xfs_da3_node_buf_ops = {
 332	.name = "xfs_da3_node",
 333	.magic16 = { cpu_to_be16(XFS_DA_NODE_MAGIC),
 334		     cpu_to_be16(XFS_DA3_NODE_MAGIC) },
 335	.verify_read = xfs_da3_node_read_verify,
 336	.verify_write = xfs_da3_node_write_verify,
 337	.verify_struct = xfs_da3_node_verify_struct,
 338};
 339
 340static int
 341xfs_da3_node_set_type(
 342	struct xfs_trans	*tp,
 
 
 343	struct xfs_buf		*bp)
 344{
 345	struct xfs_da_blkinfo	*info = bp->b_addr;
 346
 347	switch (be16_to_cpu(info->magic)) {
 348	case XFS_DA_NODE_MAGIC:
 349	case XFS_DA3_NODE_MAGIC:
 350		xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DA_NODE_BUF);
 351		return 0;
 352	case XFS_ATTR_LEAF_MAGIC:
 353	case XFS_ATTR3_LEAF_MAGIC:
 354		xfs_trans_buf_set_type(tp, bp, XFS_BLFT_ATTR_LEAF_BUF);
 355		return 0;
 356	case XFS_DIR2_LEAFN_MAGIC:
 357	case XFS_DIR3_LEAFN_MAGIC:
 358		xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAFN_BUF);
 359		return 0;
 360	default:
 361		XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, tp->t_mountp,
 362				info, sizeof(*info));
 363		xfs_trans_brelse(tp, bp);
 
 364		return -EFSCORRUPTED;
 365	}
 366}
 367
 368int
 369xfs_da3_node_read(
 370	struct xfs_trans	*tp,
 371	struct xfs_inode	*dp,
 372	xfs_dablk_t		bno,
 373	struct xfs_buf		**bpp,
 374	int			whichfork)
 375{
 376	int			error;
 377
 378	error = xfs_da_read_buf(tp, dp, bno, 0, bpp, whichfork,
 379			&xfs_da3_node_buf_ops);
 380	if (error || !*bpp || !tp)
 381		return error;
 382	return xfs_da3_node_set_type(tp, *bpp);
 383}
 384
 385int
 386xfs_da3_node_read_mapped(
 387	struct xfs_trans	*tp,
 388	struct xfs_inode	*dp,
 389	xfs_daddr_t		mappedbno,
 390	struct xfs_buf		**bpp,
 391	int			whichfork)
 392{
 393	struct xfs_mount	*mp = dp->i_mount;
 394	int			error;
 395
 396	error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, mappedbno,
 397			XFS_FSB_TO_BB(mp, xfs_dabuf_nfsb(mp, whichfork)), 0,
 398			bpp, &xfs_da3_node_buf_ops);
 
 
 399	if (error || !*bpp)
 400		return error;
 401
 402	if (whichfork == XFS_ATTR_FORK)
 403		xfs_buf_set_ref(*bpp, XFS_ATTR_BTREE_REF);
 404	else
 405		xfs_buf_set_ref(*bpp, XFS_DIR_BTREE_REF);
 406
 407	if (!tp)
 408		return 0;
 409	return xfs_da3_node_set_type(tp, *bpp);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 410}
 411
 412/*========================================================================
 413 * Routines used for growing the Btree.
 414 *========================================================================*/
 415
 416/*
 417 * Create the initial contents of an intermediate node.
 418 */
 419int
 420xfs_da3_node_create(
 421	struct xfs_da_args	*args,
 422	xfs_dablk_t		blkno,
 423	int			level,
 424	struct xfs_buf		**bpp,
 425	int			whichfork)
 426{
 427	struct xfs_da_intnode	*node;
 428	struct xfs_trans	*tp = args->trans;
 429	struct xfs_mount	*mp = tp->t_mountp;
 430	struct xfs_da3_icnode_hdr ichdr = {0};
 431	struct xfs_buf		*bp;
 432	int			error;
 433	struct xfs_inode	*dp = args->dp;
 434
 435	trace_xfs_da_node_create(args);
 436	ASSERT(level <= XFS_DA_NODE_MAXDEPTH);
 437
 438	error = xfs_da_get_buf(tp, dp, blkno, &bp, whichfork);
 439	if (error)
 440		return error;
 441	bp->b_ops = &xfs_da3_node_buf_ops;
 442	xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DA_NODE_BUF);
 443	node = bp->b_addr;
 444
 445	if (xfs_sb_version_hascrc(&mp->m_sb)) {
 446		struct xfs_da3_node_hdr *hdr3 = bp->b_addr;
 447
 448		memset(hdr3, 0, sizeof(struct xfs_da3_node_hdr));
 449		ichdr.magic = XFS_DA3_NODE_MAGIC;
 450		hdr3->info.blkno = cpu_to_be64(bp->b_bn);
 451		hdr3->info.owner = cpu_to_be64(args->dp->i_ino);
 452		uuid_copy(&hdr3->info.uuid, &mp->m_sb.sb_meta_uuid);
 453	} else {
 454		ichdr.magic = XFS_DA_NODE_MAGIC;
 455	}
 456	ichdr.level = level;
 457
 458	xfs_da3_node_hdr_to_disk(dp->i_mount, node, &ichdr);
 459	xfs_trans_log_buf(tp, bp,
 460		XFS_DA_LOGRANGE(node, &node->hdr, args->geo->node_hdr_size));
 461
 462	*bpp = bp;
 463	return 0;
 464}
 465
 466/*
 467 * Split a leaf node, rebalance, then possibly split
 468 * intermediate nodes, rebalance, etc.
 469 */
 470int							/* error */
 471xfs_da3_split(
 472	struct xfs_da_state	*state)
 473{
 474	struct xfs_da_state_blk	*oldblk;
 475	struct xfs_da_state_blk	*newblk;
 476	struct xfs_da_state_blk	*addblk;
 477	struct xfs_da_intnode	*node;
 478	int			max;
 479	int			action = 0;
 480	int			error;
 481	int			i;
 482
 483	trace_xfs_da_split(state->args);
 484
 
 
 
 485	/*
 486	 * Walk back up the tree splitting/inserting/adjusting as necessary.
 487	 * If we need to insert and there isn't room, split the node, then
 488	 * decide which fragment to insert the new block from below into.
 489	 * Note that we may split the root this way, but we need more fixup.
 490	 */
 491	max = state->path.active - 1;
 492	ASSERT((max >= 0) && (max < XFS_DA_NODE_MAXDEPTH));
 493	ASSERT(state->path.blk[max].magic == XFS_ATTR_LEAF_MAGIC ||
 494	       state->path.blk[max].magic == XFS_DIR2_LEAFN_MAGIC);
 495
 496	addblk = &state->path.blk[max];		/* initial dummy value */
 497	for (i = max; (i >= 0) && addblk; state->path.active--, i--) {
 498		oldblk = &state->path.blk[i];
 499		newblk = &state->altpath.blk[i];
 500
 501		/*
 502		 * If a leaf node then
 503		 *     Allocate a new leaf node, then rebalance across them.
 504		 * else if an intermediate node then
 505		 *     We split on the last layer, must we split the node?
 506		 */
 507		switch (oldblk->magic) {
 508		case XFS_ATTR_LEAF_MAGIC:
 509			error = xfs_attr3_leaf_split(state, oldblk, newblk);
 510			if ((error != 0) && (error != -ENOSPC)) {
 511				return error;	/* GROT: attr is inconsistent */
 512			}
 513			if (!error) {
 514				addblk = newblk;
 515				break;
 516			}
 517			/*
 518			 * Entry wouldn't fit, split the leaf again. The new
 519			 * extrablk will be consumed by xfs_da3_node_split if
 520			 * the node is split.
 521			 */
 522			state->extravalid = 1;
 523			if (state->inleaf) {
 524				state->extraafter = 0;	/* before newblk */
 525				trace_xfs_attr_leaf_split_before(state->args);
 526				error = xfs_attr3_leaf_split(state, oldblk,
 527							    &state->extrablk);
 528			} else {
 529				state->extraafter = 1;	/* after newblk */
 530				trace_xfs_attr_leaf_split_after(state->args);
 531				error = xfs_attr3_leaf_split(state, newblk,
 532							    &state->extrablk);
 533			}
 534			if (error)
 535				return error;	/* GROT: attr inconsistent */
 536			addblk = newblk;
 537			break;
 538		case XFS_DIR2_LEAFN_MAGIC:
 539			error = xfs_dir2_leafn_split(state, oldblk, newblk);
 540			if (error)
 541				return error;
 542			addblk = newblk;
 543			break;
 544		case XFS_DA_NODE_MAGIC:
 545			error = xfs_da3_node_split(state, oldblk, newblk, addblk,
 546							 max - i, &action);
 547			addblk->bp = NULL;
 548			if (error)
 549				return error;	/* GROT: dir is inconsistent */
 550			/*
 551			 * Record the newly split block for the next time thru?
 552			 */
 553			if (action)
 554				addblk = newblk;
 555			else
 556				addblk = NULL;
 557			break;
 558		}
 559
 560		/*
 561		 * Update the btree to show the new hashval for this child.
 562		 */
 563		xfs_da3_fixhashpath(state, &state->path);
 564	}
 565	if (!addblk)
 566		return 0;
 567
 568	/*
 569	 * xfs_da3_node_split() should have consumed any extra blocks we added
 570	 * during a double leaf split in the attr fork. This is guaranteed as
 571	 * we can't be here if the attr fork only has a single leaf block.
 572	 */
 573	ASSERT(state->extravalid == 0 ||
 574	       state->path.blk[max].magic == XFS_DIR2_LEAFN_MAGIC);
 575
 576	/*
 577	 * Split the root node.
 578	 */
 579	ASSERT(state->path.active == 0);
 580	oldblk = &state->path.blk[0];
 581	error = xfs_da3_root_split(state, oldblk, addblk);
 582	if (error)
 583		goto out;
 584
 585	/*
 586	 * Update pointers to the node which used to be block 0 and just got
 587	 * bumped because of the addition of a new root node.  Note that the
 588	 * original block 0 could be at any position in the list of blocks in
 589	 * the tree.
 590	 *
 591	 * Note: the magic numbers and sibling pointers are in the same physical
 592	 * place for both v2 and v3 headers (by design). Hence it doesn't matter
 593	 * which version of the xfs_da_intnode structure we use here as the
 594	 * result will be the same using either structure.
 595	 */
 596	node = oldblk->bp->b_addr;
 597	if (node->hdr.info.forw) {
 598		if (be32_to_cpu(node->hdr.info.forw) != addblk->blkno) {
 599			xfs_buf_mark_corrupt(oldblk->bp);
 
 600			error = -EFSCORRUPTED;
 601			goto out;
 602		}
 603		node = addblk->bp->b_addr;
 604		node->hdr.info.back = cpu_to_be32(oldblk->blkno);
 605		xfs_trans_log_buf(state->args->trans, addblk->bp,
 606				  XFS_DA_LOGRANGE(node, &node->hdr.info,
 607				  sizeof(node->hdr.info)));
 608	}
 609	node = oldblk->bp->b_addr;
 610	if (node->hdr.info.back) {
 611		if (be32_to_cpu(node->hdr.info.back) != addblk->blkno) {
 612			xfs_buf_mark_corrupt(oldblk->bp);
 
 613			error = -EFSCORRUPTED;
 614			goto out;
 615		}
 616		node = addblk->bp->b_addr;
 617		node->hdr.info.forw = cpu_to_be32(oldblk->blkno);
 618		xfs_trans_log_buf(state->args->trans, addblk->bp,
 619				  XFS_DA_LOGRANGE(node, &node->hdr.info,
 620				  sizeof(node->hdr.info)));
 621	}
 622out:
 623	addblk->bp = NULL;
 624	return error;
 625}
 626
 627/*
 628 * Split the root.  We have to create a new root and point to the two
 629 * parts (the split old root) that we just created.  Copy block zero to
 630 * the EOF, extending the inode in process.
 631 */
 632STATIC int						/* error */
 633xfs_da3_root_split(
 634	struct xfs_da_state	*state,
 635	struct xfs_da_state_blk	*blk1,
 636	struct xfs_da_state_blk	*blk2)
 637{
 638	struct xfs_da_intnode	*node;
 639	struct xfs_da_intnode	*oldroot;
 640	struct xfs_da_node_entry *btree;
 641	struct xfs_da3_icnode_hdr nodehdr;
 642	struct xfs_da_args	*args;
 643	struct xfs_buf		*bp;
 644	struct xfs_inode	*dp;
 645	struct xfs_trans	*tp;
 646	struct xfs_dir2_leaf	*leaf;
 647	xfs_dablk_t		blkno;
 648	int			level;
 649	int			error;
 650	int			size;
 651
 652	trace_xfs_da_root_split(state->args);
 653
 654	/*
 655	 * Copy the existing (incorrect) block from the root node position
 656	 * to a free space somewhere.
 657	 */
 658	args = state->args;
 659	error = xfs_da_grow_inode(args, &blkno);
 660	if (error)
 661		return error;
 662
 663	dp = args->dp;
 664	tp = args->trans;
 665	error = xfs_da_get_buf(tp, dp, blkno, &bp, args->whichfork);
 666	if (error)
 667		return error;
 668	node = bp->b_addr;
 669	oldroot = blk1->bp->b_addr;
 670	if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC) ||
 671	    oldroot->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) {
 672		struct xfs_da3_icnode_hdr icnodehdr;
 673
 674		xfs_da3_node_hdr_from_disk(dp->i_mount, &icnodehdr, oldroot);
 675		btree = icnodehdr.btree;
 676		size = (int)((char *)&btree[icnodehdr.count] - (char *)oldroot);
 677		level = icnodehdr.level;
 678
 679		/*
 680		 * we are about to copy oldroot to bp, so set up the type
 681		 * of bp while we know exactly what it will be.
 682		 */
 683		xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DA_NODE_BUF);
 684	} else {
 685		struct xfs_dir3_icleaf_hdr leafhdr;
 686
 687		leaf = (xfs_dir2_leaf_t *)oldroot;
 688		xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr, leaf);
 689
 690		ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC ||
 691		       leafhdr.magic == XFS_DIR3_LEAFN_MAGIC);
 692		size = (int)((char *)&leafhdr.ents[leafhdr.count] -
 693			(char *)leaf);
 694		level = 0;
 695
 696		/*
 697		 * we are about to copy oldroot to bp, so set up the type
 698		 * of bp while we know exactly what it will be.
 699		 */
 700		xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAFN_BUF);
 701	}
 702
 703	/*
 704	 * we can copy most of the information in the node from one block to
 705	 * another, but for CRC enabled headers we have to make sure that the
 706	 * block specific identifiers are kept intact. We update the buffer
 707	 * directly for this.
 708	 */
 709	memcpy(node, oldroot, size);
 710	if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC) ||
 711	    oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) {
 712		struct xfs_da3_intnode *node3 = (struct xfs_da3_intnode *)node;
 713
 714		node3->hdr.info.blkno = cpu_to_be64(bp->b_bn);
 715	}
 716	xfs_trans_log_buf(tp, bp, 0, size - 1);
 717
 718	bp->b_ops = blk1->bp->b_ops;
 719	xfs_trans_buf_copy_type(bp, blk1->bp);
 
 720	blk1->bp = bp;
 721	blk1->blkno = blkno;
 722
 723	/*
 724	 * Set up the new root node.
 725	 */
 726	error = xfs_da3_node_create(args,
 727		(args->whichfork == XFS_DATA_FORK) ? args->geo->leafblk : 0,
 728		level + 1, &bp, args->whichfork);
 729	if (error)
 730		return error;
 731
 732	node = bp->b_addr;
 733	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, node);
 734	btree = nodehdr.btree;
 735	btree[0].hashval = cpu_to_be32(blk1->hashval);
 736	btree[0].before = cpu_to_be32(blk1->blkno);
 737	btree[1].hashval = cpu_to_be32(blk2->hashval);
 738	btree[1].before = cpu_to_be32(blk2->blkno);
 739	nodehdr.count = 2;
 740	xfs_da3_node_hdr_to_disk(dp->i_mount, node, &nodehdr);
 741
 742#ifdef DEBUG
 743	if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
 744	    oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) {
 745		ASSERT(blk1->blkno >= args->geo->leafblk &&
 746		       blk1->blkno < args->geo->freeblk);
 747		ASSERT(blk2->blkno >= args->geo->leafblk &&
 748		       blk2->blkno < args->geo->freeblk);
 749	}
 750#endif
 751
 752	/* Header is already logged by xfs_da_node_create */
 753	xfs_trans_log_buf(tp, bp,
 754		XFS_DA_LOGRANGE(node, btree, sizeof(xfs_da_node_entry_t) * 2));
 755
 756	return 0;
 757}
 758
 759/*
 760 * Split the node, rebalance, then add the new entry.
 761 */
 762STATIC int						/* error */
 763xfs_da3_node_split(
 764	struct xfs_da_state	*state,
 765	struct xfs_da_state_blk	*oldblk,
 766	struct xfs_da_state_blk	*newblk,
 767	struct xfs_da_state_blk	*addblk,
 768	int			treelevel,
 769	int			*result)
 770{
 771	struct xfs_da_intnode	*node;
 772	struct xfs_da3_icnode_hdr nodehdr;
 773	xfs_dablk_t		blkno;
 774	int			newcount;
 775	int			error;
 776	int			useextra;
 777	struct xfs_inode	*dp = state->args->dp;
 778
 779	trace_xfs_da_node_split(state->args);
 780
 781	node = oldblk->bp->b_addr;
 782	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, node);
 783
 784	/*
 785	 * With V2 dirs the extra block is data or freespace.
 786	 */
 787	useextra = state->extravalid && state->args->whichfork == XFS_ATTR_FORK;
 788	newcount = 1 + useextra;
 789	/*
 790	 * Do we have to split the node?
 791	 */
 792	if (nodehdr.count + newcount > state->args->geo->node_ents) {
 793		/*
 794		 * Allocate a new node, add to the doubly linked chain of
 795		 * nodes, then move some of our excess entries into it.
 796		 */
 797		error = xfs_da_grow_inode(state->args, &blkno);
 798		if (error)
 799			return error;	/* GROT: dir is inconsistent */
 800
 801		error = xfs_da3_node_create(state->args, blkno, treelevel,
 802					   &newblk->bp, state->args->whichfork);
 803		if (error)
 804			return error;	/* GROT: dir is inconsistent */
 805		newblk->blkno = blkno;
 806		newblk->magic = XFS_DA_NODE_MAGIC;
 807		xfs_da3_node_rebalance(state, oldblk, newblk);
 808		error = xfs_da3_blk_link(state, oldblk, newblk);
 809		if (error)
 810			return error;
 811		*result = 1;
 812	} else {
 813		*result = 0;
 814	}
 815
 816	/*
 817	 * Insert the new entry(s) into the correct block
 818	 * (updating last hashval in the process).
 819	 *
 820	 * xfs_da3_node_add() inserts BEFORE the given index,
 821	 * and as a result of using node_lookup_int() we always
 822	 * point to a valid entry (not after one), but a split
 823	 * operation always results in a new block whose hashvals
 824	 * FOLLOW the current block.
 825	 *
 826	 * If we had double-split op below us, then add the extra block too.
 827	 */
 828	node = oldblk->bp->b_addr;
 829	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, node);
 830	if (oldblk->index <= nodehdr.count) {
 831		oldblk->index++;
 832		xfs_da3_node_add(state, oldblk, addblk);
 833		if (useextra) {
 834			if (state->extraafter)
 835				oldblk->index++;
 836			xfs_da3_node_add(state, oldblk, &state->extrablk);
 837			state->extravalid = 0;
 838		}
 839	} else {
 840		newblk->index++;
 841		xfs_da3_node_add(state, newblk, addblk);
 842		if (useextra) {
 843			if (state->extraafter)
 844				newblk->index++;
 845			xfs_da3_node_add(state, newblk, &state->extrablk);
 846			state->extravalid = 0;
 847		}
 848	}
 849
 850	return 0;
 851}
 852
 853/*
 854 * Balance the btree elements between two intermediate nodes,
 855 * usually one full and one empty.
 856 *
 857 * NOTE: if blk2 is empty, then it will get the upper half of blk1.
 858 */
 859STATIC void
 860xfs_da3_node_rebalance(
 861	struct xfs_da_state	*state,
 862	struct xfs_da_state_blk	*blk1,
 863	struct xfs_da_state_blk	*blk2)
 864{
 865	struct xfs_da_intnode	*node1;
 866	struct xfs_da_intnode	*node2;
 867	struct xfs_da_intnode	*tmpnode;
 868	struct xfs_da_node_entry *btree1;
 869	struct xfs_da_node_entry *btree2;
 870	struct xfs_da_node_entry *btree_s;
 871	struct xfs_da_node_entry *btree_d;
 872	struct xfs_da3_icnode_hdr nodehdr1;
 873	struct xfs_da3_icnode_hdr nodehdr2;
 874	struct xfs_trans	*tp;
 875	int			count;
 876	int			tmp;
 877	int			swap = 0;
 878	struct xfs_inode	*dp = state->args->dp;
 879
 880	trace_xfs_da_node_rebalance(state->args);
 881
 882	node1 = blk1->bp->b_addr;
 883	node2 = blk2->bp->b_addr;
 884	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr1, node1);
 885	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr2, node2);
 886	btree1 = nodehdr1.btree;
 887	btree2 = nodehdr2.btree;
 888
 889	/*
 890	 * Figure out how many entries need to move, and in which direction.
 891	 * Swap the nodes around if that makes it simpler.
 892	 */
 893	if (nodehdr1.count > 0 && nodehdr2.count > 0 &&
 894	    ((be32_to_cpu(btree2[0].hashval) < be32_to_cpu(btree1[0].hashval)) ||
 895	     (be32_to_cpu(btree2[nodehdr2.count - 1].hashval) <
 896			be32_to_cpu(btree1[nodehdr1.count - 1].hashval)))) {
 897		tmpnode = node1;
 898		node1 = node2;
 899		node2 = tmpnode;
 900		xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr1, node1);
 901		xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr2, node2);
 902		btree1 = nodehdr1.btree;
 903		btree2 = nodehdr2.btree;
 904		swap = 1;
 905	}
 906
 907	count = (nodehdr1.count - nodehdr2.count) / 2;
 908	if (count == 0)
 909		return;
 910	tp = state->args->trans;
 911	/*
 912	 * Two cases: high-to-low and low-to-high.
 913	 */
 914	if (count > 0) {
 915		/*
 916		 * Move elements in node2 up to make a hole.
 917		 */
 918		tmp = nodehdr2.count;
 919		if (tmp > 0) {
 920			tmp *= (uint)sizeof(xfs_da_node_entry_t);
 921			btree_s = &btree2[0];
 922			btree_d = &btree2[count];
 923			memmove(btree_d, btree_s, tmp);
 924		}
 925
 926		/*
 927		 * Move the req'd B-tree elements from high in node1 to
 928		 * low in node2.
 929		 */
 930		nodehdr2.count += count;
 931		tmp = count * (uint)sizeof(xfs_da_node_entry_t);
 932		btree_s = &btree1[nodehdr1.count - count];
 933		btree_d = &btree2[0];
 934		memcpy(btree_d, btree_s, tmp);
 935		nodehdr1.count -= count;
 936	} else {
 937		/*
 938		 * Move the req'd B-tree elements from low in node2 to
 939		 * high in node1.
 940		 */
 941		count = -count;
 942		tmp = count * (uint)sizeof(xfs_da_node_entry_t);
 943		btree_s = &btree2[0];
 944		btree_d = &btree1[nodehdr1.count];
 945		memcpy(btree_d, btree_s, tmp);
 946		nodehdr1.count += count;
 947
 948		xfs_trans_log_buf(tp, blk1->bp,
 949			XFS_DA_LOGRANGE(node1, btree_d, tmp));
 950
 951		/*
 952		 * Move elements in node2 down to fill the hole.
 953		 */
 954		tmp  = nodehdr2.count - count;
 955		tmp *= (uint)sizeof(xfs_da_node_entry_t);
 956		btree_s = &btree2[count];
 957		btree_d = &btree2[0];
 958		memmove(btree_d, btree_s, tmp);
 959		nodehdr2.count -= count;
 960	}
 961
 962	/*
 963	 * Log header of node 1 and all current bits of node 2.
 964	 */
 965	xfs_da3_node_hdr_to_disk(dp->i_mount, node1, &nodehdr1);
 966	xfs_trans_log_buf(tp, blk1->bp,
 967		XFS_DA_LOGRANGE(node1, &node1->hdr,
 968				state->args->geo->node_hdr_size));
 969
 970	xfs_da3_node_hdr_to_disk(dp->i_mount, node2, &nodehdr2);
 971	xfs_trans_log_buf(tp, blk2->bp,
 972		XFS_DA_LOGRANGE(node2, &node2->hdr,
 973				state->args->geo->node_hdr_size +
 974				(sizeof(btree2[0]) * nodehdr2.count)));
 975
 976	/*
 977	 * Record the last hashval from each block for upward propagation.
 978	 * (note: don't use the swapped node pointers)
 979	 */
 980	if (swap) {
 981		node1 = blk1->bp->b_addr;
 982		node2 = blk2->bp->b_addr;
 983		xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr1, node1);
 984		xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr2, node2);
 985		btree1 = nodehdr1.btree;
 986		btree2 = nodehdr2.btree;
 987	}
 988	blk1->hashval = be32_to_cpu(btree1[nodehdr1.count - 1].hashval);
 989	blk2->hashval = be32_to_cpu(btree2[nodehdr2.count - 1].hashval);
 990
 991	/*
 992	 * Adjust the expected index for insertion.
 993	 */
 994	if (blk1->index >= nodehdr1.count) {
 995		blk2->index = blk1->index - nodehdr1.count;
 996		blk1->index = nodehdr1.count + 1;	/* make it invalid */
 997	}
 998}
 999
1000/*
1001 * Add a new entry to an intermediate node.
1002 */
1003STATIC void
1004xfs_da3_node_add(
1005	struct xfs_da_state	*state,
1006	struct xfs_da_state_blk	*oldblk,
1007	struct xfs_da_state_blk	*newblk)
1008{
1009	struct xfs_da_intnode	*node;
1010	struct xfs_da3_icnode_hdr nodehdr;
1011	struct xfs_da_node_entry *btree;
1012	int			tmp;
1013	struct xfs_inode	*dp = state->args->dp;
1014
1015	trace_xfs_da_node_add(state->args);
1016
1017	node = oldblk->bp->b_addr;
1018	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, node);
1019	btree = nodehdr.btree;
1020
1021	ASSERT(oldblk->index >= 0 && oldblk->index <= nodehdr.count);
1022	ASSERT(newblk->blkno != 0);
1023	if (state->args->whichfork == XFS_DATA_FORK)
1024		ASSERT(newblk->blkno >= state->args->geo->leafblk &&
1025		       newblk->blkno < state->args->geo->freeblk);
1026
1027	/*
1028	 * We may need to make some room before we insert the new node.
1029	 */
1030	tmp = 0;
1031	if (oldblk->index < nodehdr.count) {
1032		tmp = (nodehdr.count - oldblk->index) * (uint)sizeof(*btree);
1033		memmove(&btree[oldblk->index + 1], &btree[oldblk->index], tmp);
1034	}
1035	btree[oldblk->index].hashval = cpu_to_be32(newblk->hashval);
1036	btree[oldblk->index].before = cpu_to_be32(newblk->blkno);
1037	xfs_trans_log_buf(state->args->trans, oldblk->bp,
1038		XFS_DA_LOGRANGE(node, &btree[oldblk->index],
1039				tmp + sizeof(*btree)));
1040
1041	nodehdr.count += 1;
1042	xfs_da3_node_hdr_to_disk(dp->i_mount, node, &nodehdr);
1043	xfs_trans_log_buf(state->args->trans, oldblk->bp,
1044		XFS_DA_LOGRANGE(node, &node->hdr,
1045				state->args->geo->node_hdr_size));
1046
1047	/*
1048	 * Copy the last hash value from the oldblk to propagate upwards.
1049	 */
1050	oldblk->hashval = be32_to_cpu(btree[nodehdr.count - 1].hashval);
1051}
1052
1053/*========================================================================
1054 * Routines used for shrinking the Btree.
1055 *========================================================================*/
1056
1057/*
1058 * Deallocate an empty leaf node, remove it from its parent,
1059 * possibly deallocating that block, etc...
1060 */
1061int
1062xfs_da3_join(
1063	struct xfs_da_state	*state)
1064{
1065	struct xfs_da_state_blk	*drop_blk;
1066	struct xfs_da_state_blk	*save_blk;
1067	int			action = 0;
1068	int			error;
1069
1070	trace_xfs_da_join(state->args);
1071
1072	drop_blk = &state->path.blk[ state->path.active-1 ];
1073	save_blk = &state->altpath.blk[ state->path.active-1 ];
1074	ASSERT(state->path.blk[0].magic == XFS_DA_NODE_MAGIC);
1075	ASSERT(drop_blk->magic == XFS_ATTR_LEAF_MAGIC ||
1076	       drop_blk->magic == XFS_DIR2_LEAFN_MAGIC);
1077
1078	/*
1079	 * Walk back up the tree joining/deallocating as necessary.
1080	 * When we stop dropping blocks, break out.
1081	 */
1082	for (  ; state->path.active >= 2; drop_blk--, save_blk--,
1083		 state->path.active--) {
1084		/*
1085		 * See if we can combine the block with a neighbor.
1086		 *   (action == 0) => no options, just leave
1087		 *   (action == 1) => coalesce, then unlink
1088		 *   (action == 2) => block empty, unlink it
1089		 */
1090		switch (drop_blk->magic) {
1091		case XFS_ATTR_LEAF_MAGIC:
1092			error = xfs_attr3_leaf_toosmall(state, &action);
1093			if (error)
1094				return error;
1095			if (action == 0)
1096				return 0;
1097			xfs_attr3_leaf_unbalance(state, drop_blk, save_blk);
1098			break;
1099		case XFS_DIR2_LEAFN_MAGIC:
1100			error = xfs_dir2_leafn_toosmall(state, &action);
1101			if (error)
1102				return error;
1103			if (action == 0)
1104				return 0;
1105			xfs_dir2_leafn_unbalance(state, drop_blk, save_blk);
1106			break;
1107		case XFS_DA_NODE_MAGIC:
1108			/*
1109			 * Remove the offending node, fixup hashvals,
1110			 * check for a toosmall neighbor.
1111			 */
1112			xfs_da3_node_remove(state, drop_blk);
1113			xfs_da3_fixhashpath(state, &state->path);
1114			error = xfs_da3_node_toosmall(state, &action);
1115			if (error)
1116				return error;
1117			if (action == 0)
1118				return 0;
1119			xfs_da3_node_unbalance(state, drop_blk, save_blk);
1120			break;
1121		}
1122		xfs_da3_fixhashpath(state, &state->altpath);
1123		error = xfs_da3_blk_unlink(state, drop_blk, save_blk);
1124		xfs_da_state_kill_altpath(state);
1125		if (error)
1126			return error;
1127		error = xfs_da_shrink_inode(state->args, drop_blk->blkno,
1128							 drop_blk->bp);
1129		drop_blk->bp = NULL;
1130		if (error)
1131			return error;
1132	}
1133	/*
1134	 * We joined all the way to the top.  If it turns out that
1135	 * we only have one entry in the root, make the child block
1136	 * the new root.
1137	 */
1138	xfs_da3_node_remove(state, drop_blk);
1139	xfs_da3_fixhashpath(state, &state->path);
1140	error = xfs_da3_root_join(state, &state->path.blk[0]);
1141	return error;
1142}
1143
1144#ifdef	DEBUG
1145static void
1146xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkinfo *blkinfo, __u16 level)
1147{
1148	__be16	magic = blkinfo->magic;
1149
1150	if (level == 1) {
1151		ASSERT(magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
1152		       magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) ||
1153		       magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC) ||
1154		       magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC));
1155	} else {
1156		ASSERT(magic == cpu_to_be16(XFS_DA_NODE_MAGIC) ||
1157		       magic == cpu_to_be16(XFS_DA3_NODE_MAGIC));
1158	}
1159	ASSERT(!blkinfo->forw);
1160	ASSERT(!blkinfo->back);
1161}
1162#else	/* !DEBUG */
1163#define	xfs_da_blkinfo_onlychild_validate(blkinfo, level)
1164#endif	/* !DEBUG */
1165
1166/*
1167 * We have only one entry in the root.  Copy the only remaining child of
1168 * the old root to block 0 as the new root node.
1169 */
1170STATIC int
1171xfs_da3_root_join(
1172	struct xfs_da_state	*state,
1173	struct xfs_da_state_blk	*root_blk)
1174{
1175	struct xfs_da_intnode	*oldroot;
1176	struct xfs_da_args	*args;
1177	xfs_dablk_t		child;
1178	struct xfs_buf		*bp;
1179	struct xfs_da3_icnode_hdr oldroothdr;
1180	int			error;
1181	struct xfs_inode	*dp = state->args->dp;
1182
1183	trace_xfs_da_root_join(state->args);
1184
1185	ASSERT(root_blk->magic == XFS_DA_NODE_MAGIC);
1186
1187	args = state->args;
1188	oldroot = root_blk->bp->b_addr;
1189	xfs_da3_node_hdr_from_disk(dp->i_mount, &oldroothdr, oldroot);
1190	ASSERT(oldroothdr.forw == 0);
1191	ASSERT(oldroothdr.back == 0);
1192
1193	/*
1194	 * If the root has more than one child, then don't do anything.
1195	 */
1196	if (oldroothdr.count > 1)
1197		return 0;
1198
1199	/*
1200	 * Read in the (only) child block, then copy those bytes into
1201	 * the root block's buffer and free the original child block.
1202	 */
1203	child = be32_to_cpu(oldroothdr.btree[0].before);
1204	ASSERT(child != 0);
1205	error = xfs_da3_node_read(args->trans, dp, child, &bp, args->whichfork);
1206	if (error)
1207		return error;
1208	xfs_da_blkinfo_onlychild_validate(bp->b_addr, oldroothdr.level);
1209
1210	/*
1211	 * This could be copying a leaf back into the root block in the case of
1212	 * there only being a single leaf block left in the tree. Hence we have
1213	 * to update the b_ops pointer as well to match the buffer type change
1214	 * that could occur. For dir3 blocks we also need to update the block
1215	 * number in the buffer header.
1216	 */
1217	memcpy(root_blk->bp->b_addr, bp->b_addr, args->geo->blksize);
1218	root_blk->bp->b_ops = bp->b_ops;
1219	xfs_trans_buf_copy_type(root_blk->bp, bp);
1220	if (oldroothdr.magic == XFS_DA3_NODE_MAGIC) {
1221		struct xfs_da3_blkinfo *da3 = root_blk->bp->b_addr;
1222		da3->blkno = cpu_to_be64(root_blk->bp->b_bn);
1223	}
1224	xfs_trans_log_buf(args->trans, root_blk->bp, 0,
1225			  args->geo->blksize - 1);
 
 
 
1226	error = xfs_da_shrink_inode(args, child, bp);
1227	return error;
1228}
1229
1230/*
1231 * Check a node block and its neighbors to see if the block should be
1232 * collapsed into one or the other neighbor.  Always keep the block
1233 * with the smaller block number.
1234 * If the current block is over 50% full, don't try to join it, return 0.
1235 * If the block is empty, fill in the state structure and return 2.
1236 * If it can be collapsed, fill in the state structure and return 1.
1237 * If nothing can be done, return 0.
1238 */
1239STATIC int
1240xfs_da3_node_toosmall(
1241	struct xfs_da_state	*state,
1242	int			*action)
1243{
1244	struct xfs_da_intnode	*node;
1245	struct xfs_da_state_blk	*blk;
1246	struct xfs_da_blkinfo	*info;
1247	xfs_dablk_t		blkno;
1248	struct xfs_buf		*bp;
1249	struct xfs_da3_icnode_hdr nodehdr;
1250	int			count;
1251	int			forward;
1252	int			error;
1253	int			retval;
1254	int			i;
1255	struct xfs_inode	*dp = state->args->dp;
1256
1257	trace_xfs_da_node_toosmall(state->args);
1258
1259	/*
1260	 * Check for the degenerate case of the block being over 50% full.
1261	 * If so, it's not worth even looking to see if we might be able
1262	 * to coalesce with a sibling.
1263	 */
1264	blk = &state->path.blk[ state->path.active-1 ];
1265	info = blk->bp->b_addr;
1266	node = (xfs_da_intnode_t *)info;
1267	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, node);
1268	if (nodehdr.count > (state->args->geo->node_ents >> 1)) {
1269		*action = 0;	/* blk over 50%, don't try to join */
1270		return 0;	/* blk over 50%, don't try to join */
1271	}
1272
1273	/*
1274	 * Check for the degenerate case of the block being empty.
1275	 * If the block is empty, we'll simply delete it, no need to
1276	 * coalesce it with a sibling block.  We choose (arbitrarily)
1277	 * to merge with the forward block unless it is NULL.
1278	 */
1279	if (nodehdr.count == 0) {
1280		/*
1281		 * Make altpath point to the block we want to keep and
1282		 * path point to the block we want to drop (this one).
1283		 */
1284		forward = (info->forw != 0);
1285		memcpy(&state->altpath, &state->path, sizeof(state->path));
1286		error = xfs_da3_path_shift(state, &state->altpath, forward,
1287						 0, &retval);
1288		if (error)
1289			return error;
1290		if (retval) {
1291			*action = 0;
1292		} else {
1293			*action = 2;
1294		}
1295		return 0;
1296	}
1297
1298	/*
1299	 * Examine each sibling block to see if we can coalesce with
1300	 * at least 25% free space to spare.  We need to figure out
1301	 * whether to merge with the forward or the backward block.
1302	 * We prefer coalescing with the lower numbered sibling so as
1303	 * to shrink a directory over time.
1304	 */
1305	count  = state->args->geo->node_ents;
1306	count -= state->args->geo->node_ents >> 2;
1307	count -= nodehdr.count;
1308
1309	/* start with smaller blk num */
1310	forward = nodehdr.forw < nodehdr.back;
1311	for (i = 0; i < 2; forward = !forward, i++) {
1312		struct xfs_da3_icnode_hdr thdr;
1313		if (forward)
1314			blkno = nodehdr.forw;
1315		else
1316			blkno = nodehdr.back;
1317		if (blkno == 0)
1318			continue;
1319		error = xfs_da3_node_read(state->args->trans, dp, blkno, &bp,
1320				state->args->whichfork);
1321		if (error)
1322			return error;
1323
1324		node = bp->b_addr;
1325		xfs_da3_node_hdr_from_disk(dp->i_mount, &thdr, node);
1326		xfs_trans_brelse(state->args->trans, bp);
1327
1328		if (count - thdr.count >= 0)
1329			break;	/* fits with at least 25% to spare */
1330	}
1331	if (i >= 2) {
1332		*action = 0;
1333		return 0;
1334	}
1335
1336	/*
1337	 * Make altpath point to the block we want to keep (the lower
1338	 * numbered block) and path point to the block we want to drop.
1339	 */
1340	memcpy(&state->altpath, &state->path, sizeof(state->path));
1341	if (blkno < blk->blkno) {
1342		error = xfs_da3_path_shift(state, &state->altpath, forward,
1343						 0, &retval);
1344	} else {
1345		error = xfs_da3_path_shift(state, &state->path, forward,
1346						 0, &retval);
1347	}
1348	if (error)
1349		return error;
1350	if (retval) {
1351		*action = 0;
1352		return 0;
1353	}
1354	*action = 1;
1355	return 0;
1356}
1357
1358/*
1359 * Pick up the last hashvalue from an intermediate node.
1360 */
1361STATIC uint
1362xfs_da3_node_lasthash(
1363	struct xfs_inode	*dp,
1364	struct xfs_buf		*bp,
1365	int			*count)
1366{
1367	struct xfs_da3_icnode_hdr nodehdr;
1368
1369	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, bp->b_addr);
1370	if (count)
1371		*count = nodehdr.count;
1372	if (!nodehdr.count)
1373		return 0;
1374	return be32_to_cpu(nodehdr.btree[nodehdr.count - 1].hashval);
1375}
1376
1377/*
1378 * Walk back up the tree adjusting hash values as necessary,
1379 * when we stop making changes, return.
1380 */
1381void
1382xfs_da3_fixhashpath(
1383	struct xfs_da_state	*state,
1384	struct xfs_da_state_path *path)
1385{
1386	struct xfs_da_state_blk	*blk;
1387	struct xfs_da_intnode	*node;
1388	struct xfs_da_node_entry *btree;
1389	xfs_dahash_t		lasthash=0;
1390	int			level;
1391	int			count;
1392	struct xfs_inode	*dp = state->args->dp;
1393
1394	trace_xfs_da_fixhashpath(state->args);
1395
1396	level = path->active-1;
1397	blk = &path->blk[ level ];
1398	switch (blk->magic) {
1399	case XFS_ATTR_LEAF_MAGIC:
1400		lasthash = xfs_attr_leaf_lasthash(blk->bp, &count);
1401		if (count == 0)
1402			return;
1403		break;
1404	case XFS_DIR2_LEAFN_MAGIC:
1405		lasthash = xfs_dir2_leaf_lasthash(dp, blk->bp, &count);
1406		if (count == 0)
1407			return;
1408		break;
1409	case XFS_DA_NODE_MAGIC:
1410		lasthash = xfs_da3_node_lasthash(dp, blk->bp, &count);
1411		if (count == 0)
1412			return;
1413		break;
1414	}
1415	for (blk--, level--; level >= 0; blk--, level--) {
1416		struct xfs_da3_icnode_hdr nodehdr;
1417
1418		node = blk->bp->b_addr;
1419		xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, node);
1420		btree = nodehdr.btree;
1421		if (be32_to_cpu(btree[blk->index].hashval) == lasthash)
1422			break;
1423		blk->hashval = lasthash;
1424		btree[blk->index].hashval = cpu_to_be32(lasthash);
1425		xfs_trans_log_buf(state->args->trans, blk->bp,
1426				  XFS_DA_LOGRANGE(node, &btree[blk->index],
1427						  sizeof(*btree)));
1428
1429		lasthash = be32_to_cpu(btree[nodehdr.count - 1].hashval);
1430	}
1431}
1432
1433/*
1434 * Remove an entry from an intermediate node.
1435 */
1436STATIC void
1437xfs_da3_node_remove(
1438	struct xfs_da_state	*state,
1439	struct xfs_da_state_blk	*drop_blk)
1440{
1441	struct xfs_da_intnode	*node;
1442	struct xfs_da3_icnode_hdr nodehdr;
1443	struct xfs_da_node_entry *btree;
1444	int			index;
1445	int			tmp;
1446	struct xfs_inode	*dp = state->args->dp;
1447
1448	trace_xfs_da_node_remove(state->args);
1449
1450	node = drop_blk->bp->b_addr;
1451	xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, node);
1452	ASSERT(drop_blk->index < nodehdr.count);
1453	ASSERT(drop_blk->index >= 0);
1454
1455	/*
1456	 * Copy over the offending entry, or just zero it out.
1457	 */
1458	index = drop_blk->index;
1459	btree = nodehdr.btree;
1460	if (index < nodehdr.count - 1) {
1461		tmp  = nodehdr.count - index - 1;
1462		tmp *= (uint)sizeof(xfs_da_node_entry_t);
1463		memmove(&btree[index], &btree[index + 1], tmp);
1464		xfs_trans_log_buf(state->args->trans, drop_blk->bp,
1465		    XFS_DA_LOGRANGE(node, &btree[index], tmp));
1466		index = nodehdr.count - 1;
1467	}
1468	memset(&btree[index], 0, sizeof(xfs_da_node_entry_t));
1469	xfs_trans_log_buf(state->args->trans, drop_blk->bp,
1470	    XFS_DA_LOGRANGE(node, &btree[index], sizeof(btree[index])));
1471	nodehdr.count -= 1;
1472	xfs_da3_node_hdr_to_disk(dp->i_mount, node, &nodehdr);
1473	xfs_trans_log_buf(state->args->trans, drop_blk->bp,
1474	    XFS_DA_LOGRANGE(node, &node->hdr, state->args->geo->node_hdr_size));
1475
1476	/*
1477	 * Copy the last hash value from the block to propagate upwards.
1478	 */
1479	drop_blk->hashval = be32_to_cpu(btree[index - 1].hashval);
1480}
1481
1482/*
1483 * Unbalance the elements between two intermediate nodes,
1484 * move all Btree elements from one node into another.
1485 */
1486STATIC void
1487xfs_da3_node_unbalance(
1488	struct xfs_da_state	*state,
1489	struct xfs_da_state_blk	*drop_blk,
1490	struct xfs_da_state_blk	*save_blk)
1491{
1492	struct xfs_da_intnode	*drop_node;
1493	struct xfs_da_intnode	*save_node;
1494	struct xfs_da_node_entry *drop_btree;
1495	struct xfs_da_node_entry *save_btree;
1496	struct xfs_da3_icnode_hdr drop_hdr;
1497	struct xfs_da3_icnode_hdr save_hdr;
1498	struct xfs_trans	*tp;
1499	int			sindex;
1500	int			tmp;
1501	struct xfs_inode	*dp = state->args->dp;
1502
1503	trace_xfs_da_node_unbalance(state->args);
1504
1505	drop_node = drop_blk->bp->b_addr;
1506	save_node = save_blk->bp->b_addr;
1507	xfs_da3_node_hdr_from_disk(dp->i_mount, &drop_hdr, drop_node);
1508	xfs_da3_node_hdr_from_disk(dp->i_mount, &save_hdr, save_node);
1509	drop_btree = drop_hdr.btree;
1510	save_btree = save_hdr.btree;
1511	tp = state->args->trans;
1512
1513	/*
1514	 * If the dying block has lower hashvals, then move all the
1515	 * elements in the remaining block up to make a hole.
1516	 */
1517	if ((be32_to_cpu(drop_btree[0].hashval) <
1518			be32_to_cpu(save_btree[0].hashval)) ||
1519	    (be32_to_cpu(drop_btree[drop_hdr.count - 1].hashval) <
1520			be32_to_cpu(save_btree[save_hdr.count - 1].hashval))) {
1521		/* XXX: check this - is memmove dst correct? */
1522		tmp = save_hdr.count * sizeof(xfs_da_node_entry_t);
1523		memmove(&save_btree[drop_hdr.count], &save_btree[0], tmp);
1524
1525		sindex = 0;
1526		xfs_trans_log_buf(tp, save_blk->bp,
1527			XFS_DA_LOGRANGE(save_node, &save_btree[0],
1528				(save_hdr.count + drop_hdr.count) *
1529						sizeof(xfs_da_node_entry_t)));
1530	} else {
1531		sindex = save_hdr.count;
1532		xfs_trans_log_buf(tp, save_blk->bp,
1533			XFS_DA_LOGRANGE(save_node, &save_btree[sindex],
1534				drop_hdr.count * sizeof(xfs_da_node_entry_t)));
1535	}
1536
1537	/*
1538	 * Move all the B-tree elements from drop_blk to save_blk.
1539	 */
1540	tmp = drop_hdr.count * (uint)sizeof(xfs_da_node_entry_t);
1541	memcpy(&save_btree[sindex], &drop_btree[0], tmp);
1542	save_hdr.count += drop_hdr.count;
1543
1544	xfs_da3_node_hdr_to_disk(dp->i_mount, save_node, &save_hdr);
1545	xfs_trans_log_buf(tp, save_blk->bp,
1546		XFS_DA_LOGRANGE(save_node, &save_node->hdr,
1547				state->args->geo->node_hdr_size));
1548
1549	/*
1550	 * Save the last hashval in the remaining block for upward propagation.
1551	 */
1552	save_blk->hashval = be32_to_cpu(save_btree[save_hdr.count - 1].hashval);
1553}
1554
1555/*========================================================================
1556 * Routines used for finding things in the Btree.
1557 *========================================================================*/
1558
1559/*
1560 * Walk down the Btree looking for a particular filename, filling
1561 * in the state structure as we go.
1562 *
1563 * We will set the state structure to point to each of the elements
1564 * in each of the nodes where either the hashval is or should be.
1565 *
1566 * We support duplicate hashval's so for each entry in the current
1567 * node that could contain the desired hashval, descend.  This is a
1568 * pruned depth-first tree search.
1569 */
1570int							/* error */
1571xfs_da3_node_lookup_int(
1572	struct xfs_da_state	*state,
1573	int			*result)
1574{
1575	struct xfs_da_state_blk	*blk;
1576	struct xfs_da_blkinfo	*curr;
1577	struct xfs_da_intnode	*node;
1578	struct xfs_da_node_entry *btree;
1579	struct xfs_da3_icnode_hdr nodehdr;
1580	struct xfs_da_args	*args;
1581	xfs_dablk_t		blkno;
1582	xfs_dahash_t		hashval;
1583	xfs_dahash_t		btreehashval;
1584	int			probe;
1585	int			span;
1586	int			max;
1587	int			error;
1588	int			retval;
1589	unsigned int		expected_level = 0;
1590	uint16_t		magic;
1591	struct xfs_inode	*dp = state->args->dp;
1592
1593	args = state->args;
1594
1595	/*
1596	 * Descend thru the B-tree searching each level for the right
1597	 * node to use, until the right hashval is found.
1598	 */
1599	blkno = args->geo->leafblk;
1600	for (blk = &state->path.blk[0], state->path.active = 1;
1601			 state->path.active <= XFS_DA_NODE_MAXDEPTH;
1602			 blk++, state->path.active++) {
1603		/*
1604		 * Read the next node down in the tree.
1605		 */
1606		blk->blkno = blkno;
1607		error = xfs_da3_node_read(args->trans, args->dp, blkno,
1608					&blk->bp, args->whichfork);
1609		if (error) {
1610			blk->blkno = 0;
1611			state->path.active--;
1612			return error;
1613		}
1614		curr = blk->bp->b_addr;
1615		magic = be16_to_cpu(curr->magic);
1616
1617		if (magic == XFS_ATTR_LEAF_MAGIC ||
1618		    magic == XFS_ATTR3_LEAF_MAGIC) {
1619			blk->magic = XFS_ATTR_LEAF_MAGIC;
1620			blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL);
1621			break;
1622		}
1623
1624		if (magic == XFS_DIR2_LEAFN_MAGIC ||
1625		    magic == XFS_DIR3_LEAFN_MAGIC) {
1626			blk->magic = XFS_DIR2_LEAFN_MAGIC;
1627			blk->hashval = xfs_dir2_leaf_lasthash(args->dp,
1628							      blk->bp, NULL);
1629			break;
1630		}
1631
1632		if (magic != XFS_DA_NODE_MAGIC && magic != XFS_DA3_NODE_MAGIC) {
1633			xfs_buf_mark_corrupt(blk->bp);
 
1634			return -EFSCORRUPTED;
1635		}
1636
1637		blk->magic = XFS_DA_NODE_MAGIC;
1638
1639		/*
1640		 * Search an intermediate node for a match.
1641		 */
1642		node = blk->bp->b_addr;
1643		xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr, node);
1644		btree = nodehdr.btree;
1645
1646		/* Tree taller than we can handle; bail out! */
1647		if (nodehdr.level >= XFS_DA_NODE_MAXDEPTH) {
1648			xfs_buf_mark_corrupt(blk->bp);
 
1649			return -EFSCORRUPTED;
1650		}
1651
1652		/* Check the level from the root. */
1653		if (blkno == args->geo->leafblk)
1654			expected_level = nodehdr.level - 1;
1655		else if (expected_level != nodehdr.level) {
1656			xfs_buf_mark_corrupt(blk->bp);
 
1657			return -EFSCORRUPTED;
1658		} else
1659			expected_level--;
1660
1661		max = nodehdr.count;
1662		blk->hashval = be32_to_cpu(btree[max - 1].hashval);
1663
1664		/*
1665		 * Binary search.  (note: small blocks will skip loop)
1666		 */
1667		probe = span = max / 2;
1668		hashval = args->hashval;
1669		while (span > 4) {
1670			span /= 2;
1671			btreehashval = be32_to_cpu(btree[probe].hashval);
1672			if (btreehashval < hashval)
1673				probe += span;
1674			else if (btreehashval > hashval)
1675				probe -= span;
1676			else
1677				break;
1678		}
1679		ASSERT((probe >= 0) && (probe < max));
1680		ASSERT((span <= 4) ||
1681			(be32_to_cpu(btree[probe].hashval) == hashval));
1682
1683		/*
1684		 * Since we may have duplicate hashval's, find the first
1685		 * matching hashval in the node.
1686		 */
1687		while (probe > 0 &&
1688		       be32_to_cpu(btree[probe].hashval) >= hashval) {
1689			probe--;
1690		}
1691		while (probe < max &&
1692		       be32_to_cpu(btree[probe].hashval) < hashval) {
1693			probe++;
1694		}
1695
1696		/*
1697		 * Pick the right block to descend on.
1698		 */
1699		if (probe == max) {
1700			blk->index = max - 1;
1701			blkno = be32_to_cpu(btree[max - 1].before);
1702		} else {
1703			blk->index = probe;
1704			blkno = be32_to_cpu(btree[probe].before);
1705		}
1706
1707		/* We can't point back to the root. */
1708		if (XFS_IS_CORRUPT(dp->i_mount, blkno == args->geo->leafblk))
 
1709			return -EFSCORRUPTED;
 
1710	}
1711
1712	if (XFS_IS_CORRUPT(dp->i_mount, expected_level != 0))
 
1713		return -EFSCORRUPTED;
 
1714
1715	/*
1716	 * A leaf block that ends in the hashval that we are interested in
1717	 * (final hashval == search hashval) means that the next block may
1718	 * contain more entries with the same hashval, shift upward to the
1719	 * next leaf and keep searching.
1720	 */
1721	for (;;) {
1722		if (blk->magic == XFS_DIR2_LEAFN_MAGIC) {
1723			retval = xfs_dir2_leafn_lookup_int(blk->bp, args,
1724							&blk->index, state);
1725		} else if (blk->magic == XFS_ATTR_LEAF_MAGIC) {
1726			retval = xfs_attr3_leaf_lookup_int(blk->bp, args);
1727			blk->index = args->index;
1728			args->blkno = blk->blkno;
1729		} else {
1730			ASSERT(0);
 
1731			return -EFSCORRUPTED;
1732		}
1733		if (((retval == -ENOENT) || (retval == -ENOATTR)) &&
1734		    (blk->hashval == args->hashval)) {
1735			error = xfs_da3_path_shift(state, &state->path, 1, 1,
1736							 &retval);
1737			if (error)
1738				return error;
1739			if (retval == 0) {
1740				continue;
1741			} else if (blk->magic == XFS_ATTR_LEAF_MAGIC) {
1742				/* path_shift() gives ENOENT */
1743				retval = -ENOATTR;
1744			}
1745		}
1746		break;
1747	}
1748	*result = retval;
1749	return 0;
1750}
1751
1752/*========================================================================
1753 * Utility routines.
1754 *========================================================================*/
1755
1756/*
1757 * Compare two intermediate nodes for "order".
1758 */
1759STATIC int
1760xfs_da3_node_order(
1761	struct xfs_inode *dp,
1762	struct xfs_buf	*node1_bp,
1763	struct xfs_buf	*node2_bp)
1764{
1765	struct xfs_da_intnode	*node1;
1766	struct xfs_da_intnode	*node2;
1767	struct xfs_da_node_entry *btree1;
1768	struct xfs_da_node_entry *btree2;
1769	struct xfs_da3_icnode_hdr node1hdr;
1770	struct xfs_da3_icnode_hdr node2hdr;
1771
1772	node1 = node1_bp->b_addr;
1773	node2 = node2_bp->b_addr;
1774	xfs_da3_node_hdr_from_disk(dp->i_mount, &node1hdr, node1);
1775	xfs_da3_node_hdr_from_disk(dp->i_mount, &node2hdr, node2);
1776	btree1 = node1hdr.btree;
1777	btree2 = node2hdr.btree;
1778
1779	if (node1hdr.count > 0 && node2hdr.count > 0 &&
1780	    ((be32_to_cpu(btree2[0].hashval) < be32_to_cpu(btree1[0].hashval)) ||
1781	     (be32_to_cpu(btree2[node2hdr.count - 1].hashval) <
1782	      be32_to_cpu(btree1[node1hdr.count - 1].hashval)))) {
1783		return 1;
1784	}
1785	return 0;
1786}
1787
1788/*
1789 * Link a new block into a doubly linked list of blocks (of whatever type).
1790 */
1791int							/* error */
1792xfs_da3_blk_link(
1793	struct xfs_da_state	*state,
1794	struct xfs_da_state_blk	*old_blk,
1795	struct xfs_da_state_blk	*new_blk)
1796{
1797	struct xfs_da_blkinfo	*old_info;
1798	struct xfs_da_blkinfo	*new_info;
1799	struct xfs_da_blkinfo	*tmp_info;
1800	struct xfs_da_args	*args;
1801	struct xfs_buf		*bp;
1802	int			before = 0;
1803	int			error;
1804	struct xfs_inode	*dp = state->args->dp;
1805
1806	/*
1807	 * Set up environment.
1808	 */
1809	args = state->args;
1810	ASSERT(args != NULL);
1811	old_info = old_blk->bp->b_addr;
1812	new_info = new_blk->bp->b_addr;
1813	ASSERT(old_blk->magic == XFS_DA_NODE_MAGIC ||
1814	       old_blk->magic == XFS_DIR2_LEAFN_MAGIC ||
1815	       old_blk->magic == XFS_ATTR_LEAF_MAGIC);
1816
1817	switch (old_blk->magic) {
1818	case XFS_ATTR_LEAF_MAGIC:
1819		before = xfs_attr_leaf_order(old_blk->bp, new_blk->bp);
1820		break;
1821	case XFS_DIR2_LEAFN_MAGIC:
1822		before = xfs_dir2_leafn_order(dp, old_blk->bp, new_blk->bp);
1823		break;
1824	case XFS_DA_NODE_MAGIC:
1825		before = xfs_da3_node_order(dp, old_blk->bp, new_blk->bp);
1826		break;
1827	}
1828
1829	/*
1830	 * Link blocks in appropriate order.
1831	 */
1832	if (before) {
1833		/*
1834		 * Link new block in before existing block.
1835		 */
1836		trace_xfs_da_link_before(args);
1837		new_info->forw = cpu_to_be32(old_blk->blkno);
1838		new_info->back = old_info->back;
1839		if (old_info->back) {
1840			error = xfs_da3_node_read(args->trans, dp,
1841						be32_to_cpu(old_info->back),
1842						&bp, args->whichfork);
1843			if (error)
1844				return error;
1845			ASSERT(bp != NULL);
1846			tmp_info = bp->b_addr;
1847			ASSERT(tmp_info->magic == old_info->magic);
1848			ASSERT(be32_to_cpu(tmp_info->forw) == old_blk->blkno);
1849			tmp_info->forw = cpu_to_be32(new_blk->blkno);
1850			xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1);
1851		}
1852		old_info->back = cpu_to_be32(new_blk->blkno);
1853	} else {
1854		/*
1855		 * Link new block in after existing block.
1856		 */
1857		trace_xfs_da_link_after(args);
1858		new_info->forw = old_info->forw;
1859		new_info->back = cpu_to_be32(old_blk->blkno);
1860		if (old_info->forw) {
1861			error = xfs_da3_node_read(args->trans, dp,
1862						be32_to_cpu(old_info->forw),
1863						&bp, args->whichfork);
1864			if (error)
1865				return error;
1866			ASSERT(bp != NULL);
1867			tmp_info = bp->b_addr;
1868			ASSERT(tmp_info->magic == old_info->magic);
1869			ASSERT(be32_to_cpu(tmp_info->back) == old_blk->blkno);
1870			tmp_info->back = cpu_to_be32(new_blk->blkno);
1871			xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1);
1872		}
1873		old_info->forw = cpu_to_be32(new_blk->blkno);
1874	}
1875
1876	xfs_trans_log_buf(args->trans, old_blk->bp, 0, sizeof(*tmp_info) - 1);
1877	xfs_trans_log_buf(args->trans, new_blk->bp, 0, sizeof(*tmp_info) - 1);
1878	return 0;
1879}
1880
1881/*
1882 * Unlink a block from a doubly linked list of blocks.
1883 */
1884STATIC int						/* error */
1885xfs_da3_blk_unlink(
1886	struct xfs_da_state	*state,
1887	struct xfs_da_state_blk	*drop_blk,
1888	struct xfs_da_state_blk	*save_blk)
1889{
1890	struct xfs_da_blkinfo	*drop_info;
1891	struct xfs_da_blkinfo	*save_info;
1892	struct xfs_da_blkinfo	*tmp_info;
1893	struct xfs_da_args	*args;
1894	struct xfs_buf		*bp;
1895	int			error;
1896
1897	/*
1898	 * Set up environment.
1899	 */
1900	args = state->args;
1901	ASSERT(args != NULL);
1902	save_info = save_blk->bp->b_addr;
1903	drop_info = drop_blk->bp->b_addr;
1904	ASSERT(save_blk->magic == XFS_DA_NODE_MAGIC ||
1905	       save_blk->magic == XFS_DIR2_LEAFN_MAGIC ||
1906	       save_blk->magic == XFS_ATTR_LEAF_MAGIC);
1907	ASSERT(save_blk->magic == drop_blk->magic);
1908	ASSERT((be32_to_cpu(save_info->forw) == drop_blk->blkno) ||
1909	       (be32_to_cpu(save_info->back) == drop_blk->blkno));
1910	ASSERT((be32_to_cpu(drop_info->forw) == save_blk->blkno) ||
1911	       (be32_to_cpu(drop_info->back) == save_blk->blkno));
1912
1913	/*
1914	 * Unlink the leaf block from the doubly linked chain of leaves.
1915	 */
1916	if (be32_to_cpu(save_info->back) == drop_blk->blkno) {
1917		trace_xfs_da_unlink_back(args);
1918		save_info->back = drop_info->back;
1919		if (drop_info->back) {
1920			error = xfs_da3_node_read(args->trans, args->dp,
1921						be32_to_cpu(drop_info->back),
1922						&bp, args->whichfork);
1923			if (error)
1924				return error;
1925			ASSERT(bp != NULL);
1926			tmp_info = bp->b_addr;
1927			ASSERT(tmp_info->magic == save_info->magic);
1928			ASSERT(be32_to_cpu(tmp_info->forw) == drop_blk->blkno);
1929			tmp_info->forw = cpu_to_be32(save_blk->blkno);
1930			xfs_trans_log_buf(args->trans, bp, 0,
1931						    sizeof(*tmp_info) - 1);
1932		}
1933	} else {
1934		trace_xfs_da_unlink_forward(args);
1935		save_info->forw = drop_info->forw;
1936		if (drop_info->forw) {
1937			error = xfs_da3_node_read(args->trans, args->dp,
1938						be32_to_cpu(drop_info->forw),
1939						&bp, args->whichfork);
1940			if (error)
1941				return error;
1942			ASSERT(bp != NULL);
1943			tmp_info = bp->b_addr;
1944			ASSERT(tmp_info->magic == save_info->magic);
1945			ASSERT(be32_to_cpu(tmp_info->back) == drop_blk->blkno);
1946			tmp_info->back = cpu_to_be32(save_blk->blkno);
1947			xfs_trans_log_buf(args->trans, bp, 0,
1948						    sizeof(*tmp_info) - 1);
1949		}
1950	}
1951
1952	xfs_trans_log_buf(args->trans, save_blk->bp, 0, sizeof(*save_info) - 1);
1953	return 0;
1954}
1955
1956/*
1957 * Move a path "forward" or "!forward" one block at the current level.
1958 *
1959 * This routine will adjust a "path" to point to the next block
1960 * "forward" (higher hashvalues) or "!forward" (lower hashvals) in the
1961 * Btree, including updating pointers to the intermediate nodes between
1962 * the new bottom and the root.
1963 */
1964int							/* error */
1965xfs_da3_path_shift(
1966	struct xfs_da_state	*state,
1967	struct xfs_da_state_path *path,
1968	int			forward,
1969	int			release,
1970	int			*result)
1971{
1972	struct xfs_da_state_blk	*blk;
1973	struct xfs_da_blkinfo	*info;
1974	struct xfs_da_args	*args;
1975	struct xfs_da_node_entry *btree;
1976	struct xfs_da3_icnode_hdr nodehdr;
1977	struct xfs_buf		*bp;
1978	xfs_dablk_t		blkno = 0;
1979	int			level;
1980	int			error;
1981	struct xfs_inode	*dp = state->args->dp;
1982
1983	trace_xfs_da_path_shift(state->args);
1984
1985	/*
1986	 * Roll up the Btree looking for the first block where our
1987	 * current index is not at the edge of the block.  Note that
1988	 * we skip the bottom layer because we want the sibling block.
1989	 */
1990	args = state->args;
1991	ASSERT(args != NULL);
1992	ASSERT(path != NULL);
1993	ASSERT((path->active > 0) && (path->active < XFS_DA_NODE_MAXDEPTH));
1994	level = (path->active-1) - 1;	/* skip bottom layer in path */
1995	for (; level >= 0; level--) {
1996		blk = &path->blk[level];
1997		xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr,
1998					   blk->bp->b_addr);
1999
2000		if (forward && (blk->index < nodehdr.count - 1)) {
2001			blk->index++;
2002			blkno = be32_to_cpu(nodehdr.btree[blk->index].before);
2003			break;
2004		} else if (!forward && (blk->index > 0)) {
2005			blk->index--;
2006			blkno = be32_to_cpu(nodehdr.btree[blk->index].before);
2007			break;
2008		}
2009	}
2010	if (level < 0) {
2011		*result = -ENOENT;	/* we're out of our tree */
2012		ASSERT(args->op_flags & XFS_DA_OP_OKNOENT);
2013		return 0;
2014	}
2015
2016	/*
2017	 * Roll down the edge of the subtree until we reach the
2018	 * same depth we were at originally.
2019	 */
2020	for (blk++, level++; level < path->active; blk++, level++) {
2021		/*
2022		 * Read the next child block into a local buffer.
2023		 */
2024		error = xfs_da3_node_read(args->trans, dp, blkno, &bp,
2025					  args->whichfork);
2026		if (error)
2027			return error;
2028
2029		/*
2030		 * Release the old block (if it's dirty, the trans doesn't
2031		 * actually let go) and swap the local buffer into the path
2032		 * structure. This ensures failure of the above read doesn't set
2033		 * a NULL buffer in an active slot in the path.
2034		 */
2035		if (release)
2036			xfs_trans_brelse(args->trans, blk->bp);
2037		blk->blkno = blkno;
2038		blk->bp = bp;
2039
2040		info = blk->bp->b_addr;
2041		ASSERT(info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC) ||
2042		       info->magic == cpu_to_be16(XFS_DA3_NODE_MAGIC) ||
2043		       info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
2044		       info->magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) ||
2045		       info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC) ||
2046		       info->magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC));
2047
2048
2049		/*
2050		 * Note: we flatten the magic number to a single type so we
2051		 * don't have to compare against crc/non-crc types elsewhere.
2052		 */
2053		switch (be16_to_cpu(info->magic)) {
2054		case XFS_DA_NODE_MAGIC:
2055		case XFS_DA3_NODE_MAGIC:
2056			blk->magic = XFS_DA_NODE_MAGIC;
2057			xfs_da3_node_hdr_from_disk(dp->i_mount, &nodehdr,
2058						   bp->b_addr);
2059			btree = nodehdr.btree;
2060			blk->hashval = be32_to_cpu(btree[nodehdr.count - 1].hashval);
2061			if (forward)
2062				blk->index = 0;
2063			else
2064				blk->index = nodehdr.count - 1;
2065			blkno = be32_to_cpu(btree[blk->index].before);
2066			break;
2067		case XFS_ATTR_LEAF_MAGIC:
2068		case XFS_ATTR3_LEAF_MAGIC:
2069			blk->magic = XFS_ATTR_LEAF_MAGIC;
2070			ASSERT(level == path->active-1);
2071			blk->index = 0;
2072			blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL);
2073			break;
2074		case XFS_DIR2_LEAFN_MAGIC:
2075		case XFS_DIR3_LEAFN_MAGIC:
2076			blk->magic = XFS_DIR2_LEAFN_MAGIC;
2077			ASSERT(level == path->active-1);
2078			blk->index = 0;
2079			blk->hashval = xfs_dir2_leaf_lasthash(args->dp,
2080							      blk->bp, NULL);
2081			break;
2082		default:
2083			ASSERT(0);
2084			break;
2085		}
2086	}
2087	*result = 0;
2088	return 0;
2089}
2090
2091
2092/*========================================================================
2093 * Utility routines.
2094 *========================================================================*/
2095
2096/*
2097 * Implement a simple hash on a character string.
2098 * Rotate the hash value by 7 bits, then XOR each character in.
2099 * This is implemented with some source-level loop unrolling.
2100 */
2101xfs_dahash_t
2102xfs_da_hashname(const uint8_t *name, int namelen)
2103{
2104	xfs_dahash_t hash;
2105
2106	/*
2107	 * Do four characters at a time as long as we can.
2108	 */
2109	for (hash = 0; namelen >= 4; namelen -= 4, name += 4)
2110		hash = (name[0] << 21) ^ (name[1] << 14) ^ (name[2] << 7) ^
2111		       (name[3] << 0) ^ rol32(hash, 7 * 4);
2112
2113	/*
2114	 * Now do the rest of the characters.
2115	 */
2116	switch (namelen) {
2117	case 3:
2118		return (name[0] << 14) ^ (name[1] << 7) ^ (name[2] << 0) ^
2119		       rol32(hash, 7 * 3);
2120	case 2:
2121		return (name[0] << 7) ^ (name[1] << 0) ^ rol32(hash, 7 * 2);
2122	case 1:
2123		return (name[0] << 0) ^ rol32(hash, 7 * 1);
2124	default: /* case 0: */
2125		return hash;
2126	}
2127}
2128
2129enum xfs_dacmp
2130xfs_da_compname(
2131	struct xfs_da_args *args,
2132	const unsigned char *name,
2133	int		len)
2134{
2135	return (args->namelen == len && memcmp(args->name, name, len) == 0) ?
2136					XFS_CMP_EXACT : XFS_CMP_DIFFERENT;
2137}
2138
2139int
2140xfs_da_grow_inode_int(
2141	struct xfs_da_args	*args,
2142	xfs_fileoff_t		*bno,
2143	int			count)
2144{
2145	struct xfs_trans	*tp = args->trans;
2146	struct xfs_inode	*dp = args->dp;
2147	int			w = args->whichfork;
2148	xfs_rfsblock_t		nblks = dp->i_d.di_nblocks;
2149	struct xfs_bmbt_irec	map, *mapp;
2150	int			nmap, error, got, i, mapi;
2151
2152	/*
2153	 * Find a spot in the file space to put the new block.
2154	 */
2155	error = xfs_bmap_first_unused(tp, dp, count, bno, w);
2156	if (error)
2157		return error;
2158
2159	/*
2160	 * Try mapping it in one filesystem block.
2161	 */
2162	nmap = 1;
2163	error = xfs_bmapi_write(tp, dp, *bno, count,
2164			xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA|XFS_BMAPI_CONTIG,
2165			args->total, &map, &nmap);
2166	if (error)
2167		return error;
2168
2169	ASSERT(nmap <= 1);
2170	if (nmap == 1) {
2171		mapp = &map;
2172		mapi = 1;
2173	} else if (nmap == 0 && count > 1) {
2174		xfs_fileoff_t		b;
2175		int			c;
2176
2177		/*
2178		 * If we didn't get it and the block might work if fragmented,
2179		 * try without the CONTIG flag.  Loop until we get it all.
2180		 */
2181		mapp = kmem_alloc(sizeof(*mapp) * count, 0);
 
2182		for (b = *bno, mapi = 0; b < *bno + count; ) {
2183			nmap = min(XFS_BMAP_MAX_NMAP, count);
2184			c = (int)(*bno + count - b);
 
2185			error = xfs_bmapi_write(tp, dp, b, c,
2186					xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA,
2187					args->total, &mapp[mapi], &nmap);
2188			if (error)
2189				goto out_free_map;
2190			if (nmap < 1)
2191				break;
2192			mapi += nmap;
2193			b = mapp[mapi - 1].br_startoff +
2194			    mapp[mapi - 1].br_blockcount;
2195		}
2196	} else {
2197		mapi = 0;
2198		mapp = NULL;
2199	}
2200
2201	/*
2202	 * Count the blocks we got, make sure it matches the total.
2203	 */
2204	for (i = 0, got = 0; i < mapi; i++)
2205		got += mapp[i].br_blockcount;
2206	if (got != count || mapp[0].br_startoff != *bno ||
2207	    mapp[mapi - 1].br_startoff + mapp[mapi - 1].br_blockcount !=
2208	    *bno + count) {
2209		error = -ENOSPC;
2210		goto out_free_map;
2211	}
2212
2213	/* account for newly allocated blocks in reserved blocks total */
2214	args->total -= dp->i_d.di_nblocks - nblks;
2215
2216out_free_map:
2217	if (mapp != &map)
2218		kmem_free(mapp);
2219	return error;
2220}
2221
2222/*
2223 * Add a block to the btree ahead of the file.
2224 * Return the new block number to the caller.
2225 */
2226int
2227xfs_da_grow_inode(
2228	struct xfs_da_args	*args,
2229	xfs_dablk_t		*new_blkno)
2230{
2231	xfs_fileoff_t		bno;
2232	int			error;
2233
2234	trace_xfs_da_grow_inode(args);
2235
2236	bno = args->geo->leafblk;
2237	error = xfs_da_grow_inode_int(args, &bno, args->geo->fsbcount);
2238	if (!error)
2239		*new_blkno = (xfs_dablk_t)bno;
2240	return error;
2241}
2242
2243/*
2244 * Ick.  We need to always be able to remove a btree block, even
2245 * if there's no space reservation because the filesystem is full.
2246 * This is called if xfs_bunmapi on a btree block fails due to ENOSPC.
2247 * It swaps the target block with the last block in the file.  The
2248 * last block in the file can always be removed since it can't cause
2249 * a bmap btree split to do that.
2250 */
2251STATIC int
2252xfs_da3_swap_lastblock(
2253	struct xfs_da_args	*args,
2254	xfs_dablk_t		*dead_blknop,
2255	struct xfs_buf		**dead_bufp)
2256{
2257	struct xfs_da_blkinfo	*dead_info;
2258	struct xfs_da_blkinfo	*sib_info;
2259	struct xfs_da_intnode	*par_node;
2260	struct xfs_da_intnode	*dead_node;
2261	struct xfs_dir2_leaf	*dead_leaf2;
2262	struct xfs_da_node_entry *btree;
2263	struct xfs_da3_icnode_hdr par_hdr;
2264	struct xfs_inode	*dp;
2265	struct xfs_trans	*tp;
2266	struct xfs_mount	*mp;
2267	struct xfs_buf		*dead_buf;
2268	struct xfs_buf		*last_buf;
2269	struct xfs_buf		*sib_buf;
2270	struct xfs_buf		*par_buf;
2271	xfs_dahash_t		dead_hash;
2272	xfs_fileoff_t		lastoff;
2273	xfs_dablk_t		dead_blkno;
2274	xfs_dablk_t		last_blkno;
2275	xfs_dablk_t		sib_blkno;
2276	xfs_dablk_t		par_blkno;
2277	int			error;
2278	int			w;
2279	int			entno;
2280	int			level;
2281	int			dead_level;
2282
2283	trace_xfs_da_swap_lastblock(args);
2284
2285	dead_buf = *dead_bufp;
2286	dead_blkno = *dead_blknop;
2287	tp = args->trans;
2288	dp = args->dp;
2289	w = args->whichfork;
2290	ASSERT(w == XFS_DATA_FORK);
2291	mp = dp->i_mount;
2292	lastoff = args->geo->freeblk;
2293	error = xfs_bmap_last_before(tp, dp, &lastoff, w);
2294	if (error)
2295		return error;
2296	if (XFS_IS_CORRUPT(mp, lastoff == 0))
 
2297		return -EFSCORRUPTED;
 
2298	/*
2299	 * Read the last block in the btree space.
2300	 */
2301	last_blkno = (xfs_dablk_t)lastoff - args->geo->fsbcount;
2302	error = xfs_da3_node_read(tp, dp, last_blkno, &last_buf, w);
2303	if (error)
2304		return error;
2305	/*
2306	 * Copy the last block into the dead buffer and log it.
2307	 */
2308	memcpy(dead_buf->b_addr, last_buf->b_addr, args->geo->blksize);
2309	xfs_trans_log_buf(tp, dead_buf, 0, args->geo->blksize - 1);
2310	dead_info = dead_buf->b_addr;
 
2311	/*
2312	 * Get values from the moved block.
2313	 */
2314	if (dead_info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
2315	    dead_info->magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) {
2316		struct xfs_dir3_icleaf_hdr leafhdr;
2317		struct xfs_dir2_leaf_entry *ents;
2318
2319		dead_leaf2 = (xfs_dir2_leaf_t *)dead_info;
2320		xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr,
2321					    dead_leaf2);
2322		ents = leafhdr.ents;
2323		dead_level = 0;
2324		dead_hash = be32_to_cpu(ents[leafhdr.count - 1].hashval);
2325	} else {
2326		struct xfs_da3_icnode_hdr deadhdr;
2327
2328		dead_node = (xfs_da_intnode_t *)dead_info;
2329		xfs_da3_node_hdr_from_disk(dp->i_mount, &deadhdr, dead_node);
2330		btree = deadhdr.btree;
2331		dead_level = deadhdr.level;
2332		dead_hash = be32_to_cpu(btree[deadhdr.count - 1].hashval);
2333	}
2334	sib_buf = par_buf = NULL;
2335	/*
2336	 * If the moved block has a left sibling, fix up the pointers.
2337	 */
2338	if ((sib_blkno = be32_to_cpu(dead_info->back))) {
2339		error = xfs_da3_node_read(tp, dp, sib_blkno, &sib_buf, w);
2340		if (error)
2341			goto done;
2342		sib_info = sib_buf->b_addr;
2343		if (XFS_IS_CORRUPT(mp,
2344				   be32_to_cpu(sib_info->forw) != last_blkno ||
2345				   sib_info->magic != dead_info->magic)) {
 
2346			error = -EFSCORRUPTED;
2347			goto done;
2348		}
2349		sib_info->forw = cpu_to_be32(dead_blkno);
2350		xfs_trans_log_buf(tp, sib_buf,
2351			XFS_DA_LOGRANGE(sib_info, &sib_info->forw,
2352					sizeof(sib_info->forw)));
2353		sib_buf = NULL;
2354	}
2355	/*
2356	 * If the moved block has a right sibling, fix up the pointers.
2357	 */
2358	if ((sib_blkno = be32_to_cpu(dead_info->forw))) {
2359		error = xfs_da3_node_read(tp, dp, sib_blkno, &sib_buf, w);
2360		if (error)
2361			goto done;
2362		sib_info = sib_buf->b_addr;
2363		if (XFS_IS_CORRUPT(mp,
2364				   be32_to_cpu(sib_info->back) != last_blkno ||
2365				   sib_info->magic != dead_info->magic)) {
 
2366			error = -EFSCORRUPTED;
2367			goto done;
2368		}
2369		sib_info->back = cpu_to_be32(dead_blkno);
2370		xfs_trans_log_buf(tp, sib_buf,
2371			XFS_DA_LOGRANGE(sib_info, &sib_info->back,
2372					sizeof(sib_info->back)));
2373		sib_buf = NULL;
2374	}
2375	par_blkno = args->geo->leafblk;
2376	level = -1;
2377	/*
2378	 * Walk down the tree looking for the parent of the moved block.
2379	 */
2380	for (;;) {
2381		error = xfs_da3_node_read(tp, dp, par_blkno, &par_buf, w);
2382		if (error)
2383			goto done;
2384		par_node = par_buf->b_addr;
2385		xfs_da3_node_hdr_from_disk(dp->i_mount, &par_hdr, par_node);
2386		if (XFS_IS_CORRUPT(mp,
2387				   level >= 0 && level != par_hdr.level + 1)) {
 
2388			error = -EFSCORRUPTED;
2389			goto done;
2390		}
2391		level = par_hdr.level;
2392		btree = par_hdr.btree;
2393		for (entno = 0;
2394		     entno < par_hdr.count &&
2395		     be32_to_cpu(btree[entno].hashval) < dead_hash;
2396		     entno++)
2397			continue;
2398		if (XFS_IS_CORRUPT(mp, entno == par_hdr.count)) {
 
2399			error = -EFSCORRUPTED;
2400			goto done;
2401		}
2402		par_blkno = be32_to_cpu(btree[entno].before);
2403		if (level == dead_level + 1)
2404			break;
2405		xfs_trans_brelse(tp, par_buf);
2406		par_buf = NULL;
2407	}
2408	/*
2409	 * We're in the right parent block.
2410	 * Look for the right entry.
2411	 */
2412	for (;;) {
2413		for (;
2414		     entno < par_hdr.count &&
2415		     be32_to_cpu(btree[entno].before) != last_blkno;
2416		     entno++)
2417			continue;
2418		if (entno < par_hdr.count)
2419			break;
2420		par_blkno = par_hdr.forw;
2421		xfs_trans_brelse(tp, par_buf);
2422		par_buf = NULL;
2423		if (XFS_IS_CORRUPT(mp, par_blkno == 0)) {
 
2424			error = -EFSCORRUPTED;
2425			goto done;
2426		}
2427		error = xfs_da3_node_read(tp, dp, par_blkno, &par_buf, w);
2428		if (error)
2429			goto done;
2430		par_node = par_buf->b_addr;
2431		xfs_da3_node_hdr_from_disk(dp->i_mount, &par_hdr, par_node);
2432		if (XFS_IS_CORRUPT(mp, par_hdr.level != level)) {
 
2433			error = -EFSCORRUPTED;
2434			goto done;
2435		}
2436		btree = par_hdr.btree;
2437		entno = 0;
2438	}
2439	/*
2440	 * Update the parent entry pointing to the moved block.
2441	 */
2442	btree[entno].before = cpu_to_be32(dead_blkno);
2443	xfs_trans_log_buf(tp, par_buf,
2444		XFS_DA_LOGRANGE(par_node, &btree[entno].before,
2445				sizeof(btree[entno].before)));
2446	*dead_blknop = last_blkno;
2447	*dead_bufp = last_buf;
2448	return 0;
2449done:
2450	if (par_buf)
2451		xfs_trans_brelse(tp, par_buf);
2452	if (sib_buf)
2453		xfs_trans_brelse(tp, sib_buf);
2454	xfs_trans_brelse(tp, last_buf);
2455	return error;
2456}
2457
2458/*
2459 * Remove a btree block from a directory or attribute.
2460 */
2461int
2462xfs_da_shrink_inode(
2463	struct xfs_da_args	*args,
2464	xfs_dablk_t		dead_blkno,
2465	struct xfs_buf		*dead_buf)
2466{
2467	struct xfs_inode	*dp;
2468	int			done, error, w, count;
2469	struct xfs_trans	*tp;
2470
2471	trace_xfs_da_shrink_inode(args);
2472
2473	dp = args->dp;
2474	w = args->whichfork;
2475	tp = args->trans;
2476	count = args->geo->fsbcount;
2477	for (;;) {
2478		/*
2479		 * Remove extents.  If we get ENOSPC for a dir we have to move
2480		 * the last block to the place we want to kill.
2481		 */
2482		error = xfs_bunmapi(tp, dp, dead_blkno, count,
2483				    xfs_bmapi_aflag(w), 0, &done);
2484		if (error == -ENOSPC) {
2485			if (w != XFS_DATA_FORK)
2486				break;
2487			error = xfs_da3_swap_lastblock(args, &dead_blkno,
2488						      &dead_buf);
2489			if (error)
2490				break;
2491		} else {
2492			break;
2493		}
2494	}
2495	xfs_trans_binval(tp, dead_buf);
2496	return error;
2497}
2498
2499static int
2500xfs_dabuf_map(
2501	struct xfs_inode	*dp,
2502	xfs_dablk_t		bno,
2503	unsigned int		flags,
2504	int			whichfork,
2505	struct xfs_buf_map	**mapp,
2506	int			*nmaps)
2507{
2508	struct xfs_mount	*mp = dp->i_mount;
2509	int			nfsb = xfs_dabuf_nfsb(mp, whichfork);
2510	struct xfs_bmbt_irec	irec, *irecs = &irec;
2511	struct xfs_buf_map	*map = *mapp;
2512	xfs_fileoff_t		off = bno;
2513	int			error = 0, nirecs, i;
2514
2515	if (nfsb > 1)
2516		irecs = kmem_zalloc(sizeof(irec) * nfsb, KM_NOFS);
 
2517
2518	nirecs = nfsb;
2519	error = xfs_bmapi_read(dp, bno, nfsb, irecs, &nirecs,
2520			xfs_bmapi_aflag(whichfork));
2521	if (error)
2522		goto out_free_irecs;
2523
2524	/*
2525	 * Use the caller provided map for the single map case, else allocate a
2526	 * larger one that needs to be free by the caller.
2527	 */
2528	if (nirecs > 1) {
2529		map = kmem_zalloc(nirecs * sizeof(struct xfs_buf_map), KM_NOFS);
 
2530		if (!map) {
2531			error = -ENOMEM;
2532			goto out_free_irecs;
2533		}
2534		*mapp = map;
2535	}
2536
2537	for (i = 0; i < nirecs; i++) {
2538		if (irecs[i].br_startblock == HOLESTARTBLOCK ||
2539		    irecs[i].br_startblock == DELAYSTARTBLOCK)
2540			goto invalid_mapping;
2541		if (off != irecs[i].br_startoff)
2542			goto invalid_mapping;
2543
2544		map[i].bm_bn = XFS_FSB_TO_DADDR(mp, irecs[i].br_startblock);
2545		map[i].bm_len = XFS_FSB_TO_BB(mp, irecs[i].br_blockcount);
2546		off += irecs[i].br_blockcount;
2547	}
2548
2549	if (off != bno + nfsb)
2550		goto invalid_mapping;
2551
2552	*nmaps = nirecs;
2553out_free_irecs:
2554	if (irecs != &irec)
2555		kmem_free(irecs);
2556	return error;
2557
2558invalid_mapping:
2559	/* Caller ok with no mapping. */
2560	if (XFS_IS_CORRUPT(mp, !(flags & XFS_DABUF_MAP_HOLE_OK))) {
 
2561		error = -EFSCORRUPTED;
2562		if (xfs_error_level >= XFS_ERRLEVEL_LOW) {
2563			xfs_alert(mp, "%s: bno %u inode %llu",
2564					__func__, bno, dp->i_ino);
2565
2566			for (i = 0; i < nirecs; i++) {
2567				xfs_alert(mp,
2568"[%02d] br_startoff %lld br_startblock %lld br_blockcount %lld br_state %d",
2569					i, irecs[i].br_startoff,
2570					irecs[i].br_startblock,
2571					irecs[i].br_blockcount,
2572					irecs[i].br_state);
2573			}
2574		}
2575	} else {
2576		*nmaps = 0;
2577	}
2578	goto out_free_irecs;
2579}
2580
2581/*
2582 * Get a buffer for the dir/attr block.
2583 */
2584int
2585xfs_da_get_buf(
2586	struct xfs_trans	*tp,
2587	struct xfs_inode	*dp,
2588	xfs_dablk_t		bno,
2589	struct xfs_buf		**bpp,
2590	int			whichfork)
2591{
2592	struct xfs_mount	*mp = dp->i_mount;
2593	struct xfs_buf		*bp;
2594	struct xfs_buf_map	map, *mapp = &map;
2595	int			nmap = 1;
2596	int			error;
2597
2598	*bpp = NULL;
2599	error = xfs_dabuf_map(dp, bno, 0, whichfork, &mapp, &nmap);
2600	if (error || nmap == 0)
2601		goto out_free;
2602
2603	error = xfs_trans_get_buf_map(tp, mp->m_ddev_targp, mapp, nmap, 0, &bp);
2604	if (error)
2605		goto out_free;
2606
2607	*bpp = bp;
2608
2609out_free:
2610	if (mapp != &map)
2611		kmem_free(mapp);
2612
2613	return error;
2614}
2615
2616/*
2617 * Get a buffer for the dir/attr block, fill in the contents.
2618 */
2619int
2620xfs_da_read_buf(
2621	struct xfs_trans	*tp,
2622	struct xfs_inode	*dp,
2623	xfs_dablk_t		bno,
2624	unsigned int		flags,
2625	struct xfs_buf		**bpp,
2626	int			whichfork,
2627	const struct xfs_buf_ops *ops)
2628{
2629	struct xfs_mount	*mp = dp->i_mount;
2630	struct xfs_buf		*bp;
2631	struct xfs_buf_map	map, *mapp = &map;
2632	int			nmap = 1;
2633	int			error;
2634
2635	*bpp = NULL;
2636	error = xfs_dabuf_map(dp, bno, flags, whichfork, &mapp, &nmap);
2637	if (error || !nmap)
2638		goto out_free;
2639
2640	error = xfs_trans_read_buf_map(mp, tp, mp->m_ddev_targp, mapp, nmap, 0,
2641			&bp, ops);
 
 
2642	if (error)
2643		goto out_free;
2644
2645	if (whichfork == XFS_ATTR_FORK)
2646		xfs_buf_set_ref(bp, XFS_ATTR_BTREE_REF);
2647	else
2648		xfs_buf_set_ref(bp, XFS_DIR_BTREE_REF);
2649	*bpp = bp;
2650out_free:
2651	if (mapp != &map)
2652		kmem_free(mapp);
2653
2654	return error;
2655}
2656
2657/*
2658 * Readahead the dir/attr block.
2659 */
2660int
2661xfs_da_reada_buf(
2662	struct xfs_inode	*dp,
2663	xfs_dablk_t		bno,
2664	unsigned int		flags,
2665	int			whichfork,
2666	const struct xfs_buf_ops *ops)
2667{
2668	struct xfs_buf_map	map;
2669	struct xfs_buf_map	*mapp;
2670	int			nmap;
2671	int			error;
2672
2673	mapp = &map;
2674	nmap = 1;
2675	error = xfs_dabuf_map(dp, bno, flags, whichfork, &mapp, &nmap);
2676	if (error || !nmap)
2677		goto out_free;
2678
2679	xfs_buf_readahead_map(dp->i_mount->m_ddev_targp, mapp, nmap, ops);
2680
2681out_free:
2682	if (mapp != &map)
2683		kmem_free(mapp);
2684
2685	return error;
2686}