cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

xfs_dir2_block.c (35723B)


      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_IFORK_DSIZE(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_IFORK_DSIZE(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	xfs_dir2_sf_hdr_t	*oldsfp;	/* old shortform header  */
   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	oldsfp = (xfs_dir2_sf_hdr_t *)ifp->if_u1.if_data;
   1103
   1104	ASSERT(ifp->if_bytes == dp->i_disk_size);
   1105	ASSERT(ifp->if_u1.if_data != NULL);
   1106	ASSERT(dp->i_disk_size >= xfs_dir2_sf_hdr_size(oldsfp->i8count));
   1107	ASSERT(dp->i_df.if_nextents == 0);
   1108
   1109	/*
   1110	 * Copy the directory into a temporary buffer.
   1111	 * Then pitch the incore inode data so we can make extents.
   1112	 */
   1113	sfp = kmem_alloc(ifp->if_bytes, 0);
   1114	memcpy(sfp, oldsfp, ifp->if_bytes);
   1115
   1116	xfs_idata_realloc(dp, -ifp->if_bytes, XFS_DATA_FORK);
   1117	xfs_bmap_local_to_extents_empty(tp, dp, XFS_DATA_FORK);
   1118	dp->i_disk_size = 0;
   1119
   1120	/*
   1121	 * Add block 0 to the inode.
   1122	 */
   1123	error = xfs_dir2_grow_inode(args, XFS_DIR2_DATA_SPACE, &blkno);
   1124	if (error)
   1125		goto out_free;
   1126	/*
   1127	 * Initialize the data block, then convert it to block format.
   1128	 */
   1129	error = xfs_dir3_data_init(args, blkno, &bp);
   1130	if (error)
   1131		goto out_free;
   1132	xfs_dir3_block_init(mp, tp, bp, dp);
   1133	hdr = bp->b_addr;
   1134
   1135	/*
   1136	 * Compute size of block "tail" area.
   1137	 */
   1138	i = (uint)sizeof(*btp) +
   1139	    (sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t);
   1140	/*
   1141	 * The whole thing is initialized to free by the init routine.
   1142	 * Say we're using the leaf and tail area.
   1143	 */
   1144	dup = bp->b_addr + offset;
   1145	needlog = needscan = 0;
   1146	error = xfs_dir2_data_use_free(args, bp, dup, args->geo->blksize - i,
   1147			i, &needlog, &needscan);
   1148	if (error)
   1149		goto out_free;
   1150	ASSERT(needscan == 0);
   1151	/*
   1152	 * Fill in the tail.
   1153	 */
   1154	btp = xfs_dir2_block_tail_p(args->geo, hdr);
   1155	btp->count = cpu_to_be32(sfp->count + 2);	/* ., .. */
   1156	btp->stale = 0;
   1157	blp = xfs_dir2_block_leaf_p(btp);
   1158	endoffset = (uint)((char *)blp - (char *)hdr);
   1159	/*
   1160	 * Remove the freespace, we'll manage it.
   1161	 */
   1162	error = xfs_dir2_data_use_free(args, bp, dup,
   1163			(xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr),
   1164			be16_to_cpu(dup->length), &needlog, &needscan);
   1165	if (error)
   1166		goto out_free;
   1167
   1168	/*
   1169	 * Create entry for .
   1170	 */
   1171	dep = bp->b_addr + offset;
   1172	dep->inumber = cpu_to_be64(dp->i_ino);
   1173	dep->namelen = 1;
   1174	dep->name[0] = '.';
   1175	xfs_dir2_data_put_ftype(mp, dep, XFS_DIR3_FT_DIR);
   1176	tagp = xfs_dir2_data_entry_tag_p(mp, dep);
   1177	*tagp = cpu_to_be16(offset);
   1178	xfs_dir2_data_log_entry(args, bp, dep);
   1179	blp[0].hashval = cpu_to_be32(xfs_dir_hash_dot);
   1180	blp[0].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(offset));
   1181	offset += xfs_dir2_data_entsize(mp, dep->namelen);
   1182
   1183	/*
   1184	 * Create entry for ..
   1185	 */
   1186	dep = bp->b_addr + offset;
   1187	dep->inumber = cpu_to_be64(xfs_dir2_sf_get_parent_ino(sfp));
   1188	dep->namelen = 2;
   1189	dep->name[0] = dep->name[1] = '.';
   1190	xfs_dir2_data_put_ftype(mp, dep, XFS_DIR3_FT_DIR);
   1191	tagp = xfs_dir2_data_entry_tag_p(mp, dep);
   1192	*tagp = cpu_to_be16(offset);
   1193	xfs_dir2_data_log_entry(args, bp, dep);
   1194	blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot);
   1195	blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(offset));
   1196	offset += xfs_dir2_data_entsize(mp, dep->namelen);
   1197
   1198	/*
   1199	 * Loop over existing entries, stuff them in.
   1200	 */
   1201	i = 0;
   1202	if (!sfp->count)
   1203		sfep = NULL;
   1204	else
   1205		sfep = xfs_dir2_sf_firstentry(sfp);
   1206
   1207	/*
   1208	 * Need to preserve the existing offset values in the sf directory.
   1209	 * Insert holes (unused entries) where necessary.
   1210	 */
   1211	while (offset < endoffset) {
   1212		/*
   1213		 * sfep is null when we reach the end of the list.
   1214		 */
   1215		if (sfep == NULL)
   1216			newoffset = endoffset;
   1217		else
   1218			newoffset = xfs_dir2_sf_get_offset(sfep);
   1219		/*
   1220		 * There should be a hole here, make one.
   1221		 */
   1222		if (offset < newoffset) {
   1223			dup = bp->b_addr + offset;
   1224			dup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG);
   1225			dup->length = cpu_to_be16(newoffset - offset);
   1226			*xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16(offset);
   1227			xfs_dir2_data_log_unused(args, bp, dup);
   1228			xfs_dir2_data_freeinsert(hdr,
   1229					xfs_dir2_data_bestfree_p(mp, hdr),
   1230					dup, &dummy);
   1231			offset += be16_to_cpu(dup->length);
   1232			continue;
   1233		}
   1234		/*
   1235		 * Copy a real entry.
   1236		 */
   1237		dep = bp->b_addr + newoffset;
   1238		dep->inumber = cpu_to_be64(xfs_dir2_sf_get_ino(mp, sfp, sfep));
   1239		dep->namelen = sfep->namelen;
   1240		xfs_dir2_data_put_ftype(mp, dep,
   1241				xfs_dir2_sf_get_ftype(mp, sfep));
   1242		memcpy(dep->name, sfep->name, dep->namelen);
   1243		tagp = xfs_dir2_data_entry_tag_p(mp, dep);
   1244		*tagp = cpu_to_be16(newoffset);
   1245		xfs_dir2_data_log_entry(args, bp, dep);
   1246		name.name = sfep->name;
   1247		name.len = sfep->namelen;
   1248		blp[2 + i].hashval = cpu_to_be32(xfs_dir2_hashname(mp, &name));
   1249		blp[2 + i].address =
   1250			cpu_to_be32(xfs_dir2_byte_to_dataptr(newoffset));
   1251		offset = (int)((char *)(tagp + 1) - (char *)hdr);
   1252		if (++i == sfp->count)
   1253			sfep = NULL;
   1254		else
   1255			sfep = xfs_dir2_sf_nextentry(mp, sfp, sfep);
   1256	}
   1257	/* Done with the temporary buffer */
   1258	kmem_free(sfp);
   1259	/*
   1260	 * Sort the leaf entries by hash value.
   1261	 */
   1262	xfs_sort(blp, be32_to_cpu(btp->count), sizeof(*blp), xfs_dir2_block_sort);
   1263	/*
   1264	 * Log the leaf entry area and tail.
   1265	 * Already logged the header in data_init, ignore needlog.
   1266	 */
   1267	ASSERT(needscan == 0);
   1268	xfs_dir2_block_log_leaf(tp, bp, 0, be32_to_cpu(btp->count) - 1);
   1269	xfs_dir2_block_log_tail(tp, bp);
   1270	xfs_dir3_data_check(dp, bp);
   1271	return 0;
   1272out_free:
   1273	kmem_free(sfp);
   1274	return error;
   1275}