1  // SPDX-License-Identifier: GPL-2.0
2  /*
3   * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
4   * All Rights Reserved.
5   */
6  #include "xfs.h"
7  #include "xfs_fs.h"
8  #include "xfs_shared.h"
9  #include "xfs_format.h"
10  #include "xfs_log_format.h"
11  #include "xfs_trans_resv.h"
12  #include "xfs_mount.h"
13  #include "xfs_inode.h"
14  #include "xfs_trans.h"
15  #include "xfs_bmap.h"
16  #include "xfs_dir2.h"
17  #include "xfs_dir2_priv.h"
18  #include "xfs_errortag.h"
19  #include "xfs_error.h"
20  #include "xfs_trace.h"
21  #include "xfs_health.h"
22  #include "xfs_bmap_btree.h"
23  #include "xfs_trans_space.h"
24  #include "xfs_parent.h"
25  #include "xfs_ag.h"
26  #include "xfs_ialloc.h"
27  
28  const struct xfs_name xfs_name_dotdot = {
29  	.name	= (const unsigned char *)"..",
30  	.len	= 2,
31  	.type	= XFS_DIR3_FT_DIR,
32  };
33  
34  const struct xfs_name xfs_name_dot = {
35  	.name	= (const unsigned char *)".",
36  	.len	= 1,
37  	.type	= XFS_DIR3_FT_DIR,
38  };
39  
40  /*
41   * Convert inode mode to directory entry filetype
42   */
43  unsigned char
xfs_mode_to_ftype(int mode)44  xfs_mode_to_ftype(
45  	int		mode)
46  {
47  	switch (mode & S_IFMT) {
48  	case S_IFREG:
49  		return XFS_DIR3_FT_REG_FILE;
50  	case S_IFDIR:
51  		return XFS_DIR3_FT_DIR;
52  	case S_IFCHR:
53  		return XFS_DIR3_FT_CHRDEV;
54  	case S_IFBLK:
55  		return XFS_DIR3_FT_BLKDEV;
56  	case S_IFIFO:
57  		return XFS_DIR3_FT_FIFO;
58  	case S_IFSOCK:
59  		return XFS_DIR3_FT_SOCK;
60  	case S_IFLNK:
61  		return XFS_DIR3_FT_SYMLINK;
62  	default:
63  		return XFS_DIR3_FT_UNKNOWN;
64  	}
65  }
66  
67  /*
68   * ASCII case-insensitive (ie. A-Z) support for directories that was
69   * used in IRIX.
70   */
71  xfs_dahash_t
xfs_ascii_ci_hashname(const struct xfs_name * name)72  xfs_ascii_ci_hashname(
73  	const struct xfs_name	*name)
74  {
75  	xfs_dahash_t		hash;
76  	int			i;
77  
78  	for (i = 0, hash = 0; i < name->len; i++)
79  		hash = xfs_ascii_ci_xfrm(name->name[i]) ^ rol32(hash, 7);
80  
81  	return hash;
82  }
83  
84  enum xfs_dacmp
xfs_ascii_ci_compname(struct xfs_da_args * args,const unsigned char * name,int len)85  xfs_ascii_ci_compname(
86  	struct xfs_da_args	*args,
87  	const unsigned char	*name,
88  	int			len)
89  {
90  	enum xfs_dacmp		result;
91  	int			i;
92  
93  	if (args->namelen != len)
94  		return XFS_CMP_DIFFERENT;
95  
96  	result = XFS_CMP_EXACT;
97  	for (i = 0; i < len; i++) {
98  		if (args->name[i] == name[i])
99  			continue;
100  		if (xfs_ascii_ci_xfrm(args->name[i]) !=
101  		    xfs_ascii_ci_xfrm(name[i]))
102  			return XFS_CMP_DIFFERENT;
103  		result = XFS_CMP_CASE;
104  	}
105  
106  	return result;
107  }
108  
109  int
xfs_da_mount(struct xfs_mount * mp)110  xfs_da_mount(
111  	struct xfs_mount	*mp)
112  {
113  	struct xfs_da_geometry	*dageo;
114  
115  
116  	ASSERT(mp->m_sb.sb_versionnum & XFS_SB_VERSION_DIRV2BIT);
117  	ASSERT(xfs_dir2_dirblock_bytes(&mp->m_sb) <= XFS_MAX_BLOCKSIZE);
118  
119  	mp->m_dir_geo = kzalloc(sizeof(struct xfs_da_geometry),
120  				GFP_KERNEL | __GFP_RETRY_MAYFAIL);
121  	mp->m_attr_geo = kzalloc(sizeof(struct xfs_da_geometry),
122  				GFP_KERNEL | __GFP_RETRY_MAYFAIL);
123  	if (!mp->m_dir_geo || !mp->m_attr_geo) {
124  		kfree(mp->m_dir_geo);
125  		kfree(mp->m_attr_geo);
126  		return -ENOMEM;
127  	}
128  
129  	/* set up directory geometry */
130  	dageo = mp->m_dir_geo;
131  	dageo->blklog = mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog;
132  	dageo->fsblog = mp->m_sb.sb_blocklog;
133  	dageo->blksize = xfs_dir2_dirblock_bytes(&mp->m_sb);
134  	dageo->fsbcount = 1 << mp->m_sb.sb_dirblklog;
135  	if (xfs_has_crc(mp)) {
136  		dageo->node_hdr_size = sizeof(struct xfs_da3_node_hdr);
137  		dageo->leaf_hdr_size = sizeof(struct xfs_dir3_leaf_hdr);
138  		dageo->free_hdr_size = sizeof(struct xfs_dir3_free_hdr);
139  		dageo->data_entry_offset =
140  				sizeof(struct xfs_dir3_data_hdr);
141  	} else {
142  		dageo->node_hdr_size = sizeof(struct xfs_da_node_hdr);
143  		dageo->leaf_hdr_size = sizeof(struct xfs_dir2_leaf_hdr);
144  		dageo->free_hdr_size = sizeof(struct xfs_dir2_free_hdr);
145  		dageo->data_entry_offset =
146  				sizeof(struct xfs_dir2_data_hdr);
147  	}
148  	dageo->leaf_max_ents = (dageo->blksize - dageo->leaf_hdr_size) /
149  			sizeof(struct xfs_dir2_leaf_entry);
150  	dageo->free_max_bests = (dageo->blksize - dageo->free_hdr_size) /
151  			sizeof(xfs_dir2_data_off_t);
152  
153  	dageo->data_first_offset = dageo->data_entry_offset +
154  			xfs_dir2_data_entsize(mp, 1) +
155  			xfs_dir2_data_entsize(mp, 2);
156  
157  	/*
158  	 * Now we've set up the block conversion variables, we can calculate the
159  	 * segment block constants using the geometry structure.
160  	 */
161  	dageo->datablk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_DATA_OFFSET);
162  	dageo->leafblk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_LEAF_OFFSET);
163  	dageo->freeblk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_FREE_OFFSET);
164  	dageo->node_ents = (dageo->blksize - dageo->node_hdr_size) /
165  				(uint)sizeof(xfs_da_node_entry_t);
166  	dageo->max_extents = (XFS_DIR2_MAX_SPACES * XFS_DIR2_SPACE_SIZE) >>
167  					mp->m_sb.sb_blocklog;
168  	dageo->magicpct = (dageo->blksize * 37) / 100;
169  
170  	/* set up attribute geometry - single fsb only */
171  	dageo = mp->m_attr_geo;
172  	dageo->blklog = mp->m_sb.sb_blocklog;
173  	dageo->fsblog = mp->m_sb.sb_blocklog;
174  	dageo->blksize = 1 << dageo->blklog;
175  	dageo->fsbcount = 1;
176  	dageo->node_hdr_size = mp->m_dir_geo->node_hdr_size;
177  	dageo->node_ents = (dageo->blksize - dageo->node_hdr_size) /
178  				(uint)sizeof(xfs_da_node_entry_t);
179  
180  	if (xfs_has_large_extent_counts(mp))
181  		dageo->max_extents = XFS_MAX_EXTCNT_ATTR_FORK_LARGE;
182  	else
183  		dageo->max_extents = XFS_MAX_EXTCNT_ATTR_FORK_SMALL;
184  
185  	dageo->magicpct = (dageo->blksize * 37) / 100;
186  	return 0;
187  }
188  
189  void
xfs_da_unmount(struct xfs_mount * mp)190  xfs_da_unmount(
191  	struct xfs_mount	*mp)
192  {
193  	kfree(mp->m_dir_geo);
194  	kfree(mp->m_attr_geo);
195  }
196  
197  /*
198   * Return 1 if directory contains only "." and "..".
199   */
200  int
xfs_dir_isempty(xfs_inode_t * dp)201  xfs_dir_isempty(
202  	xfs_inode_t	*dp)
203  {
204  	xfs_dir2_sf_hdr_t	*sfp;
205  
206  	ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
207  	if (dp->i_disk_size == 0)	/* might happen during shutdown. */
208  		return 1;
209  	if (dp->i_disk_size > xfs_inode_data_fork_size(dp))
210  		return 0;
211  	sfp = dp->i_df.if_data;
212  	return !sfp->count;
213  }
214  
215  /*
216   * Validate a given inode number.
217   */
218  int
xfs_dir_ino_validate(xfs_mount_t * mp,xfs_ino_t ino)219  xfs_dir_ino_validate(
220  	xfs_mount_t	*mp,
221  	xfs_ino_t	ino)
222  {
223  	bool		ino_ok = xfs_verify_dir_ino(mp, ino);
224  
225  	if (XFS_IS_CORRUPT(mp, !ino_ok) ||
226  	    XFS_TEST_ERROR(false, mp, XFS_ERRTAG_DIR_INO_VALIDATE)) {
227  		xfs_warn(mp, "Invalid inode number 0x%Lx",
228  				(unsigned long long) ino);
229  		return -EFSCORRUPTED;
230  	}
231  	return 0;
232  }
233  
234  /*
235   * Initialize a directory with its "." and ".." entries.
236   */
237  int
xfs_dir_init(xfs_trans_t * tp,xfs_inode_t * dp,xfs_inode_t * pdp)238  xfs_dir_init(
239  	xfs_trans_t	*tp,
240  	xfs_inode_t	*dp,
241  	xfs_inode_t	*pdp)
242  {
243  	struct xfs_da_args *args;
244  	int		error;
245  
246  	ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
247  	error = xfs_dir_ino_validate(tp->t_mountp, pdp->i_ino);
248  	if (error)
249  		return error;
250  
251  	args = kzalloc(sizeof(*args), GFP_KERNEL | __GFP_NOFAIL);
252  	if (!args)
253  		return -ENOMEM;
254  
255  	args->geo = dp->i_mount->m_dir_geo;
256  	args->dp = dp;
257  	args->trans = tp;
258  	args->owner = dp->i_ino;
259  	error = xfs_dir2_sf_create(args, pdp->i_ino);
260  	kfree(args);
261  	return error;
262  }
263  
264  enum xfs_dir2_fmt
xfs_dir2_format(struct xfs_da_args * args,int * error)265  xfs_dir2_format(
266  	struct xfs_da_args	*args,
267  	int			*error)
268  {
269  	struct xfs_inode	*dp = args->dp;
270  	struct xfs_mount	*mp = dp->i_mount;
271  	struct xfs_da_geometry	*geo = mp->m_dir_geo;
272  	xfs_fileoff_t		eof;
273  
274  	xfs_assert_ilocked(dp, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL);
275  
276  	*error = 0;
277  	if (dp->i_df.if_format == XFS_DINODE_FMT_LOCAL)
278  		return XFS_DIR2_FMT_SF;
279  
280  	*error = xfs_bmap_last_offset(dp, &eof, XFS_DATA_FORK);
281  	if (*error)
282  		return XFS_DIR2_FMT_ERROR;
283  
284  	if (eof == XFS_B_TO_FSB(mp, geo->blksize)) {
285  		if (XFS_IS_CORRUPT(mp, dp->i_disk_size != geo->blksize)) {
286  			xfs_da_mark_sick(args);
287  			*error = -EFSCORRUPTED;
288  			return XFS_DIR2_FMT_ERROR;
289  		}
290  		return XFS_DIR2_FMT_BLOCK;
291  	}
292  	if (eof == geo->leafblk + geo->fsbcount)
293  		return XFS_DIR2_FMT_LEAF;
294  	return XFS_DIR2_FMT_NODE;
295  }
296  
297  int
xfs_dir_createname_args(struct xfs_da_args * args)298  xfs_dir_createname_args(
299  	struct xfs_da_args	*args)
300  {
301  	int			error;
302  
303  	if (!args->inumber)
304  		args->op_flags |= XFS_DA_OP_JUSTCHECK;
305  
306  	switch (xfs_dir2_format(args, &error)) {
307  	case XFS_DIR2_FMT_SF:
308  		return xfs_dir2_sf_addname(args);
309  	case XFS_DIR2_FMT_BLOCK:
310  		return xfs_dir2_block_addname(args);
311  	case XFS_DIR2_FMT_LEAF:
312  		return xfs_dir2_leaf_addname(args);
313  	case XFS_DIR2_FMT_NODE:
314  		return xfs_dir2_node_addname(args);
315  	default:
316  		return error;
317  	}
318  }
319  
320  /*
321   * Enter a name in a directory, or check for available space.
322   * If inum is 0, only the available space test is performed.
323   */
324  int
xfs_dir_createname(struct xfs_trans * tp,struct xfs_inode * dp,const struct xfs_name * name,xfs_ino_t inum,xfs_extlen_t total)325  xfs_dir_createname(
326  	struct xfs_trans	*tp,
327  	struct xfs_inode	*dp,
328  	const struct xfs_name	*name,
329  	xfs_ino_t		inum,		/* new entry inode number */
330  	xfs_extlen_t		total)		/* bmap's total block count */
331  {
332  	struct xfs_da_args	*args;
333  	int			rval;
334  
335  	ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
336  
337  	if (inum) {
338  		rval = xfs_dir_ino_validate(tp->t_mountp, inum);
339  		if (rval)
340  			return rval;
341  		XFS_STATS_INC(dp->i_mount, xs_dir_create);
342  	}
343  
344  	args = kzalloc(sizeof(*args), GFP_KERNEL | __GFP_NOFAIL);
345  	if (!args)
346  		return -ENOMEM;
347  
348  	args->geo = dp->i_mount->m_dir_geo;
349  	args->name = name->name;
350  	args->namelen = name->len;
351  	args->filetype = name->type;
352  	args->hashval = xfs_dir2_hashname(dp->i_mount, name);
353  	args->inumber = inum;
354  	args->dp = dp;
355  	args->total = total;
356  	args->whichfork = XFS_DATA_FORK;
357  	args->trans = tp;
358  	args->op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT;
359  	args->owner = dp->i_ino;
360  
361  	rval = xfs_dir_createname_args(args);
362  	kfree(args);
363  	return rval;
364  }
365  
366  /*
367   * If doing a CI lookup and case-insensitive match, dup actual name into
368   * args.value. Return EEXIST for success (ie. name found) or an error.
369   */
370  int
xfs_dir_cilookup_result(struct xfs_da_args * args,const unsigned char * name,int len)371  xfs_dir_cilookup_result(
372  	struct xfs_da_args *args,
373  	const unsigned char *name,
374  	int		len)
375  {
376  	if (args->cmpresult == XFS_CMP_DIFFERENT)
377  		return -ENOENT;
378  	if (args->cmpresult != XFS_CMP_CASE ||
379  					!(args->op_flags & XFS_DA_OP_CILOOKUP))
380  		return -EEXIST;
381  
382  	args->value = kmalloc(len,
383  			GFP_KERNEL | __GFP_NOLOCKDEP | __GFP_RETRY_MAYFAIL);
384  	if (!args->value)
385  		return -ENOMEM;
386  
387  	memcpy(args->value, name, len);
388  	args->valuelen = len;
389  	return -EEXIST;
390  }
391  
392  int
xfs_dir_lookup_args(struct xfs_da_args * args)393  xfs_dir_lookup_args(
394  	struct xfs_da_args	*args)
395  {
396  	int			error;
397  
398  	switch (xfs_dir2_format(args, &error)) {
399  	case XFS_DIR2_FMT_SF:
400  		error = xfs_dir2_sf_lookup(args);
401  		break;
402  	case XFS_DIR2_FMT_BLOCK:
403  		error = xfs_dir2_block_lookup(args);
404  		break;
405  	case XFS_DIR2_FMT_LEAF:
406  		error = xfs_dir2_leaf_lookup(args);
407  		break;
408  	case XFS_DIR2_FMT_NODE:
409  		error = xfs_dir2_node_lookup(args);
410  		break;
411  	default:
412  		break;
413  	}
414  
415  	if (error != -EEXIST)
416  		return error;
417  	return 0;
418  }
419  
420  /*
421   * Lookup a name in a directory, give back the inode number.
422   * If ci_name is not NULL, returns the actual name in ci_name if it differs
423   * to name, or ci_name->name is set to NULL for an exact match.
424   */
425  
426  int
xfs_dir_lookup(struct xfs_trans * tp,struct xfs_inode * dp,const struct xfs_name * name,xfs_ino_t * inum,struct xfs_name * ci_name)427  xfs_dir_lookup(
428  	struct xfs_trans	*tp,
429  	struct xfs_inode	*dp,
430  	const struct xfs_name	*name,
431  	xfs_ino_t		*inum,	  /* out: inode number */
432  	struct xfs_name		*ci_name) /* out: actual name if CI match */
433  {
434  	struct xfs_da_args	*args;
435  	int			rval;
436  	int			lock_mode;
437  
438  	ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
439  	XFS_STATS_INC(dp->i_mount, xs_dir_lookup);
440  
441  	args = kzalloc(sizeof(*args),
442  			GFP_KERNEL | __GFP_NOLOCKDEP | __GFP_NOFAIL);
443  	args->geo = dp->i_mount->m_dir_geo;
444  	args->name = name->name;
445  	args->namelen = name->len;
446  	args->filetype = name->type;
447  	args->hashval = xfs_dir2_hashname(dp->i_mount, name);
448  	args->dp = dp;
449  	args->whichfork = XFS_DATA_FORK;
450  	args->trans = tp;
451  	args->op_flags = XFS_DA_OP_OKNOENT;
452  	args->owner = dp->i_ino;
453  	if (ci_name)
454  		args->op_flags |= XFS_DA_OP_CILOOKUP;
455  
456  	lock_mode = xfs_ilock_data_map_shared(dp);
457  	rval = xfs_dir_lookup_args(args);
458  	if (!rval) {
459  		*inum = args->inumber;
460  		if (ci_name) {
461  			ci_name->name = args->value;
462  			ci_name->len = args->valuelen;
463  		}
464  	}
465  	xfs_iunlock(dp, lock_mode);
466  	kfree(args);
467  	return rval;
468  }
469  
470  int
xfs_dir_removename_args(struct xfs_da_args * args)471  xfs_dir_removename_args(
472  	struct xfs_da_args	*args)
473  {
474  	int			error;
475  
476  	switch (xfs_dir2_format(args, &error)) {
477  	case XFS_DIR2_FMT_SF:
478  		return xfs_dir2_sf_removename(args);
479  	case XFS_DIR2_FMT_BLOCK:
480  		return xfs_dir2_block_removename(args);
481  	case XFS_DIR2_FMT_LEAF:
482  		return xfs_dir2_leaf_removename(args);
483  	case XFS_DIR2_FMT_NODE:
484  		return xfs_dir2_node_removename(args);
485  	default:
486  		return error;
487  	}
488  }
489  
490  /*
491   * Remove an entry from a directory.
492   */
493  int
xfs_dir_removename(struct xfs_trans * tp,struct xfs_inode * dp,const struct xfs_name * name,xfs_ino_t ino,xfs_extlen_t total)494  xfs_dir_removename(
495  	struct xfs_trans	*tp,
496  	struct xfs_inode	*dp,
497  	const struct xfs_name	*name,
498  	xfs_ino_t		ino,
499  	xfs_extlen_t		total)		/* bmap's total block count */
500  {
501  	struct xfs_da_args	*args;
502  	int			rval;
503  
504  	ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
505  	XFS_STATS_INC(dp->i_mount, xs_dir_remove);
506  
507  	args = kzalloc(sizeof(*args), GFP_KERNEL | __GFP_NOFAIL);
508  	if (!args)
509  		return -ENOMEM;
510  
511  	args->geo = dp->i_mount->m_dir_geo;
512  	args->name = name->name;
513  	args->namelen = name->len;
514  	args->filetype = name->type;
515  	args->hashval = xfs_dir2_hashname(dp->i_mount, name);
516  	args->inumber = ino;
517  	args->dp = dp;
518  	args->total = total;
519  	args->whichfork = XFS_DATA_FORK;
520  	args->trans = tp;
521  	args->owner = dp->i_ino;
522  	rval = xfs_dir_removename_args(args);
523  	kfree(args);
524  	return rval;
525  }
526  
527  int
xfs_dir_replace_args(struct xfs_da_args * args)528  xfs_dir_replace_args(
529  	struct xfs_da_args	*args)
530  {
531  	int			error;
532  
533  	switch (xfs_dir2_format(args, &error)) {
534  	case XFS_DIR2_FMT_SF:
535  		return xfs_dir2_sf_replace(args);
536  	case XFS_DIR2_FMT_BLOCK:
537  		return xfs_dir2_block_replace(args);
538  	case XFS_DIR2_FMT_LEAF:
539  		return xfs_dir2_leaf_replace(args);
540  	case XFS_DIR2_FMT_NODE:
541  		return xfs_dir2_node_replace(args);
542  	default:
543  		return error;
544  	}
545  }
546  
547  /*
548   * Replace the inode number of a directory entry.
549   */
550  int
xfs_dir_replace(struct xfs_trans * tp,struct xfs_inode * dp,const struct xfs_name * name,xfs_ino_t inum,xfs_extlen_t total)551  xfs_dir_replace(
552  	struct xfs_trans	*tp,
553  	struct xfs_inode	*dp,
554  	const struct xfs_name	*name,		/* name of entry to replace */
555  	xfs_ino_t		inum,		/* new inode number */
556  	xfs_extlen_t		total)		/* bmap's total block count */
557  {
558  	struct xfs_da_args	*args;
559  	int			rval;
560  
561  	ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
562  
563  	rval = xfs_dir_ino_validate(tp->t_mountp, inum);
564  	if (rval)
565  		return rval;
566  
567  	args = kzalloc(sizeof(*args), GFP_KERNEL | __GFP_NOFAIL);
568  	if (!args)
569  		return -ENOMEM;
570  
571  	args->geo = dp->i_mount->m_dir_geo;
572  	args->name = name->name;
573  	args->namelen = name->len;
574  	args->filetype = name->type;
575  	args->hashval = xfs_dir2_hashname(dp->i_mount, name);
576  	args->inumber = inum;
577  	args->dp = dp;
578  	args->total = total;
579  	args->whichfork = XFS_DATA_FORK;
580  	args->trans = tp;
581  	args->owner = dp->i_ino;
582  	rval = xfs_dir_replace_args(args);
583  	kfree(args);
584  	return rval;
585  }
586  
587  /*
588   * See if this entry can be added to the directory without allocating space.
589   */
590  int
xfs_dir_canenter(struct xfs_trans * tp,struct xfs_inode * dp,const struct xfs_name * name)591  xfs_dir_canenter(
592  	struct xfs_trans	*tp,
593  	struct xfs_inode	*dp,
594  	const struct xfs_name	*name)		/* name of entry to add */
595  {
596  	return xfs_dir_createname(tp, dp, name, 0, 0);
597  }
598  
599  /*
600   * Utility routines.
601   */
602  
603  /*
604   * Add a block to the directory.
605   *
606   * This routine is for data and free blocks, not leaf/node blocks which are
607   * handled by xfs_da_grow_inode.
608   */
609  int
xfs_dir2_grow_inode(struct xfs_da_args * args,int space,xfs_dir2_db_t * dbp)610  xfs_dir2_grow_inode(
611  	struct xfs_da_args	*args,
612  	int			space,	/* v2 dir's space XFS_DIR2_xxx_SPACE */
613  	xfs_dir2_db_t		*dbp)	/* out: block number added */
614  {
615  	struct xfs_inode	*dp = args->dp;
616  	struct xfs_mount	*mp = dp->i_mount;
617  	xfs_fileoff_t		bno;	/* directory offset of new block */
618  	int			count;	/* count of filesystem blocks */
619  	int			error;
620  
621  	trace_xfs_dir2_grow_inode(args, space);
622  
623  	/*
624  	 * Set lowest possible block in the space requested.
625  	 */
626  	bno = XFS_B_TO_FSBT(mp, space * XFS_DIR2_SPACE_SIZE);
627  	count = args->geo->fsbcount;
628  
629  	error = xfs_da_grow_inode_int(args, &bno, count);
630  	if (error)
631  		return error;
632  
633  	*dbp = xfs_dir2_da_to_db(args->geo, (xfs_dablk_t)bno);
634  
635  	/*
636  	 * Update file's size if this is the data space and it grew.
637  	 */
638  	if (space == XFS_DIR2_DATA_SPACE) {
639  		xfs_fsize_t	size;		/* directory file (data) size */
640  
641  		size = XFS_FSB_TO_B(mp, bno + count);
642  		if (size > dp->i_disk_size) {
643  			dp->i_disk_size = size;
644  			xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE);
645  		}
646  	}
647  	return 0;
648  }
649  
650  /*
651   * Remove the given block from the directory.
652   * This routine is used for data and free blocks, leaf/node are done
653   * by xfs_da_shrink_inode.
654   */
655  int
xfs_dir2_shrink_inode(struct xfs_da_args * args,xfs_dir2_db_t db,struct xfs_buf * bp)656  xfs_dir2_shrink_inode(
657  	struct xfs_da_args	*args,
658  	xfs_dir2_db_t		db,
659  	struct xfs_buf		*bp)
660  {
661  	xfs_fileoff_t		bno;		/* directory file offset */
662  	xfs_dablk_t		da;		/* directory file offset */
663  	int			done;		/* bunmap is finished */
664  	struct xfs_inode	*dp;
665  	int			error;
666  	struct xfs_mount	*mp;
667  	struct xfs_trans	*tp;
668  
669  	trace_xfs_dir2_shrink_inode(args, db);
670  
671  	dp = args->dp;
672  	mp = dp->i_mount;
673  	tp = args->trans;
674  	da = xfs_dir2_db_to_da(args->geo, db);
675  
676  	/* Unmap the fsblock(s). */
677  	error = xfs_bunmapi(tp, dp, da, args->geo->fsbcount, 0, 0, &done);
678  	if (error) {
679  		/*
680  		 * ENOSPC actually can happen if we're in a removename with no
681  		 * space reservation, and the resulting block removal would
682  		 * cause a bmap btree split or conversion from extents to btree.
683  		 * This can only happen for un-fragmented directory blocks,
684  		 * since you need to be punching out the middle of an extent.
685  		 * In this case we need to leave the block in the file, and not
686  		 * binval it.  So the block has to be in a consistent empty
687  		 * state and appropriately logged.  We don't free up the buffer,
688  		 * the caller can tell it hasn't happened since it got an error
689  		 * back.
690  		 */
691  		return error;
692  	}
693  	ASSERT(done);
694  	/*
695  	 * Invalidate the buffer from the transaction.
696  	 */
697  	xfs_trans_binval(tp, bp);
698  	/*
699  	 * If it's not a data block, we're done.
700  	 */
701  	if (db >= xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET))
702  		return 0;
703  	/*
704  	 * If the block isn't the last one in the directory, we're done.
705  	 */
706  	if (dp->i_disk_size > xfs_dir2_db_off_to_byte(args->geo, db + 1, 0))
707  		return 0;
708  	bno = da;
709  	if ((error = xfs_bmap_last_before(tp, dp, &bno, XFS_DATA_FORK))) {
710  		/*
711  		 * This can't really happen unless there's kernel corruption.
712  		 */
713  		return error;
714  	}
715  	if (db == args->geo->datablk)
716  		ASSERT(bno == 0);
717  	else
718  		ASSERT(bno > 0);
719  	/*
720  	 * Set the size to the new last block.
721  	 */
722  	dp->i_disk_size = XFS_FSB_TO_B(mp, bno);
723  	xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
724  	return 0;
725  }
726  
727  /* Returns true if the directory entry name is valid. */
728  bool
xfs_dir2_namecheck(const void * name,size_t length)729  xfs_dir2_namecheck(
730  	const void	*name,
731  	size_t		length)
732  {
733  	/*
734  	 * MAXNAMELEN includes the trailing null, but (name/length) leave it
735  	 * out, so use >= for the length check.
736  	 */
737  	if (length >= MAXNAMELEN)
738  		return false;
739  
740  	/* There shouldn't be any slashes or nulls here */
741  	return !memchr(name, '/', length) && !memchr(name, 0, length);
742  }
743  
744  xfs_dahash_t
xfs_dir2_hashname(struct xfs_mount * mp,const struct xfs_name * name)745  xfs_dir2_hashname(
746  	struct xfs_mount	*mp,
747  	const struct xfs_name	*name)
748  {
749  	if (unlikely(xfs_has_asciici(mp)))
750  		return xfs_ascii_ci_hashname(name);
751  	return xfs_da_hashname(name->name, name->len);
752  }
753  
754  enum xfs_dacmp
xfs_dir2_compname(struct xfs_da_args * args,const unsigned char * name,int len)755  xfs_dir2_compname(
756  	struct xfs_da_args	*args,
757  	const unsigned char	*name,
758  	int			len)
759  {
760  	if (unlikely(xfs_has_asciici(args->dp->i_mount)))
761  		return xfs_ascii_ci_compname(args, name, len);
762  	return xfs_da_compname(args, name, len);
763  }
764  
765  #ifdef CONFIG_XFS_LIVE_HOOKS
766  /*
767   * Use a static key here to reduce the overhead of directory live update hooks.
768   * If the compiler supports jump labels, the static branch will be replaced by
769   * a nop sled when there are no hook users.  Online fsck is currently the only
770   * caller, so this is a reasonable tradeoff.
771   *
772   * Note: Patching the kernel code requires taking the cpu hotplug lock.  Other
773   * parts of the kernel allocate memory with that lock held, which means that
774   * XFS callers cannot hold any locks that might be used by memory reclaim or
775   * writeback when calling the static_branch_{inc,dec} functions.
776   */
777  DEFINE_STATIC_XFS_HOOK_SWITCH(xfs_dir_hooks_switch);
778  
779  void
xfs_dir_hook_disable(void)780  xfs_dir_hook_disable(void)
781  {
782  	xfs_hooks_switch_off(&xfs_dir_hooks_switch);
783  }
784  
785  void
xfs_dir_hook_enable(void)786  xfs_dir_hook_enable(void)
787  {
788  	xfs_hooks_switch_on(&xfs_dir_hooks_switch);
789  }
790  
791  /* Call hooks for a directory update relating to a child dirent update. */
792  inline void
xfs_dir_update_hook(struct xfs_inode * dp,struct xfs_inode * ip,int delta,const struct xfs_name * name)793  xfs_dir_update_hook(
794  	struct xfs_inode		*dp,
795  	struct xfs_inode		*ip,
796  	int				delta,
797  	const struct xfs_name		*name)
798  {
799  	if (xfs_hooks_switched_on(&xfs_dir_hooks_switch)) {
800  		struct xfs_dir_update_params	p = {
801  			.dp		= dp,
802  			.ip		= ip,
803  			.delta		= delta,
804  			.name		= name,
805  		};
806  		struct xfs_mount	*mp = ip->i_mount;
807  
808  		xfs_hooks_call(&mp->m_dir_update_hooks, 0, &p);
809  	}
810  }
811  
812  /* Call the specified function during a directory update. */
813  int
xfs_dir_hook_add(struct xfs_mount * mp,struct xfs_dir_hook * hook)814  xfs_dir_hook_add(
815  	struct xfs_mount	*mp,
816  	struct xfs_dir_hook	*hook)
817  {
818  	return xfs_hooks_add(&mp->m_dir_update_hooks, &hook->dirent_hook);
819  }
820  
821  /* Stop calling the specified function during a directory update. */
822  void
xfs_dir_hook_del(struct xfs_mount * mp,struct xfs_dir_hook * hook)823  xfs_dir_hook_del(
824  	struct xfs_mount	*mp,
825  	struct xfs_dir_hook	*hook)
826  {
827  	xfs_hooks_del(&mp->m_dir_update_hooks, &hook->dirent_hook);
828  }
829  
830  /* Configure directory update hook functions. */
831  void
xfs_dir_hook_setup(struct xfs_dir_hook * hook,notifier_fn_t mod_fn)832  xfs_dir_hook_setup(
833  	struct xfs_dir_hook	*hook,
834  	notifier_fn_t		mod_fn)
835  {
836  	xfs_hook_setup(&hook->dirent_hook, mod_fn);
837  }
838  #endif /* CONFIG_XFS_LIVE_HOOKS */
839  
840  /*
841   * Given a directory @dp, a newly allocated inode @ip, and a @name, link @ip
842   * into @dp under the given @name.  If @ip is a directory, it will be
843   * initialized.  Both inodes must have the ILOCK held and the transaction must
844   * have sufficient blocks reserved.
845   */
846  int
xfs_dir_create_child(struct xfs_trans * tp,unsigned int resblks,struct xfs_dir_update * du)847  xfs_dir_create_child(
848  	struct xfs_trans	*tp,
849  	unsigned int		resblks,
850  	struct xfs_dir_update	*du)
851  {
852  	struct xfs_inode	*dp = du->dp;
853  	const struct xfs_name	*name = du->name;
854  	struct xfs_inode	*ip = du->ip;
855  	int			error;
856  
857  	xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
858  	xfs_assert_ilocked(dp, XFS_ILOCK_EXCL);
859  
860  	error = xfs_dir_createname(tp, dp, name, ip->i_ino, resblks);
861  	if (error) {
862  		ASSERT(error != -ENOSPC);
863  		return error;
864  	}
865  
866  	xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
867  	xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
868  
869  	if (S_ISDIR(VFS_I(ip)->i_mode)) {
870  		error = xfs_dir_init(tp, ip, dp);
871  		if (error)
872  			return error;
873  
874  		xfs_bumplink(tp, dp);
875  	}
876  
877  	/*
878  	 * If we have parent pointers, we need to add the attribute containing
879  	 * the parent information now.
880  	 */
881  	if (du->ppargs) {
882  		error = xfs_parent_addname(tp, du->ppargs, dp, name, ip);
883  		if (error)
884  			return error;
885  	}
886  
887  	xfs_dir_update_hook(dp, ip, 1, name);
888  	return 0;
889  }
890  
891  /*
892   * Given a directory @dp, an existing non-directory inode @ip, and a @name,
893   * link @ip into @dp under the given @name.  Both inodes must have the ILOCK
894   * held.
895   */
896  int
xfs_dir_add_child(struct xfs_trans * tp,unsigned int resblks,struct xfs_dir_update * du)897  xfs_dir_add_child(
898  	struct xfs_trans	*tp,
899  	unsigned int		resblks,
900  	struct xfs_dir_update	*du)
901  {
902  	struct xfs_inode	*dp = du->dp;
903  	const struct xfs_name	*name = du->name;
904  	struct xfs_inode	*ip = du->ip;
905  	struct xfs_mount	*mp = tp->t_mountp;
906  	int			error;
907  
908  	xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
909  	xfs_assert_ilocked(dp, XFS_ILOCK_EXCL);
910  	ASSERT(!S_ISDIR(VFS_I(ip)->i_mode));
911  
912  	if (!resblks) {
913  		error = xfs_dir_canenter(tp, dp, name);
914  		if (error)
915  			return error;
916  	}
917  
918  	/*
919  	 * Handle initial link state of O_TMPFILE inode
920  	 */
921  	if (VFS_I(ip)->i_nlink == 0) {
922  		struct xfs_perag	*pag;
923  
924  		pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino));
925  		error = xfs_iunlink_remove(tp, pag, ip);
926  		xfs_perag_put(pag);
927  		if (error)
928  			return error;
929  	}
930  
931  	error = xfs_dir_createname(tp, dp, name, ip->i_ino, resblks);
932  	if (error)
933  		return error;
934  
935  	xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
936  	xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
937  
938  	xfs_bumplink(tp, ip);
939  
940  	/*
941  	 * If we have parent pointers, we now need to add the parent record to
942  	 * the attribute fork of the inode. If this is the initial parent
943  	 * attribute, we need to create it correctly, otherwise we can just add
944  	 * the parent to the inode.
945  	 */
946  	if (du->ppargs) {
947  		error = xfs_parent_addname(tp, du->ppargs, dp, name, ip);
948  		if (error)
949  			return error;
950  	}
951  
952  	xfs_dir_update_hook(dp, ip, 1, name);
953  	return 0;
954  }
955  
956  /*
957   * Given a directory @dp, a child @ip, and a @name, remove the (@name, @ip)
958   * entry from the directory.  Both inodes must have the ILOCK held.
959   */
960  int
xfs_dir_remove_child(struct xfs_trans * tp,unsigned int resblks,struct xfs_dir_update * du)961  xfs_dir_remove_child(
962  	struct xfs_trans	*tp,
963  	unsigned int		resblks,
964  	struct xfs_dir_update	*du)
965  {
966  	struct xfs_inode	*dp = du->dp;
967  	const struct xfs_name	*name = du->name;
968  	struct xfs_inode	*ip = du->ip;
969  	int			error;
970  
971  	xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
972  	xfs_assert_ilocked(dp, XFS_ILOCK_EXCL);
973  
974  	/*
975  	 * If we're removing a directory perform some additional validation.
976  	 */
977  	if (S_ISDIR(VFS_I(ip)->i_mode)) {
978  		ASSERT(VFS_I(ip)->i_nlink >= 2);
979  		if (VFS_I(ip)->i_nlink != 2)
980  			return -ENOTEMPTY;
981  		if (!xfs_dir_isempty(ip))
982  			return -ENOTEMPTY;
983  
984  		/* Drop the link from ip's "..".  */
985  		error = xfs_droplink(tp, dp);
986  		if (error)
987  			return error;
988  
989  		/* Drop the "." link from ip to self.  */
990  		error = xfs_droplink(tp, ip);
991  		if (error)
992  			return error;
993  
994  		/*
995  		 * Point the unlinked child directory's ".." entry to the root
996  		 * directory to eliminate back-references to inodes that may
997  		 * get freed before the child directory is closed.  If the fs
998  		 * gets shrunk, this can lead to dirent inode validation errors.
999  		 */
1000  		if (dp->i_ino != tp->t_mountp->m_sb.sb_rootino) {
1001  			error = xfs_dir_replace(tp, ip, &xfs_name_dotdot,
1002  					tp->t_mountp->m_sb.sb_rootino, 0);
1003  			if (error)
1004  				return error;
1005  		}
1006  	} else {
1007  		/*
1008  		 * When removing a non-directory we need to log the parent
1009  		 * inode here.  For a directory this is done implicitly
1010  		 * by the xfs_droplink call for the ".." entry.
1011  		 */
1012  		xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
1013  	}
1014  	xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
1015  
1016  	/* Drop the link from dp to ip. */
1017  	error = xfs_droplink(tp, ip);
1018  	if (error)
1019  		return error;
1020  
1021  	error = xfs_dir_removename(tp, dp, name, ip->i_ino, resblks);
1022  	if (error) {
1023  		ASSERT(error != -ENOENT);
1024  		return error;
1025  	}
1026  
1027  	/* Remove parent pointer. */
1028  	if (du->ppargs) {
1029  		error = xfs_parent_removename(tp, du->ppargs, dp, name, ip);
1030  		if (error)
1031  			return error;
1032  	}
1033  
1034  	xfs_dir_update_hook(dp, ip, -1, name);
1035  	return 0;
1036  }
1037  
1038  /*
1039   * Exchange the entry (@name1, @ip1) in directory @dp1 with the entry (@name2,
1040   * @ip2) in directory @dp2, and update '..' @ip1 and @ip2's entries as needed.
1041   * @ip1 and @ip2 need not be of the same type.
1042   *
1043   * All inodes must have the ILOCK held, and both entries must already exist.
1044   */
1045  int
xfs_dir_exchange_children(struct xfs_trans * tp,struct xfs_dir_update * du1,struct xfs_dir_update * du2,unsigned int spaceres)1046  xfs_dir_exchange_children(
1047  	struct xfs_trans	*tp,
1048  	struct xfs_dir_update	*du1,
1049  	struct xfs_dir_update	*du2,
1050  	unsigned int		spaceres)
1051  {
1052  	struct xfs_inode	*dp1 = du1->dp;
1053  	const struct xfs_name	*name1 = du1->name;
1054  	struct xfs_inode	*ip1 = du1->ip;
1055  	struct xfs_inode	*dp2 = du2->dp;
1056  	const struct xfs_name	*name2 = du2->name;
1057  	struct xfs_inode	*ip2 = du2->ip;
1058  	int			ip1_flags = 0;
1059  	int			ip2_flags = 0;
1060  	int			dp2_flags = 0;
1061  	int			error;
1062  
1063  	/* Swap inode number for dirent in first parent */
1064  	error = xfs_dir_replace(tp, dp1, name1, ip2->i_ino, spaceres);
1065  	if (error)
1066  		return error;
1067  
1068  	/* Swap inode number for dirent in second parent */
1069  	error = xfs_dir_replace(tp, dp2, name2, ip1->i_ino, spaceres);
1070  	if (error)
1071  		return error;
1072  
1073  	/*
1074  	 * If we're renaming one or more directories across different parents,
1075  	 * update the respective ".." entries (and link counts) to match the new
1076  	 * parents.
1077  	 */
1078  	if (dp1 != dp2) {
1079  		dp2_flags = XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG;
1080  
1081  		if (S_ISDIR(VFS_I(ip2)->i_mode)) {
1082  			error = xfs_dir_replace(tp, ip2, &xfs_name_dotdot,
1083  						dp1->i_ino, spaceres);
1084  			if (error)
1085  				return error;
1086  
1087  			/* transfer ip2 ".." reference to dp1 */
1088  			if (!S_ISDIR(VFS_I(ip1)->i_mode)) {
1089  				error = xfs_droplink(tp, dp2);
1090  				if (error)
1091  					return error;
1092  				xfs_bumplink(tp, dp1);
1093  			}
1094  
1095  			/*
1096  			 * Although ip1 isn't changed here, userspace needs
1097  			 * to be warned about the change, so that applications
1098  			 * relying on it (like backup ones), will properly
1099  			 * notify the change
1100  			 */
1101  			ip1_flags |= XFS_ICHGTIME_CHG;
1102  			ip2_flags |= XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG;
1103  		}
1104  
1105  		if (S_ISDIR(VFS_I(ip1)->i_mode)) {
1106  			error = xfs_dir_replace(tp, ip1, &xfs_name_dotdot,
1107  						dp2->i_ino, spaceres);
1108  			if (error)
1109  				return error;
1110  
1111  			/* transfer ip1 ".." reference to dp2 */
1112  			if (!S_ISDIR(VFS_I(ip2)->i_mode)) {
1113  				error = xfs_droplink(tp, dp1);
1114  				if (error)
1115  					return error;
1116  				xfs_bumplink(tp, dp2);
1117  			}
1118  
1119  			/*
1120  			 * Although ip2 isn't changed here, userspace needs
1121  			 * to be warned about the change, so that applications
1122  			 * relying on it (like backup ones), will properly
1123  			 * notify the change
1124  			 */
1125  			ip1_flags |= XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG;
1126  			ip2_flags |= XFS_ICHGTIME_CHG;
1127  		}
1128  	}
1129  
1130  	if (ip1_flags) {
1131  		xfs_trans_ichgtime(tp, ip1, ip1_flags);
1132  		xfs_trans_log_inode(tp, ip1, XFS_ILOG_CORE);
1133  	}
1134  	if (ip2_flags) {
1135  		xfs_trans_ichgtime(tp, ip2, ip2_flags);
1136  		xfs_trans_log_inode(tp, ip2, XFS_ILOG_CORE);
1137  	}
1138  	if (dp2_flags) {
1139  		xfs_trans_ichgtime(tp, dp2, dp2_flags);
1140  		xfs_trans_log_inode(tp, dp2, XFS_ILOG_CORE);
1141  	}
1142  	xfs_trans_ichgtime(tp, dp1, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
1143  	xfs_trans_log_inode(tp, dp1, XFS_ILOG_CORE);
1144  
1145  	/* Schedule parent pointer replacements */
1146  	if (du1->ppargs) {
1147  		error = xfs_parent_replacename(tp, du1->ppargs, dp1, name1,
1148  				dp2, name2, ip1);
1149  		if (error)
1150  			return error;
1151  	}
1152  
1153  	if (du2->ppargs) {
1154  		error = xfs_parent_replacename(tp, du2->ppargs, dp2, name2,
1155  				dp1, name1, ip2);
1156  		if (error)
1157  			return error;
1158  	}
1159  
1160  	/*
1161  	 * Inform our hook clients that we've finished an exchange operation as
1162  	 * follows: removed the source and target files from their directories;
1163  	 * added the target to the source directory; and added the source to
1164  	 * the target directory.  All inodes are locked, so it's ok to model a
1165  	 * rename this way so long as we say we deleted entries before we add
1166  	 * new ones.
1167  	 */
1168  	xfs_dir_update_hook(dp1, ip1, -1, name1);
1169  	xfs_dir_update_hook(dp2, ip2, -1, name2);
1170  	xfs_dir_update_hook(dp1, ip2, 1, name1);
1171  	xfs_dir_update_hook(dp2, ip1, 1, name2);
1172  	return 0;
1173  }
1174  
1175  /*
1176   * Given an entry (@src_name, @src_ip) in directory @src_dp, make the entry
1177   * @target_name in directory @target_dp point to @src_ip and remove the
1178   * original entry, cleaning up everything left behind.
1179   *
1180   * Cleanup involves dropping a link count on @target_ip, and either removing
1181   * the (@src_name, @src_ip) entry from @src_dp or simply replacing the entry
1182   * with (@src_name, @wip) if a whiteout inode @wip is supplied.
1183   *
1184   * All inodes must have the ILOCK held.  We assume that if @src_ip is a
1185   * directory then its '..' doesn't already point to @target_dp, and that @wip
1186   * is a freshly allocated whiteout.
1187   */
1188  int
xfs_dir_rename_children(struct xfs_trans * tp,struct xfs_dir_update * du_src,struct xfs_dir_update * du_tgt,unsigned int spaceres,struct xfs_dir_update * du_wip)1189  xfs_dir_rename_children(
1190  	struct xfs_trans	*tp,
1191  	struct xfs_dir_update	*du_src,
1192  	struct xfs_dir_update	*du_tgt,
1193  	unsigned int		spaceres,
1194  	struct xfs_dir_update	*du_wip)
1195  {
1196  	struct xfs_mount	*mp = tp->t_mountp;
1197  	struct xfs_inode	*src_dp = du_src->dp;
1198  	const struct xfs_name	*src_name = du_src->name;
1199  	struct xfs_inode	*src_ip = du_src->ip;
1200  	struct xfs_inode	*target_dp = du_tgt->dp;
1201  	const struct xfs_name	*target_name = du_tgt->name;
1202  	struct xfs_inode	*target_ip = du_tgt->ip;
1203  	bool			new_parent = (src_dp != target_dp);
1204  	bool			src_is_directory;
1205  	int			error;
1206  
1207  	src_is_directory = S_ISDIR(VFS_I(src_ip)->i_mode);
1208  
1209  	/*
1210  	 * Check for expected errors before we dirty the transaction
1211  	 * so we can return an error without a transaction abort.
1212  	 */
1213  	if (target_ip == NULL) {
1214  		/*
1215  		 * If there's no space reservation, check the entry will
1216  		 * fit before actually inserting it.
1217  		 */
1218  		if (!spaceres) {
1219  			error = xfs_dir_canenter(tp, target_dp, target_name);
1220  			if (error)
1221  				return error;
1222  		}
1223  	} else {
1224  		/*
1225  		 * If target exists and it's a directory, check that whether
1226  		 * it can be destroyed.
1227  		 */
1228  		if (S_ISDIR(VFS_I(target_ip)->i_mode) &&
1229  		    (!xfs_dir_isempty(target_ip) ||
1230  		     (VFS_I(target_ip)->i_nlink > 2)))
1231  			return -EEXIST;
1232  	}
1233  
1234  	/*
1235  	 * Directory entry creation below may acquire the AGF. Remove
1236  	 * the whiteout from the unlinked list first to preserve correct
1237  	 * AGI/AGF locking order. This dirties the transaction so failures
1238  	 * after this point will abort and log recovery will clean up the
1239  	 * mess.
1240  	 *
1241  	 * For whiteouts, we need to bump the link count on the whiteout
1242  	 * inode. After this point, we have a real link, clear the tmpfile
1243  	 * state flag from the inode so it doesn't accidentally get misused
1244  	 * in future.
1245  	 */
1246  	if (du_wip->ip) {
1247  		struct xfs_perag	*pag;
1248  
1249  		ASSERT(VFS_I(du_wip->ip)->i_nlink == 0);
1250  
1251  		pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, du_wip->ip->i_ino));
1252  		error = xfs_iunlink_remove(tp, pag, du_wip->ip);
1253  		xfs_perag_put(pag);
1254  		if (error)
1255  			return error;
1256  
1257  		xfs_bumplink(tp, du_wip->ip);
1258  	}
1259  
1260  	/*
1261  	 * Set up the target.
1262  	 */
1263  	if (target_ip == NULL) {
1264  		/*
1265  		 * If target does not exist and the rename crosses
1266  		 * directories, adjust the target directory link count
1267  		 * to account for the ".." reference from the new entry.
1268  		 */
1269  		error = xfs_dir_createname(tp, target_dp, target_name,
1270  					   src_ip->i_ino, spaceres);
1271  		if (error)
1272  			return error;
1273  
1274  		xfs_trans_ichgtime(tp, target_dp,
1275  					XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
1276  
1277  		if (new_parent && src_is_directory) {
1278  			xfs_bumplink(tp, target_dp);
1279  		}
1280  	} else { /* target_ip != NULL */
1281  		/*
1282  		 * Link the source inode under the target name.
1283  		 * If the source inode is a directory and we are moving
1284  		 * it across directories, its ".." entry will be
1285  		 * inconsistent until we replace that down below.
1286  		 *
1287  		 * In case there is already an entry with the same
1288  		 * name at the destination directory, remove it first.
1289  		 */
1290  		error = xfs_dir_replace(tp, target_dp, target_name,
1291  					src_ip->i_ino, spaceres);
1292  		if (error)
1293  			return error;
1294  
1295  		xfs_trans_ichgtime(tp, target_dp,
1296  					XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
1297  
1298  		/*
1299  		 * Decrement the link count on the target since the target
1300  		 * dir no longer points to it.
1301  		 */
1302  		error = xfs_droplink(tp, target_ip);
1303  		if (error)
1304  			return error;
1305  
1306  		if (src_is_directory) {
1307  			/*
1308  			 * Drop the link from the old "." entry.
1309  			 */
1310  			error = xfs_droplink(tp, target_ip);
1311  			if (error)
1312  				return error;
1313  		}
1314  	} /* target_ip != NULL */
1315  
1316  	/*
1317  	 * Remove the source.
1318  	 */
1319  	if (new_parent && src_is_directory) {
1320  		/*
1321  		 * Rewrite the ".." entry to point to the new
1322  		 * directory.
1323  		 */
1324  		error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot,
1325  					target_dp->i_ino, spaceres);
1326  		ASSERT(error != -EEXIST);
1327  		if (error)
1328  			return error;
1329  	}
1330  
1331  	/*
1332  	 * We always want to hit the ctime on the source inode.
1333  	 *
1334  	 * This isn't strictly required by the standards since the source
1335  	 * inode isn't really being changed, but old unix file systems did
1336  	 * it and some incremental backup programs won't work without it.
1337  	 */
1338  	xfs_trans_ichgtime(tp, src_ip, XFS_ICHGTIME_CHG);
1339  	xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE);
1340  
1341  	/*
1342  	 * Adjust the link count on src_dp.  This is necessary when
1343  	 * renaming a directory, either within one parent when
1344  	 * the target existed, or across two parent directories.
1345  	 */
1346  	if (src_is_directory && (new_parent || target_ip != NULL)) {
1347  
1348  		/*
1349  		 * Decrement link count on src_directory since the
1350  		 * entry that's moved no longer points to it.
1351  		 */
1352  		error = xfs_droplink(tp, src_dp);
1353  		if (error)
1354  			return error;
1355  	}
1356  
1357  	/*
1358  	 * For whiteouts, we only need to update the source dirent with the
1359  	 * inode number of the whiteout inode rather than removing it
1360  	 * altogether.
1361  	 */
1362  	if (du_wip->ip)
1363  		error = xfs_dir_replace(tp, src_dp, src_name, du_wip->ip->i_ino,
1364  					spaceres);
1365  	else
1366  		error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino,
1367  					   spaceres);
1368  	if (error)
1369  		return error;
1370  
1371  	xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
1372  	xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE);
1373  	if (new_parent)
1374  		xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE);
1375  
1376  	/* Schedule parent pointer updates. */
1377  	if (du_wip->ppargs) {
1378  		error = xfs_parent_addname(tp, du_wip->ppargs, src_dp,
1379  				src_name, du_wip->ip);
1380  		if (error)
1381  			return error;
1382  	}
1383  
1384  	if (du_src->ppargs) {
1385  		error = xfs_parent_replacename(tp, du_src->ppargs, src_dp,
1386  				src_name, target_dp, target_name, src_ip);
1387  		if (error)
1388  			return error;
1389  	}
1390  
1391  	if (du_tgt->ppargs) {
1392  		error = xfs_parent_removename(tp, du_tgt->ppargs, target_dp,
1393  				target_name, target_ip);
1394  		if (error)
1395  			return error;
1396  	}
1397  
1398  	/*
1399  	 * Inform our hook clients that we've finished a rename operation as
1400  	 * follows: removed the source and target files from their directories;
1401  	 * that we've added the source to the target directory; and finally
1402  	 * that we've added the whiteout, if there was one.  All inodes are
1403  	 * locked, so it's ok to model a rename this way so long as we say we
1404  	 * deleted entries before we add new ones.
1405  	 */
1406  	if (target_ip)
1407  		xfs_dir_update_hook(target_dp, target_ip, -1, target_name);
1408  	xfs_dir_update_hook(src_dp, src_ip, -1, src_name);
1409  	xfs_dir_update_hook(target_dp, src_ip, 1, target_name);
1410  	if (du_wip->ip)
1411  		xfs_dir_update_hook(src_dp, du_wip->ip, 1, src_name);
1412  	return 0;
1413  }
1414