xref: /dragonfly/sys/vfs/ufs/ufs_vnops.c (revision e65bc1c3)
1 /*
2  * Copyright (c) 1982, 1986, 1989, 1993, 1995
3  *	The Regents of the University of California.  All rights reserved.
4  * (c) UNIX System Laboratories, Inc.
5  * All or some portions of this file are derived from material licensed
6  * to the University of California by American Telephone and Telegraph
7  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8  * the permission of UNIX System Laboratories, Inc.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. Neither the name of the University nor the names of its contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  *	@(#)ufs_vnops.c	8.27 (Berkeley) 5/27/95
35  * $FreeBSD: src/sys/ufs/ufs/ufs_vnops.c,v 1.131.2.8 2003/01/02 17:26:19 bde Exp $
36  */
37 
38 #include "opt_quota.h"
39 #include "opt_suiddir.h"
40 #include "opt_ufs.h"
41 
42 #include <sys/param.h>
43 #include <sys/systm.h>
44 #include <sys/kernel.h>
45 #include <sys/fcntl.h>
46 #include <sys/stat.h>
47 #include <sys/buf.h>
48 #include <sys/proc.h>
49 #include <sys/priv.h>
50 #include <sys/namei.h>
51 #include <sys/mount.h>
52 #include <sys/unistd.h>
53 #include <sys/vnode.h>
54 #include <sys/malloc.h>
55 #include <sys/dirent.h>
56 #include <sys/lockf.h>
57 #include <sys/event.h>
58 #include <sys/conf.h>
59 
60 #include <sys/file.h>		/* XXX */
61 #include <sys/jail.h>
62 
63 #include <vm/vm.h>
64 #include <vm/vm_extern.h>
65 
66 #include <vfs/fifofs/fifo.h>
67 
68 #include "quota.h"
69 #include "inode.h"
70 #include "dir.h"
71 #include "ufsmount.h"
72 #include "ufs_extern.h"
73 #include "ffs_extern.h"
74 #include "fs.h"
75 #ifdef UFS_DIRHASH
76 #include "dirhash.h"
77 #endif
78 
79 static int ufs_access (struct vop_access_args *);
80 static int ufs_advlock (struct vop_advlock_args *);
81 static int ufs_chmod (struct vnode *, int, struct ucred *);
82 static int ufs_chown (struct vnode *, uid_t, gid_t, struct ucred *);
83 static int ufs_close (struct vop_close_args *);
84 static int ufs_create (struct vop_old_create_args *);
85 static int ufs_getattr (struct vop_getattr_args *);
86 static int ufs_link (struct vop_old_link_args *);
87 static int ufs_makeinode (int mode, struct vnode *, struct vnode **, struct componentname *);
88 static int ufs_markatime (struct vop_markatime_args *);
89 static int ufs_missingop (struct vop_generic_args *ap);
90 static int ufs_mkdir (struct vop_old_mkdir_args *);
91 static int ufs_mknod (struct vop_old_mknod_args *);
92 static int ufs_mmap (struct vop_mmap_args *);
93 static int ufs_print (struct vop_print_args *);
94 static int ufs_readdir (struct vop_readdir_args *);
95 static int ufs_readlink (struct vop_readlink_args *);
96 static int ufs_remove (struct vop_old_remove_args *);
97 static int ufs_rename (struct vop_old_rename_args *);
98 static int ufs_rmdir (struct vop_old_rmdir_args *);
99 static int ufs_setattr (struct vop_setattr_args *);
100 static int ufs_strategy (struct vop_strategy_args *);
101 static int ufs_symlink (struct vop_old_symlink_args *);
102 static int ufs_whiteout (struct vop_old_whiteout_args *);
103 static int ufsfifo_close (struct vop_close_args *);
104 static int ufsfifo_kqfilter (struct vop_kqfilter_args *);
105 static int ufsfifo_read (struct vop_read_args *);
106 static int ufsfifo_write (struct vop_write_args *);
107 static int filt_ufsread (struct knote *kn, long hint);
108 static int filt_ufswrite (struct knote *kn, long hint);
109 static int filt_ufsvnode (struct knote *kn, long hint);
110 static void filt_ufsdetach (struct knote *kn);
111 static int ufs_kqfilter (struct vop_kqfilter_args *ap);
112 
113 union _qcvt {
114 	int64_t qcvt;
115 	int32_t val[2];
116 };
117 #define SETHIGH(q, h) { \
118 	union _qcvt tmp; \
119 	tmp.qcvt = (q); \
120 	tmp.val[_QUAD_HIGHWORD] = (h); \
121 	(q) = tmp.qcvt; \
122 }
123 #define SETLOW(q, l) { \
124 	union _qcvt tmp; \
125 	tmp.qcvt = (q); \
126 	tmp.val[_QUAD_LOWWORD] = (l); \
127 	(q) = tmp.qcvt; \
128 }
129 #define VN_KNOTE(vp, b) \
130 	KNOTE(&vp->v_pollinfo.vpi_kqinfo.ki_note, (b))
131 
132 #define OFSFMT(vp)		((vp)->v_mount->mnt_maxsymlinklen <= 0)
133 
134 /*
135  * A virgin directory (no blushing please).
136  */
137 static struct dirtemplate mastertemplate = {
138 	0, 12, DT_DIR, 1, ".",
139 	0, DIRBLKSIZ - 12, DT_DIR, 2, ".."
140 };
141 static struct odirtemplate omastertemplate = {
142 	0, 12, 1, ".",
143 	0, DIRBLKSIZ - 12, 2, ".."
144 };
145 
146 void
147 ufs_itimes(struct vnode *vp)
148 {
149 	struct inode *ip;
150 	struct timespec ts;
151 
152 	ip = VTOI(vp);
153 	if ((ip->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) == 0)
154 		return;
155 	if ((vp->v_type == VBLK || vp->v_type == VCHR) && !DOINGSOFTDEP(vp))
156 		ip->i_flag |= IN_LAZYMOD;
157 	else
158 		ip->i_flag |= IN_MODIFIED;
159 	if ((vp->v_mount->mnt_flag & MNT_RDONLY) == 0) {
160 		vfs_timestamp(&ts);
161 		if (ip->i_flag & IN_ACCESS) {
162 			ip->i_atime = ts.tv_sec;
163 			ip->i_atimensec = ts.tv_nsec;
164 		}
165 		if (ip->i_flag & IN_UPDATE) {
166 			ip->i_mtime = ts.tv_sec;
167 			ip->i_mtimensec = ts.tv_nsec;
168 			ip->i_modrev++;
169 		}
170 		if (ip->i_flag & IN_CHANGE) {
171 			ip->i_ctime = ts.tv_sec;
172 			ip->i_ctimensec = ts.tv_nsec;
173 		}
174 	}
175 	ip->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE);
176 }
177 
178 /*
179  * Create a regular file
180  *
181  * ufs_create(struct vnode *a_dvp, struct vnode **a_vpp,
182  *	      struct componentname *a_cnp, struct vattr *a_vap)
183  */
184 static
185 int
186 ufs_create(struct vop_old_create_args *ap)
187 {
188 	int error;
189 
190 	error =
191 	    ufs_makeinode(MAKEIMODE(ap->a_vap->va_type, ap->a_vap->va_mode),
192 	    ap->a_dvp, ap->a_vpp, ap->a_cnp);
193 	if (error)
194 		return (error);
195 	VN_KNOTE(ap->a_dvp, NOTE_WRITE);
196 	return (0);
197 }
198 
199 /*
200  * Mknod vnode call
201  *
202  * ufs_mknod(struct vnode *a_dvp, struct vnode **a_vpp,
203  *	     struct componentname *a_cnp, struct vattr *a_vap)
204  */
205 /* ARGSUSED */
206 static
207 int
208 ufs_mknod(struct vop_old_mknod_args *ap)
209 {
210 	struct vattr *vap = ap->a_vap;
211 	struct vnode **vpp = ap->a_vpp;
212 	struct inode *ip;
213 	ino_t ino;
214 	int error;
215 
216 	/*
217 	 * UFS cannot represent the entire major/minor range supported by
218 	 * the kernel.
219 	 */
220 	if (vap->va_rmajor != VNOVAL &&
221 	    makeudev(vap->va_rmajor, vap->va_rminor) == NOUDEV) {
222 		return(EINVAL);
223 	}
224 
225 	/* no special directory support */
226 	if (vap->va_type == VDIR)
227 		return(EINVAL);
228 
229 	error = ufs_makeinode(MAKEIMODE(vap->va_type, vap->va_mode),
230 	    ap->a_dvp, vpp, ap->a_cnp);
231 	if (error)
232 		return (error);
233 	VN_KNOTE(ap->a_dvp, NOTE_WRITE);
234 	ip = VTOI(*vpp);
235 	ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE;
236 	if (vap->va_rmajor != VNOVAL) {
237 		/*
238 		 * Want to be able to use this to make badblock
239 		 * inodes, so don't truncate the dev number.
240 		 */
241 		ip->i_rdev = makeudev(vap->va_rmajor, vap->va_rminor);
242 	}
243 	/*
244 	 * Remove inode, then reload it through VFS_VGET so it is
245 	 * checked to see if it is an alias of an existing entry in
246 	 * the inode cache.
247 	 */
248 	(*vpp)->v_type = VNON;
249 	ino = ip->i_number;	/* Save this before vgone() invalidates ip. */
250 	vgone_vxlocked(*vpp);
251 	vput(*vpp);
252 	error = VFS_VGET(ap->a_dvp->v_mount, NULL, ino, vpp);
253 	if (error) {
254 		*vpp = NULL;
255 		return (error);
256 	}
257 	return (0);
258 }
259 
260 /*
261  * Close called.
262  *
263  * Update the times on the inode.
264  *
265  * ufs_close(struct vnode *a_vp, int a_fflag)
266  */
267 /* ARGSUSED */
268 static
269 int
270 ufs_close(struct vop_close_args *ap)
271 {
272 	struct vnode *vp = ap->a_vp;
273 
274 	if (vp->v_sysref.refcnt > 1)
275 		ufs_itimes(vp);
276 	return (vop_stdclose(ap));
277 }
278 
279 /*
280  * ufs_access(struct vnode *a_vp, int a_mode, struct ucred *a_cred)
281  */
282 static
283 int
284 ufs_access(struct vop_access_args *ap)
285 {
286 	struct vnode *vp = ap->a_vp;
287 	struct inode *ip = VTOI(vp);
288 	int error;
289 
290 #ifdef QUOTA
291 	if (ap->a_mode & VWRITE) {
292 		switch (vp->v_type) {
293 		case VDIR:
294 		case VLNK:
295 		case VREG:
296 			if ((error = ufs_getinoquota(ip)) != 0)
297 				return (error);
298 			break;
299 		default:
300 			break;
301 		}
302 	}
303 #endif
304 
305 	error = vop_helper_access(ap, ip->i_uid, ip->i_gid, ip->i_mode, 0);
306 	return (error);
307 }
308 
309 /*
310  * ufs_getattr(struct vnode *a_vp, struct vattr *a_vap)
311  */
312 /* ARGSUSED */
313 static
314 int
315 ufs_getattr(struct vop_getattr_args *ap)
316 {
317 	struct vnode *vp = ap->a_vp;
318 	struct inode *ip = VTOI(vp);
319 	struct vattr *vap = ap->a_vap;
320 
321 	ufs_itimes(vp);
322 	/*
323 	 * Copy from inode table
324 	 */
325 	vap->va_fsid = dev2udev(ip->i_dev);
326 	vap->va_fileid = ip->i_number;
327 	vap->va_mode = ip->i_mode & ~IFMT;
328 	vap->va_nlink = VFSTOUFS(vp->v_mount)->um_i_effnlink_valid ?
329 	    ip->i_effnlink : ip->i_nlink;
330 	vap->va_uid = ip->i_uid;
331 	vap->va_gid = ip->i_gid;
332 	vap->va_rmajor = umajor(ip->i_rdev);
333 	vap->va_rminor = uminor(ip->i_rdev);
334 	vap->va_size = ip->i_din.di_size;
335 	vap->va_atime.tv_sec = ip->i_atime;
336 	vap->va_atime.tv_nsec = ip->i_atimensec;
337 	vap->va_mtime.tv_sec = ip->i_mtime;
338 	vap->va_mtime.tv_nsec = ip->i_mtimensec;
339 	vap->va_ctime.tv_sec = ip->i_ctime;
340 	vap->va_ctime.tv_nsec = ip->i_ctimensec;
341 	vap->va_flags = ip->i_flags;
342 	vap->va_gen = ip->i_gen;
343 	vap->va_blocksize = vp->v_mount->mnt_stat.f_iosize;
344 	vap->va_bytes = dbtob((u_quad_t)ip->i_blocks);
345 	vap->va_type = IFTOVT(ip->i_mode);
346 	vap->va_filerev = ip->i_modrev;
347 	return (0);
348 }
349 
350 static
351 int
352 ufs_markatime(struct vop_markatime_args *ap)
353 {
354 	struct vnode *vp = ap->a_vp;
355 	struct inode *ip = VTOI(vp);
356 
357 	if (vp->v_mount->mnt_flag & MNT_RDONLY)
358 		return (EROFS);
359 	if (vp->v_mount->mnt_flag & MNT_NOATIME)
360 		return (0);
361 	ip->i_flag |= IN_ACCESS;
362 	VN_KNOTE(vp, NOTE_ATTRIB);
363 	return (0);
364 }
365 
366 /*
367  * Set attribute vnode op. called from several syscalls
368  *
369  * ufs_setattr(struct vnode *a_vp, struct vattr *a_vap,
370  *		struct ucred *a_cred)
371  */
372 static
373 int
374 ufs_setattr(struct vop_setattr_args *ap)
375 {
376 	struct vattr *vap = ap->a_vap;
377 	struct vnode *vp = ap->a_vp;
378 	struct inode *ip = VTOI(vp);
379 	struct ucred *cred = ap->a_cred;
380 	int error;
381 
382 	/*
383 	 * Check for unsettable attributes.
384 	 */
385 	if ((vap->va_type != VNON) || (vap->va_nlink != VNOVAL) ||
386 	    (vap->va_fsid != VNOVAL) || (vap->va_fileid != VNOVAL) ||
387 	    (vap->va_blocksize != VNOVAL) || (vap->va_rmajor != VNOVAL) ||
388 	    ((int)vap->va_bytes != VNOVAL) || (vap->va_gen != VNOVAL)) {
389 		return (EINVAL);
390 	}
391 	if (vap->va_flags != VNOVAL) {
392 		if (vp->v_mount->mnt_flag & MNT_RDONLY)
393 			return (EROFS);
394 		if (cred->cr_uid != ip->i_uid &&
395 		    (error = priv_check_cred(cred, PRIV_VFS_SETATTR, 0)))
396 			return (error);
397 		/*
398 		 * Note that a root chflags becomes a user chflags when
399 		 * we are jailed, unless the jail.chflags_allowed sysctl
400 		 * is set.
401 		 */
402 		if (cred->cr_uid == 0 &&
403 		    (!jailed(cred) || jail_chflags_allowed)) {
404 			if ((ip->i_flags
405 			    & (SF_NOUNLINK | SF_IMMUTABLE | SF_APPEND)) &&
406 			    securelevel > 0)
407 				return (EPERM);
408 			ip->i_flags = vap->va_flags;
409 		} else {
410 			if (ip->i_flags
411 			    & (SF_NOUNLINK | SF_IMMUTABLE | SF_APPEND) ||
412 			    (vap->va_flags & UF_SETTABLE) != vap->va_flags)
413 				return (EPERM);
414 			ip->i_flags &= SF_SETTABLE;
415 			ip->i_flags |= (vap->va_flags & UF_SETTABLE);
416 		}
417 		ip->i_flag |= IN_CHANGE;
418 		if (vap->va_flags & (IMMUTABLE | APPEND))
419 			return (0);
420 	}
421 	if (ip->i_flags & (IMMUTABLE | APPEND))
422 		return (EPERM);
423 	/*
424 	 * Go through the fields and update iff not VNOVAL.
425 	 */
426 	if (vap->va_uid != (uid_t)VNOVAL || vap->va_gid != (gid_t)VNOVAL) {
427 		if (vp->v_mount->mnt_flag & MNT_RDONLY)
428 			return (EROFS);
429 		if ((error = ufs_chown(vp, vap->va_uid, vap->va_gid, cred)) != 0)
430 			return (error);
431 	}
432 	if (vap->va_size != VNOVAL) {
433 		/*
434 		 * Disallow write attempts on read-only filesystems;
435 		 * unless the file is a socket, fifo, or a block or
436 		 * character device resident on the filesystem.
437 		 */
438 		switch (vp->v_type) {
439 		case VDIR:
440 			return (EISDIR);
441 		case VLNK:
442 		case VREG:
443 			if (vp->v_mount->mnt_flag & MNT_RDONLY)
444 				return (EROFS);
445 			break;
446 		default:
447 			break;
448 		}
449 		if ((error = ffs_truncate(vp, vap->va_size, 0, cred)) != 0)
450 			return (error);
451 	}
452 	ip = VTOI(vp);
453 	if (vap->va_atime.tv_sec != VNOVAL || vap->va_mtime.tv_sec != VNOVAL) {
454 		if (vp->v_mount->mnt_flag & MNT_RDONLY)
455 			return (EROFS);
456 		if (cred->cr_uid != ip->i_uid &&
457 		    (error = priv_check_cred(cred, PRIV_VFS_SETATTR, 0)) &&
458 		    ((vap->va_vaflags & VA_UTIMES_NULL) == 0 ||
459 		    (error = VOP_EACCESS(vp, VWRITE, cred))))
460 			return (error);
461 		if (vap->va_atime.tv_sec != VNOVAL)
462 			ip->i_flag |= IN_ACCESS;
463 		if (vap->va_mtime.tv_sec != VNOVAL)
464 			ip->i_flag |= IN_CHANGE | IN_UPDATE;
465 		ufs_itimes(vp);
466 		if (vap->va_atime.tv_sec != VNOVAL) {
467 			ip->i_atime = vap->va_atime.tv_sec;
468 			ip->i_atimensec = vap->va_atime.tv_nsec;
469 		}
470 		if (vap->va_mtime.tv_sec != VNOVAL) {
471 			ip->i_mtime = vap->va_mtime.tv_sec;
472 			ip->i_mtimensec = vap->va_mtime.tv_nsec;
473 		}
474 		error = ffs_update(vp, 0);
475 		if (error)
476 			return (error);
477 	}
478 	error = 0;
479 	if (vap->va_mode != (mode_t)VNOVAL) {
480 		if (vp->v_mount->mnt_flag & MNT_RDONLY)
481 			return (EROFS);
482 		error = ufs_chmod(vp, (int)vap->va_mode, cred);
483 	}
484 	VN_KNOTE(vp, NOTE_ATTRIB);
485 	return (error);
486 }
487 
488 /*
489  * Change the mode on a file.
490  * Inode must be locked before calling.
491  */
492 static int
493 ufs_chmod(struct vnode *vp, int mode, struct ucred *cred)
494 {
495 	struct inode *ip = VTOI(vp);
496 	int error;
497 	mode_t	cur_mode = ip->i_mode;
498 
499 	error = vop_helper_chmod(vp, mode, cred, ip->i_uid, ip->i_gid,
500 				 &cur_mode);
501 	if (error)
502 		return (error);
503 #if 0
504 	if (cred->cr_uid != ip->i_uid) {
505 	    error = priv_check_cred(cred, PRIV_VFS_CHMOD, 0);
506 	    if (error)
507 		return (error);
508 	}
509 	if (cred->cr_uid) {
510 		if (vp->v_type != VDIR && (mode & S_ISTXT))
511 			return (EFTYPE);
512 		if (!groupmember(ip->i_gid, cred) && (mode & ISGID))
513 			return (EPERM);
514 	}
515 #endif
516 	ip->i_mode = cur_mode;
517 	ip->i_flag |= IN_CHANGE;
518 	return (0);
519 }
520 
521 /*
522  * Perform chown operation on inode ip;
523  * inode must be locked prior to call.
524  */
525 static int
526 ufs_chown(struct vnode *vp, uid_t uid, gid_t gid, struct ucred *cred)
527 {
528 	struct inode *ip = VTOI(vp);
529 	uid_t ouid;
530 	gid_t ogid;
531 	int error = 0;
532 #ifdef QUOTA
533 	int i;
534 	long change;
535 #endif
536 
537 	if (uid == (uid_t)VNOVAL)
538 		uid = ip->i_uid;
539 	if (gid == (gid_t)VNOVAL)
540 		gid = ip->i_gid;
541 	/*
542 	 * If we don't own the file, are trying to change the owner
543 	 * of the file, or are not a member of the target group,
544 	 * the caller must be superuser or the call fails.
545 	 */
546 	if ((cred->cr_uid != ip->i_uid || uid != ip->i_uid ||
547 	    (gid != ip->i_gid && !(cred->cr_gid == gid ||
548 	    groupmember(gid, cred)))) &&
549 	    (error = priv_check_cred(cred, PRIV_VFS_CHOWN, 0)))
550 		return (error);
551 	ogid = ip->i_gid;
552 	ouid = ip->i_uid;
553 #ifdef QUOTA
554 	if ((error = ufs_getinoquota(ip)) != 0)
555 		return (error);
556 	if (ouid == uid) {
557 		ufs_dqrele(vp, ip->i_dquot[USRQUOTA]);
558 		ip->i_dquot[USRQUOTA] = NODQUOT;
559 	}
560 	if (ogid == gid) {
561 		ufs_dqrele(vp, ip->i_dquot[GRPQUOTA]);
562 		ip->i_dquot[GRPQUOTA] = NODQUOT;
563 	}
564 	change = ip->i_blocks;
565 	(void) ufs_chkdq(ip, -change, cred, CHOWN);
566 	(void) ufs_chkiq(ip, -1, cred, CHOWN);
567 	for (i = 0; i < MAXQUOTAS; i++) {
568 		ufs_dqrele(vp, ip->i_dquot[i]);
569 		ip->i_dquot[i] = NODQUOT;
570 	}
571 #endif
572 	ip->i_gid = gid;
573 	ip->i_uid = uid;
574 #ifdef QUOTA
575 	if ((error = ufs_getinoquota(ip)) == 0) {
576 		if (ouid == uid) {
577 			ufs_dqrele(vp, ip->i_dquot[USRQUOTA]);
578 			ip->i_dquot[USRQUOTA] = NODQUOT;
579 		}
580 		if (ogid == gid) {
581 			ufs_dqrele(vp, ip->i_dquot[GRPQUOTA]);
582 			ip->i_dquot[GRPQUOTA] = NODQUOT;
583 		}
584 		if ((error = ufs_chkdq(ip, change, cred, CHOWN)) == 0) {
585 			if ((error = ufs_chkiq(ip, 1, cred, CHOWN)) == 0)
586 				goto good;
587 			else
588 				(void)ufs_chkdq(ip, -change, cred, CHOWN|FORCE);
589 		}
590 		for (i = 0; i < MAXQUOTAS; i++) {
591 			ufs_dqrele(vp, ip->i_dquot[i]);
592 			ip->i_dquot[i] = NODQUOT;
593 		}
594 	}
595 	ip->i_gid = ogid;
596 	ip->i_uid = ouid;
597 	if (ufs_getinoquota(ip) == 0) {
598 		if (ouid == uid) {
599 			ufs_dqrele(vp, ip->i_dquot[USRQUOTA]);
600 			ip->i_dquot[USRQUOTA] = NODQUOT;
601 		}
602 		if (ogid == gid) {
603 			ufs_dqrele(vp, ip->i_dquot[GRPQUOTA]);
604 			ip->i_dquot[GRPQUOTA] = NODQUOT;
605 		}
606 		(void) ufs_chkdq(ip, change, cred, FORCE|CHOWN);
607 		(void) ufs_chkiq(ip, 1, cred, FORCE|CHOWN);
608 		(void) ufs_getinoquota(ip);
609 	}
610 	return (error);
611 good:
612 	if (ufs_getinoquota(ip))
613 		panic("ufs_chown: lost quota");
614 #endif /* QUOTA */
615 	ip->i_flag |= IN_CHANGE;
616 	if (cred->cr_uid != 0 && (ouid != uid || ogid != gid))
617 		ip->i_mode &= ~(ISUID | ISGID);
618 	return (0);
619 }
620 
621 /*
622  * Mmap a file
623  *
624  * NB Currently unsupported.
625  *
626  * ufs_mmap(struct vnode *a_vp, int a_fflags, struct ucred *a_cred)
627  */
628 /* ARGSUSED */
629 static
630 int
631 ufs_mmap(struct vop_mmap_args *ap)
632 {
633 	return (EINVAL);
634 }
635 
636 /*
637  * ufs_remove(struct vnode *a_dvp, struct vnode *a_vp,
638  *	      struct componentname *a_cnp)
639  */
640 static
641 int
642 ufs_remove(struct vop_old_remove_args *ap)
643 {
644 	struct inode *ip;
645 	struct vnode *vp = ap->a_vp;
646 	struct vnode *dvp = ap->a_dvp;
647 	int error;
648 
649 	ip = VTOI(vp);
650 #if 0	/* handled by kernel now */
651 	if ((ip->i_flags & (NOUNLINK | IMMUTABLE | APPEND)) ||
652 	    (VTOI(dvp)->i_flags & APPEND)) {
653 		error = EPERM;
654 		goto out;
655 	}
656 #endif
657 	error = ufs_dirremove(dvp, ip, ap->a_cnp->cn_flags, 0);
658 	VN_KNOTE(vp, NOTE_DELETE);
659 	VN_KNOTE(dvp, NOTE_WRITE);
660 #if 0
661 out:
662 #endif
663 	return (error);
664 }
665 
666 /*
667  * link vnode call
668  *
669  * ufs_link(struct vnode *a_tdvp, struct vnode *a_vp,
670  *	    struct componentname *a_cnp)
671  */
672 static
673 int
674 ufs_link(struct vop_old_link_args *ap)
675 {
676 	struct vnode *vp = ap->a_vp;
677 	struct vnode *tdvp = ap->a_tdvp;
678 	struct componentname *cnp = ap->a_cnp;
679 	struct inode *ip;
680 	struct direct newdir;
681 	int error;
682 
683 	if (tdvp->v_mount != vp->v_mount) {
684 		error = EXDEV;
685 		goto out2;
686 	}
687 	if (tdvp != vp && (error = vn_lock(vp, LK_EXCLUSIVE))) {
688 		goto out2;
689 	}
690 	ip = VTOI(vp);
691 	if ((nlink_t)ip->i_nlink >= LINK_MAX) {
692 		error = EMLINK;
693 		goto out1;
694 	}
695 #if 0	/* handled by kernel now, also DragonFly allows this */
696 	if (ip->i_flags & (IMMUTABLE | APPEND)) {
697 		error = EPERM;
698 		goto out1;
699 	}
700 #endif
701 	ip->i_effnlink++;
702 	ip->i_nlink++;
703 	ip->i_flag |= IN_CHANGE;
704 	if (DOINGSOFTDEP(vp))
705 		softdep_change_linkcnt(ip);
706 	error = ffs_update(vp, !(DOINGSOFTDEP(vp) | DOINGASYNC(vp)));
707 	if (!error) {
708 		ufs_makedirentry(ip, cnp, &newdir);
709 		error = ufs_direnter(tdvp, vp, &newdir, cnp, NULL);
710 	}
711 
712 	if (error) {
713 		ip->i_effnlink--;
714 		ip->i_nlink--;
715 		ip->i_flag |= IN_CHANGE;
716 		if (DOINGSOFTDEP(vp))
717 			softdep_change_linkcnt(ip);
718 	}
719 out1:
720 	if (tdvp != vp)
721 		vn_unlock(vp);
722 out2:
723 	VN_KNOTE(vp, NOTE_LINK);
724 	VN_KNOTE(tdvp, NOTE_WRITE);
725 	return (error);
726 }
727 
728 /*
729  * whiteout vnode call
730  *
731  * ufs_whiteout(struct vnode *a_dvp, struct componentname *a_cnp, int a_flags)
732  */
733 static
734 int
735 ufs_whiteout(struct vop_old_whiteout_args *ap)
736 {
737 	struct vnode *dvp = ap->a_dvp;
738 	struct componentname *cnp = ap->a_cnp;
739 	struct direct newdir;
740 	int error = 0;
741 
742 	switch (ap->a_flags) {
743 	case NAMEI_LOOKUP:
744 		/* 4.4 format directories support whiteout operations */
745 		if (dvp->v_mount->mnt_maxsymlinklen > 0)
746 			return (0);
747 		return (EOPNOTSUPP);
748 
749 	case NAMEI_CREATE:
750 		/* create a new directory whiteout */
751 #ifdef DIAGNOSTIC
752 		if (dvp->v_mount->mnt_maxsymlinklen <= 0)
753 			panic("ufs_whiteout: old format filesystem");
754 #endif
755 
756 		newdir.d_ino = WINO;
757 		newdir.d_namlen = cnp->cn_namelen;
758 		bcopy(cnp->cn_nameptr, newdir.d_name, (unsigned)cnp->cn_namelen + 1);
759 		newdir.d_type = DT_WHT;
760 		error = ufs_direnter(dvp, NULL, &newdir, cnp, NULL);
761 		break;
762 
763 	case NAMEI_DELETE:
764 		/* remove an existing directory whiteout */
765 #ifdef DIAGNOSTIC
766 		if (dvp->v_mount->mnt_maxsymlinklen <= 0)
767 			panic("ufs_whiteout: old format filesystem");
768 #endif
769 
770 		cnp->cn_flags &= ~CNP_DOWHITEOUT;
771 		error = ufs_dirremove(dvp, NULL, cnp->cn_flags, 0);
772 		break;
773 	default:
774 		panic("ufs_whiteout: unknown op");
775 	}
776 	return (error);
777 }
778 
779 /*
780  * Rename system call.
781  * 	rename("foo", "bar");
782  * is essentially
783  *	unlink("bar");
784  *	link("foo", "bar");
785  *	unlink("foo");
786  * but ``atomically''.  Can't do full commit without saving state in the
787  * inode on disk which isn't feasible at this time.  Best we can do is
788  * always guarantee the target exists.
789  *
790  * Basic algorithm is:
791  *
792  * 1) Bump link count on source while we're linking it to the
793  *    target.  This also ensure the inode won't be deleted out
794  *    from underneath us while we work (it may be truncated by
795  *    a concurrent `trunc' or `open' for creation).
796  * 2) Link source to destination.  If destination already exists,
797  *    delete it first.
798  * 3) Unlink source reference to inode if still around. If a
799  *    directory was moved and the parent of the destination
800  *    is different from the source, patch the ".." entry in the
801  *    directory.
802  *
803  * ufs_rename(struct vnode *a_fdvp, struct vnode *a_fvp,
804  *	      struct componentname *a_fcnp, struct vnode *a_tdvp,
805  *	      struct vnode *a_tvp, struct componentname *a_tcnp)
806  */
807 static
808 int
809 ufs_rename(struct vop_old_rename_args *ap)
810 {
811 	struct vnode *tvp = ap->a_tvp;
812 	struct vnode *tdvp = ap->a_tdvp;
813 	struct vnode *fvp = ap->a_fvp;
814 	struct vnode *fdvp = ap->a_fdvp;
815 	struct componentname *tcnp = ap->a_tcnp;
816 	struct componentname *fcnp = ap->a_fcnp;
817 	struct inode *ip, *xp, *dp;
818 	struct direct newdir;
819 	ino_t oldparent = 0, newparent = 0;
820 	int doingdirectory = 0;
821 	int error = 0, ioflag;
822 
823 	/*
824 	 * Check for cross-device rename.
825 	 */
826 	if ((fvp->v_mount != tdvp->v_mount) ||
827 	    (tvp && (fvp->v_mount != tvp->v_mount))) {
828 		error = EXDEV;
829 abortit:
830 		if (tdvp == tvp)
831 			vrele(tdvp);
832 		else
833 			vput(tdvp);
834 		if (tvp)
835 			vput(tvp);
836 		vrele(fdvp);
837 		vrele(fvp);
838 		return (error);
839 	}
840 
841 #if 0	/* handled by kernel now */
842 	if (tvp && ((VTOI(tvp)->i_flags & (NOUNLINK | IMMUTABLE | APPEND)) ||
843 	    (VTOI(tdvp)->i_flags & APPEND))) {
844 		error = EPERM;
845 		goto abortit;
846 	}
847 #endif
848 
849 	/*
850 	 * Renaming a file to itself has no effect.  The upper layers should
851 	 * not call us in that case.  Temporarily just warn if they do.
852 	 */
853 	if (fvp == tvp) {
854 		kprintf("ufs_rename: fvp == tvp (can't happen)\n");
855 		error = 0;
856 		goto abortit;
857 	}
858 
859 	if ((error = vn_lock(fvp, LK_EXCLUSIVE)) != 0)
860 		goto abortit;
861 
862 	/*
863 	 * Note: now that fvp is locked we have to be sure to unlock it before
864 	 * using the 'abortit' target.
865 	 */
866 	dp = VTOI(fdvp);
867 	ip = VTOI(fvp);
868 	if (ip->i_nlink >= LINK_MAX) {
869 		vn_unlock(fvp);
870 		error = EMLINK;
871 		goto abortit;
872 	}
873 #if 0	/* handled by kernel now */
874 	if ((ip->i_flags & (NOUNLINK | IMMUTABLE | APPEND))
875 	    || (dp->i_flags & APPEND)) {
876 		vn_unlock(fvp);
877 		error = EPERM;
878 		goto abortit;
879 	}
880 #endif
881 	if ((ip->i_mode & IFMT) == IFDIR) {
882 		/*
883 		 * Avoid ".", "..", and aliases of "." for obvious reasons.
884 		 */
885 		if ((fcnp->cn_namelen == 1 && fcnp->cn_nameptr[0] == '.') ||
886 		    dp == ip || (fcnp->cn_flags | tcnp->cn_flags) & CNP_ISDOTDOT ||
887 		    (ip->i_flag & IN_RENAME)) {
888 			vn_unlock(fvp);
889 			error = EINVAL;
890 			goto abortit;
891 		}
892 		ip->i_flag |= IN_RENAME;
893 		oldparent = dp->i_number;
894 		doingdirectory = 1;
895 	}
896 	VN_KNOTE(fdvp, NOTE_WRITE);		/* XXX right place? */
897 
898 	/*
899 	 * fvp still locked.  ip->i_flag has IN_RENAME set if doingdirectory.
900 	 * Cleanup fvp requirements so we can unlock it.
901 	 *
902 	 * tvp and tdvp are locked.  tvp may be NULL.  Now that dp and xp
903 	 * is setup we can use the 'bad' target if we unlock fvp.  We cannot
904 	 * use the abortit target anymore because of IN_RENAME.
905 	 */
906 	dp = VTOI(tdvp);
907 	if (tvp)
908 		xp = VTOI(tvp);
909 	else
910 		xp = NULL;
911 
912 	/*
913 	 * 1) Bump link count while we're moving stuff
914 	 *    around.  If we crash somewhere before
915 	 *    completing our work, the link count
916 	 *    may be wrong, but correctable.
917 	 */
918 	ip->i_effnlink++;
919 	ip->i_nlink++;
920 	ip->i_flag |= IN_CHANGE;
921 	if (DOINGSOFTDEP(fvp))
922 		softdep_change_linkcnt(ip);
923 	if ((error = ffs_update(fvp, !(DOINGSOFTDEP(fvp) |
924 				       DOINGASYNC(fvp)))) != 0) {
925 		vn_unlock(fvp);
926 		goto bad;
927 	}
928 
929 	/*
930 	 * If ".." must be changed (ie the directory gets a new
931 	 * parent) then the source directory must not be in the
932 	 * directory heirarchy above the target, as this would
933 	 * orphan everything below the source directory. Also
934 	 * the user must have write permission in the source so
935 	 * as to be able to change "..". We must repeat the call
936 	 * to namei, as the parent directory is unlocked by the
937 	 * call to checkpath().
938 	 */
939 	error = VOP_EACCESS(fvp, VWRITE, tcnp->cn_cred);
940 	vn_unlock(fvp);
941 
942 	/*
943 	 * We are now back to where we were in that fvp, fdvp are unlocked
944 	 * and tvp, tdvp are locked.  tvp may be NULL.  IN_RENAME may be
945 	 * set.  Only the bad target or, if we clean up tvp and tdvp, the
946 	 * out target, may be used.
947 	 */
948 	if (oldparent != dp->i_number)
949 		newparent = dp->i_number;
950 	if (doingdirectory && newparent) {
951 		if (error)	/* write access check above */
952 			goto bad;
953 
954 		/*
955 		 * Once we start messing with tvp and tdvp we cannot use the
956 		 * 'bad' target, only finish cleaning tdvp and tvp up and
957 		 * use the 'out' target.
958 		 *
959 		 * This cleans up tvp.
960 		 */
961 		if (xp != NULL) {
962 			vput(tvp);
963 			xp = NULL;
964 		}
965 
966 		/*
967 		 * This is a real mess. ufs_checkpath vput's the target
968 		 * directory so retain an extra ref and note that tdvp will
969 		 * lose its lock on return.  This leaves us with one good
970 		 * ref after ufs_checkpath returns.
971 		 */
972 		vref(tdvp);
973 		error = ufs_checkpath(ip, dp, tcnp->cn_cred);
974 		tcnp->cn_flags |= CNP_PDIRUNLOCK;
975 		if (error) {
976 			vrele(tdvp);
977 			goto out;
978 	        }
979 
980 		/*
981 		 * relookup no longer messes with tdvp's refs. tdvp must be
982 		 * unlocked on entry and will be locked on a successful
983 		 * return.
984 		 */
985 		error = relookup(tdvp, &tvp, tcnp);
986 		if (error) {
987 			if (tcnp->cn_flags & CNP_PDIRUNLOCK)
988 				vrele(tdvp);
989 			else
990 				vput(tdvp);
991 			goto out;
992 		}
993 		KKASSERT((tcnp->cn_flags & CNP_PDIRUNLOCK) == 0);
994 		dp = VTOI(tdvp);
995 		if (tvp)
996 			xp = VTOI(tvp);
997 	}
998 
999 	/*
1000 	 * We are back to fvp, fdvp unlocked, tvp, tdvp locked.  tvp may
1001 	 * be NULL (xp will also be NULL in that case), and IN_RENAME will
1002 	 * be set if doingdirectory.  This means we can use the 'bad' target
1003 	 * again.
1004 	 */
1005 
1006 	/*
1007 	 * 2) If target doesn't exist, link the target
1008 	 *    to the source and unlink the source.
1009 	 *    Otherwise, rewrite the target directory
1010 	 *    entry to reference the source inode and
1011 	 *    expunge the original entry's existence.
1012 	 */
1013 	if (xp == NULL) {
1014 		if (dp->i_dev != ip->i_dev)
1015 			panic("ufs_rename: EXDEV");
1016 		/*
1017 		 * Account for ".." in new directory.
1018 		 * When source and destination have the same
1019 		 * parent we don't fool with the link count.
1020 		 */
1021 		if (doingdirectory && newparent) {
1022 			if ((nlink_t)dp->i_nlink >= LINK_MAX) {
1023 				error = EMLINK;
1024 				goto bad;
1025 			}
1026 			dp->i_effnlink++;
1027 			dp->i_nlink++;
1028 			dp->i_flag |= IN_CHANGE;
1029 			if (DOINGSOFTDEP(tdvp))
1030 				softdep_change_linkcnt(dp);
1031 			error = ffs_update(tdvp, !(DOINGSOFTDEP(tdvp) |
1032 						   DOINGASYNC(tdvp)));
1033 			if (error)
1034 				goto bad;
1035 		}
1036 		ufs_makedirentry(ip, tcnp, &newdir);
1037 		error = ufs_direnter(tdvp, NULL, &newdir, tcnp, NULL);
1038 		if (error) {
1039 			if (doingdirectory && newparent) {
1040 				dp->i_effnlink--;
1041 				dp->i_nlink--;
1042 				dp->i_flag |= IN_CHANGE;
1043 				if (DOINGSOFTDEP(tdvp))
1044 					softdep_change_linkcnt(dp);
1045 				(void)ffs_update(tdvp, 1);
1046 			}
1047 			goto bad;
1048 		}
1049 		VN_KNOTE(tdvp, NOTE_WRITE);
1050 		vput(tdvp);
1051 	} else {
1052 		if (xp->i_dev != dp->i_dev || xp->i_dev != ip->i_dev)
1053 			panic("ufs_rename: EXDEV");
1054 		/*
1055 		 * Short circuit rename(foo, foo).
1056 		 */
1057 		if (xp->i_number == ip->i_number)
1058 			panic("ufs_rename: same file");
1059 		/*
1060 		 * If the parent directory is "sticky", then the user must
1061 		 * own the parent directory, or the destination of the rename,
1062 		 * otherwise the destination may not be changed (except by
1063 		 * root). This implements append-only directories.
1064 		 */
1065 		if ((dp->i_mode & S_ISTXT) && tcnp->cn_cred->cr_uid != 0 &&
1066 		    tcnp->cn_cred->cr_uid != dp->i_uid &&
1067 		    xp->i_uid != tcnp->cn_cred->cr_uid) {
1068 			error = EPERM;
1069 			goto bad;
1070 		}
1071 		/*
1072 		 * Target must be empty if a directory and have no links
1073 		 * to it. Also, ensure source and target are compatible
1074 		 * (both directories, or both not directories).
1075 		 *
1076 		 * Purge the file or directory being replaced from the
1077 		 * nameccache.
1078 		 */
1079 		if ((xp->i_mode&IFMT) == IFDIR) {
1080 			if ((xp->i_effnlink > 2) ||
1081 			    !ufs_dirempty(xp, dp->i_number, tcnp->cn_cred)) {
1082 				error = ENOTEMPTY;
1083 				goto bad;
1084 			}
1085 			if (!doingdirectory) {
1086 				error = ENOTDIR;
1087 				goto bad;
1088 			}
1089 			/* cache_purge removed - handled by VFS compat layer */
1090 		} else if (doingdirectory == 0) {
1091 			/* cache_purge removed - handled by VFS compat layer */
1092 		} else {
1093 			error = EISDIR;
1094 			goto bad;
1095 		}
1096 		/*
1097 		 * note: inode passed to ufs_dirrewrite() is 0 for a
1098 		 * non-directory file rename, 1 for a directory rename
1099 		 * in the same directory, and > 1 for an inode representing
1100 		 * the new directory.
1101 		 */
1102 		error = ufs_dirrewrite(dp, xp, ip->i_number,
1103 		    IFTODT(ip->i_mode),
1104 		    (doingdirectory && newparent) ?
1105 			newparent : (ino_t)doingdirectory);
1106 		if (error)
1107 			goto bad;
1108 		if (doingdirectory) {
1109 			if (!newparent) {
1110 				dp->i_effnlink--;
1111 				if (DOINGSOFTDEP(tdvp))
1112 					softdep_change_linkcnt(dp);
1113 			}
1114 			xp->i_effnlink--;
1115 			if (DOINGSOFTDEP(tvp))
1116 				softdep_change_linkcnt(xp);
1117 		}
1118 		if (doingdirectory && !DOINGSOFTDEP(tvp)) {
1119 			/*
1120 			 * Truncate inode. The only stuff left in the directory
1121 			 * is "." and "..". The "." reference is inconsequential
1122 			 * since we are quashing it. We have removed the "."
1123 			 * reference and the reference in the parent directory,
1124 			 * but there may be other hard links. The soft
1125 			 * dependency code will arrange to do these operations
1126 			 * after the parent directory entry has been deleted on
1127 			 * disk, so when running with that code we avoid doing
1128 			 * them now.
1129 			 */
1130 			if (!newparent) {
1131 				dp->i_nlink--;
1132 				dp->i_flag |= IN_CHANGE;
1133 			}
1134 			xp->i_nlink--;
1135 			xp->i_flag |= IN_CHANGE;
1136 			ioflag = DOINGASYNC(tvp) ? 0 : IO_SYNC;
1137 			error = ffs_truncate(tvp, (off_t)0, ioflag,
1138 					     tcnp->cn_cred);
1139 			if (error)
1140 				goto bad;
1141 		}
1142 		VN_KNOTE(tdvp, NOTE_WRITE);
1143 		vput(tdvp);
1144 		VN_KNOTE(tvp, NOTE_DELETE);
1145 		vput(tvp);
1146 		xp = NULL;
1147 	}
1148 
1149 	/*
1150 	 * tvp and tdvp have been cleaned up.  only fvp and fdvp (both
1151 	 * unlocked) remain.  We are about to overwrite fvp but we have to
1152 	 * keep 'ip' intact so we cannot release the old fvp, which is still
1153 	 * refd and accessible via ap->a_fvp.
1154 	 *
1155 	 * This means we cannot use either 'bad' or 'out' to cleanup any
1156 	 * more.
1157 	 */
1158 
1159 	/*
1160 	 * 3) Unlink the source.
1161 	 */
1162 	fcnp->cn_flags &= ~CNP_MODMASK;
1163 	fcnp->cn_flags |= CNP_LOCKPARENT;
1164 	error = relookup(fdvp, &fvp, fcnp);
1165 	if (error || fvp == NULL) {
1166 		/*
1167 		 * From name has disappeared.  IN_RENAME will not be set if
1168 		 * we get past the panic so we don't have to clean it up.
1169 		 */
1170 		if (doingdirectory)
1171 			panic("ufs_rename: lost dir entry");
1172 		vrele(ap->a_fvp);
1173 		if (fcnp->cn_flags & CNP_PDIRUNLOCK)
1174 			vrele(fdvp);
1175 		else
1176 			vput(fdvp);
1177 		return(0);
1178 	}
1179 	KKASSERT((fcnp->cn_flags & CNP_PDIRUNLOCK) == 0);
1180 
1181 	/*
1182 	 * fdvp and fvp are locked.
1183 	 */
1184 	xp = VTOI(fvp);
1185 	dp = VTOI(fdvp);
1186 
1187 	/*
1188 	 * Ensure that the directory entry still exists and has not
1189 	 * changed while the new name has been entered. If the source is
1190 	 * a file then the entry may have been unlinked or renamed. In
1191 	 * either case there is no further work to be done. If the source
1192 	 * is a directory then it cannot have been rmdir'ed; the IN_RENAME
1193 	 * flag ensures that it cannot be moved by another rename or removed
1194 	 * by a rmdir.  Cleanup IN_RENAME.
1195 	 */
1196 	if (xp != ip) {
1197 		if (doingdirectory)
1198 			panic("ufs_rename: lost dir entry");
1199 	} else {
1200 		/*
1201 		 * If the source is a directory with a
1202 		 * new parent, the link count of the old
1203 		 * parent directory must be decremented
1204 		 * and ".." set to point to the new parent.
1205 		 */
1206 		if (doingdirectory && newparent) {
1207 			xp->i_offset = mastertemplate.dot_reclen;
1208 			ufs_dirrewrite(xp, dp, newparent, DT_DIR, 0);
1209 			/* cache_purge removed - handled by VFS compat layer */
1210 		}
1211 		error = ufs_dirremove(fdvp, xp, fcnp->cn_flags, 0);
1212 		xp->i_flag &= ~IN_RENAME;
1213 	}
1214 
1215 	VN_KNOTE(fvp, NOTE_RENAME);
1216 	vput(fdvp);
1217 	vput(fvp);
1218 	vrele(ap->a_fvp);
1219 	return (error);
1220 
1221 bad:
1222 	if (xp)
1223 		vput(ITOV(xp));
1224 	vput(ITOV(dp));
1225 out:
1226 	if (doingdirectory)
1227 		ip->i_flag &= ~IN_RENAME;
1228 	if (vn_lock(fvp, LK_EXCLUSIVE) == 0) {
1229 		ip->i_effnlink--;
1230 		ip->i_nlink--;
1231 		ip->i_flag |= IN_CHANGE;
1232 		ip->i_flag &= ~IN_RENAME;
1233 		if (DOINGSOFTDEP(fvp))
1234 			softdep_change_linkcnt(ip);
1235 		vput(fvp);
1236 	} else {
1237 		vrele(fvp);
1238 	}
1239 	return (error);
1240 }
1241 
1242 /*
1243  * Mkdir system call
1244  *
1245  * ufs_mkdir(struct vnode *a_dvp, struct vnode **a_vpp,
1246  *	     struct componentname *a_cnp, struct vattr *a_vap)
1247  */
1248 static
1249 int
1250 ufs_mkdir(struct vop_old_mkdir_args *ap)
1251 {
1252 	struct vnode *dvp = ap->a_dvp;
1253 	struct vattr *vap = ap->a_vap;
1254 	struct componentname *cnp = ap->a_cnp;
1255 	struct inode *ip, *dp;
1256 	struct vnode *tvp;
1257 	struct buf *bp;
1258 	struct dirtemplate dirtemplate, *dtp;
1259 	struct direct newdir;
1260 	int error, dmode;
1261 	long blkoff;
1262 
1263 	dp = VTOI(dvp);
1264 	if ((nlink_t)dp->i_nlink >= LINK_MAX) {
1265 		error = EMLINK;
1266 		goto out;
1267 	}
1268 	dmode = vap->va_mode & 0777;
1269 	dmode |= IFDIR;
1270 	/*
1271 	 * Must simulate part of ufs_makeinode here to acquire the inode,
1272 	 * but not have it entered in the parent directory. The entry is
1273 	 * made later after writing "." and ".." entries.
1274 	 */
1275 	error = ffs_valloc(dvp, dmode, cnp->cn_cred, &tvp);
1276 	if (error)
1277 		goto out;
1278 	ip = VTOI(tvp);
1279 	ip->i_gid = dp->i_gid;
1280 #ifdef SUIDDIR
1281 	{
1282 #ifdef QUOTA
1283 		struct ucred ucred, *ucp;
1284 		ucp = cnp->cn_cred;
1285 #endif
1286 		/*
1287 		 * If we are hacking owners here, (only do this where told to)
1288 		 * and we are not giving it TO root, (would subvert quotas)
1289 		 * then go ahead and give it to the other user.
1290 		 * The new directory also inherits the SUID bit.
1291 		 * If user's UID and dir UID are the same,
1292 		 * 'give it away' so that the SUID is still forced on.
1293 		 */
1294 		if ((dvp->v_mount->mnt_flag & MNT_SUIDDIR) &&
1295 		    (dp->i_mode & ISUID) && dp->i_uid) {
1296 			dmode |= ISUID;
1297 			ip->i_uid = dp->i_uid;
1298 #ifdef QUOTA
1299 			if (dp->i_uid != cnp->cn_cred->cr_uid) {
1300 				/*
1301 				 * Make sure the correct user gets charged
1302 				 * for the space.
1303 				 * Make a dummy credential for the victim.
1304 				 * XXX This seems to never be accessed out of
1305 				 * our context so a stack variable is ok.
1306 				 */
1307 				ucred.cr_ref = 1;
1308 				ucred.cr_uid = ip->i_uid;
1309 				ucred.cr_ngroups = 1;
1310 				ucred.cr_groups[0] = dp->i_gid;
1311 				ucp = &ucred;
1312 			}
1313 #endif
1314 		} else
1315 			ip->i_uid = cnp->cn_cred->cr_uid;
1316 #ifdef QUOTA
1317 		if ((error = ufs_getinoquota(ip)) ||
1318 	    	    (error = ufs_chkiq(ip, 1, ucp, 0))) {
1319 			ffs_vfree(tvp, ip->i_number, dmode);
1320 			vput(tvp);
1321 			return (error);
1322 		}
1323 #endif
1324 	}
1325 #else	/* !SUIDDIR */
1326 	ip->i_uid = cnp->cn_cred->cr_uid;
1327 #ifdef QUOTA
1328 	if ((error = ufs_getinoquota(ip)) ||
1329 	    (error = ufs_chkiq(ip, 1, cnp->cn_cred, 0))) {
1330 		ffs_vfree(tvp, ip->i_number, dmode);
1331 		vput(tvp);
1332 		return (error);
1333 	}
1334 #endif
1335 #endif	/* !SUIDDIR */
1336 	ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE;
1337 	ip->i_mode = dmode;
1338 	tvp->v_type = VDIR;	/* Rest init'd in getnewvnode(). */
1339 	ip->i_effnlink = 2;
1340 	ip->i_nlink = 2;
1341 	if (DOINGSOFTDEP(tvp))
1342 		softdep_change_linkcnt(ip);
1343 	if (cnp->cn_flags & CNP_ISWHITEOUT)
1344 		ip->i_flags |= UF_OPAQUE;
1345 
1346 	/*
1347 	 * Bump link count in parent directory to reflect work done below.
1348 	 * Should be done before reference is created so cleanup is
1349 	 * possible if we crash.
1350 	 */
1351 	dp->i_effnlink++;
1352 	dp->i_nlink++;
1353 	dp->i_flag |= IN_CHANGE;
1354 	if (DOINGSOFTDEP(dvp))
1355 		softdep_change_linkcnt(dp);
1356 	error = ffs_update(tvp, !(DOINGSOFTDEP(dvp) | DOINGASYNC(dvp)));
1357 	if (error)
1358 		goto bad;
1359 
1360 	/*
1361 	 * The vnode must have a VM object in order to issue buffer cache
1362 	 * ops on it.
1363 	 */
1364 	vinitvmio(tvp, DIRBLKSIZ, DIRBLKSIZ, -1);
1365 
1366 	/*
1367 	 * Initialize directory with "." and ".." from static template.
1368 	 */
1369 	if (dvp->v_mount->mnt_maxsymlinklen > 0)
1370 		dtp = &mastertemplate;
1371 	else
1372 		dtp = (struct dirtemplate *)&omastertemplate;
1373 	dirtemplate = *dtp;
1374 	dirtemplate.dot_ino = ip->i_number;
1375 	dirtemplate.dotdot_ino = dp->i_number;
1376 	nvnode_pager_setsize(tvp, DIRBLKSIZ, DIRBLKSIZ, -1);
1377 	error = VOP_BALLOC(tvp, 0LL, DIRBLKSIZ, cnp->cn_cred, B_CLRBUF, &bp);
1378 	if (error)
1379 		goto bad;
1380 	ip->i_size = DIRBLKSIZ;
1381 	ip->i_flag |= IN_CHANGE | IN_UPDATE;
1382 	bcopy((caddr_t)&dirtemplate, (caddr_t)bp->b_data, sizeof dirtemplate);
1383 	if (DOINGSOFTDEP(tvp)) {
1384 		/*
1385 		 * Ensure that the entire newly allocated block is a
1386 		 * valid directory so that future growth within the
1387 		 * block does not have to ensure that the block is
1388 		 * written before the inode.
1389 		 */
1390 		blkoff = DIRBLKSIZ;
1391 		while (blkoff < bp->b_bcount) {
1392 			((struct direct *)
1393 			   (bp->b_data + blkoff))->d_reclen = DIRBLKSIZ;
1394 			blkoff += DIRBLKSIZ;
1395 		}
1396 	}
1397 	if ((error = ffs_update(tvp, !(DOINGSOFTDEP(tvp) |
1398 				       DOINGASYNC(tvp)))) != 0) {
1399 		bwrite(bp);
1400 		goto bad;
1401 	}
1402 	/*
1403 	 * Directory set up, now install its entry in the parent directory.
1404 	 *
1405 	 * If we are not doing soft dependencies, then we must write out the
1406 	 * buffer containing the new directory body before entering the new
1407 	 * name in the parent. If we are doing soft dependencies, then the
1408 	 * buffer containing the new directory body will be passed to and
1409 	 * released in the soft dependency code after the code has attached
1410 	 * an appropriate ordering dependency to the buffer which ensures that
1411 	 * the buffer is written before the new name is written in the parent.
1412 	 */
1413 	if (DOINGASYNC(dvp))
1414 		bdwrite(bp);
1415 	else if (!DOINGSOFTDEP(dvp) && (error = bwrite(bp)) != 0)
1416 		goto bad;
1417 	ufs_makedirentry(ip, cnp, &newdir);
1418 	error = ufs_direnter(dvp, tvp, &newdir, cnp, bp);
1419 
1420 bad:
1421 	if (error == 0) {
1422 		VN_KNOTE(dvp, NOTE_WRITE | NOTE_LINK);
1423 		*ap->a_vpp = tvp;
1424 	} else {
1425 		dp->i_effnlink--;
1426 		dp->i_nlink--;
1427 		dp->i_flag |= IN_CHANGE;
1428 		if (DOINGSOFTDEP(dvp))
1429 			softdep_change_linkcnt(dp);
1430 		/*
1431 		 * No need to do an explicit VOP_TRUNCATE here, vrele will
1432 		 * do this for us because we set the link count to 0.
1433 		 */
1434 		ip->i_effnlink = 0;
1435 		ip->i_nlink = 0;
1436 		ip->i_flag |= IN_CHANGE;
1437 		if (DOINGSOFTDEP(tvp))
1438 			softdep_change_linkcnt(ip);
1439 		vput(tvp);
1440 	}
1441 out:
1442 	return (error);
1443 }
1444 
1445 /*
1446  * Rmdir system call.
1447  *
1448  * ufs_rmdir(struct vnode *a_dvp, struct vnode *a_vp,
1449  *	     struct componentname *a_cnp)
1450  */
1451 static
1452 int
1453 ufs_rmdir(struct vop_old_rmdir_args *ap)
1454 {
1455 	struct vnode *vp = ap->a_vp;
1456 	struct vnode *dvp = ap->a_dvp;
1457 	struct componentname *cnp = ap->a_cnp;
1458 	struct inode *ip, *dp;
1459 	int error, ioflag;
1460 
1461 	ip = VTOI(vp);
1462 	dp = VTOI(dvp);
1463 
1464 	/*
1465 	 * Do not remove a directory that is in the process of being renamed.
1466 	 * Verify the directory is empty (and valid). Rmdir ".." will not be
1467 	 * valid since ".." will contain a reference to the current directory
1468 	 * and thus be non-empty. Do not allow the removal of mounted on
1469 	 * directories (this can happen when an NFS exported filesystem
1470 	 * tries to remove a locally mounted on directory).
1471 	 */
1472 	error = 0;
1473 	if (ip->i_flag & IN_RENAME) {
1474 		error = EINVAL;
1475 		goto out;
1476 	}
1477 	if (ip->i_effnlink != 2 ||
1478 	    !ufs_dirempty(ip, dp->i_number, cnp->cn_cred)) {
1479 		error = ENOTEMPTY;
1480 		goto out;
1481 	}
1482 #if 0	/* handled by kernel now */
1483 	if ((dp->i_flags & APPEND)
1484 	    || (ip->i_flags & (NOUNLINK | IMMUTABLE | APPEND))) {
1485 		error = EPERM;
1486 		goto out;
1487 	}
1488 #endif
1489 	/*
1490 	 * Delete reference to directory before purging
1491 	 * inode.  If we crash in between, the directory
1492 	 * will be reattached to lost+found,
1493 	 */
1494 	dp->i_effnlink--;
1495 	ip->i_effnlink--;
1496 	if (DOINGSOFTDEP(vp)) {
1497 		softdep_change_linkcnt(dp);
1498 		softdep_change_linkcnt(ip);
1499 	}
1500 	error = ufs_dirremove(dvp, ip, cnp->cn_flags, 1);
1501 	if (error) {
1502 		dp->i_effnlink++;
1503 		ip->i_effnlink++;
1504 		if (DOINGSOFTDEP(vp)) {
1505 			softdep_change_linkcnt(dp);
1506 			softdep_change_linkcnt(ip);
1507 		}
1508 		goto out;
1509 	}
1510 	VN_KNOTE(dvp, NOTE_WRITE | NOTE_LINK);
1511 	/*
1512 	 * Truncate inode. The only stuff left in the directory is "." and
1513 	 * "..". The "." reference is inconsequential since we are quashing
1514 	 * it. The soft dependency code will arrange to do these operations
1515 	 * after the parent directory entry has been deleted on disk, so
1516 	 * when running with that code we avoid doing them now.
1517 	 */
1518 	if (!DOINGSOFTDEP(vp)) {
1519 		dp->i_nlink--;
1520 		dp->i_flag |= IN_CHANGE;
1521 		ip->i_nlink--;
1522 		ip->i_flag |= IN_CHANGE;
1523 		ioflag = DOINGASYNC(vp) ? 0 : IO_SYNC;
1524 		error = ffs_truncate(vp, (off_t)0, ioflag, cnp->cn_cred);
1525 	}
1526 	/* cache_purge removed - handled by VFS compat layer */
1527 #ifdef UFS_DIRHASH
1528 	/* Kill any active hash; i_effnlink == 0, so it will not come back. */
1529 	if (ip->i_dirhash != NULL)
1530 		ufsdirhash_free(ip);
1531 #endif
1532 out:
1533 	VN_KNOTE(vp, NOTE_DELETE);
1534 	return (error);
1535 }
1536 
1537 /*
1538  * symlink -- make a symbolic link
1539  *
1540  * ufs_symlink(struct vnode *a_dvp, struct vnode **a_vpp,
1541  *		struct componentname *a_cnp, struct vattr *a_vap,
1542  *		char *a_target)
1543  */
1544 static
1545 int
1546 ufs_symlink(struct vop_old_symlink_args *ap)
1547 {
1548 	struct vnode *vp, **vpp = ap->a_vpp;
1549 	struct inode *ip;
1550 	int len, error;
1551 
1552 	error = ufs_makeinode(IFLNK | ap->a_vap->va_mode, ap->a_dvp,
1553 			      vpp, ap->a_cnp);
1554 	if (error)
1555 		return (error);
1556 	VN_KNOTE(ap->a_dvp, NOTE_WRITE);
1557 	vp = *vpp;
1558 	len = strlen(ap->a_target);
1559 	if (len < vp->v_mount->mnt_maxsymlinklen) {
1560 		ip = VTOI(vp);
1561 		bcopy(ap->a_target, (char *)ip->i_shortlink, len);
1562 		ip->i_size = len;
1563 		ip->i_flag |= IN_CHANGE | IN_UPDATE;
1564 	} else {
1565 		/*
1566 		 * Make sure we have a VM object in order to use
1567 		 * the buffer cache.
1568 		 */
1569 		if (vp->v_object == NULL)
1570 			vinitvmio(vp, 0, PAGE_SIZE, -1);
1571 		error = vn_rdwr(UIO_WRITE, vp, ap->a_target, len, (off_t)0,
1572 				UIO_SYSSPACE, IO_NODELOCKED,
1573 				ap->a_cnp->cn_cred, NULL);
1574 	}
1575 	if (error)
1576 		vput(vp);
1577 	return (error);
1578 }
1579 
1580 /*
1581  * Vnode op for reading directories.
1582  *
1583  * ufs_readdir(struct vnode *a_vp, struct uio *a_uio, struct ucred *a_cred,
1584  *		int *a_eofflag, int *ncookies, off_t **a_cookies)
1585  */
1586 static
1587 int
1588 ufs_readdir(struct vop_readdir_args *ap)
1589 {
1590 	struct uio *uio = ap->a_uio;
1591 	struct vnode *vp = ap->a_vp;
1592 	struct direct *dp;
1593 	struct buf *bp;
1594 	int retval;
1595 	int error;
1596 	int offset;	/* offset into buffer cache buffer */
1597 	int eoffset;	/* end of buffer clipped to file EOF */
1598 	int pickup;	/* pickup point */
1599 	int ncookies;
1600 	int cookie_index;
1601 	off_t *cookies;
1602 
1603 	if (uio->uio_offset < 0)
1604 		return (EINVAL);
1605 	/*
1606 	 * Guess the number of cookies needed.  Make sure we compute at
1607 	 * least 1, and no more then a reasonable limit.
1608 	 */
1609 	if (ap->a_ncookies) {
1610 		ncookies = uio->uio_resid / 16 + 1;
1611 		if (ncookies > 1024)
1612 			ncookies = 1024;
1613 		cookies = kmalloc(ncookies * sizeof(off_t), M_TEMP, M_WAITOK);
1614 	} else {
1615 		ncookies = -1;	/* force conditionals below */
1616 		cookies = NULL;
1617 	}
1618 	cookie_index = 0;
1619 
1620 	if ((error = vn_lock(vp, LK_EXCLUSIVE | LK_RETRY)) != 0)
1621 		return (error);
1622 
1623 	/*
1624 	 * Past or at EOF
1625 	 */
1626 	if (uio->uio_offset >= VTOI(vp)->i_size) {
1627 		if (ap->a_eofflag)
1628 			*ap->a_eofflag = 1;
1629 		if (ap->a_ncookies) {
1630 			*ap->a_ncookies = cookie_index;
1631 			*ap->a_cookies = cookies;
1632 		}
1633 		goto done;
1634 	}
1635 
1636 	/*
1637 	 * Loop until we run out of cookies, we run out of user buffer,
1638 	 * or we hit the directory EOF.
1639 	 *
1640 	 * Always start scans at the beginning of the buffer, don't trust
1641 	 * the offset supplied by userland.
1642 	 */
1643 	while ((error = ffs_blkatoff_ra(vp, uio->uio_offset, NULL, &bp, 2)) == 0) {
1644 		pickup = (int)(uio->uio_offset - bp->b_loffset);
1645 		offset = 0;
1646 		retval = 0;
1647 		if (bp->b_loffset + bp->b_bcount > VTOI(vp)->i_size)
1648 			eoffset = (int)(VTOI(vp)->i_size - bp->b_loffset);
1649 		else
1650 			eoffset = bp->b_bcount;
1651 
1652 		while (offset < eoffset) {
1653 			dp = (struct direct *)(bp->b_data + offset);
1654 			if (dp->d_reclen <= 0 || (dp->d_reclen & 3) ||
1655 			    offset + dp->d_reclen > bp->b_bcount) {
1656 				error = EIO;
1657 				break;
1658 			}
1659 			if (offsetof(struct direct, d_name[dp->d_namlen]) >				     dp->d_reclen) {
1660 				error = EIO;
1661 				break;
1662 			}
1663 			if (offset < pickup) {
1664 				offset += dp->d_reclen;
1665 				continue;
1666 			}
1667 #if BYTE_ORDER == LITTLE_ENDIAN
1668 			if (OFSFMT(vp)) {
1669 				retval = vop_write_dirent(&error, uio,
1670 				    dp->d_ino, dp->d_namlen, dp->d_type,
1671 				    dp->d_name);
1672 			} else
1673 #endif
1674 			{
1675 				retval = vop_write_dirent(&error, uio,
1676 				    dp->d_ino, dp->d_type, dp->d_namlen,
1677 				    dp->d_name);
1678 			}
1679 			if (retval)
1680 				break;
1681 			if (cookies)
1682 				cookies[cookie_index] = bp->b_loffset + offset;
1683 			++cookie_index;
1684 			offset += dp->d_reclen;
1685 			if (cookie_index == ncookies)
1686 				break;
1687 		}
1688 
1689 		/*
1690 		 * This will align the next loop to the beginning of the
1691 		 * next block, and pickup will calculate to 0.
1692 		 */
1693 		uio->uio_offset = bp->b_loffset + offset;
1694 		brelse(bp);
1695 
1696 		if (retval || error || cookie_index == ncookies ||
1697 		    uio->uio_offset >= VTOI(vp)->i_size) {
1698 			break;
1699 		}
1700 	}
1701 	if (ap->a_eofflag)
1702 		*ap->a_eofflag = VTOI(vp)->i_size <= uio->uio_offset;
1703 
1704 	/*
1705 	 * Report errors only if we didn't manage to read anything
1706 	 */
1707 	if (error && cookie_index == 0) {
1708 		if (cookies) {
1709 			kfree(cookies, M_TEMP);
1710 			*ap->a_ncookies = 0;
1711 			*ap->a_cookies = NULL;
1712 		}
1713 	} else {
1714 		error = 0;
1715 		if (cookies) {
1716 			*ap->a_ncookies = cookie_index;
1717 			*ap->a_cookies = cookies;
1718 		}
1719 	}
1720 done:
1721 	vn_unlock(vp);
1722         return (error);
1723 }
1724 
1725 /*
1726  * Return target name of a symbolic link
1727  *
1728  * ufs_readlink(struct vnode *a_vp, struct uio *a_uio, struct ucred *a_cred)
1729  */
1730 static
1731 int
1732 ufs_readlink(struct vop_readlink_args *ap)
1733 {
1734 	struct vnode *vp = ap->a_vp;
1735 	struct inode *ip = VTOI(vp);
1736 	int isize;
1737 
1738 	isize = ip->i_size;
1739 	if ((isize < vp->v_mount->mnt_maxsymlinklen) ||
1740 	    (ip->i_din.di_blocks == 0)) {   /* XXX - for old fastlink support */
1741 		uiomove((char *)ip->i_shortlink, isize, ap->a_uio);
1742 		return (0);
1743 	}
1744 
1745 	/*
1746 	 * Perform the equivalent of an OPEN on vp so we can issue a
1747 	 * VOP_READ.
1748 	 */
1749 	return (VOP_READ(vp, ap->a_uio, 0, ap->a_cred));
1750 }
1751 
1752 /*
1753  * Calculate the logical to physical mapping if not done already,
1754  * then call the device strategy routine.
1755  *
1756  * In order to be able to swap to a file, the VOP_BMAP operation may not
1757  * deadlock on memory.  See ufs_bmap() for details.
1758  *
1759  * ufs_strategy(struct vnode *a_vp, struct bio *a_bio)
1760  */
1761 static
1762 int
1763 ufs_strategy(struct vop_strategy_args *ap)
1764 {
1765 	struct bio *bio = ap->a_bio;
1766 	struct bio *nbio;
1767 	struct buf *bp = bio->bio_buf;
1768 	struct vnode *vp = ap->a_vp;
1769 	struct inode *ip;
1770 	int error;
1771 
1772 	ip = VTOI(vp);
1773 	if (vp->v_type == VBLK || vp->v_type == VCHR)
1774 		panic("ufs_strategy: spec");
1775 	nbio = push_bio(bio);
1776 	if (nbio->bio_offset == NOOFFSET) {
1777 		error = VOP_BMAP(vp, bio->bio_offset, &nbio->bio_offset,
1778 				 NULL, NULL, bp->b_cmd);
1779 		if (error) {
1780 			bp->b_error = error;
1781 			bp->b_flags |= B_ERROR;
1782 			/* I/O was never started on nbio, must biodone(bio) */
1783 			biodone(bio);
1784 			return (error);
1785 		}
1786 		if (nbio->bio_offset == NOOFFSET)
1787 			vfs_bio_clrbuf(bp);
1788 	}
1789 	if (nbio->bio_offset == NOOFFSET) {
1790 		/*
1791 		 * We hit a hole in the file.  The buffer has been zero-filled
1792 		 * so just biodone() it.
1793 		 */
1794 		biodone(bio);
1795 	} else {
1796 		vn_strategy(ip->i_devvp, nbio);
1797 	}
1798 	return (0);
1799 }
1800 
1801 /*
1802  * Print out the contents of an inode.
1803  *
1804  * ufs_print(struct vnode *a_vp)
1805  */
1806 static
1807 int
1808 ufs_print(struct vop_print_args *ap)
1809 {
1810 	struct vnode *vp = ap->a_vp;
1811 	struct inode *ip = VTOI(vp);
1812 
1813 	kprintf("tag VT_UFS, ino %lu, on dev %s (%d, %d)",
1814 	    (u_long)ip->i_number, devtoname(ip->i_dev), major(ip->i_dev),
1815 	    minor(ip->i_dev));
1816 	if (vp->v_type == VFIFO)
1817 		fifo_printinfo(vp);
1818 	lockmgr_printinfo(&vp->v_lock);
1819 	kprintf("\n");
1820 	return (0);
1821 }
1822 
1823 /*
1824  * Read wrapper for fifos.
1825  *
1826  * ufsfifo_read(struct vnode *a_vp, struct uio *a_uio, int a_ioflag,
1827  *		struct ucred *a_cred)
1828  */
1829 static
1830 int
1831 ufsfifo_read(struct vop_read_args *ap)
1832 {
1833 	int error, resid;
1834 	struct inode *ip;
1835 	struct uio *uio;
1836 
1837 	uio = ap->a_uio;
1838 	resid = uio->uio_resid;
1839 	error = VOCALL(&fifo_vnode_vops, &ap->a_head);
1840 	ip = VTOI(ap->a_vp);
1841 	if ((ap->a_vp->v_mount->mnt_flag & MNT_NOATIME) == 0 && ip != NULL &&
1842 	    (uio->uio_resid != resid || (error == 0 && resid != 0)))
1843 		VTOI(ap->a_vp)->i_flag |= IN_ACCESS;
1844 	return (error);
1845 }
1846 
1847 /*
1848  * Write wrapper for fifos.
1849  *
1850  * ufsfifo_write(struct vnode *a_vp, struct uio *a_uio, int a_ioflag,
1851  *		 struct ucred *a_cred)
1852  */
1853 static
1854 int
1855 ufsfifo_write(struct vop_write_args *ap)
1856 {
1857 	int error, resid;
1858 	struct inode *ip;
1859 	struct uio *uio;
1860 
1861 	uio = ap->a_uio;
1862 	resid = uio->uio_resid;
1863 	error = VOCALL(&fifo_vnode_vops, &ap->a_head);
1864 	ip = VTOI(ap->a_vp);
1865 	if (ip != NULL && (uio->uio_resid != resid || (error == 0 && resid != 0)))
1866 		VTOI(ap->a_vp)->i_flag |= IN_CHANGE | IN_UPDATE;
1867 	return (error);
1868 }
1869 
1870 /*
1871  * Close wrapper for fifos.
1872  *
1873  * Update the times on the inode then do device close.
1874  *
1875  * ufsfifo_close(struct vnode *a_vp, int a_fflag)
1876  */
1877 static
1878 int
1879 ufsfifo_close(struct vop_close_args *ap)
1880 {
1881 	struct vnode *vp = ap->a_vp;
1882 
1883 	if (vp->v_sysref.refcnt > 1)
1884 		ufs_itimes(vp);
1885 	return (VOCALL(&fifo_vnode_vops, &ap->a_head));
1886 }
1887 
1888 /*
1889  * Kqfilter wrapper for fifos.
1890  *
1891  * Fall through to ufs kqfilter routines if needed
1892  */
1893 static
1894 int
1895 ufsfifo_kqfilter(struct vop_kqfilter_args *ap)
1896 {
1897 	int error;
1898 
1899 	error = VOCALL(&fifo_vnode_vops, &ap->a_head);
1900 	if (error)
1901 		error = ufs_kqfilter(ap);
1902 	return (error);
1903 }
1904 
1905 /*
1906  * Advisory record locking support
1907  *
1908  * ufs_advlock(struct vnode *a_vp, caddr_t a_id, int a_op, struct flock *a_fl,
1909  *	       int a_flags)
1910  */
1911 static
1912 int
1913 ufs_advlock(struct vop_advlock_args *ap)
1914 {
1915 	struct inode *ip = VTOI(ap->a_vp);
1916 
1917 	return (lf_advlock(ap, &(ip->i_lockf), ip->i_size));
1918 }
1919 
1920 /*
1921  * Initialize the vnode associated with a new inode, handle aliased
1922  * vnodes.
1923  *
1924  * Make sure directories have their VM object now rather then later,
1925  * saving us from having to check on all the myrid directory VOPs
1926  * that might be executed without a VOP_OPEN being performed.
1927  */
1928 int
1929 ufs_vinit(struct mount *mntp, struct vnode **vpp)
1930 {
1931 	struct inode *ip;
1932 	struct vnode *vp;
1933 	struct timeval tv;
1934 
1935 	vp = *vpp;
1936 	ip = VTOI(vp);
1937 
1938 	vp->v_type = IFTOVT(ip->i_mode);
1939 
1940 	switch(vp->v_type) {
1941 	case VCHR:
1942 	case VBLK:
1943 		vp->v_ops = &mntp->mnt_vn_spec_ops;
1944 		addaliasu(vp, umajor(ip->i_rdev), uminor(ip->i_rdev));
1945 		break;
1946 	case VFIFO:
1947 		vp->v_ops = &mntp->mnt_vn_fifo_ops;
1948 		break;
1949 	case VDIR:
1950 	case VREG:
1951 		vinitvmio(vp, ip->i_size,
1952 			  blkoffsize(ip->i_fs, ip, ip->i_size),
1953 			  blkoff(ip->i_fs, ip->i_size));
1954 		break;
1955 	case VLNK:
1956 		if (ip->i_size >= vp->v_mount->mnt_maxsymlinklen) {
1957 			vinitvmio(vp, ip->i_size,
1958 				  blkoffsize(ip->i_fs, ip, ip->i_size),
1959 				  blkoff(ip->i_fs, ip->i_size));
1960 		}
1961 		break;
1962 	default:
1963 		break;
1964 
1965 	}
1966 
1967 	if (ip->i_number == ROOTINO)
1968 		vsetflags(vp, VROOT);
1969 	/*
1970 	 * Initialize modrev times
1971 	 */
1972 	getmicrouptime(&tv);
1973 	SETHIGH(ip->i_modrev, tv.tv_sec);
1974 	SETLOW(ip->i_modrev, tv.tv_usec * 4294);
1975 	*vpp = vp;
1976 	return (0);
1977 }
1978 
1979 /*
1980  * Allocate a new inode.
1981  */
1982 static
1983 int
1984 ufs_makeinode(int mode, struct vnode *dvp, struct vnode **vpp,
1985 	      struct componentname *cnp)
1986 {
1987 	struct inode *ip, *pdir;
1988 	struct direct newdir;
1989 	struct vnode *tvp;
1990 	int error;
1991 
1992 	pdir = VTOI(dvp);
1993 	*vpp = NULL;
1994 	if ((mode & IFMT) == 0)
1995 		mode |= IFREG;
1996 
1997 	error = ffs_valloc(dvp, mode, cnp->cn_cred, &tvp);
1998 	if (error)
1999 		return (error);
2000 	ip = VTOI(tvp);
2001 	ip->i_flags = pdir->i_flags & (SF_NOHISTORY|UF_NOHISTORY|UF_NODUMP);
2002 	ip->i_gid = pdir->i_gid;
2003 #ifdef SUIDDIR
2004 	{
2005 #ifdef QUOTA
2006 		struct ucred ucred, *ucp;
2007 		ucp = cnp->cn_cred;
2008 #endif
2009 		/*
2010 		 * If we are not the owner of the directory,
2011 		 * and we are hacking owners here, (only do this where told to)
2012 		 * and we are not giving it TO root, (would subvert quotas)
2013 		 * then go ahead and give it to the other user.
2014 		 * Note that this drops off the execute bits for security.
2015 		 */
2016 		if ((dvp->v_mount->mnt_flag & MNT_SUIDDIR) &&
2017 		    (pdir->i_mode & ISUID) &&
2018 		    (pdir->i_uid != cnp->cn_cred->cr_uid) && pdir->i_uid) {
2019 			ip->i_uid = pdir->i_uid;
2020 			mode &= ~07111;
2021 #ifdef QUOTA
2022 			/*
2023 			 * Make sure the correct user gets charged
2024 			 * for the space.
2025 			 * Quickly knock up a dummy credential for the victim.
2026 			 * XXX This seems to never be accessed out of our
2027 			 * context so a stack variable is ok.
2028 			 */
2029 			ucred.cr_ref = 1;
2030 			ucred.cr_uid = ip->i_uid;
2031 			ucred.cr_ngroups = 1;
2032 			ucred.cr_groups[0] = pdir->i_gid;
2033 			ucp = &ucred;
2034 #endif
2035 		} else
2036 			ip->i_uid = cnp->cn_cred->cr_uid;
2037 
2038 #ifdef QUOTA
2039 		if ((error = ufs_getinoquota(ip)) ||
2040 	    	    (error = ufs_chkiq(ip, 1, ucp, 0))) {
2041 			ffs_vfree(tvp, ip->i_number, mode);
2042 			vput(tvp);
2043 			return (error);
2044 		}
2045 #endif
2046 	}
2047 #else	/* !SUIDDIR */
2048 	ip->i_uid = cnp->cn_cred->cr_uid;
2049 #ifdef QUOTA
2050 	if ((error = ufs_getinoquota(ip)) ||
2051 	    (error = ufs_chkiq(ip, 1, cnp->cn_cred, 0))) {
2052 		ffs_vfree(tvp, ip->i_number, mode);
2053 		vput(tvp);
2054 		return (error);
2055 	}
2056 #endif
2057 #endif	/* !SUIDDIR */
2058 	ip->i_din.di_spare[0] = 0;
2059 	ip->i_din.di_spare[1] = 0;
2060 	ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE;
2061 	ip->i_mode = mode;
2062 	tvp->v_type = IFTOVT(mode);	/* Rest init'd in getnewvnode(). */
2063 	ip->i_effnlink = 1;
2064 	ip->i_nlink = 1;
2065 	if (DOINGSOFTDEP(tvp))
2066 		softdep_change_linkcnt(ip);
2067 	if ((ip->i_mode & ISGID) && !groupmember(ip->i_gid, cnp->cn_cred) &&
2068 	    priv_check_cred(cnp->cn_cred, PRIV_VFS_SETGID, 0)) {
2069 		ip->i_mode &= ~ISGID;
2070 	}
2071 
2072 	if (cnp->cn_flags & CNP_ISWHITEOUT)
2073 		ip->i_flags |= UF_OPAQUE;
2074 
2075 	/*
2076 	 * Regular files and directories need VM objects.  Softlinks do
2077 	 * not (not immediately anyway).
2078 	 */
2079 	if (tvp->v_type == VREG || tvp->v_type == VDIR)
2080 		vinitvmio(tvp, 0, PAGE_SIZE, -1);
2081 
2082 	/*
2083 	 * Make sure inode goes to disk before directory entry.
2084 	 */
2085 	error = ffs_update(tvp, !(DOINGSOFTDEP(tvp) | DOINGASYNC(tvp)));
2086 	if (error)
2087 		goto bad;
2088 	ufs_makedirentry(ip, cnp, &newdir);
2089 	error = ufs_direnter(dvp, tvp, &newdir, cnp, NULL);
2090 	if (error)
2091 		goto bad;
2092 	*vpp = tvp;
2093 	return (0);
2094 
2095 bad:
2096 	/*
2097 	 * Write error occurred trying to update the inode
2098 	 * or the directory so must deallocate the inode.
2099 	 */
2100 	ip->i_effnlink = 0;
2101 	ip->i_nlink = 0;
2102 	ip->i_flag |= IN_CHANGE;
2103 	if (DOINGSOFTDEP(tvp))
2104 		softdep_change_linkcnt(ip);
2105 	vput(tvp);
2106 	return (error);
2107 }
2108 
2109 static int
2110 ufs_missingop(struct vop_generic_args *ap)
2111 {
2112 	panic("no vop function for %s in ufs child", ap->a_desc->sd_name);
2113 	return (EOPNOTSUPP);
2114 }
2115 
2116 static struct filterops ufsread_filtops =
2117 	{ FILTEROP_ISFD, NULL, filt_ufsdetach, filt_ufsread };
2118 static struct filterops ufswrite_filtops =
2119 	{ FILTEROP_ISFD, NULL, filt_ufsdetach, filt_ufswrite };
2120 static struct filterops ufsvnode_filtops =
2121 	{ FILTEROP_ISFD, NULL, filt_ufsdetach, filt_ufsvnode };
2122 
2123 /*
2124  * ufs_kqfilter(struct vnode *a_vp, struct knote *a_kn)
2125  */
2126 static int
2127 ufs_kqfilter(struct vop_kqfilter_args *ap)
2128 {
2129 	struct vnode *vp = ap->a_vp;
2130 	struct knote *kn = ap->a_kn;
2131 
2132 	switch (kn->kn_filter) {
2133 	case EVFILT_READ:
2134 		kn->kn_fop = &ufsread_filtops;
2135 		break;
2136 	case EVFILT_WRITE:
2137 		kn->kn_fop = &ufswrite_filtops;
2138 		break;
2139 	case EVFILT_VNODE:
2140 		kn->kn_fop = &ufsvnode_filtops;
2141 		break;
2142 	default:
2143 		return (EOPNOTSUPP);
2144 	}
2145 
2146 	kn->kn_hook = (caddr_t)vp;
2147 
2148 	/* XXX: kq token actually protects the list */
2149 	lwkt_gettoken(&vp->v_token);
2150 	knote_insert(&vp->v_pollinfo.vpi_kqinfo.ki_note, kn);
2151 	lwkt_reltoken(&vp->v_token);
2152 
2153 	return (0);
2154 }
2155 
2156 static void
2157 filt_ufsdetach(struct knote *kn)
2158 {
2159 	struct vnode *vp = (struct vnode *)kn->kn_hook;
2160 
2161 	lwkt_gettoken(&vp->v_token);
2162 	knote_remove(&vp->v_pollinfo.vpi_kqinfo.ki_note, kn);
2163 	lwkt_reltoken(&vp->v_token);
2164 }
2165 
2166 /*ARGSUSED*/
2167 static int
2168 filt_ufsread(struct knote *kn, long hint)
2169 {
2170 	struct vnode *vp = (struct vnode *)kn->kn_hook;
2171 	struct inode *ip = VTOI(vp);
2172 	off_t off;
2173 
2174 	/*
2175 	 * filesystem is gone, so set the EOF flag and schedule
2176 	 * the knote for deletion.
2177 	 */
2178 	if (hint == NOTE_REVOKE) {
2179 		kn->kn_flags |= (EV_EOF | EV_NODATA | EV_ONESHOT);
2180 		return (1);
2181 	}
2182 
2183 	off = ip->i_size - kn->kn_fp->f_offset;
2184 	kn->kn_data = (off < INTPTR_MAX) ? off : INTPTR_MAX;
2185 	if (kn->kn_sfflags & NOTE_OLDAPI)
2186 		return(1);
2187         return (kn->kn_data != 0);
2188 }
2189 
2190 /*ARGSUSED*/
2191 static int
2192 filt_ufswrite(struct knote *kn, long hint)
2193 {
2194 	/*
2195 	 * filesystem is gone, so set the EOF flag and schedule
2196 	 * the knote for deletion.
2197 	 */
2198 	if (hint == NOTE_REVOKE)
2199 		kn->kn_flags |= (EV_EOF | EV_NODATA | EV_ONESHOT);
2200 
2201         kn->kn_data = 0;
2202         return (1);
2203 }
2204 
2205 static int
2206 filt_ufsvnode(struct knote *kn, long hint)
2207 {
2208 	if (kn->kn_sfflags & hint)
2209 		kn->kn_fflags |= hint;
2210 	if (hint == NOTE_REVOKE) {
2211 		kn->kn_flags |= (EV_EOF | EV_NODATA);
2212 		return (1);
2213 	}
2214 	return (kn->kn_fflags != 0);
2215 }
2216 
2217 /* Global vfs data structures for ufs. */
2218 static struct vop_ops ufs_vnode_vops = {
2219 	.vop_default =		vop_defaultop,
2220 	.vop_fsync =		(void *)ufs_missingop,
2221 	.vop_read =		(void *)ufs_missingop,
2222 	.vop_reallocblks =	(void *)ufs_missingop,
2223 	.vop_write =		(void *)ufs_missingop,
2224 	.vop_access =		ufs_access,
2225 	.vop_advlock =		ufs_advlock,
2226 	.vop_bmap =		ufs_bmap,
2227 	.vop_old_lookup =	ufs_lookup,
2228 	.vop_close =		ufs_close,
2229 	.vop_old_create =	ufs_create,
2230 	.vop_getattr =		ufs_getattr,
2231 	.vop_inactive =		ufs_inactive,
2232 	.vop_old_link =		ufs_link,
2233 	.vop_old_mkdir =	ufs_mkdir,
2234 	.vop_old_mknod =	ufs_mknod,
2235 	.vop_mmap =		ufs_mmap,
2236 	.vop_open =		vop_stdopen,
2237 	.vop_pathconf =		vop_stdpathconf,
2238 	.vop_kqfilter =		ufs_kqfilter,
2239 	.vop_print =		ufs_print,
2240 	.vop_readdir =		ufs_readdir,
2241 	.vop_readlink =		ufs_readlink,
2242 	.vop_reclaim =		ufs_reclaim,
2243 	.vop_old_remove =	ufs_remove,
2244 	.vop_old_rename =	ufs_rename,
2245 	.vop_old_rmdir =	ufs_rmdir,
2246 	.vop_setattr =		ufs_setattr,
2247 	.vop_markatime =	ufs_markatime,
2248 	.vop_strategy =		ufs_strategy,
2249 	.vop_old_symlink =	ufs_symlink,
2250 	.vop_old_whiteout =	ufs_whiteout
2251 };
2252 
2253 static struct vop_ops ufs_spec_vops = {
2254 	.vop_default =		vop_defaultop,
2255 	.vop_fsync =		(void *)ufs_missingop,
2256 	.vop_access =		ufs_access,
2257 	.vop_close =		ufs_close,
2258 	.vop_getattr =		ufs_getattr,
2259 	.vop_inactive =		ufs_inactive,
2260 	.vop_print =		ufs_print,
2261 	.vop_read =		vop_stdnoread,
2262 	.vop_reclaim =		ufs_reclaim,
2263 	.vop_setattr =		ufs_setattr,
2264 	.vop_markatime =	ufs_markatime,
2265 	.vop_write =		vop_stdnowrite
2266 };
2267 
2268 static struct vop_ops ufs_fifo_vops = {
2269 	.vop_default =		fifo_vnoperate,
2270 	.vop_fsync =		(void *)ufs_missingop,
2271 	.vop_access =		ufs_access,
2272 	.vop_close =		ufsfifo_close,
2273 	.vop_getattr =		ufs_getattr,
2274 	.vop_inactive =		ufs_inactive,
2275 	.vop_kqfilter =		ufsfifo_kqfilter,
2276 	.vop_print =		ufs_print,
2277 	.vop_read =		ufsfifo_read,
2278 	.vop_reclaim =		ufs_reclaim,
2279 	.vop_setattr =		ufs_setattr,
2280 	.vop_markatime =	ufs_markatime,
2281 	.vop_write =		ufsfifo_write
2282 };
2283 
2284 VNODEOP_SET(ufs_vnode_vops);
2285 VNODEOP_SET(ufs_spec_vops);
2286 VNODEOP_SET(ufs_fifo_vops);
2287 
2288 /*
2289  * ufs_vnoperate()
2290  */
2291 int
2292 ufs_vnoperate(struct vop_generic_args *ap)
2293 {
2294 	return (VOCALL(&ufs_vnode_vops, ap));
2295 }
2296 
2297 /*
2298  * ufs_vnoperatefifo()
2299  */
2300 int
2301 ufs_vnoperatefifo(struct vop_generic_args *ap)
2302 {
2303 	return (VOCALL(&ufs_fifo_vops, ap));
2304 }
2305 
2306 /*
2307  * ufs_vnoperatespec()
2308  */
2309 int
2310 ufs_vnoperatespec(struct vop_generic_args *ap)
2311 {
2312 	return (VOCALL(&ufs_spec_vops, ap));
2313 }
2314