xref: /illumos-gate/usr/src/uts/common/fs/ufs/ufs_dir.c (revision 5422785d352a2bb398daceab3d1898a8aa64d006)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (c) 1984, 2010, Oracle and/or its affiliates. All rights reserved.
23  */
24 
25 /*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
26 /*	  All Rights Reserved  	*/
27 
28 /*
29  * University Copyright- Copyright (c) 1982, 1986, 1988
30  * The Regents of the University of California
31  * All Rights Reserved
32  *
33  * University Acknowledgment- Portions of this document are derived from
34  * software developed by the University of California, Berkeley, and its
35  * contributors.
36  */
37 
38 /*
39  * Directory manipulation routines.
40  *
41  * When manipulating directories, the i_rwlock provides serialization
42  * since directories cannot be mmapped. The i_contents lock is redundant.
43  */
44 
45 #include <sys/types.h>
46 #include <sys/t_lock.h>
47 #include <sys/param.h>
48 #include <sys/systm.h>
49 #include <sys/signal.h>
50 #include <sys/cred.h>
51 #include <sys/proc.h>
52 #include <sys/disp.h>
53 #include <sys/user.h>
54 #include <sys/vfs.h>
55 #include <sys/vnode.h>
56 #include <sys/stat.h>
57 #include <sys/mode.h>
58 #include <sys/buf.h>
59 #include <sys/uio.h>
60 #include <sys/dnlc.h>
61 #include <sys/fs/ufs_inode.h>
62 #include <sys/fs/ufs_fs.h>
63 #include <sys/mount.h>
64 #include <sys/fs/ufs_fsdir.h>
65 #include <sys/fs/ufs_trans.h>
66 #include <sys/fs/ufs_panic.h>
67 #include <sys/fs/ufs_quota.h>
68 #include <sys/errno.h>
69 #include <sys/debug.h>
70 #include <vm/seg.h>
71 #include <sys/sysmacros.h>
72 #include <sys/cmn_err.h>
73 #include <sys/cpuvar.h>
74 #include <sys/unistd.h>
75 #include <sys/policy.h>
76 
77 /*
78  * This is required since we're using P2ROUNDUP_TYPED on DIRBLKSIZ
79  */
80 #if !ISP2(DIRBLKSIZ)
81 #error	"DIRBLKSIZ not a power of 2"
82 #endif
83 
84 /*
85  * A virgin directory.
86  */
87 static struct dirtemplate mastertemplate = {
88 	0, 12, 1, ".",
89 	0, DIRBLKSIZ - 12, 2, ".."
90 };
91 
92 #define	LDIRSIZ(len) \
93 	((sizeof (struct direct) - (MAXNAMLEN + 1)) + ((len + 1 + 3) &~ 3))
94 #define	MAX_DIR_NAME_LEN(len) \
95 	(((len) - (sizeof (struct direct) - (MAXNAMLEN + 1))) - 1)
96 
97 /*
98  * The dnlc directory cache allows a 64 bit handle for directory entries.
99  * For ufs we squeeze both the 32 bit inumber and a 32 bit disk offset
100  * into the handle. Note, a 32 bit offset allows a 4GB directory, which
101  * is way beyond what could be cached in memory by the directory
102  * caching routines. So we are quite safe with this limit.
103  * The macros below pack and unpack the handle.
104  */
105 #define	H_TO_INO(h) (uint32_t)((h) & UINT_MAX)
106 #define	H_TO_OFF(h) (off_t)((h) >> 32)
107 #define	INO_OFF_TO_H(ino, off) (uint64_t)(((uint64_t)(off) << 32) | (ino))
108 
109 /*
110  * The average size of a typical on disk directory entry is about 16 bytes
111  * and so defines AV_DIRECT_SHIFT : log2(16)
112  * This define is only used to approximate the number of entries
113  * is a directory. This is needed for dnlc_dir_start() which will immediately
114  * return an error if the value is not within its acceptable range of
115  * number of files in a directory.
116  */
117 #define	AV_DIRECT_SHIFT 4
118 /*
119  * If the directory size (from i_size) is greater than the ufs_min_dir_cache
120  * tunable then we request dnlc directory caching.
121  * This has found to be profitable after 1024 file names.
122  */
123 int ufs_min_dir_cache = 1024 << AV_DIRECT_SHIFT;
124 
125 /* The time point the dnlc directory caching was disabled */
126 static hrtime_t ufs_dc_disable_at;
127 /* directory caching disable duration */
128 static hrtime_t ufs_dc_disable_duration = (hrtime_t)NANOSEC * 5;
129 
130 #ifdef DEBUG
131 int dirchk = 1;
132 #else /* !DEBUG */
133 int dirchk = 0;
134 #endif /* DEBUG */
135 int ufs_negative_cache = 1;
136 uint64_t ufs_dirremove_retry_cnt;
137 
138 static void dirbad();
139 static int ufs_dirrename();
140 static int ufs_diraddentry();
141 static int ufs_dirempty();
142 static int ufs_dirscan();
143 static int ufs_dirclrdotdot();
144 static int ufs_dirfixdotdot();
145 static int ufs_dirpurgedotdot();
146 static int dirprepareentry();
147 static int ufs_dirmakedirect();
148 static int dirbadname();
149 static int dirmangled();
150 
151 /*
152  * Check accessibility of directory against inquired mode and type.
153  * Execute access is required to search the directory.
154  * Access for write is interpreted as allowing
155  * deletion of files in the directory.
156  * Note, the reader i_contents lock will be acquired in
157  * ufs_iaccess().
158  */
159 int
160 ufs_diraccess(struct inode *ip, int mode, struct cred *cr)
161 {
162 	if (((ip->i_mode & IFMT) != IFDIR) &&
163 	    ((ip->i_mode & IFMT) != IFATTRDIR))
164 		return (ENOTDIR);
165 
166 	return (ufs_iaccess(ip, mode, cr, 1));
167 }
168 
169 /*
170  * Look for a given name in a directory.  On successful return, *ipp
171  * will point to the VN_HELD inode.
172  * The caller is responsible for checking accessibility upfront
173  * via ufs_diraccess().
174  */
175 int
176 ufs_dirlook(
177 	struct inode *dp,
178 	char *namep,
179 	struct inode **ipp,
180 	struct cred *cr,
181 	int skipdnlc,			/* skip the 1st level dnlc */
182 	int skipcaching)		/* force directory caching off */
183 {
184 	uint64_t handle;
185 	struct fbuf *fbp;		/* a buffer of directory entries */
186 	struct direct *ep;		/* the current directory entry */
187 	struct vnode *vp;
188 	struct vnode *dvp;		/* directory vnode ptr */
189 	struct ulockfs *ulp;
190 	dcanchor_t *dcap;
191 	off_t endsearch;		/* offset to end directory search */
192 	off_t offset;
193 	off_t start_off;		/* starting offset from middle search */
194 	off_t last_offset;		/* last offset */
195 	int entryoffsetinblock;		/* offset of ep in addr's buffer */
196 	int numdirpasses;		/* strategy for directory search */
197 	int namlen;			/* length of name */
198 	int err;
199 	int doingchk;
200 	int i;
201 	int caching;
202 	int indeadlock;
203 	ino_t ep_ino;			/* entry i number */
204 	ino_t chkino;
205 	ushort_t ep_reclen;		/* direct local d_reclen */
206 
207 	ASSERT(*namep != '\0'); /* All callers ensure *namep is non null */
208 
209 	if (dp->i_ufsvfs)
210 		ulp = &dp->i_ufsvfs->vfs_ulockfs;
211 
212 	/*
213 	 * Check the directory name lookup cache, first for individual files
214 	 * then for complete directories.
215 	 */
216 	dvp = ITOV(dp);
217 	if (!skipdnlc && (vp = dnlc_lookup(dvp, namep))) {
218 		/* vp is already held from dnlc_lookup */
219 		if (vp == DNLC_NO_VNODE) {
220 			VN_RELE(vp);
221 			return (ENOENT);
222 		}
223 		*ipp = VTOI(vp);
224 		return (0);
225 	}
226 
227 	dcap = &dp->i_danchor;
228 
229 	/*
230 	 * Grab the reader lock on the directory data before checking
231 	 * the dnlc to avoid a race with ufs_dirremove() & friends.
232 	 *
233 	 * ufs_tryirwlock uses rw_tryenter and checks for SLOCK to
234 	 * avoid i_rwlock, ufs_lockfs_begin deadlock. If deadlock
235 	 * possible, retries the operation.
236 	 */
237 	ufs_tryirwlock((&dp->i_rwlock), RW_READER, retry_dircache);
238 	if (indeadlock)
239 		return (EAGAIN);
240 
241 	switch (dnlc_dir_lookup(dcap, namep, &handle)) {
242 	case DFOUND:
243 		ep_ino = (ino_t)H_TO_INO(handle);
244 		if (dp->i_number == ep_ino) {
245 			VN_HOLD(dvp);	/* want ourself, "." */
246 			*ipp = dp;
247 			rw_exit(&dp->i_rwlock);
248 			return (0);
249 		}
250 		if (namep[0] == '.' && namep[1] == '.' && namep[2] == 0) {
251 			uint64_t handle2;
252 			/*
253 			 * release the lock on the dir we are searching
254 			 * to avoid a deadlock when grabbing the
255 			 * i_contents lock in ufs_iget_alloced().
256 			 */
257 			rw_exit(&dp->i_rwlock);
258 			rw_enter(&dp->i_ufsvfs->vfs_dqrwlock, RW_READER);
259 			err = ufs_iget_alloced(dp->i_vfs, ep_ino, ipp, cr);
260 			rw_exit(&dp->i_ufsvfs->vfs_dqrwlock);
261 			/*
262 			 * must recheck as we dropped dp->i_rwlock
263 			 */
264 			ufs_tryirwlock(&dp->i_rwlock, RW_READER, retry_parent);
265 			if (indeadlock) {
266 				if (!err)
267 					VN_RELE(ITOV(*ipp));
268 				return (EAGAIN);
269 			}
270 			if (!err && (dnlc_dir_lookup(dcap, namep, &handle2)
271 			    == DFOUND) && (handle == handle2)) {
272 				dnlc_update(dvp, namep, ITOV(*ipp));
273 				rw_exit(&dp->i_rwlock);
274 				return (0);
275 			}
276 			/* check failed, read the actual directory */
277 			if (!err) {
278 				VN_RELE(ITOV(*ipp));
279 			}
280 			goto restart;
281 		}
282 		/* usual case of not "." nor ".." */
283 		rw_enter(&dp->i_ufsvfs->vfs_dqrwlock, RW_READER);
284 		err = ufs_iget_alloced(dp->i_vfs, ep_ino, ipp, cr);
285 		rw_exit(&dp->i_ufsvfs->vfs_dqrwlock);
286 		if (err) {
287 			rw_exit(&dp->i_rwlock);
288 			return (err);
289 		}
290 		dnlc_update(dvp, namep, ITOV(*ipp));
291 		rw_exit(&dp->i_rwlock);
292 		return (0);
293 	case DNOENT:
294 		if (ufs_negative_cache && (dp->i_nlink > 0)) {
295 			dnlc_enter(dvp, namep, DNLC_NO_VNODE);
296 		}
297 		rw_exit(&dp->i_rwlock);
298 		return (ENOENT);
299 	default:
300 		break;
301 	}
302 restart:
303 
304 	fbp = NULL;
305 	doingchk = 0;
306 	chkino = 0;
307 	caching = 0;
308 
309 	/*
310 	 * Attempt to cache any directories greater than the tunable
311 	 * ufs_min_cache_dir. If it fails due to memory shortage (DNOMEM),
312 	 * disable caching for this directory and record the system time.
313 	 * Any attempt after the disable time has expired will enable
314 	 * the caching again.
315 	 */
316 	if (!skipcaching && (dp->i_size >= ufs_min_dir_cache)) {
317 		/*
318 		 * if the directory caching disable time has expired
319 		 * enable the caching again.
320 		 */
321 		if (dp->i_cachedir == CD_DISABLED_NOMEM &&
322 		    gethrtime() - ufs_dc_disable_at > ufs_dc_disable_duration) {
323 			ufs_dc_disable_at = 0;
324 			dp->i_cachedir = CD_ENABLED;
325 		}
326 		if (dp->i_cachedir == CD_ENABLED) {
327 			switch (dnlc_dir_start(dcap, dp->i_size >>
328 			    AV_DIRECT_SHIFT)) {
329 			case DNOMEM:
330 				dp->i_cachedir = CD_DISABLED_NOMEM;
331 				ufs_dc_disable_at = gethrtime();
332 				break;
333 			case DTOOBIG:
334 				dp->i_cachedir = CD_DISABLED_TOOBIG;
335 				break;
336 			case DOK:
337 				caching = 1;
338 				break;
339 			default:
340 				break;
341 			}
342 		}
343 	}
344 	/*
345 	 * If caching we don't stop when the file has been
346 	 * found, but need to know later, so clear *ipp now
347 	 */
348 	*ipp = NULL;
349 
350 recheck:
351 	if (caching) {
352 		offset = 0;
353 		entryoffsetinblock = 0;
354 		numdirpasses = 1;
355 	} else {
356 		/*
357 		 * Take care to look at dp->i_diroff only once, as it
358 		 * may be changing due to other threads/cpus.
359 		 */
360 		offset = dp->i_diroff;
361 		if (offset > dp->i_size) {
362 			offset = 0;
363 		}
364 		if (offset == 0) {
365 			entryoffsetinblock = 0;
366 			numdirpasses = 1;
367 		} else {
368 			start_off = offset;
369 
370 			entryoffsetinblock = blkoff(dp->i_fs, offset);
371 			if (entryoffsetinblock != 0) {
372 				err = blkatoff(dp, offset, (char **)0, &fbp);
373 				if (err)
374 					goto bad;
375 			}
376 			numdirpasses = 2;
377 		}
378 	}
379 	endsearch = P2ROUNDUP_TYPED(dp->i_size, DIRBLKSIZ, u_offset_t);
380 	namlen = strlen(namep);
381 	last_offset = 0;
382 
383 searchloop:
384 	while (offset < endsearch) {
385 		/*
386 		 * If offset is on a block boundary,
387 		 * read the next directory block.
388 		 * Release previous if it exists.
389 		 */
390 		if (blkoff(dp->i_fs, offset) == 0) {
391 			if (fbp != NULL) {
392 				fbrelse(fbp, S_OTHER);
393 			}
394 			err = blkatoff(dp, offset, (char **)0, &fbp);
395 			if (err)
396 				goto bad;
397 			entryoffsetinblock = 0;
398 		}
399 
400 		/*
401 		 * If the offset to the next entry is invalid or if the
402 		 * next entry is a zero length record or if the record
403 		 * length is invalid, then skip to the next directory
404 		 * block.  Complete validation checks are done if the
405 		 * record length is invalid.
406 		 *
407 		 * Full validation checks are slow so they are disabled
408 		 * by default.  Complete checks can be run by patching
409 		 * "dirchk" to be true.
410 		 *
411 		 * We have to check the validity of entryoffsetinblock
412 		 * here because it can be set to i_diroff above.
413 		 */
414 		ep = (struct direct *)(fbp->fb_addr + entryoffsetinblock);
415 		if ((entryoffsetinblock & 0x3) || ep->d_reclen == 0 ||
416 		    (dirchk || (ep->d_reclen & 0x3)) &&
417 		    dirmangled(dp, ep, entryoffsetinblock, offset)) {
418 			i = DIRBLKSIZ - (entryoffsetinblock & (DIRBLKSIZ - 1));
419 			offset += i;
420 			entryoffsetinblock += i;
421 			if (caching) {
422 				dnlc_dir_purge(dcap);
423 				caching = 0;
424 			}
425 			continue;
426 		}
427 
428 		ep_reclen = ep->d_reclen;
429 
430 		/*
431 		 * Add named entries and free space into the directory cache
432 		 */
433 		if (caching) {
434 			ushort_t extra;
435 			off_t off2;
436 
437 			if (ep->d_ino == 0) {
438 				extra = ep_reclen;
439 				if (offset & (DIRBLKSIZ - 1)) {
440 					dnlc_dir_purge(dcap);
441 					dp->i_cachedir = CD_DISABLED;
442 					caching = 0;
443 				}
444 			} else {
445 				/*
446 				 * entries hold the previous offset except the
447 				 * 1st which holds the offset + 1
448 				 */
449 				if (offset & (DIRBLKSIZ - 1)) {
450 					off2 = last_offset;
451 				} else {
452 					off2 = offset + 1;
453 				}
454 				caching = (dnlc_dir_add_entry(dcap, ep->d_name,
455 				    INO_OFF_TO_H(ep->d_ino, off2)) == DOK);
456 				extra = ep_reclen - DIRSIZ(ep);
457 			}
458 			if (caching && (extra >= LDIRSIZ(1))) {
459 				caching = (dnlc_dir_add_space(dcap, extra,
460 				    (uint64_t)offset) == DOK);
461 			}
462 		}
463 
464 		/*
465 		 * Check for a name match.
466 		 * We have the parent inode read locked with i_rwlock.
467 		 */
468 		if (ep->d_ino && ep->d_namlen == namlen &&
469 		    *namep == *ep->d_name &&	/* fast chk 1st chr */
470 		    bcmp(namep, ep->d_name, (int)ep->d_namlen) == 0) {
471 
472 			/*
473 			 * We have to release the fbp early here to avoid
474 			 * a possible deadlock situation where we have the
475 			 * fbp and want the directory inode and someone doing
476 			 * a ufs_direnter_* has the directory inode and wants
477 			 * the fbp.  XXX - is this still needed?
478 			 */
479 			ep_ino = (ino_t)ep->d_ino;
480 			ASSERT(fbp != NULL);
481 			fbrelse(fbp, S_OTHER);
482 			fbp = NULL;
483 
484 			/*
485 			 * Atomic update (read lock held)
486 			 */
487 			dp->i_diroff = offset;
488 
489 			if (namlen == 2 && namep[0] == '.' && namep[1] == '.') {
490 				struct timeval32 omtime;
491 
492 				if (caching) {
493 					dnlc_dir_purge(dcap);
494 					caching = 0;
495 				}
496 				if (doingchk) {
497 					/*
498 					 * if the inumber didn't change
499 					 * continue with already found inode.
500 					 */
501 					if (ep_ino == chkino)
502 						goto checkok;
503 					else {
504 						VN_RELE(ITOV(*ipp));
505 						/* *ipp is nulled at restart */
506 						goto restart;
507 					}
508 				}
509 				/*
510 				 * release the lock on the dir we are searching
511 				 * to avoid a deadlock when grabbing the
512 				 * i_contents lock in ufs_iget_alloced().
513 				 */
514 				omtime = dp->i_mtime;
515 				rw_exit(&dp->i_rwlock);
516 				rw_enter(&dp->i_ufsvfs->vfs_dqrwlock,
517 				    RW_READER);
518 				err = ufs_iget_alloced(dp->i_vfs, ep_ino, ipp,
519 				    cr);
520 				rw_exit(&dp->i_ufsvfs->vfs_dqrwlock);
521 				ufs_tryirwlock(&dp->i_rwlock, RW_READER,
522 				    retry_disk);
523 				if (indeadlock) {
524 					if (!err)
525 						VN_RELE(ITOV(*ipp));
526 					return (EAGAIN);
527 				}
528 				if (err)
529 					goto bad;
530 				/*
531 				 * Since we released the lock on the directory,
532 				 * we must check that the same inode is still
533 				 * the ".." entry for this directory.
534 				 */
535 				/*CSTYLED*/
536 				if (timercmp(&omtime, &dp->i_mtime, !=)) {
537 					/*
538 					 * Modification time changed on the
539 					 * directory, we must go check if
540 					 * the inumber changed for ".."
541 					 */
542 					doingchk = 1;
543 					chkino = ep_ino;
544 					entryoffsetinblock = 0;
545 					if (caching) {
546 						/*
547 						 * Forget directory caching
548 						 * for this rare case
549 						 */
550 						dnlc_dir_purge(dcap);
551 						caching = 0;
552 					}
553 					goto recheck;
554 				}
555 			} else if (dp->i_number == ep_ino) {
556 				VN_HOLD(dvp);	/* want ourself, "." */
557 				*ipp = dp;
558 				if (caching) {
559 					dnlc_dir_purge(dcap);
560 					caching = 0;
561 				}
562 			} else {
563 				rw_enter(&dp->i_ufsvfs->vfs_dqrwlock,
564 				    RW_READER);
565 				err = ufs_iget_alloced(dp->i_vfs, ep_ino, ipp,
566 				    cr);
567 				rw_exit(&dp->i_ufsvfs->vfs_dqrwlock);
568 				if (err)
569 					goto bad;
570 			}
571 checkok:
572 			ASSERT(*ipp);
573 			dnlc_update(dvp, namep, ITOV(*ipp));
574 			/*
575 			 * If we are not caching then just return the entry
576 			 * otherwise complete loading up the cache
577 			 */
578 			if (!caching) {
579 				rw_exit(&dp->i_rwlock);
580 				return (0);
581 			}
582 			err = blkatoff(dp, offset, (char **)0, &fbp);
583 			if (err)
584 				goto bad;
585 		}
586 		last_offset = offset;
587 		offset += ep_reclen;
588 		entryoffsetinblock += ep_reclen;
589 	}
590 	/*
591 	 * If we started in the middle of the directory and failed
592 	 * to find our target, we must check the beginning as well.
593 	 */
594 	if (numdirpasses == 2) {
595 		numdirpasses--;
596 		offset = 0;
597 		endsearch = start_off;
598 		goto searchloop;
599 	}
600 
601 	/*
602 	 * If whole directory caching is on (or was originally on) then
603 	 * the entry may have been found.
604 	 */
605 	if (*ipp == NULL) {
606 		err = ENOENT;
607 		if (ufs_negative_cache && (dp->i_nlink > 0)) {
608 			dnlc_enter(dvp, namep, DNLC_NO_VNODE);
609 		}
610 	}
611 	if (caching) {
612 		dnlc_dir_complete(dcap);
613 		caching = 0;
614 	}
615 
616 bad:
617 	if (err && *ipp) {
618 		/*
619 		 * err and *ipp can both be set if we were attempting to
620 		 * cache the directory, and we found the entry, then later
621 		 * while trying to complete the directory cache encountered
622 		 * a error (eg reading a directory sector).
623 		 */
624 		VN_RELE(ITOV(*ipp));
625 		*ipp = NULL;
626 	}
627 
628 	if (fbp)
629 		fbrelse(fbp, S_OTHER);
630 	rw_exit(&dp->i_rwlock);
631 	if (caching)
632 		dnlc_dir_purge(dcap);
633 	return (err);
634 }
635 
636 /*
637  * Write a new directory entry for DE_CREATE or DE_MKDIR operations.
638  */
639 int
640 ufs_direnter_cm(
641 	struct inode *tdp,	/* target directory to make entry in */
642 	char *namep,		/* name of entry */
643 	enum de_op op,		/* entry operation */
644 	struct vattr *vap,	/* attributes if new inode needed */
645 	struct inode **ipp,	/* return entered inode here */
646 	struct cred *cr,	/* user credentials */
647 	int flags)		/* no entry exists */
648 {
649 	struct inode *tip;	/* inode of (existing) target file */
650 	char *s;
651 	struct ufs_slot slot;	/* slot info to pass around */
652 	int namlen;		/* length of name */
653 	int err;		/* error number */
654 	struct inode *nip;	/* new inode */
655 	int do_rele_nip = 0;	/* release nip */
656 	int noentry = flags & ~IQUIET;
657 	int quiet = flags & IQUIET;	/* Suppress out of inodes message */
658 	int indeadlock;
659 	struct ulockfs *ulp;
660 
661 	ASSERT(RW_WRITE_HELD(&tdp->i_rwlock));
662 
663 	if (((tdp->i_mode & IFMT) == IFATTRDIR) && ((op == DE_MKDIR) ||
664 	    ((vap->va_type == VCHR) || (vap->va_type == VBLK) ||
665 	    (vap->va_type == VDOOR) || (vap->va_type == VSOCK) ||
666 	    (vap->va_type == VFIFO))))
667 		return (EINVAL);
668 
669 	/* don't allow '/' characters in pathname component */
670 	for (s = namep, namlen = 0; *s; s++, namlen++)
671 		if (*s == '/')
672 			return (EACCES);
673 	ASSERT(namlen);
674 
675 	/*
676 	 * Check accessibility of target directory.
677 	 */
678 	if (err = ufs_diraccess(tdp, IEXEC, cr))
679 		return (err);
680 
681 	/*
682 	 * If name is "." or ".." then if this is a create look it up
683 	 * and return EEXIST.
684 	 */
685 	if (namep[0] == '.' &&
686 	    (namlen == 1 || (namlen == 2 && namep[1] == '.'))) {
687 		/*
688 		 * ufs_dirlook will acquire the i_rwlock
689 		 */
690 		if (tdp->i_ufsvfs)
691 			ulp = &tdp->i_ufsvfs->vfs_ulockfs;
692 		rw_exit(&tdp->i_rwlock);
693 		if (err = ufs_dirlook(tdp, namep, ipp, cr, 0, 0)) {
694 			if (err == EAGAIN)
695 				return (err);
696 
697 			/*
698 			 * ufs_tryirwlock uses rw_tryenter and checks for
699 			 * SLOCK to avoid i_rwlock, ufs_lockfs_begin deadlock.
700 			 * If deadlock possible, retries the operation.
701 			 */
702 			ufs_tryirwlock(&tdp->i_rwlock, RW_WRITER, retry_err);
703 			if (indeadlock)
704 				return (EAGAIN);
705 
706 			return (err);
707 		}
708 		ufs_tryirwlock(&tdp->i_rwlock, RW_WRITER, retry);
709 		if (indeadlock) {
710 			VN_RELE(ITOV(*ipp));
711 			return (EAGAIN);
712 		}
713 		return (EEXIST);
714 	}
715 
716 	/*
717 	 * If target directory has not been removed, then we can consider
718 	 * allowing file to be created.
719 	 */
720 	if (tdp->i_nlink <= 0) {
721 		return (ENOENT);
722 	}
723 
724 	/*
725 	 * Search for the entry. Return VN_HELD tip if found.
726 	 */
727 	tip = NULL;
728 	slot.fbp = NULL;
729 	slot.status = NONE;
730 	rw_enter(&tdp->i_ufsvfs->vfs_dqrwlock, RW_READER);
731 	rw_enter(&tdp->i_contents, RW_WRITER);
732 	err = ufs_dircheckforname(tdp, namep, namlen, &slot, &tip, cr, noentry);
733 	if (err)
734 		goto out;
735 	if (tip) {
736 		ASSERT(!noentry);
737 		*ipp = tip;
738 		err = EEXIST;
739 	} else {
740 		/*
741 		 * The entry does not exist. Check write permission in
742 		 * directory to see if entry can be created.
743 		 */
744 		if (err = ufs_iaccess(tdp, IWRITE, cr, 0))
745 			goto out;
746 		/*
747 		 * Make new inode and directory entry.
748 		 */
749 		tdp->i_flag |= quiet;
750 		if (err = ufs_dirmakeinode(tdp, &nip, vap, op, cr)) {
751 			if (nip != NULL)
752 				do_rele_nip = 1;
753 			goto out;
754 		}
755 		if (err = ufs_diraddentry(tdp, namep, op,
756 		    namlen, &slot, nip, NULL, cr)) {
757 			/*
758 			 * Unmake the inode we just made.
759 			 */
760 			rw_enter(&nip->i_contents, RW_WRITER);
761 			if (((nip->i_mode & IFMT) == IFDIR) ||
762 			    ((nip->i_mode & IFMT) == IFATTRDIR)) {
763 				tdp->i_nlink--;
764 				ufs_setreclaim(tdp);
765 				tdp->i_flag |= ICHG;
766 				tdp->i_seq++;
767 				TRANS_INODE(tdp->i_ufsvfs, tdp);
768 				ITIMES_NOLOCK(tdp);
769 			}
770 			nip->i_nlink = 0;
771 			ufs_setreclaim(nip);
772 			TRANS_INODE(nip->i_ufsvfs, nip);
773 			nip->i_flag |= ICHG;
774 			nip->i_seq++;
775 			ITIMES_NOLOCK(nip);
776 			rw_exit(&nip->i_contents);
777 			do_rele_nip = 1;
778 		} else {
779 			*ipp = nip;
780 		}
781 	}
782 
783 out:
784 	if (slot.fbp)
785 		fbrelse(slot.fbp, S_OTHER);
786 
787 	tdp->i_flag &= ~quiet;
788 	rw_exit(&tdp->i_contents);
789 
790 	/*
791 	 * Drop vfs_dqrwlock before calling VN_RELE() on nip to
792 	 * avoid deadlock since ufs_delete() grabs vfs_dqrwlock as reader.
793 	 */
794 	rw_exit(&tdp->i_ufsvfs->vfs_dqrwlock);
795 
796 	if (do_rele_nip) {
797 		VN_RELE(ITOV(nip));
798 	}
799 
800 	return (err);
801 }
802 
803 /*
804  * Write a new directory entry for DE_LINK, DE_SYMLINK or DE_RENAME operations.
805  */
806 int
807 ufs_direnter_lr(
808 	struct inode *tdp,	/* target directory to make entry in */
809 	char *namep,		/* name of entry */
810 	enum de_op op,		/* entry operation */
811 	struct inode *sdp,	/* source inode parent if rename */
812 	struct inode *sip,	/* source inode */
813 	struct cred *cr)	/* user credentials */
814 {
815 	struct inode *tip;	/* inode of (existing) target file */
816 	char *s;
817 	struct ufs_slot slot;	/* slot info to pass around */
818 	int namlen;		/* length of name */
819 	int err;		/* error number */
820 
821 	/* don't allow '/' characters in pathname component */
822 	for (s = namep, namlen = 0; *s; s++, namlen++)
823 		if (*s == '/')
824 			return (EACCES);
825 	ASSERT(namlen);
826 	ASSERT(RW_WRITE_HELD(&tdp->i_rwlock));
827 
828 	/*
829 	 * If name is "." or ".." then if this is a create look it up
830 	 * and return EEXIST.  Rename or link TO "." or ".." is forbidden.
831 	 */
832 	if (namep[0] == '.' &&
833 	    (namlen == 1 || (namlen == 2 && namep[1] == '.'))) {
834 		if (op == DE_RENAME) {
835 			return (EINVAL);	/* *SIGH* should be ENOTEMPTY */
836 		}
837 		return (EEXIST);
838 	}
839 	/*
840 	 * For link and rename lock the source entry and check the link count
841 	 * to see if it has been removed while it was unlocked.  If not, we
842 	 * increment the link count and force the inode to disk to make sure
843 	 * that it is there before any directory entry that points to it.
844 	 *
845 	 * In the case of a symbolic link, we are dealing with a new inode
846 	 * which does not yet have any links.  We've created it with a link
847 	 * count of 1, and we don't want to increment it since this will be
848 	 * its first link.
849 	 *
850 	 * We are about to push the inode to disk. We make sure
851 	 * that the inode's data blocks are flushed first so the
852 	 * inode and it's data blocks are always in sync.  This
853 	 * adds some robustness in in the event of a power failure
854 	 * or panic where sync fails. If we panic before the
855 	 * inode is updated, then the inode still refers to the
856 	 * old data blocks (or none for a new file). If we panic
857 	 * after the inode is updated, then the inode refers to
858 	 * the new data blocks.
859 	 *
860 	 * We do this before grabbing the i_contents lock because
861 	 * ufs_syncip() will want that lock. We could do the data
862 	 * syncing after the removal checks, but upon return from
863 	 * the data sync we would have to repeat the removal
864 	 * checks.
865 	 */
866 	if (err = TRANS_SYNCIP(sip, 0, I_DSYNC, TOP_FSYNC)) {
867 		return (err);
868 	}
869 
870 	rw_enter(&sip->i_contents, RW_WRITER);
871 	if (sip->i_nlink <= 0) {
872 		rw_exit(&sip->i_contents);
873 		return (ENOENT);
874 	}
875 	if (sip->i_nlink == MAXLINK) {
876 		rw_exit(&sip->i_contents);
877 		return (EMLINK);
878 	}
879 
880 	/*
881 	 * Sync the indirect blocks associated with the file
882 	 * for the same reasons as described above.  Since this
883 	 * call wants the i_contents lock held for it we can do
884 	 * this here with no extra work.
885 	 */
886 	if (err = ufs_sync_indir(sip)) {
887 		rw_exit(&sip->i_contents);
888 		return (err);
889 	}
890 
891 	if (op != DE_SYMLINK)
892 		sip->i_nlink++;
893 	TRANS_INODE(sip->i_ufsvfs, sip);
894 	sip->i_flag |= ICHG;
895 	sip->i_seq++;
896 	ufs_iupdat(sip, I_SYNC);
897 	rw_exit(&sip->i_contents);
898 
899 	/*
900 	 * If target directory has not been removed, then we can consider
901 	 * allowing file to be created.
902 	 */
903 	if (tdp->i_nlink <= 0) {
904 		err = ENOENT;
905 		goto out2;
906 	}
907 
908 	/*
909 	 * Check accessibility of target directory.
910 	 */
911 	if (err = ufs_diraccess(tdp, IEXEC, cr))
912 		goto out2;
913 
914 	/*
915 	 * Search for the entry. Return VN_HELD tip if found.
916 	 */
917 	tip = NULL;
918 	slot.status = NONE;
919 	slot.fbp = NULL;
920 	rw_enter(&tdp->i_ufsvfs->vfs_dqrwlock, RW_READER);
921 	rw_enter(&tdp->i_contents, RW_WRITER);
922 	err = ufs_dircheckforname(tdp, namep, namlen, &slot, &tip, cr, 0);
923 	if (err)
924 		goto out;
925 
926 	if (tip) {
927 		switch (op) {
928 		case DE_RENAME:
929 			err = ufs_dirrename(sdp, sip, tdp, namep,
930 			    tip, &slot, cr);
931 			break;
932 
933 		case DE_LINK:
934 		case DE_SYMLINK:
935 			/*
936 			 * Can't link to an existing file.
937 			 */
938 			err = EEXIST;
939 			break;
940 		default:
941 			break;
942 		}
943 	} else {
944 		/*
945 		 * The entry does not exist. Check write permission in
946 		 * directory to see if entry can be created.
947 		 */
948 		if (err = ufs_iaccess(tdp, IWRITE, cr, 0))
949 			goto out;
950 		err = ufs_diraddentry(tdp, namep, op, namlen, &slot, sip, sdp,
951 		    cr);
952 	}
953 
954 out:
955 	if (slot.fbp)
956 		fbrelse(slot.fbp, S_OTHER);
957 
958 	rw_exit(&tdp->i_contents);
959 
960 	/*
961 	 * Drop vfs_dqrwlock before calling VN_RELE() on tip to
962 	 * avoid deadlock since ufs_delete() grabs vfs_dqrwlock as reader.
963 	 */
964 	rw_exit(&tdp->i_ufsvfs->vfs_dqrwlock);
965 
966 	/*
967 	 * If we renamed a file over the top of an existing file,
968 	 * or linked a file to an existing file (or tried to),
969 	 * then release and delete (or just release) the inode.
970 	 */
971 	if (tip)
972 		VN_RELE(ITOV(tip));
973 
974 out2:
975 	if (err) {
976 		/*
977 		 * Undo bumped link count.
978 		 */
979 		if (op != DE_SYMLINK) {
980 			rw_enter(&sip->i_contents, RW_WRITER);
981 			sip->i_nlink--;
982 			ufs_setreclaim(sip);
983 			TRANS_INODE(sip->i_ufsvfs, sip);
984 			sip->i_flag |= ICHG;
985 			sip->i_seq++;
986 			ITIMES_NOLOCK(sip);
987 			rw_exit(&sip->i_contents);
988 		}
989 	}
990 	return (err);
991 }
992 
993 /*
994  * Check for the existence of a name in a directory (unless noentry
995  * is set) , or else of an empty
996  * slot in which an entry may be made.  If the requested name is found,
997  * then on return *ipp points at the inode and *offp contains
998  * its offset in the directory.  If the name is not found, then *ipp
999  * will be NULL and *slotp will contain information about a directory slot in
1000  * which an entry may be made (either an empty slot, or the first position
1001  * past the end of the directory).
1002  * The target directory inode (tdp) is supplied write locked (i_rwlock).
1003  *
1004  * This may not be used on "." or "..", but aliases of "." are ok.
1005  */
1006 int
1007 ufs_dircheckforname(
1008 	struct inode *tdp,	/* inode of directory being checked */
1009 	char *namep,		/* name we're checking for */
1010 	int namlen,		/* length of name, excluding null */
1011 	struct ufs_slot *slotp,	/* slot structure */
1012 	struct inode **ipp,	/* return inode if we find one */
1013 	struct cred *cr,
1014 	int noentry)		/* noentry - just look for space */
1015 {
1016 	uint64_t handle;
1017 	struct fbuf *fbp;	/* pointer to directory block */
1018 	struct direct *ep;	/* directory entry */
1019 	struct direct *nep;	/* next directory entry */
1020 	dcanchor_t *dcap;
1021 	vnode_t *dvp;		/* directory vnode ptr */
1022 	off_t dirsize;		/* size of the directory */
1023 	off_t offset;		/* offset in the directory */
1024 	off_t last_offset;	/* last offset */
1025 	off_t enduseful;	/* pointer past last used dir slot */
1026 	int entryoffsetinblk;	/* offset of ep in fbp's buffer */
1027 	int i;			/* length of mangled entry */
1028 	int needed;
1029 	int err;
1030 	int first;
1031 	int caching;
1032 	int stat;
1033 	ino_t ep_ino;
1034 	slotstat_t initstat = slotp->status;
1035 
1036 	ASSERT(RW_WRITE_HELD(&tdp->i_rwlock));
1037 	ASSERT(RW_WRITE_HELD(&tdp->i_contents));
1038 	ASSERT(*ipp == NULL);
1039 	fbp = NULL;
1040 
1041 	/*
1042 	 * First check if there is a complete cache of the directory.
1043 	 */
1044 	dvp = ITOV(tdp);
1045 
1046 	dcap = &tdp->i_danchor;
1047 	if (noentry) {
1048 		/*
1049 		 * We know from the 1st level dnlc cache that the entry
1050 		 * doesn't exist, so don't bother searching the directory
1051 		 * cache, but just look for space (possibly in the directory
1052 		 * cache).
1053 		 */
1054 		stat = DNOENT;
1055 	} else {
1056 		stat = dnlc_dir_lookup(dcap, namep, &handle);
1057 	}
1058 	switch (stat) {
1059 	case DFOUND:
1060 		ep_ino = (ino_t)H_TO_INO(handle);
1061 		if (tdp->i_number == ep_ino) {
1062 			*ipp = tdp;	/* we want ourself, ie "." */
1063 			VN_HOLD(dvp);
1064 		} else {
1065 			err = ufs_iget_alloced(tdp->i_vfs, ep_ino, ipp, cr);
1066 			if (err)
1067 				return (err);
1068 		}
1069 		offset = H_TO_OFF(handle);
1070 		first = 0;
1071 		if (offset & 1) {
1072 			/* This is the first entry in the block */
1073 			first = 1;
1074 			offset -= 1;
1075 			ASSERT((offset & (DIRBLKSIZ - 1)) == 0);
1076 		}
1077 		err = blkatoff(tdp, offset, (char **)&ep, &fbp);
1078 		if (err) {
1079 			VN_RELE(ITOV(*ipp));
1080 			*ipp = NULL;
1081 			return (err);
1082 		}
1083 		/*
1084 		 * Check the validity of the entry.
1085 		 * If it's bad, then throw away the cache and
1086 		 * continue without it. The dirmangled() routine
1087 		 * will then be called upon it.
1088 		 */
1089 		if ((ep->d_reclen == 0) || (ep->d_reclen & 0x3)) {
1090 			VN_RELE(ITOV(*ipp));
1091 			*ipp = NULL;
1092 			dnlc_dir_purge(dcap);
1093 			break;
1094 		}
1095 		/*
1096 		 * Remember the returned offset is the offset of the
1097 		 * preceding record (unless this is the 1st record
1098 		 * in the DIRBLKSIZ sized block (disk sector)), then it's
1099 		 * offset + 1. Note, no real offsets are on odd boundaries.
1100 		 */
1101 		if (first) {
1102 			ASSERT((offset & (DIRBLKSIZ - 1)) == 0);
1103 			slotp->offset = offset;
1104 			slotp->size = 0;
1105 			slotp->ep = ep;
1106 		} else {
1107 			/* get the next entry */
1108 			nep = (struct direct *)((char *)ep + ep->d_reclen);
1109 			/*
1110 			 * Check the validity of this entry as well
1111 			 * If it's bad, then throw away the cache and
1112 			 * continue without it. The dirmangled() routine
1113 			 * will then be called upon it.
1114 			 */
1115 			if ((nep->d_reclen == 0) || (nep->d_reclen & 0x3) ||
1116 			    (nep->d_ino != ep_ino)) {
1117 				VN_RELE(ITOV(*ipp));
1118 				*ipp = NULL;
1119 				dnlc_dir_purge(dcap);
1120 				break;
1121 			}
1122 			slotp->offset = offset + ep->d_reclen;
1123 			slotp->size = ep->d_reclen;
1124 			slotp->ep = nep;
1125 		}
1126 		slotp->status = EXIST;
1127 		slotp->fbp = fbp;
1128 		slotp->endoff = 0;
1129 		slotp->cached = 1;
1130 		dnlc_update(dvp, namep, ITOV(*ipp));
1131 		return (0);
1132 	case DNOENT:
1133 		/*
1134 		 * The caller gets to set the initial slot status to
1135 		 * indicate whether it's interested in getting a
1136 		 * empty slot. For example, the status can be set
1137 		 * to FOUND when an entry is being deleted.
1138 		 */
1139 		ASSERT(slotp->fbp == NULL);
1140 		if (slotp->status == FOUND) {
1141 			return (0);
1142 		}
1143 		switch (dnlc_dir_rem_space_by_len(dcap, LDIRSIZ(namlen),
1144 		    &handle)) {
1145 		case DFOUND:
1146 			offset = (off_t)handle;
1147 			err = blkatoff(tdp, offset, (char **)&ep, &fbp);
1148 			if (err) {
1149 				dnlc_dir_purge(dcap);
1150 				ASSERT(*ipp == NULL);
1151 				return (err);
1152 			}
1153 			/*
1154 			 * Check the validity of the entry.
1155 			 * If it's bad, then throw away the cache and
1156 			 * continue without it. The dirmangled() routine
1157 			 * will then be called upon it.
1158 			 */
1159 			if ((ep->d_reclen == 0) || (ep->d_reclen & 0x3)) {
1160 				dnlc_dir_purge(dcap);
1161 				break;
1162 			}
1163 			/*
1164 			 * Remember the returned offset is the offset of the
1165 			 * containing record.
1166 			 */
1167 			slotp->status = FOUND;
1168 			slotp->ep = ep;
1169 			slotp->offset = offset;
1170 			slotp->fbp = fbp;
1171 			slotp->size = ep->d_reclen;
1172 			/*
1173 			 * Set end offset to 0. Truncation is handled
1174 			 * because the dnlc cache will blow away the
1175 			 * cached directory when an entry is removed
1176 			 * that drops the entries left to less than half
1177 			 * the minumum number (dnlc_min_dir_cache).
1178 			 */
1179 			slotp->endoff = 0;
1180 			slotp->cached = 1;
1181 			return (0);
1182 		case DNOENT:
1183 			slotp->status = NONE;
1184 			slotp->offset = P2ROUNDUP_TYPED(tdp->i_size,
1185 			    DIRBLKSIZ, u_offset_t);
1186 			slotp->size = DIRBLKSIZ;
1187 			slotp->endoff = 0;
1188 			slotp->cached = 1;
1189 			return (0);
1190 		default:
1191 			break;
1192 		}
1193 		break;
1194 	}
1195 	slotp->cached = 0;
1196 	caching = NULL;
1197 	if (!noentry && tdp->i_size >= ufs_min_dir_cache) {
1198 		/*
1199 		 * if the directory caching disable time has expired
1200 		 * enable caching again.
1201 		 */
1202 		if (tdp->i_cachedir == CD_DISABLED_NOMEM &&
1203 		    gethrtime() - ufs_dc_disable_at > ufs_dc_disable_duration) {
1204 			ufs_dc_disable_at = 0;
1205 			tdp->i_cachedir = CD_ENABLED;
1206 		}
1207 		/*
1208 		 * Attempt to cache any directories greater than the tunable
1209 		 * ufs_min_cache_dir. If it fails due to memory shortage
1210 		 * (DNOMEM), disable caching for this directory and record
1211 		 * the system time. Any attempt after the disable time has
1212 		 * expired will enable the caching again.
1213 		 */
1214 		if (tdp->i_cachedir == CD_ENABLED) {
1215 			switch (dnlc_dir_start(dcap,
1216 			    tdp->i_size >> AV_DIRECT_SHIFT)) {
1217 			case DNOMEM:
1218 				tdp->i_cachedir = CD_DISABLED_NOMEM;
1219 				ufs_dc_disable_at = gethrtime();
1220 				break;
1221 			case DTOOBIG:
1222 				tdp->i_cachedir = CD_DISABLED_TOOBIG;
1223 				break;
1224 			case DOK:
1225 				caching = 1;
1226 				break;
1227 			default:
1228 				break;
1229 			}
1230 		}
1231 	}
1232 
1233 	/*
1234 	 * No point in using i_diroff since we must search whole directory
1235 	 */
1236 	dirsize = P2ROUNDUP_TYPED(tdp->i_size, DIRBLKSIZ, u_offset_t);
1237 	enduseful = 0;
1238 	offset = last_offset = 0;
1239 	entryoffsetinblk = 0;
1240 	needed = (int)LDIRSIZ(namlen);
1241 	while (offset < dirsize) {
1242 		/*
1243 		 * If offset is on a block boundary,
1244 		 * read the next directory block.
1245 		 * Release previous if it exists.
1246 		 */
1247 		if (blkoff(tdp->i_fs, offset) == 0) {
1248 			if (fbp != NULL)
1249 				fbrelse(fbp, S_OTHER);
1250 
1251 			err = blkatoff(tdp, offset, (char **)0, &fbp);
1252 			if (err) {
1253 				ASSERT(*ipp == NULL);
1254 				if (caching) {
1255 					dnlc_dir_purge(dcap);
1256 				}
1257 				return (err);
1258 			}
1259 			entryoffsetinblk = 0;
1260 		}
1261 		/*
1262 		 * If still looking for a slot, and at a DIRBLKSIZ
1263 		 * boundary, have to start looking for free space
1264 		 * again.
1265 		 */
1266 		if (slotp->status == NONE &&
1267 		    (entryoffsetinblk & (DIRBLKSIZ - 1)) == 0) {
1268 			slotp->offset = -1;
1269 		}
1270 		/*
1271 		 * If the next entry is a zero length record or if the
1272 		 * record length is invalid, then skip to the next
1273 		 * directory block.  Complete validation checks are
1274 		 * done if the record length is invalid.
1275 		 *
1276 		 * Full validation checks are slow so they are disabled
1277 		 * by default.  Complete checks can be run by patching
1278 		 * "dirchk" to be true.
1279 		 *
1280 		 * We do not have to check the validity of
1281 		 * entryoffsetinblk here because it starts out as zero
1282 		 * and is only incremented by d_reclen values that we
1283 		 * validate here.
1284 		 */
1285 		ep = (struct direct *)(fbp->fb_addr + entryoffsetinblk);
1286 		if (ep->d_reclen == 0 ||
1287 		    (dirchk || (ep->d_reclen & 0x3)) &&
1288 		    dirmangled(tdp, ep, entryoffsetinblk, offset)) {
1289 			i = DIRBLKSIZ - (entryoffsetinblk & (DIRBLKSIZ - 1));
1290 			offset += i;
1291 			entryoffsetinblk += i;
1292 			if (caching) {
1293 				dnlc_dir_purge(dcap);
1294 				caching = 0;
1295 			}
1296 			continue;
1297 		}
1298 
1299 		/*
1300 		 * Add named entries and free space into the directory cache
1301 		 */
1302 		if (caching) {
1303 			ushort_t extra;
1304 			off_t off2;
1305 
1306 			if (ep->d_ino == 0) {
1307 				extra = ep->d_reclen;
1308 				if (offset & (DIRBLKSIZ - 1)) {
1309 					dnlc_dir_purge(dcap);
1310 					caching = 0;
1311 				}
1312 			} else {
1313 				/*
1314 				 * entries hold the previous offset if
1315 				 * not the 1st one
1316 				 */
1317 				if (offset & (DIRBLKSIZ - 1)) {
1318 					off2 = last_offset;
1319 				} else {
1320 					off2 = offset + 1;
1321 				}
1322 				caching = (dnlc_dir_add_entry(dcap, ep->d_name,
1323 				    INO_OFF_TO_H(ep->d_ino, off2)) == DOK);
1324 				extra = ep->d_reclen - DIRSIZ(ep);
1325 			}
1326 			if (caching && (extra >= LDIRSIZ(1))) {
1327 				caching = (dnlc_dir_add_space(dcap, extra,
1328 				    (uint64_t)offset) == DOK);
1329 			}
1330 		}
1331 
1332 		/*
1333 		 * If an appropriate sized slot has not yet been found,
1334 		 * check to see if one is available.
1335 		 */
1336 		if ((slotp->status != FOUND) && (slotp->status != EXIST)) {
1337 			int size = ep->d_reclen;
1338 
1339 			if (ep->d_ino != 0)
1340 				size -= DIRSIZ(ep);
1341 			if (size > 0) {
1342 				if (size >= needed) {
1343 					slotp->offset = offset;
1344 					slotp->size = ep->d_reclen;
1345 					if (noentry) {
1346 						slotp->ep = ep;
1347 						slotp->fbp = fbp;
1348 						slotp->status = FOUND;
1349 						slotp->endoff = 0;
1350 						return (0);
1351 					}
1352 					slotp->status = FOUND;
1353 				} else if (slotp->status == NONE) {
1354 					if (slotp->offset == -1)
1355 						slotp->offset = offset;
1356 				}
1357 			}
1358 		}
1359 		/*
1360 		 * Check for a name match.
1361 		 */
1362 		if (ep->d_ino && ep->d_namlen == namlen &&
1363 		    *namep == *ep->d_name &&	/* fast chk 1st char */
1364 		    bcmp(namep, ep->d_name, namlen) == 0) {
1365 
1366 			tdp->i_diroff = offset;
1367 
1368 			if (tdp->i_number == ep->d_ino) {
1369 				*ipp = tdp;	/* we want ourself, ie "." */
1370 				VN_HOLD(dvp);
1371 			} else {
1372 				err = ufs_iget_alloced(tdp->i_vfs,
1373 				    (ino_t)ep->d_ino, ipp, cr);
1374 				if (err) {
1375 					fbrelse(fbp, S_OTHER);
1376 					if (caching)
1377 						dnlc_dir_purge(dcap);
1378 					return (err);
1379 				}
1380 			}
1381 			slotp->status = EXIST;
1382 			slotp->offset = offset;
1383 			slotp->size = (int)(offset - last_offset);
1384 			slotp->fbp = fbp;
1385 			slotp->ep = ep;
1386 			slotp->endoff = 0;
1387 			if (caching)
1388 				dnlc_dir_purge(dcap);
1389 			return (0);
1390 		}
1391 		last_offset = offset;
1392 		offset += ep->d_reclen;
1393 		entryoffsetinblk += ep->d_reclen;
1394 		if (ep->d_ino)
1395 			enduseful = offset;
1396 	}
1397 	if (fbp) {
1398 		fbrelse(fbp, S_OTHER);
1399 	}
1400 
1401 	if (caching) {
1402 		dnlc_dir_complete(dcap);
1403 		slotp->cached = 1;
1404 		if (slotp->status == FOUND) {
1405 			if (initstat == FOUND) {
1406 				return (0);
1407 			}
1408 			(void) dnlc_dir_rem_space_by_handle(dcap,
1409 			    slotp->offset);
1410 			slotp->endoff = 0;
1411 			return (0);
1412 		}
1413 	}
1414 
1415 	if (slotp->status == NONE) {
1416 		/*
1417 		 * We didn't find a slot; the new directory entry should be put
1418 		 * at the end of the directory.  Return an indication of where
1419 		 * this is, and set "endoff" to zero; since we're going to have
1420 		 * to extend the directory, we're certainly not going to
1421 		 * truncate it.
1422 		 */
1423 		slotp->offset = dirsize;
1424 		slotp->size = DIRBLKSIZ;
1425 		slotp->endoff = 0;
1426 	} else {
1427 		/*
1428 		 * We found a slot, and will return an indication of where that
1429 		 * slot is, as any new directory entry will be put there.
1430 		 * Since that slot will become a useful entry, if the last
1431 		 * useful entry we found was before this one, update the offset
1432 		 * of the last useful entry.
1433 		 */
1434 		if (enduseful < slotp->offset + slotp->size)
1435 			enduseful = slotp->offset + slotp->size;
1436 		slotp->endoff = P2ROUNDUP_TYPED(enduseful, DIRBLKSIZ, off_t);
1437 	}
1438 	*ipp = NULL;
1439 	return (0);
1440 }
1441 
1442 uint64_t ufs_dirrename_retry_cnt;
1443 
1444 /*
1445  * Rename the entry in the directory tdp so that it points to
1446  * sip instead of tip.
1447  */
1448 static int
1449 ufs_dirrename(
1450 	struct inode *sdp,	/* parent directory of source */
1451 	struct inode *sip,	/* source inode */
1452 	struct inode *tdp,	/* parent directory of target */
1453 	char *namep,		/* entry we are trying to change */
1454 	struct inode *tip,	/* target inode */
1455 	struct ufs_slot *slotp,	/* slot for entry */
1456 	struct cred *cr)	/* credentials */
1457 {
1458 	vnode_t *tdvp;
1459 	off_t offset;
1460 	int err;
1461 	int doingdirectory;
1462 
1463 	ASSERT(sdp->i_ufsvfs != NULL);
1464 	ASSERT(RW_WRITE_HELD(&tdp->i_rwlock));
1465 	ASSERT(RW_WRITE_HELD(&tdp->i_contents));
1466 	/*
1467 	 * Short circuit rename of something to itself.
1468 	 */
1469 	if (sip->i_number == tip->i_number) {
1470 		return (ESAME); /* special KLUDGE error code */
1471 	}
1472 
1473 	/*
1474 	 * We're locking 2 peer level locks, so must use tryenter
1475 	 * on the 2nd to avoid deadlocks that would occur
1476 	 * if we renamed a->b and b->a concurrently.
1477 	 */
1478 retry:
1479 	rw_enter(&tip->i_contents, RW_WRITER);
1480 	if (!rw_tryenter(&sip->i_contents, RW_READER)) {
1481 		/*
1482 		 * drop tip and wait (sleep) until we stand a chance
1483 		 * of holding sip
1484 		 */
1485 		rw_exit(&tip->i_contents);
1486 		rw_enter(&sip->i_contents, RW_READER);
1487 		/*
1488 		 * Reverse the lock grabs in case we have heavy
1489 		 * contention on the 2nd lock.
1490 		 */
1491 		if (!rw_tryenter(&tip->i_contents, RW_WRITER)) {
1492 			ufs_dirrename_retry_cnt++;
1493 			rw_exit(&sip->i_contents);
1494 			goto retry;
1495 		}
1496 	}
1497 
1498 	/*
1499 	 * Check that everything is on the same filesystem.
1500 	 */
1501 	if ((ITOV(tip)->v_vfsp != ITOV(tdp)->v_vfsp) ||
1502 	    (ITOV(tip)->v_vfsp != ITOV(sip)->v_vfsp)) {
1503 		err = EXDEV;		/* XXX archaic */
1504 		goto out;
1505 	}
1506 	/*
1507 	 * Must have write permission to rewrite target entry.
1508 	 * Perform additional checks for sticky directories.
1509 	 */
1510 	if ((err = ufs_iaccess(tdp, IWRITE, cr, 0)) != 0 ||
1511 	    (err = ufs_sticky_remove_access(tdp, tip, cr)) != 0)
1512 		goto out;
1513 
1514 	/*
1515 	 * Ensure source and target are compatible (both directories
1516 	 * or both not directories).  If target is a directory it must
1517 	 * be empty and have no links to it; in addition it must not
1518 	 * be a mount point, and both the source and target must be
1519 	 * writable.
1520 	 */
1521 	doingdirectory = (((sip->i_mode & IFMT) == IFDIR) ||
1522 	    ((sip->i_mode & IFMT) == IFATTRDIR));
1523 	if (((tip->i_mode & IFMT) == IFDIR) ||
1524 	    ((tip->i_mode & IFMT) == IFATTRDIR)) {
1525 		if (!doingdirectory) {
1526 			err = EISDIR;
1527 			goto out;
1528 		}
1529 		/*
1530 		 * vn_vfsrlock will prevent mounts from using the directory
1531 		 * until we are done.
1532 		 */
1533 		if (vn_vfsrlock(ITOV(tip))) {
1534 			err = EBUSY;
1535 			goto out;
1536 		}
1537 		if (vn_mountedvfs(ITOV(tip)) != NULL) {
1538 			vn_vfsunlock(ITOV(tip));
1539 			err = EBUSY;
1540 			goto out;
1541 		}
1542 		if (!ufs_dirempty(tip, tdp->i_number, cr) || tip->i_nlink > 2) {
1543 			vn_vfsunlock(ITOV(tip));
1544 			err = EEXIST;	/* SIGH should be ENOTEMPTY */
1545 			goto out;
1546 		}
1547 	} else if (doingdirectory) {
1548 		err = ENOTDIR;
1549 		goto out;
1550 	}
1551 
1552 	/*
1553 	 * Rewrite the inode pointer for target name entry
1554 	 * from the target inode (ip) to the source inode (sip).
1555 	 * This prevents the target entry from disappearing
1556 	 * during a crash. Mark the directory inode to reflect the changes.
1557 	 */
1558 	tdvp = ITOV(tdp);
1559 	slotp->ep->d_ino = (int32_t)sip->i_number;
1560 	dnlc_update(tdvp, namep, ITOV(sip));
1561 	if (slotp->size) {
1562 		offset = slotp->offset - slotp->size;
1563 	} else {
1564 		offset = slotp->offset + 1;
1565 	}
1566 	if (slotp->cached) {
1567 		(void) dnlc_dir_update(&tdp->i_danchor, namep,
1568 		    INO_OFF_TO_H(slotp->ep->d_ino, offset));
1569 	}
1570 
1571 	err = TRANS_DIR(tdp, slotp->offset);
1572 	if (err)
1573 		fbrelse(slotp->fbp, S_OTHER);
1574 	else
1575 		err = ufs_fbwrite(slotp->fbp, tdp);
1576 
1577 	slotp->fbp = NULL;
1578 	if (err) {
1579 		if (doingdirectory)
1580 			vn_vfsunlock(ITOV(tip));
1581 		goto out;
1582 	}
1583 
1584 	TRANS_INODE(tdp->i_ufsvfs, tdp);
1585 	tdp->i_flag |= IUPD|ICHG;
1586 	tdp->i_seq++;
1587 	ITIMES_NOLOCK(tdp);
1588 
1589 	/*
1590 	 * Decrement the link count of the target inode.
1591 	 * Fix the ".." entry in sip to point to dp.
1592 	 * This is done after the new entry is on the disk.
1593 	 */
1594 	tip->i_nlink--;
1595 	TRANS_INODE(tip->i_ufsvfs, tip);
1596 	tip->i_flag |= ICHG;
1597 	tip->i_seq++;
1598 	ITIMES_NOLOCK(tip);
1599 	if (doingdirectory) {
1600 		/*
1601 		 * The entry for tip no longer exists so I can unlock the
1602 		 * vfslock.
1603 		 */
1604 		vn_vfsunlock(ITOV(tip));
1605 		/*
1606 		 * Decrement target link count once more if it was a directory.
1607 		 */
1608 		if (--tip->i_nlink != 0) {
1609 			err = ufs_fault(ITOV(tip),
1610 		    "ufs_dirrename: target directory link count != 0 (%s)",
1611 			    tip->i_fs->fs_fsmnt);
1612 			rw_exit(&tip->i_contents);
1613 			return (err);
1614 		}
1615 		TRANS_INODE(tip->i_ufsvfs, tip);
1616 		ufs_setreclaim(tip);
1617 		/*
1618 		 * Renaming a directory with the parent different
1619 		 * requires that ".." be rewritten.  The window is
1620 		 * still there for ".." to be inconsistent, but this
1621 		 * is unavoidable, and a lot shorter than when it was
1622 		 * done in a user process.  We decrement the link
1623 		 * count in the new parent as appropriate to reflect
1624 		 * the just-removed target.  If the parent is the
1625 		 * same, this is appropriate since the original
1626 		 * directory is going away.  If the new parent is
1627 		 * different, ufs_dirfixdotdot() will bump the link count
1628 		 * back.
1629 		 */
1630 		tdp->i_nlink--;
1631 		ufs_setreclaim(tdp);
1632 		TRANS_INODE(tdp->i_ufsvfs, tdp);
1633 		tdp->i_flag |= ICHG;
1634 		tdp->i_seq++;
1635 		ITIMES_NOLOCK(tdp);
1636 		if (sdp != tdp) {
1637 			rw_exit(&tip->i_contents);
1638 			rw_exit(&sip->i_contents);
1639 			err = ufs_dirfixdotdot(sip, sdp, tdp);
1640 			return (err);
1641 		}
1642 	} else
1643 		ufs_setreclaim(tip);
1644 out:
1645 	rw_exit(&tip->i_contents);
1646 	rw_exit(&sip->i_contents);
1647 	return (err);
1648 }
1649 
1650 /*
1651  * Fix the ".." entry of the child directory so that it points
1652  * to the new parent directory instead of the old one.  Routine
1653  * assumes that dp is a directory and that all the inodes are on
1654  * the same file system.
1655  */
1656 static int
1657 ufs_dirfixdotdot(
1658 	struct inode *dp,	/* child directory */
1659 	struct inode *opdp,	/* old parent directory */
1660 	struct inode *npdp)	/* new parent directory */
1661 {
1662 	struct fbuf *fbp;
1663 	struct dirtemplate *dirp;
1664 	vnode_t *dvp;
1665 	int err;
1666 
1667 	ASSERT(RW_WRITE_HELD(&npdp->i_rwlock));
1668 	ASSERT(RW_WRITE_HELD(&npdp->i_contents));
1669 
1670 	/*
1671 	 * We hold the child directory's i_contents lock before calling
1672 	 * blkatoff so that we honor correct locking protocol which is
1673 	 * i_contents lock and then page lock. (blkatoff will call
1674 	 * ufs_getpage where we want the page lock)
1675 	 * We hold the child directory's i_rwlock before i_contents (as
1676 	 * per the locking protocol) since we are modifying the ".." entry
1677 	 * of the child directory.
1678 	 * We hold the i_rwlock and i_contents lock until we record
1679 	 * this directory delta to the log (via ufs_trans_dir) and have
1680 	 * done fbrelse.
1681 	 */
1682 	rw_enter(&dp->i_rwlock, RW_WRITER);
1683 	rw_enter(&dp->i_contents, RW_WRITER);
1684 	err = blkatoff(dp, (off_t)0, (char **)&dirp, &fbp);
1685 	if (err)
1686 		goto bad;
1687 
1688 	if (dp->i_nlink <= 0 ||
1689 	    dp->i_size < sizeof (struct dirtemplate)) {
1690 		err = ENOENT;
1691 		goto bad;
1692 	}
1693 
1694 	if (dirp->dotdot_namlen != 2 ||
1695 	    dirp->dotdot_name[0] != '.' ||
1696 	    dirp->dotdot_name[1] != '.') {	/* Sanity check. */
1697 		dirbad(dp, "mangled .. entry", (off_t)0);
1698 		err = ENOTDIR;
1699 		goto bad;
1700 	}
1701 
1702 	/*
1703 	 * Increment the link count in the new parent inode and force it out.
1704 	 */
1705 	if (npdp->i_nlink == MAXLINK) {
1706 		err = EMLINK;
1707 		goto bad;
1708 	}
1709 	npdp->i_nlink++;
1710 	TRANS_INODE(npdp->i_ufsvfs, npdp);
1711 	npdp->i_flag |= ICHG;
1712 	npdp->i_seq++;
1713 	ufs_iupdat(npdp, I_SYNC);
1714 
1715 	/*
1716 	 * Rewrite the child ".." entry and force it out.
1717 	 */
1718 	dvp = ITOV(dp);
1719 	dirp->dotdot_ino = (uint32_t)npdp->i_number;
1720 	dnlc_update(dvp, "..", ITOV(npdp));
1721 	(void) dnlc_dir_update(&dp->i_danchor, "..",
1722 	    INO_OFF_TO_H(dirp->dotdot_ino, 0));
1723 
1724 	err = TRANS_DIR(dp, 0);
1725 	if (err)
1726 		fbrelse(fbp, S_OTHER);
1727 	else
1728 		err = ufs_fbwrite(fbp, dp);
1729 
1730 	fbp = NULL;
1731 	if (err)
1732 		goto bad;
1733 
1734 	rw_exit(&dp->i_contents);
1735 	rw_exit(&dp->i_rwlock);
1736 
1737 	/*
1738 	 * Decrement the link count of the old parent inode and force it out.
1739 	 */
1740 	ASSERT(opdp);
1741 	rw_enter(&opdp->i_contents, RW_WRITER);
1742 	ASSERT(opdp->i_nlink > 0);
1743 	opdp->i_nlink--;
1744 	ufs_setreclaim(opdp);
1745 	TRANS_INODE(opdp->i_ufsvfs, opdp);
1746 	opdp->i_flag |= ICHG;
1747 	opdp->i_seq++;
1748 	ufs_iupdat(opdp, I_SYNC);
1749 	rw_exit(&opdp->i_contents);
1750 	return (0);
1751 
1752 bad:
1753 	if (fbp)
1754 		fbrelse(fbp, S_OTHER);
1755 	rw_exit(&dp->i_contents);
1756 	rw_exit(&dp->i_rwlock);
1757 	return (err);
1758 }
1759 
1760 /*
1761  * Enter the file sip in the directory tdp with name namep.
1762  */
1763 static int
1764 ufs_diraddentry(
1765 	struct inode *tdp,
1766 	char *namep,
1767 	enum de_op op,
1768 	int namlen,
1769 	struct ufs_slot *slotp,
1770 	struct inode *sip,
1771 	struct inode *sdp,
1772 	struct cred *cr)
1773 {
1774 	struct direct *ep, *nep;
1775 	vnode_t *tdvp;
1776 	dcanchor_t *dcap = &tdp->i_danchor;
1777 	off_t offset;
1778 	int err;
1779 	ushort_t extra;
1780 
1781 	ASSERT(RW_WRITE_HELD(&tdp->i_rwlock));
1782 	ASSERT(RW_WRITE_HELD(&tdp->i_contents));
1783 	/*
1784 	 * Prepare a new entry.  If the caller has not supplied an
1785 	 * existing inode, make a new one.
1786 	 */
1787 	err = dirprepareentry(tdp, slotp, cr);
1788 	if (err) {
1789 		if (slotp->fbp) {
1790 			fbrelse(slotp->fbp, S_OTHER);
1791 			slotp->fbp = NULL;
1792 		}
1793 		return (err);
1794 	}
1795 	/*
1796 	 * Check inode to be linked to see if it is in the
1797 	 * same filesystem.
1798 	 */
1799 	if (ITOV(tdp)->v_vfsp != ITOV(sip)->v_vfsp) {
1800 		err = EXDEV;
1801 		goto bad;
1802 	}
1803 
1804 	/*
1805 	 * If renaming a directory then fix up the ".." entry in the
1806 	 * directory to point to the new parent.
1807 	 */
1808 	if ((op == DE_RENAME) && (((sip->i_mode & IFMT) == IFDIR) ||
1809 	    ((sip->i_mode & IFMT) == IFATTRDIR)) && (sdp != tdp)) {
1810 		err = ufs_dirfixdotdot(sip, sdp, tdp);
1811 		if (err)
1812 			goto bad;
1813 	}
1814 
1815 	/*
1816 	 * Fill in entry data.
1817 	 */
1818 	ep = slotp->ep;
1819 	ep->d_namlen = (ushort_t)namlen;
1820 	(void) strncpy(ep->d_name, namep, (size_t)((namlen + 4) & ~3));
1821 	ep->d_ino = (uint32_t)sip->i_number;
1822 	tdvp = ITOV(tdp);
1823 	dnlc_update(tdvp, namep, ITOV(sip));
1824 	/*
1825 	 * Note the offset supplied for any named entry is
1826 	 * the offset of the previous one, unless it's the 1st.
1827 	 * slotp->size is used to pass the length to
1828 	 * the previous entry.
1829 	 */
1830 	if (slotp->size) {
1831 		offset = slotp->offset - slotp->size;
1832 	} else {
1833 		offset = slotp->offset + 1;
1834 	}
1835 
1836 	if (slotp->cached) {
1837 		/*
1838 		 * Add back any usable unused space to the dnlc directory
1839 		 * cache.
1840 		 */
1841 		extra = ep->d_reclen - DIRSIZ(ep);
1842 		if (extra >= LDIRSIZ(1)) {
1843 			(void) dnlc_dir_add_space(dcap, extra,
1844 			    (uint64_t)slotp->offset);
1845 		}
1846 
1847 		(void) dnlc_dir_add_entry(dcap, namep,
1848 		    INO_OFF_TO_H(ep->d_ino, offset));
1849 
1850 		/* adjust the previous offset of the next entry */
1851 		nep = (struct direct *)((char *)ep + ep->d_reclen);
1852 		if ((uintptr_t)nep & (DIRBLKSIZ - 1)) {
1853 			/*
1854 			 * Not a new block.
1855 			 *
1856 			 * Check the validity of the next entry.
1857 			 * If it's bad, then throw away the cache, and
1858 			 * continue as before directory caching.
1859 			 */
1860 			if ((nep->d_reclen == 0) || (nep->d_reclen & 0x3) ||
1861 			    dnlc_dir_update(dcap, nep->d_name,
1862 			    INO_OFF_TO_H(nep->d_ino, slotp->offset))
1863 			    == DNOENT) {
1864 				dnlc_dir_purge(dcap);
1865 				slotp->cached = 0;
1866 			}
1867 		}
1868 	}
1869 
1870 	/*
1871 	 * Write out the directory block.
1872 	 */
1873 	err = TRANS_DIR(tdp, slotp->offset);
1874 	if (err)
1875 		fbrelse(slotp->fbp, S_OTHER);
1876 	else
1877 		err = ufs_fbwrite(slotp->fbp, tdp);
1878 
1879 	slotp->fbp = NULL;
1880 	/*
1881 	 * If this is a rename of a directory, then we have already
1882 	 * fixed the ".." entry to refer to the new parent. If err
1883 	 * is true at this point, we have failed to update the new
1884 	 * parent to refer to the renamed directory.
1885 	 * XXX - we need to unwind the ".." fix.
1886 	 */
1887 	if (err)
1888 		return (err);
1889 
1890 	/*
1891 	 * Mark the directory inode to reflect the changes.
1892 	 * Truncate the directory to chop off blocks of empty entries.
1893 	 */
1894 
1895 	TRANS_INODE(tdp->i_ufsvfs, tdp);
1896 	tdp->i_flag |= IUPD|ICHG;
1897 	tdp->i_seq++;
1898 	tdp->i_diroff = 0;
1899 	ITIMES_NOLOCK(tdp);
1900 	/*
1901 	 * If the directory grew then dirprepareentry() will have
1902 	 * set IATTCHG in tdp->i_flag, then the directory inode must
1903 	 * be flushed out. This is because if fsync() is used later
1904 	 * the directory size must be correct, otherwise a crash would
1905 	 * cause fsck to move the file to lost+found. Also because later
1906 	 * a file may be linked in more than one directory, then there
1907 	 * is no way to flush the original directory. So it must be
1908 	 * flushed out on creation. See bug 4293809.
1909 	 */
1910 	if (tdp->i_flag & IATTCHG) {
1911 		ufs_iupdat(tdp, I_SYNC);
1912 	}
1913 
1914 	if (slotp->endoff && (slotp->endoff < tdp->i_size)) {
1915 		if (!TRANS_ISTRANS(tdp->i_ufsvfs)) {
1916 			(void) ufs_itrunc(tdp, (u_offset_t)slotp->endoff, 0,
1917 			    cr);
1918 		}
1919 	}
1920 
1921 
1922 	return (0);
1923 
1924 bad:
1925 	if (slotp->cached) {
1926 		dnlc_dir_purge(dcap);
1927 		fbrelse(slotp->fbp, S_OTHER);
1928 		slotp->cached = 0;
1929 		slotp->fbp = NULL;
1930 		return (err);
1931 	}
1932 
1933 	/*
1934 	 * Clear out entry prepared by dirprepareent.
1935 	 */
1936 	slotp->ep->d_ino = 0;
1937 	slotp->ep->d_namlen = 0;
1938 
1939 	/*
1940 	 * Don't touch err so we don't clobber the real error that got us here.
1941 	 */
1942 	if (TRANS_DIR(tdp, slotp->offset))
1943 		fbrelse(slotp->fbp, S_OTHER);
1944 	else
1945 		(void) ufs_fbwrite(slotp->fbp, tdp);
1946 	slotp->fbp = NULL;
1947 	return (err);
1948 }
1949 
1950 /*
1951  * Prepare a directory slot to receive an entry.
1952  */
1953 static int
1954 dirprepareentry(
1955 	struct inode *dp,	/* directory we are working in */
1956 	struct ufs_slot *slotp,	/* available slot info */
1957 	struct cred *cr)
1958 {
1959 	struct direct *ep, *nep;
1960 	off_t entryend;
1961 	int err;
1962 	slotstat_t status = slotp->status;
1963 	ushort_t dsize;
1964 
1965 	ASSERT((status == NONE) || (status == FOUND));
1966 	ASSERT(RW_WRITE_HELD(&dp->i_rwlock));
1967 	ASSERT(RW_WRITE_HELD(&dp->i_contents));
1968 	/*
1969 	 * If we didn't find a slot, then indicate that the
1970 	 * new slot belongs at the end of the directory.
1971 	 * If we found a slot, then the new entry can be
1972 	 * put at slotp->offset.
1973 	 */
1974 	entryend = slotp->offset + slotp->size;
1975 	if (status == NONE) {
1976 		ASSERT((slotp->offset & (DIRBLKSIZ - 1)) == 0);
1977 		if (DIRBLKSIZ > dp->i_fs->fs_fsize) {
1978 			err = ufs_fault(ITOV(dp),
1979 			    "dirprepareentry: bad fs_fsize, DIRBLKSIZ: %d"
1980 			    " > dp->i_fs->fs_fsize: %d (%s)",
1981 			    DIRBLKSIZ, dp->i_fs->fs_fsize, dp->i_fs->fs_fsmnt);
1982 			return (err);
1983 		}
1984 		/*
1985 		 * Allocate the new block.
1986 		 */
1987 		err = BMAPALLOC(dp, (u_offset_t)slotp->offset,
1988 		    (int)(blkoff(dp->i_fs, slotp->offset) + DIRBLKSIZ), cr);
1989 		if (err) {
1990 			return (err);
1991 		}
1992 		dp->i_size = entryend;
1993 		TRANS_INODE(dp->i_ufsvfs, dp);
1994 		dp->i_flag |= IUPD|ICHG|IATTCHG;
1995 		dp->i_seq++;
1996 		ITIMES_NOLOCK(dp);
1997 	} else if (entryend > dp->i_size) {
1998 		/*
1999 		 * Adjust directory size, if needed. This should never
2000 		 * push the size past a new multiple of DIRBLKSIZ.
2001 		 * This is an artifact of the old (4.2BSD) way of initializing
2002 		 * directory sizes to be less than DIRBLKSIZ.
2003 		 */
2004 		dp->i_size = P2ROUNDUP_TYPED(entryend, DIRBLKSIZ, off_t);
2005 		TRANS_INODE(dp->i_ufsvfs, dp);
2006 		dp->i_flag |= IUPD|ICHG|IATTCHG;
2007 		dp->i_seq++;
2008 		ITIMES_NOLOCK(dp);
2009 	}
2010 
2011 	/*
2012 	 * Get the block containing the space for the new directory entry.
2013 	 */
2014 	if (slotp->fbp == NULL) {
2015 		err = blkatoff(dp, slotp->offset, (char **)&slotp->ep,
2016 		    &slotp->fbp);
2017 		if (err) {
2018 			return (err);
2019 		}
2020 	}
2021 	ep = slotp->ep;
2022 
2023 	switch (status) {
2024 	case NONE:
2025 		/*
2026 		 * No space in the directory. slotp->offset will be on a
2027 		 * directory block boundary and we will write the new entry
2028 		 * into a fresh block.
2029 		 */
2030 		ep->d_reclen = DIRBLKSIZ;
2031 		slotp->size = 0; /* length of previous entry */
2032 		break;
2033 	case FOUND:
2034 		/*
2035 		 * An entry of the required size has been found. Use it.
2036 		 */
2037 		if (ep->d_ino == 0) {
2038 			/* this is the 1st record in a block */
2039 			slotp->size = 0; /* length of previous entry */
2040 		} else {
2041 			dsize = DIRSIZ(ep);
2042 			nep = (struct direct *)((char *)ep + dsize);
2043 			nep->d_reclen = ep->d_reclen - dsize;
2044 			ep->d_reclen = dsize;
2045 			slotp->ep = nep;
2046 			slotp->offset += dsize;
2047 			slotp->size = dsize; /* length of previous entry */
2048 		}
2049 		break;
2050 	default:
2051 		break;
2052 	}
2053 	return (0);
2054 }
2055 
2056 /*
2057  * Allocate and initialize a new inode that will go into directory tdp.
2058  * This routine is called from ufs_symlink(), as well as within this file.
2059  */
2060 int
2061 ufs_dirmakeinode(
2062 	struct inode *tdp,
2063 	struct inode **ipp,
2064 	struct vattr *vap,
2065 	enum de_op op,
2066 	struct cred *cr)
2067 {
2068 	struct inode *ip;
2069 	enum vtype type;
2070 	int imode;			/* mode and format as in inode */
2071 	ino_t ipref;
2072 	int err;
2073 	timestruc_t now;
2074 
2075 	ASSERT(vap != NULL);
2076 	ASSERT(op == DE_CREATE || op == DE_MKDIR || op == DE_ATTRDIR ||
2077 	    op == DE_SYMLINK);
2078 	ASSERT((vap->va_mask & (AT_TYPE|AT_MODE)) == (AT_TYPE|AT_MODE));
2079 	ASSERT(RW_WRITE_HELD(&tdp->i_rwlock));
2080 	ASSERT(RW_WRITE_HELD(&tdp->i_contents));
2081 	/*
2082 	 * Allocate a new inode.
2083 	 */
2084 	type = vap->va_type;
2085 	if (type == VDIR) {
2086 		ipref = dirpref(tdp);
2087 	} else {
2088 		ipref = tdp->i_number;
2089 	}
2090 	if (op == DE_ATTRDIR)
2091 		imode = vap->va_mode;
2092 	else
2093 		imode = MAKEIMODE(type, vap->va_mode);
2094 	*ipp = NULL;
2095 	err = ufs_ialloc(tdp, ipref, imode, &ip, cr);
2096 	if (err)
2097 		return (err);
2098 
2099 	/*
2100 	 * We don't need to grab vfs_dqrwlock here because it is held
2101 	 * in ufs_direnter_*() above us.
2102 	 */
2103 	ASSERT(RW_READ_HELD(&ip->i_ufsvfs->vfs_dqrwlock));
2104 	rw_enter(&ip->i_contents, RW_WRITER);
2105 	if (ip->i_dquot != NULL) {
2106 		err = ufs_fault(ITOV(ip),
2107 		    "ufs_dirmakeinode, ip->i_dquot != NULL: dquot (%s)",
2108 		    tdp->i_fs->fs_fsmnt);
2109 		rw_exit(&ip->i_contents);
2110 		return (err);
2111 	}
2112 	*ipp = ip;
2113 	ip->i_mode = (o_mode_t)imode;
2114 	if (type == VBLK || type == VCHR) {
2115 		dev_t d = vap->va_rdev;
2116 		dev32_t dev32;
2117 
2118 		/*
2119 		 * Don't allow a special file to be created with a
2120 		 * dev_t that cannot be represented by this filesystem
2121 		 * format on disk.
2122 		 */
2123 		if (!cmpldev(&dev32, d)) {
2124 			err = EOVERFLOW;
2125 			goto fail;
2126 		}
2127 
2128 		ITOV(ip)->v_rdev = ip->i_rdev = d;
2129 
2130 		if (dev32 & ~((O_MAXMAJ << L_BITSMINOR32) | O_MAXMIN)) {
2131 			ip->i_ordev = dev32; /* can't use old format */
2132 		} else {
2133 			ip->i_ordev = cmpdev(d);
2134 		}
2135 	}
2136 	ITOV(ip)->v_type = type;
2137 	ufs_reset_vnode(ip->i_vnode);
2138 	if (type == VDIR) {
2139 		ip->i_nlink = 2; /* anticipating a call to dirmakedirect */
2140 	} else {
2141 		ip->i_nlink = 1;
2142 	}
2143 
2144 	if (op == DE_ATTRDIR) {
2145 		ip->i_uid = vap->va_uid;
2146 		ip->i_gid = vap->va_gid;
2147 	} else
2148 		ip->i_uid = crgetuid(cr);
2149 	/*
2150 	 * To determine the group-id of the created file:
2151 	 *   1) If the gid is set in the attribute list (non-Sun & pre-4.0
2152 	 *	clients are not likely to set the gid), then use it if
2153 	 *	the process is privileged, belongs to the target group,
2154 	 *	or the group is the same as the parent directory.
2155 	 *   2) If the filesystem was not mounted with the Old-BSD-compatible
2156 	 *	GRPID option, and the directory's set-gid bit is clear,
2157 	 *	then use the process's gid.
2158 	 *   3) Otherwise, set the group-id to the gid of the parent directory.
2159 	 */
2160 	if (op != DE_ATTRDIR && (vap->va_mask & AT_GID) &&
2161 	    ((vap->va_gid == tdp->i_gid) || groupmember(vap->va_gid, cr) ||
2162 	    secpolicy_vnode_create_gid(cr) == 0)) {
2163 		/*
2164 		 * XXX - is this only the case when a 4.0 NFS client, or a
2165 		 * client derived from that code, makes a call over the wire?
2166 		 */
2167 		ip->i_gid = vap->va_gid;
2168 	} else
2169 		ip->i_gid = (tdp->i_mode & ISGID) ? tdp->i_gid : crgetgid(cr);
2170 
2171 	/*
2172 	 * For SunOS 5.0->5.4, the lines below read:
2173 	 *
2174 	 * ip->i_suid = (ip->i_uid > MAXUID) ? UID_LONG : ip->i_uid;
2175 	 * ip->i_sgid = (ip->i_gid > MAXUID) ? GID_LONG : ip->i_gid;
2176 	 *
2177 	 * where MAXUID was set to 60002.  See notes on this in ufs_inode.c
2178 	 */
2179 	ip->i_suid =
2180 	    (ulong_t)ip->i_uid > (ulong_t)USHRT_MAX ? UID_LONG : ip->i_uid;
2181 	ip->i_sgid =
2182 	    (ulong_t)ip->i_gid > (ulong_t)USHRT_MAX ? GID_LONG : ip->i_gid;
2183 
2184 	/*
2185 	 * If we're creating a directory, and the parent directory has the
2186 	 * set-GID bit set, set it on the new directory.
2187 	 * Otherwise, if the user is neither privileged nor a member of the
2188 	 * file's new group, clear the file's set-GID bit.
2189 	 */
2190 	if ((tdp->i_mode & ISGID) && (type == VDIR))
2191 		ip->i_mode |= ISGID;
2192 	else {
2193 		if ((ip->i_mode & ISGID) &&
2194 		    secpolicy_vnode_setids_setgids(cr, ip->i_gid) != 0)
2195 			ip->i_mode &= ~ISGID;
2196 	}
2197 
2198 	if (((vap->va_mask & AT_ATIME) && TIMESPEC_OVERFLOW(&vap->va_atime)) ||
2199 	    ((vap->va_mask & AT_MTIME) && TIMESPEC_OVERFLOW(&vap->va_mtime))) {
2200 		err = EOVERFLOW;
2201 		goto fail;
2202 	}
2203 
2204 	/*
2205 	 * Extended attribute directories are not subject to quotas.
2206 	 */
2207 	if (op != DE_ATTRDIR)
2208 		ip->i_dquot = getinoquota(ip);
2209 	else
2210 		ip->i_dquot = NULL;
2211 
2212 	if (op == DE_MKDIR || op == DE_ATTRDIR) {
2213 		err = ufs_dirmakedirect(ip, tdp, (op == DE_MKDIR) ? 0 : 1, cr);
2214 		if (err)
2215 			goto fail;
2216 	}
2217 
2218 	/*
2219 	 * generate the shadow inode and attach it to the new object
2220 	 */
2221 	ASSERT((tdp->i_shadow && tdp->i_ufs_acl) ||
2222 	    (!tdp->i_shadow && !tdp->i_ufs_acl));
2223 	if (tdp->i_shadow && tdp->i_ufs_acl &&
2224 	    (((tdp->i_mode & IFMT) == IFDIR) ||
2225 	    ((tdp->i_mode & IFMT) == IFATTRDIR))) {
2226 		err = ufs_si_inherit(ip, tdp, ip->i_mode, cr);
2227 		if (err) {
2228 			if (op == DE_MKDIR) {
2229 				/*
2230 				 * clean up parent directory
2231 				 *
2232 				 * tdp->i_contents already locked from
2233 				 * ufs_direnter_*()
2234 				 */
2235 				tdp->i_nlink--;
2236 				TRANS_INODE(tdp->i_ufsvfs, tdp);
2237 				tdp->i_flag |= ICHG;
2238 				tdp->i_seq++;
2239 				ufs_iupdat(tdp, I_SYNC);
2240 			}
2241 			goto fail;
2242 		}
2243 	}
2244 
2245 	/*
2246 	 * If the passed in attributes contain atime and/or mtime
2247 	 * settings, then use them instead of using the current
2248 	 * high resolution time.
2249 	 */
2250 	if (vap->va_mask & (AT_MTIME|AT_ATIME)) {
2251 		if (vap->va_mask & AT_ATIME) {
2252 			ip->i_atime.tv_sec = vap->va_atime.tv_sec;
2253 			ip->i_atime.tv_usec = vap->va_atime.tv_nsec / 1000;
2254 			ip->i_flag &= ~IACC;
2255 		} else
2256 			ip->i_flag |= IACC;
2257 		if (vap->va_mask & AT_MTIME) {
2258 			ip->i_mtime.tv_sec = vap->va_mtime.tv_sec;
2259 			ip->i_mtime.tv_usec = vap->va_mtime.tv_nsec / 1000;
2260 			gethrestime(&now);
2261 			if (now.tv_sec > TIME32_MAX) {
2262 				/*
2263 				 * In 2038, ctime sticks forever..
2264 				 */
2265 				ip->i_ctime.tv_sec = TIME32_MAX;
2266 				ip->i_ctime.tv_usec = 0;
2267 			} else {
2268 				ip->i_ctime.tv_sec = now.tv_sec;
2269 				ip->i_ctime.tv_usec = now.tv_nsec / 1000;
2270 			}
2271 			ip->i_flag &= ~(IUPD|ICHG);
2272 			ip->i_flag |= IMODTIME;
2273 		} else
2274 			ip->i_flag |= IUPD|ICHG;
2275 		ip->i_flag |= IMOD;
2276 	} else
2277 		ip->i_flag |= IACC|IUPD|ICHG;
2278 	ip->i_seq++;
2279 
2280 	/*
2281 	 * If this is an attribute tag it as one.
2282 	 */
2283 	if ((tdp->i_mode & IFMT) == IFATTRDIR) {
2284 		ip->i_cflags |= IXATTR;
2285 	}
2286 
2287 	/*
2288 	 * push inode before it's name appears in a directory
2289 	 */
2290 	TRANS_INODE(ip->i_ufsvfs, ip);
2291 	ufs_iupdat(ip, I_SYNC);
2292 	rw_exit(&ip->i_contents);
2293 	return (0);
2294 
2295 fail:
2296 	/* Throw away inode we just allocated. */
2297 	ip->i_nlink = 0;
2298 	ufs_setreclaim(ip);
2299 	TRANS_INODE(ip->i_ufsvfs, ip);
2300 	ip->i_flag |= ICHG;
2301 	ip->i_seq++;
2302 	ITIMES_NOLOCK(ip);
2303 	rw_exit(&ip->i_contents);
2304 	return (err);
2305 }
2306 
2307 /*
2308  * Write a prototype directory into the empty inode ip, whose parent is dp.
2309  */
2310 static int
2311 ufs_dirmakedirect(
2312 	struct inode *ip,		/* new directory */
2313 	struct inode *dp,		/* parent directory */
2314 	int	attrdir,
2315 	struct cred *cr)
2316 {
2317 	struct dirtemplate *dirp;
2318 	struct fbuf *fbp;
2319 	int err;
2320 
2321 	ASSERT(RW_WRITE_HELD(&ip->i_contents));
2322 	ASSERT(RW_WRITE_HELD(&dp->i_rwlock));
2323 	ASSERT(RW_WRITE_HELD(&dp->i_contents));
2324 	/*
2325 	 * Allocate space for the directory we're creating.
2326 	 */
2327 	err = BMAPALLOC(ip, (u_offset_t)0, DIRBLKSIZ, cr);
2328 	if (err)
2329 		return (err);
2330 	if (DIRBLKSIZ > dp->i_fs->fs_fsize) {
2331 		err = ufs_fault(ITOV(dp),
2332 "ufs_dirmakedirect: bad fs_fsize, DIRBLKSIZ: %d > dp->i_fs->fs_fsize: %d (%s)",
2333 		    DIRBLKSIZ, dp->i_fs->fs_fsize,
2334 		    dp->i_fs->fs_fsmnt);
2335 		return (err);
2336 	}
2337 	ip->i_size = DIRBLKSIZ;
2338 	TRANS_INODE(ip->i_ufsvfs, ip);
2339 	ip->i_flag |= IUPD|ICHG|IATTCHG;
2340 	ip->i_seq++;
2341 	ITIMES_NOLOCK(ip);
2342 	/*
2343 	 * Update the tdp link count and write out the change.
2344 	 * This reflects the ".." entry we'll soon write.
2345 	 */
2346 	if (dp->i_nlink == MAXLINK)
2347 		return (EMLINK);
2348 	if (attrdir == 0)
2349 		dp->i_nlink++;
2350 	TRANS_INODE(dp->i_ufsvfs, dp);
2351 	dp->i_flag |= ICHG;
2352 	dp->i_seq++;
2353 	ufs_iupdat(dp, I_SYNC);
2354 	/*
2355 	 * Initialize directory with "."
2356 	 * and ".." from static template.
2357 	 *
2358 	 * Since the parent directory is locked, we don't have to
2359 	 * worry about anything changing when we drop the write
2360 	 * lock on (ip).
2361 	 *
2362 	 */
2363 	err = fbread(ITOV(ip), (offset_t)0, (uint_t)ip->i_fs->fs_fsize,
2364 	    S_READ, &fbp);
2365 
2366 	if (err) {
2367 		goto fail;
2368 	}
2369 	dirp = (struct dirtemplate *)fbp->fb_addr;
2370 	/*
2371 	 * Now initialize the directory we're creating
2372 	 * with the "." and ".." entries.
2373 	 */
2374 	*dirp = mastertemplate;			/* structure assignment */
2375 	dirp->dot_ino = (uint32_t)ip->i_number;
2376 	dirp->dotdot_ino = (uint32_t)dp->i_number;
2377 
2378 	err = TRANS_DIR(ip, 0);
2379 	if (err) {
2380 		fbrelse(fbp, S_OTHER);
2381 		goto fail;
2382 	}
2383 
2384 	err = ufs_fbwrite(fbp, ip);
2385 	if (err) {
2386 		goto fail;
2387 	}
2388 
2389 	return (0);
2390 
2391 fail:
2392 	if (attrdir == 0)
2393 		dp->i_nlink--;
2394 	TRANS_INODE(dp->i_ufsvfs, dp);
2395 	dp->i_flag |= ICHG;
2396 	dp->i_seq++;
2397 	ufs_iupdat(dp, I_SYNC);
2398 	return (err);
2399 }
2400 
2401 /*
2402  * Delete a directory entry.  If oip is nonzero the entry is checked
2403  * to make sure it still reflects oip.
2404  */
2405 int
2406 ufs_dirremove(
2407 	struct inode *dp,
2408 	char *namep,
2409 	struct inode *oip,
2410 	struct vnode *cdir,
2411 	enum dr_op op,
2412 	struct cred *cr)
2413 {
2414 	struct direct *ep, *pep, *nep;
2415 	struct inode *ip;
2416 	vnode_t *dvp, *vp;
2417 	struct ufs_slot slot;
2418 	int namlen;
2419 	int err;
2420 	int mode;
2421 	ushort_t extra;
2422 
2423 	namlen = (int)strlen(namep);
2424 	if (namlen == 0) {
2425 		struct fs	*fs = dp->i_fs;
2426 
2427 		cmn_err(CE_WARN, "%s: ufs_dirremove: attempted to remove"
2428 		    " nameless file in directory (directory inode %llu)",
2429 		    fs->fs_fsmnt, (u_longlong_t)dp->i_number);
2430 		ASSERT(namlen != 0);
2431 
2432 		return (ENOENT);
2433 	}
2434 
2435 	/*
2436 	 * return error when removing . and ..
2437 	 */
2438 	if (namep[0] == '.') {
2439 		if (namlen == 1)
2440 			return (EINVAL);
2441 		else if (namlen == 2 && namep[1] == '.') {
2442 			return (EEXIST);	/* SIGH should be ENOTEMPTY */
2443 		}
2444 	}
2445 
2446 	ASSERT(RW_WRITE_HELD(&dp->i_rwlock));
2447 
2448 retry:
2449 	/*
2450 	 * Check accessibility of directory.
2451 	 */
2452 	if (err = ufs_diraccess(dp, IEXEC|IWRITE, cr))
2453 		return (err);
2454 
2455 	ip = NULL;
2456 	slot.fbp = NULL;
2457 	slot.status = FOUND;	/* don't need to look for empty slot */
2458 	rw_enter(&dp->i_ufsvfs->vfs_dqrwlock, RW_READER);
2459 	rw_enter(&dp->i_contents, RW_WRITER);
2460 
2461 	err = ufs_dircheckforname(dp, namep, namlen, &slot, &ip, cr, 0);
2462 	if (err)
2463 		goto out_novfs;
2464 	if (ip == NULL) {
2465 		err = ENOENT;
2466 		goto out_novfs;
2467 	}
2468 	vp = ITOV(ip);
2469 	if (oip && oip != ip) {
2470 		err = ENOENT;
2471 		goto out_novfs;
2472 	}
2473 
2474 	mode = ip->i_mode & IFMT;
2475 	if (mode == IFDIR || mode == IFATTRDIR) {
2476 
2477 		/*
2478 		 * vn_vfsrlock() prevents races between mount and rmdir.
2479 		 */
2480 		if (vn_vfsrlock(vp)) {
2481 			err = EBUSY;
2482 			goto out_novfs;
2483 		}
2484 		if (vn_mountedvfs(vp) != NULL && op != DR_RENAME) {
2485 			err = EBUSY;
2486 			goto out;
2487 		}
2488 		/*
2489 		 * If we are removing a directory, get a lock on it.
2490 		 * Taking a writer lock prevents a parallel ufs_dirlook from
2491 		 * incorrectly entering a negative cache vnode entry in the dnlc
2492 		 * If the directory is empty, it will stay empty until
2493 		 * we can remove it.
2494 		 */
2495 		if (!rw_tryenter(&ip->i_rwlock, RW_WRITER)) {
2496 			/*
2497 			 * It is possible that a thread in rename would have
2498 			 * acquired this rwlock. To prevent a deadlock we
2499 			 * do a rw_tryenter. If we fail to get the lock
2500 			 * we drop all the locks we have acquired, wait
2501 			 * for 2 ticks and reacquire the
2502 			 * directory's (dp) i_rwlock and try again.
2503 			 * If we dont drop dp's i_rwlock then we will panic
2504 			 * with a "Deadlock: cycle in blocking chain"
2505 			 * since in ufs_dircheckpath we want dp's i_rwlock.
2506 			 * dp is guaranteed to exist since ufs_dirremove is
2507 			 * called after a VN_HOLD(dp) has been done.
2508 			 */
2509 			ufs_dirremove_retry_cnt++;
2510 			vn_vfsunlock(vp);
2511 			if (slot.fbp)
2512 				fbrelse(slot.fbp, S_OTHER);
2513 			rw_exit(&dp->i_contents);
2514 			rw_exit(&dp->i_ufsvfs->vfs_dqrwlock);
2515 			rw_exit(&dp->i_rwlock);
2516 			VN_RELE(vp);
2517 			delay(2);
2518 			rw_enter(&dp->i_rwlock, RW_WRITER);
2519 			goto retry;
2520 		}
2521 	}
2522 	rw_enter(&ip->i_contents, RW_READER);
2523 
2524 	/*
2525 	 * Now check the restrictions that apply on sticky directories.
2526 	 */
2527 	if ((err = ufs_sticky_remove_access(dp, ip, cr)) != 0) {
2528 		rw_exit(&ip->i_contents);
2529 		if (mode == IFDIR || mode == IFATTRDIR)
2530 			rw_exit(&ip->i_rwlock);
2531 		goto out;
2532 	}
2533 
2534 	if (op == DR_RMDIR) {
2535 		/*
2536 		 * For rmdir(2), some special checks are required.
2537 		 * (a) Don't remove any alias of the parent (e.g. ".").
2538 		 * (b) Don't remove the current directory.
2539 		 * (c) Make sure the entry is (still) a directory.
2540 		 * (d) Make sure the directory is empty.
2541 		 */
2542 
2543 		if (dp == ip || vp == cdir)
2544 			err = EINVAL;
2545 		else if (((ip->i_mode & IFMT) != IFDIR) &&
2546 		    ((ip->i_mode & IFMT) != IFATTRDIR))
2547 			err = ENOTDIR;
2548 		else if ((ip->i_nlink > 2) ||
2549 		    !ufs_dirempty(ip, dp->i_number, cr)) {
2550 			err = EEXIST;	/* SIGH should be ENOTEMPTY */
2551 		}
2552 
2553 		if (err) {
2554 			rw_exit(&ip->i_contents);
2555 			if (mode == IFDIR || mode == IFATTRDIR)
2556 				rw_exit(&ip->i_rwlock);
2557 			goto out;
2558 		}
2559 	} else if (op == DR_REMOVE)  {
2560 		/*
2561 		 * unlink(2) requires a different check: allow only
2562 		 * privileged users to unlink a directory.
2563 		 */
2564 		if (vp->v_type == VDIR &&
2565 		    secpolicy_fs_linkdir(cr, vp->v_vfsp)) {
2566 			err = EPERM;
2567 			rw_exit(&ip->i_contents);
2568 			rw_exit(&ip->i_rwlock);
2569 			goto out;
2570 		}
2571 	}
2572 
2573 	rw_exit(&ip->i_contents);
2574 
2575 	/*
2576 	 * Remove the cache'd entry, if any.
2577 	 */
2578 	dvp = ITOV(dp);
2579 	dnlc_remove(dvp, namep);
2580 	ep = slot.ep;
2581 	ep->d_ino = 0;
2582 
2583 	if (slot.cached) {
2584 		dcanchor_t *dcap = &dp->i_danchor;
2585 
2586 		(void) dnlc_dir_rem_entry(dcap, namep, NULL);
2587 		if (((int)ep->d_reclen - (int)DIRSIZ(ep)) >= LDIRSIZ(1)) {
2588 			(void) dnlc_dir_rem_space_by_handle(dcap, slot.offset);
2589 		}
2590 		if (slot.offset & (DIRBLKSIZ - 1)) {
2591 			/*
2592 			 * Collapse new free space into previous entry.
2593 			 * Note, the previous entry has already been
2594 			 * validated in ufs_dircheckforname().
2595 			 */
2596 			ASSERT(slot.size);
2597 			pep = (struct direct *)((char *)ep - slot.size);
2598 			if ((pep->d_ino == 0) &&
2599 			    ((uintptr_t)pep & (DIRBLKSIZ - 1))) {
2600 				dnlc_dir_purge(dcap);
2601 				slot.cached = 0;
2602 				goto nocache;
2603 			}
2604 			if (pep->d_ino) {
2605 				extra = pep->d_reclen - DIRSIZ(pep);
2606 			} else {
2607 				extra = pep->d_reclen;
2608 			}
2609 			if (extra >= LDIRSIZ(1)) {
2610 				(void) dnlc_dir_rem_space_by_handle(dcap,
2611 				    (uint64_t)(slot.offset - slot.size));
2612 			}
2613 			pep->d_reclen += ep->d_reclen;
2614 			(void) dnlc_dir_add_space(dcap, extra + ep->d_reclen,
2615 			    (uint64_t)(slot.offset - slot.size));
2616 			/* adjust the previous pointer in the next entry */
2617 			nep = (struct direct *)((char *)ep + ep->d_reclen);
2618 			if ((uintptr_t)nep & (DIRBLKSIZ - 1)) {
2619 				/*
2620 				 * Not a new block.
2621 				 *
2622 				 * Check the validity of the entry.
2623 				 * If it's bad, then throw away the cache and
2624 				 * continue.
2625 				 */
2626 				if ((nep->d_reclen == 0) ||
2627 				    (nep->d_reclen & 0x3) ||
2628 				    (dnlc_dir_update(dcap, nep->d_name,
2629 				    INO_OFF_TO_H(nep->d_ino,
2630 				    slot.offset - slot.size)) == DNOENT)) {
2631 					dnlc_dir_purge(dcap);
2632 					slot.cached = 0;
2633 				}
2634 			}
2635 		} else {
2636 			(void) dnlc_dir_add_space(dcap, ep->d_reclen,
2637 			    (uint64_t)slot.offset);
2638 		}
2639 	} else {
2640 		/*
2641 		 * If the entry isn't the first in the directory, we must
2642 		 * reclaim the space of the now empty record by adding
2643 		 * the record size to the size of the previous entry.
2644 		 */
2645 		if (slot.offset & (DIRBLKSIZ - 1)) {
2646 			/*
2647 			 * Collapse new free space into previous entry.
2648 			 */
2649 			pep = (struct direct *)((char *)ep - slot.size);
2650 			pep->d_reclen += ep->d_reclen;
2651 		}
2652 	}
2653 nocache:
2654 
2655 
2656 	err = TRANS_DIR(dp, slot.offset);
2657 	if (err)
2658 		fbrelse(slot.fbp, S_OTHER);
2659 	else
2660 		err = ufs_fbwrite(slot.fbp, dp);
2661 	slot.fbp = NULL;
2662 
2663 	/*
2664 	 * If we were removing a directory, it is 'gone' now, but we cannot
2665 	 * unlock it as a thread may be waiting for the lock in ufs_create. If
2666 	 * we did, it could then create a file in a deleted directory.
2667 	 */
2668 
2669 	if (err) {
2670 		if (mode == IFDIR || mode == IFATTRDIR)
2671 			rw_exit(&ip->i_rwlock);
2672 		goto out;
2673 	}
2674 
2675 	rw_enter(&ip->i_contents, RW_WRITER);
2676 
2677 	dp->i_flag |= IUPD|ICHG;
2678 	dp->i_seq++;
2679 	ip->i_flag |= ICHG;
2680 	ip->i_seq++;
2681 
2682 	TRANS_INODE(dp->i_ufsvfs, dp);
2683 	TRANS_INODE(ip->i_ufsvfs, ip);
2684 	/*
2685 	 * Now dispose of the inode.
2686 	 */
2687 	if (ip->i_nlink > 0) {
2688 		/*
2689 		 * This is not done for IFATTRDIR's because they don't
2690 		 * have entries in the dnlc and the link counts are
2691 		 * not incremented when they are created.
2692 		 */
2693 		if (op == DR_RMDIR && (ip->i_mode & IFMT) == IFDIR) {
2694 			/*
2695 			 * Decrement by 2 because we're trashing the "."
2696 			 * entry as well as removing the entry in dp.
2697 			 * Clear the directory entry, but there may be
2698 			 * other hard links so don't free the inode.
2699 			 * Decrement the dp linkcount because we're
2700 			 * trashing the ".." entry.
2701 			 */
2702 			ip->i_nlink -= 2;
2703 			dp->i_nlink--;
2704 			ufs_setreclaim(dp);
2705 			/*
2706 			 * XXX need to discard negative cache entries
2707 			 * for vp.  See comment in ufs_delete().
2708 			 */
2709 			dnlc_remove(vp, ".");
2710 			dnlc_remove(vp, "..");
2711 			/*
2712 			 * The return value is ignored here bacause if
2713 			 * the directory purge fails we don't want to
2714 			 * stop the delete. If ufs_dirpurgedotdot fails
2715 			 * the delete will continue with the preexiting
2716 			 * behavior.
2717 			 */
2718 			(void) ufs_dirpurgedotdot(ip, dp->i_number, cr);
2719 		} else {
2720 			ip->i_nlink--;
2721 		}
2722 		ufs_setreclaim(ip);
2723 	}
2724 	ITIMES_NOLOCK(dp);
2725 	ITIMES_NOLOCK(ip);
2726 
2727 	if (!TRANS_ISTRANS(dp->i_ufsvfs))
2728 		ufs_iupdat(dp, I_SYNC);
2729 	if (!TRANS_ISTRANS(ip->i_ufsvfs))
2730 		ufs_iupdat(ip, I_SYNC);
2731 
2732 	rw_exit(&ip->i_contents);
2733 	if (mode == IFDIR || mode == IFATTRDIR)
2734 		rw_exit(&ip->i_rwlock);
2735 out:
2736 	if (mode == IFDIR || mode == IFATTRDIR) {
2737 		vn_vfsunlock(vp);
2738 	}
2739 out_novfs:
2740 	ASSERT(RW_WRITE_HELD(&dp->i_contents));
2741 
2742 	if (slot.fbp)
2743 		fbrelse(slot.fbp, S_OTHER);
2744 
2745 	rw_exit(&dp->i_contents);
2746 	rw_exit(&dp->i_ufsvfs->vfs_dqrwlock);
2747 
2748 	/*
2749 	 * Release (and delete) the inode after we drop vfs_dqrwlock to
2750 	 * avoid deadlock since ufs_delete() grabs vfs_dqrwlock as reader.
2751 	 */
2752 	if (ip)
2753 		VN_RELE(vp);
2754 
2755 	return (err);
2756 }
2757 
2758 /*
2759  * Return buffer with contents of block "offset"
2760  * from the beginning of directory "ip".  If "res"
2761  * is non-zero, fill it in with a pointer to the
2762  * remaining space in the directory.
2763  *
2764  */
2765 
2766 int
2767 blkatoff(
2768 	struct inode *ip,
2769 	off_t offset,
2770 	char **res,
2771 	struct fbuf **fbpp)
2772 {
2773 	struct fs *fs;
2774 	struct fbuf *fbp;
2775 	daddr_t lbn;
2776 	uint_t bsize;
2777 	int err;
2778 
2779 	CPU_STATS_ADD_K(sys, ufsdirblk, 1);
2780 	fs = ip->i_fs;
2781 	lbn = (daddr_t)lblkno(fs, offset);
2782 	bsize = (uint_t)blksize(fs, ip, lbn);
2783 	err = fbread(ITOV(ip), (offset_t)(offset & fs->fs_bmask),
2784 	    bsize, S_READ, &fbp);
2785 	if (err) {
2786 		*fbpp = (struct fbuf *)NULL;
2787 		return (err);
2788 	}
2789 	if (res)
2790 		*res = fbp->fb_addr + blkoff(fs, offset);
2791 	*fbpp = fbp;
2792 	return (0);
2793 }
2794 
2795 /*
2796  * Do consistency checking:
2797  *	record length must be multiple of 4
2798  *	entry must fit in rest of its DIRBLKSIZ block
2799  *	record must be large enough to contain entry
2800  *	name is not longer than MAXNAMLEN
2801  *	name must be as long as advertised, and null terminated
2802  * NOTE: record length must not be zero (should be checked previously).
2803  *       This routine is only called if dirchk is true.
2804  *       It would be nice to set the FSBAD flag in the super-block when
2805  *       this routine fails so that a fsck is forced on next reboot,
2806  *       but locking is a problem.
2807  */
2808 static int
2809 dirmangled(
2810 	struct inode *dp,
2811 	struct direct *ep,
2812 	int entryoffsetinblock,
2813 	off_t offset)
2814 {
2815 	int i;
2816 
2817 	i = DIRBLKSIZ - (entryoffsetinblock & (DIRBLKSIZ - 1));
2818 	if ((ep->d_reclen & 0x3) != 0 || (int)ep->d_reclen > i ||
2819 	    (uint_t)ep->d_reclen < DIRSIZ(ep) || ep->d_namlen > MAXNAMLEN ||
2820 	    ep->d_ino && dirbadname(ep->d_name, (int)ep->d_namlen)) {
2821 		dirbad(dp, "mangled entry", offset);
2822 		return (1);
2823 	}
2824 	return (0);
2825 }
2826 
2827 static void
2828 dirbad(struct inode *ip, char *how, off_t offset)
2829 {
2830 	cmn_err(CE_NOTE, "%s: bad dir ino %d at offset %ld: %s",
2831 	    ip->i_fs->fs_fsmnt, (int)ip->i_number, offset, how);
2832 }
2833 
2834 static int
2835 dirbadname(char *sp, int l)
2836 {
2837 	while (l--) {			/* check for nulls */
2838 		if (*sp++ == '\0') {
2839 			return (1);
2840 		}
2841 	}
2842 	return (*sp);			/* check for terminating null */
2843 }
2844 
2845 /*
2846  * Check if a directory is empty or not.
2847  */
2848 static int
2849 ufs_dirempty(
2850 	struct inode *ip,
2851 	ino_t parentino,
2852 	struct cred *cr)
2853 {
2854 	return (ufs_dirscan(ip, parentino, cr, 0));
2855 }
2856 
2857 /*
2858  * clear the .. directory entry.
2859  */
2860 static int
2861 ufs_dirpurgedotdot(
2862 	struct inode *ip,
2863 	ino_t parentino,
2864 	struct cred *cr)
2865 {
2866 	return (ufs_dirscan(ip, parentino, cr, 1));
2867 }
2868 
2869 /*
2870  * Scan the directoy. If clr_dotdot is true clear the ..
2871  * directory else check to see if the directory is empty.
2872  *
2873  * Using a struct dirtemplate here is not precisely
2874  * what we want, but better than using a struct direct.
2875  *
2876  * clr_dotdot is used as a flag to tell us if we need
2877  * to clear the dotdot entry
2878  *
2879  * N.B.: does not handle corrupted directories.
2880  */
2881 static int
2882 ufs_dirscan(
2883 	struct inode *ip,
2884 	ino_t parentino,
2885 	struct cred *cr,
2886 	int clr_dotdot)
2887 {
2888 	offset_t off;
2889 	struct dirtemplate dbuf;
2890 	struct direct *dp = (struct direct *)&dbuf;
2891 	int err, count;
2892 	int empty = 1;	/* Assume it's empty */
2893 #define	MINDIRSIZ (sizeof (struct dirtemplate) / 2)
2894 
2895 	ASSERT(RW_LOCK_HELD(&ip->i_contents));
2896 
2897 	ASSERT(ip->i_size <= (offset_t)MAXOFF_T);
2898 	for (off = 0; off < ip->i_size; off += dp->d_reclen) {
2899 		err = ufs_rdwri(UIO_READ, FREAD, ip, (caddr_t)dp,
2900 		    (ssize_t)MINDIRSIZ, off, UIO_SYSSPACE, &count, cr);
2901 		/*
2902 		 * Since we read MINDIRSIZ, residual must
2903 		 * be 0 unless we're at end of file.
2904 		 */
2905 		if (err || count != 0 || dp->d_reclen == 0) {
2906 			empty = 0;
2907 			break;
2908 		}
2909 		/* skip empty entries */
2910 		if (dp->d_ino == 0)
2911 			continue;
2912 		/* accept only "." and ".." */
2913 		if (dp->d_namlen > 2 || dp->d_name[0] != '.') {
2914 			empty = 0;
2915 			break;
2916 		}
2917 		/*
2918 		 * At this point d_namlen must be 1 or 2.
2919 		 * 1 implies ".", 2 implies ".." if second
2920 		 * char is also "."
2921 		 */
2922 		if (dp->d_namlen == 1)
2923 			continue;
2924 		if (dp->d_name[1] == '.' &&
2925 		    (ino_t)dp->d_ino == parentino) {
2926 			/*
2927 			 * If we're doing a purge we need to check for
2928 			 * the . and .. entries and clear the d_ino for ..
2929 			 *
2930 			 * if clr_dotdot is set ufs_dirscan does not
2931 			 * check for an empty directory.
2932 			 */
2933 			if (clr_dotdot) {
2934 				/*
2935 				 * Have to actually zap the ..
2936 				 * entry in the directory, as
2937 				 * otherwise someone might have
2938 				 * dp as its cwd and try to
2939 				 * open .., which now points to
2940 				 * an unallocated inode.
2941 				 */
2942 				empty = ufs_dirclrdotdot(ip, parentino);
2943 				break;
2944 			} else {
2945 				continue;
2946 			}
2947 		}
2948 		empty = 0;
2949 		break;
2950 	}
2951 	return (empty);
2952 }
2953 
2954 clock_t retry_backoff_delay = 1; /* delay before retrying the i_rwlock */
2955 uint64_t dircheck_retry_cnt;
2956 /*
2957  * Check if source directory inode is in the path of the target directory.
2958  * Target is supplied locked.
2959  *
2960  * The source and target inode's should be different upon entry.
2961  */
2962 int
2963 ufs_dircheckpath(
2964 	ino_t source_ino,
2965 	struct inode *target,
2966 	struct inode *sdp,
2967 	struct cred *cr)
2968 {
2969 	struct fbuf *fbp;
2970 	struct dirtemplate *dirp;
2971 	struct inode *ip;
2972 	struct ufsvfs *ufsvfsp;
2973 	struct inode *tip;
2974 	ino_t dotdotino;
2975 	int err;
2976 
2977 	ASSERT(target->i_ufsvfs != NULL);
2978 	ASSERT(RW_LOCK_HELD(&target->i_rwlock));
2979 	ASSERT(RW_LOCK_HELD(&sdp->i_rwlock));
2980 
2981 	ip = target;
2982 	if (ip->i_number == source_ino) {
2983 		err = EINVAL;
2984 		goto out;
2985 	}
2986 	if (ip->i_number == UFSROOTINO) {
2987 		err = 0;
2988 		goto out;
2989 	}
2990 	/*
2991 	 * Search back through the directory tree, using the ".." entries.
2992 	 * Fail any attempt to move a directory into an ancestor directory.
2993 	 */
2994 	fbp = NULL;
2995 	for (;;) {
2996 		struct vfs	*vfs;
2997 
2998 		err = blkatoff(ip, (off_t)0, (char **)&dirp, &fbp);
2999 		if (err)
3000 			break;
3001 		if (((ip->i_mode & IFMT) != IFDIR) || ip->i_nlink == 0 ||
3002 		    ip->i_size < sizeof (struct dirtemplate)) {
3003 			dirbad(ip, "bad size, unlinked or not dir", (off_t)0);
3004 			err = ENOTDIR;
3005 			break;
3006 		}
3007 		if (dirp->dotdot_namlen != 2 ||
3008 		    dirp->dotdot_name[0] != '.' ||
3009 		    dirp->dotdot_name[1] != '.') {
3010 			dirbad(ip, "mangled .. entry", (off_t)0);
3011 			err = ENOTDIR;		/* Sanity check */
3012 			break;
3013 		}
3014 		dotdotino = (ino_t)dirp->dotdot_ino;
3015 		if (dotdotino == source_ino) {
3016 			err = EINVAL;
3017 			break;
3018 		}
3019 		if (dotdotino == UFSROOTINO)
3020 			break;
3021 		if (fbp) {
3022 			fbrelse(fbp, S_OTHER);
3023 			fbp = NULL;
3024 		}
3025 		vfs = ip->i_vfs;
3026 		ufsvfsp = ip->i_ufsvfs;
3027 
3028 		if (ip != target) {
3029 			rw_exit(&ip->i_rwlock);
3030 			VN_RELE(ITOV(ip));
3031 		}
3032 		/*
3033 		 * Race to get the inode.
3034 		 */
3035 		rw_enter(&ufsvfsp->vfs_dqrwlock, RW_READER);
3036 		if (err = ufs_iget_alloced(vfs, dotdotino, &tip, cr)) {
3037 			rw_exit(&ufsvfsp->vfs_dqrwlock);
3038 			ip = NULL;
3039 			break;
3040 		}
3041 		rw_exit(&ufsvfsp->vfs_dqrwlock);
3042 		/*
3043 		 * If the directory of the source inode (also a directory)
3044 		 * is the same as this next entry up the chain, then
3045 		 * we know the source directory itself can't be in the
3046 		 * chain. This also prevents a panic because we already
3047 		 * have sdp->i_rwlock locked.
3048 		 */
3049 		if (tip == sdp) {
3050 			VN_RELE(ITOV(tip));
3051 			ip = NULL;
3052 			break;
3053 		}
3054 		ip = tip;
3055 
3056 		/*
3057 		 * If someone has set the WRITE_WANTED bit in this lock and if
3058 		 * this happens to be a sdp or tdp of another parallel rename
3059 		 * which is executing  the same code and in similar situation
3060 		 * we end up in a 4 way deadlock. We need to make sure that
3061 		 * the WRITE_WANTED bit is not  set.
3062 		 */
3063 retry_lock:
3064 		if (!rw_tryenter(&ip->i_rwlock, RW_READER)) {
3065 			/*
3066 			 * If the lock held as WRITER thats fine but if it
3067 			 * has WRITE_WANTED bit set we might end up in a
3068 			 * deadlock. If WRITE_WANTED is set we return
3069 			 * with EAGAIN else we just go back and try.
3070 			 */
3071 			if (RW_ISWRITER(&ip->i_rwlock) &&
3072 			    !(RW_WRITE_HELD(&ip->i_rwlock))) {
3073 				err = EAGAIN;
3074 				if (fbp) {
3075 					fbrelse(fbp, S_OTHER);
3076 				}
3077 				VN_RELE(ITOV(ip));
3078 				return (err);
3079 			} else {
3080 				/*
3081 				 * The lock is being write held. We could
3082 				 * just do a rw_enter here but there is a
3083 				 * window between the check and now, where
3084 				 * the status could have changed, so to
3085 				 * avoid looping we backoff and go back to
3086 				 * try for the lock.
3087 				 */
3088 				delay(retry_backoff_delay);
3089 				dircheck_retry_cnt++;
3090 				goto retry_lock;
3091 			}
3092 		}
3093 	}
3094 	if (fbp) {
3095 		fbrelse(fbp, S_OTHER);
3096 	}
3097 out:
3098 	if (ip) {
3099 		if (ip != target) {
3100 			rw_exit(&ip->i_rwlock);
3101 			VN_RELE(ITOV(ip));
3102 		}
3103 	}
3104 	return (err);
3105 }
3106 
3107 int
3108 ufs_xattrdirempty(struct inode *ip, ino_t parentino, struct cred *cr)
3109 {
3110 	offset_t off;
3111 	struct dirtemplate dbuf;
3112 	struct direct *dp = (struct direct *)&dbuf;
3113 	int err, count;
3114 	int empty = 1;	/* Assume it's empty */
3115 #define	MINDIRSIZ (sizeof (struct dirtemplate) / 2)
3116 
3117 	ASSERT(RW_LOCK_HELD(&ip->i_contents));
3118 
3119 	ASSERT(ip->i_size <= (offset_t)MAXOFF_T);
3120 	for (off = 0; off < ip->i_size; off += dp->d_reclen) {
3121 		err = ufs_rdwri(UIO_READ, FREAD, ip, (caddr_t)dp,
3122 		    (ssize_t)MINDIRSIZ, off, UIO_SYSSPACE, &count, cr);
3123 		/*
3124 		 * Since we read MINDIRSIZ, residual must
3125 		 * be 0 unless we're at end of file.
3126 		 */
3127 
3128 		if (err || count != 0 || dp->d_reclen == 0) {
3129 			empty = 0;
3130 			break;
3131 		}
3132 		/* skip empty entries */
3133 		if (dp->d_ino == 0)
3134 			continue;
3135 		/*
3136 		 * At this point d_namlen must be 1 or 2.
3137 		 * 1 implies ".", 2 implies ".." if second
3138 		 * char is also "."
3139 		 */
3140 
3141 		if (dp->d_namlen == 1 && dp->d_name[0] == '.' &&
3142 		    (ino_t)dp->d_ino == parentino)
3143 			continue;
3144 
3145 		if (dp->d_namlen == 2 && dp->d_name[0] == '.' &&
3146 		    dp->d_name[1] == '.') {
3147 			continue;
3148 		}
3149 		empty = 0;
3150 		break;
3151 	}
3152 	return (empty);
3153 }
3154 
3155 
3156 /*
3157  * Allocate and initialize a new shadow inode to contain extended attributes.
3158  */
3159 int
3160 ufs_xattrmkdir(
3161 	struct inode *tdp,
3162 	struct inode **ipp,
3163 	int flags,
3164 	struct cred *cr)
3165 {
3166 	struct inode *ip;
3167 	struct vattr va;
3168 	int err;
3169 	int retry = 1;
3170 	struct ufsvfs *ufsvfsp;
3171 	struct ulockfs *ulp;
3172 	int issync;
3173 	int trans_size;
3174 	int dorwlock;		/* 0 = not yet taken, */
3175 				/* 1 = taken outside the transaction, */
3176 				/* 2 = taken inside the transaction */
3177 
3178 	/*
3179 	 * Validate permission to create attribute directory
3180 	 */
3181 
3182 	if ((err = ufs_iaccess(tdp, IWRITE, cr, 1)) != 0) {
3183 		return (err);
3184 	}
3185 
3186 	if (vn_is_readonly(ITOV(tdp)))
3187 		return (EROFS);
3188 
3189 	/*
3190 	 * No need to re-init err after again:, since it's set before
3191 	 * the next use of it.
3192 	 */
3193 again:
3194 	dorwlock = 0;
3195 	va.va_type = VDIR;
3196 	va.va_uid = tdp->i_uid;
3197 	va.va_gid = tdp->i_gid;
3198 
3199 	if ((tdp->i_mode & IFMT) == IFDIR) {
3200 		va.va_mode = (o_mode_t)IFATTRDIR;
3201 		va.va_mode |= tdp->i_mode & 0777;
3202 	} else {
3203 		va.va_mode = (o_mode_t)IFATTRDIR|0700;
3204 		if (tdp->i_mode & 0040)
3205 			va.va_mode |= 0750;
3206 		if (tdp->i_mode & 0004)
3207 			va.va_mode |= 0705;
3208 	}
3209 	va.va_mask = AT_TYPE|AT_MODE;
3210 
3211 	ufsvfsp = tdp->i_ufsvfs;
3212 
3213 	err = ufs_lockfs_begin(ufsvfsp, &ulp, ULOCKFS_MKDIR_MASK);
3214 	if (err)
3215 		return (err);
3216 
3217 	/*
3218 	 * Acquire i_rwlock before TRANS_BEGIN_CSYNC() if this is a file.
3219 	 * This follows the protocol for read()/write().
3220 	 */
3221 	if (ITOV(tdp)->v_type != VDIR) {
3222 		rw_enter(&tdp->i_rwlock, RW_WRITER);
3223 		dorwlock = 1;
3224 	}
3225 
3226 	if (ulp) {
3227 		trans_size = (int)TOP_MKDIR_SIZE(tdp);
3228 		TRANS_BEGIN_CSYNC(ufsvfsp, issync, TOP_MKDIR, trans_size);
3229 	}
3230 
3231 	/*
3232 	 * Acquire i_rwlock after TRANS_BEGIN_CSYNC() if this is a directory.
3233 	 * This follows the protocol established by
3234 	 * ufs_link/create/remove/rename/mkdir/rmdir/symlink.
3235 	 */
3236 	if (dorwlock == 0) {
3237 		rw_enter(&tdp->i_rwlock, RW_WRITER);
3238 		dorwlock = 2;
3239 	}
3240 	rw_enter(&ufsvfsp->vfs_dqrwlock, RW_READER);
3241 	rw_enter(&tdp->i_contents, RW_WRITER);
3242 
3243 	/*
3244 	 * Suppress out of inodes messages if we will retry.
3245 	 */
3246 	if (retry)
3247 		tdp->i_flag |= IQUIET;
3248 	err = ufs_dirmakeinode(tdp, &ip, &va, DE_ATTRDIR, cr);
3249 	tdp->i_flag &= ~IQUIET;
3250 
3251 	if (err)
3252 		goto fail;
3253 
3254 	if (flags) {
3255 
3256 		/*
3257 		 * Now attach it to src file.
3258 		 */
3259 
3260 		tdp->i_oeftflag = ip->i_number;
3261 	}
3262 
3263 	ip->i_cflags |= IXATTR;
3264 	ITOV(ip)->v_flag |= V_XATTRDIR;
3265 	TRANS_INODE(ufsvfsp, tdp);
3266 	tdp->i_flag |= ICHG | IUPD;
3267 	tdp->i_seq++;
3268 	ufs_iupdat(tdp, I_SYNC);
3269 	rw_exit(&tdp->i_contents);
3270 	rw_exit(&ufsvfsp->vfs_dqrwlock);
3271 
3272 	rw_enter(&ip->i_rwlock, RW_WRITER);
3273 	rw_enter(&ip->i_contents, RW_WRITER);
3274 	TRANS_INODE(ufsvfsp, ip);
3275 	ip->i_flag |= ICHG| IUPD;
3276 	ip->i_seq++;
3277 	ufs_iupdat(ip, I_SYNC);
3278 	rw_exit(&ip->i_contents);
3279 	rw_exit(&ip->i_rwlock);
3280 	if (dorwlock == 2)
3281 		rw_exit(&tdp->i_rwlock);
3282 	if (ulp) {
3283 		int terr = 0;
3284 
3285 		TRANS_END_CSYNC(ufsvfsp, err, issync, TOP_MKDIR, trans_size);
3286 		ufs_lockfs_end(ulp);
3287 		if (err == 0)
3288 			err = terr;
3289 	}
3290 	if (dorwlock == 1)
3291 		rw_exit(&tdp->i_rwlock);
3292 	*ipp = ip;
3293 	return (err);
3294 
3295 fail:
3296 	rw_exit(&tdp->i_contents);
3297 	rw_exit(&ufsvfsp->vfs_dqrwlock);
3298 	if (dorwlock == 2)
3299 		rw_exit(&tdp->i_rwlock);
3300 	if (ulp) {
3301 		TRANS_END_CSYNC(ufsvfsp, err, issync, TOP_MKDIR, trans_size);
3302 		ufs_lockfs_end(ulp);
3303 	}
3304 	if (dorwlock == 1)
3305 		rw_exit(&tdp->i_rwlock);
3306 	if (ip != NULL)
3307 		VN_RELE(ITOV(ip));
3308 
3309 	/*
3310 	 * No inodes?  See if any are tied up in pending deletions.
3311 	 * This has to be done outside of any of the above, because
3312 	 * the draining operation can't be done from inside a transaction.
3313 	 */
3314 	if ((err == ENOSPC) && retry && TRANS_ISTRANS(ufsvfsp)) {
3315 		ufs_delete_drain_wait(ufsvfsp, 1);
3316 		retry = 0;
3317 		goto again;
3318 	}
3319 
3320 	return (err);
3321 }
3322 
3323 /*
3324  * clear the dotdot directory entry.
3325  * Used by ufs_dirscan when clr_dotdot
3326  * flag is set and we're deleting a
3327  * directory.
3328  */
3329 static int
3330 ufs_dirclrdotdot(struct inode *ip, ino_t parentino)
3331 {
3332 	struct fbuf *fbp;
3333 	struct direct *dotp, *dotdotp;
3334 	int err = 0;
3335 
3336 	ASSERT(RW_WRITE_HELD(&ip->i_rwlock));
3337 	ASSERT(RW_LOCK_HELD(&ip->i_contents));
3338 	err = blkatoff(ip, 0, NULL, &fbp);
3339 	if (err) {
3340 		return (err);
3341 	}
3342 
3343 	dotp = (struct direct *)fbp->fb_addr;
3344 	if ((dotp->d_namlen < (MAXNAMLEN + 1)) &&
3345 	    ((DIRBLKSIZ - DIRSIZ(dotp)) >= (sizeof (struct dirtemplate) / 2))) {
3346 		dotdotp = (struct direct *)((char *)dotp + dotp->d_reclen);
3347 		if ((dotdotp->d_namlen < (MAXNAMLEN + 1)) &&
3348 		    ((DIRBLKSIZ - DIRSIZ(dotp)) >= dotdotp->d_reclen)) {
3349 
3350 			dotp->d_reclen += dotdotp->d_reclen;
3351 			if (parentino == dotdotp->d_ino) {
3352 				dotdotp->d_ino = 0;
3353 				dotdotp->d_namlen = 0;
3354 				dotdotp->d_reclen = 0;
3355 			}
3356 
3357 			err = TRANS_DIR(ip, 0);
3358 			if (err) {
3359 				fbrelse(fbp, S_OTHER);
3360 			} else {
3361 				err = ufs_fbwrite(fbp, ip);
3362 			}
3363 		}
3364 	} else {
3365 		err = -1;
3366 	}
3367 	return (err);
3368 }
3369