Linux Audio

Check our new training course

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