Linux Audio

Check our new training course

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