From owner-p4-projects@FreeBSD.ORG Fri Dec 28 14:24:23 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 37D8F16A41A; Fri, 28 Dec 2007 14:24:23 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DE85316A418 for ; Fri, 28 Dec 2007 14:24:22 +0000 (UTC) (envelope-from rdivacky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id BA6CF13C45D for ; Fri, 28 Dec 2007 14:24:22 +0000 (UTC) (envelope-from rdivacky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id lBSEOMof005465 for ; Fri, 28 Dec 2007 14:24:22 GMT (envelope-from rdivacky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id lBSEOMZG005462 for perforce@freebsd.org; Fri, 28 Dec 2007 14:24:22 GMT (envelope-from rdivacky@FreeBSD.org) Date: Fri, 28 Dec 2007 14:24:22 GMT Message-Id: <200712281424.lBSEOMZG005462@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to rdivacky@FreeBSD.org using -f From: Roman Divacky To: Perforce Change Reviews Cc: Subject: PERFORCE change 131878 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 28 Dec 2007 14:24:23 -0000 http://perforce.freebsd.org/chv.cgi?CH=131878 Change 131878 by rdivacky@rdivacky_witten on 2007/12/28 14:24:10 Implement the fd->vnode translation in the namei routine instead in the consumers. This is raceless and prefered method. Suggested by: jhb, kib Affected files ... .. //depot/projects/soc2007/rdivacky/linux_at/sys/compat/linprocfs/linprocfs.c#5 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/compat/pecoff/imgact_pecoff.c#4 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/fs/coda/coda_vfsops.c#3 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/fs/msdosfs/msdosfs_vfsops.c#7 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/fs/nullfs/null_vfsops.c#4 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/fs/unionfs/union_vfsops.c#3 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/kern_jail.c#4 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_acl.c#3 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_extattr.c#3 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_lookup.c#11 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_mount.c#7 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#54 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/security/mac/mac_syscalls.c#4 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/sys/namei.h#7 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/ufs/ffs/ffs_snapshot.c#4 edit Differences ... ==== //depot/projects/soc2007/rdivacky/linux_at/sys/compat/linprocfs/linprocfs.c#5 (text+ko) ==== @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include ==== //depot/projects/soc2007/rdivacky/linux_at/sys/compat/pecoff/imgact_pecoff.c#4 (text+ko) ==== @@ -45,6 +45,7 @@ #include #include +#include #include #include #include ==== //depot/projects/soc2007/rdivacky/linux_at/sys/fs/coda/coda_vfsops.c#3 (text+ko) ==== @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include ==== //depot/projects/soc2007/rdivacky/linux_at/sys/fs/msdosfs/msdosfs_vfsops.c#7 (text+ko) ==== @@ -52,6 +52,7 @@ #include #include #include +#include #include #include #include ==== //depot/projects/soc2007/rdivacky/linux_at/sys/fs/nullfs/null_vfsops.c#4 (text+ko) ==== @@ -42,6 +42,7 @@ #include #include +#include #include #include #include ==== //depot/projects/soc2007/rdivacky/linux_at/sys/fs/unionfs/union_vfsops.c#3 (text+ko) ==== @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include ==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/kern_jail.c#4 (text+ko) ==== @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include ==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_acl.c#3 (text+ko) ==== @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include ==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_extattr.c#3 (text+ko) ==== @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include ==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_lookup.c#11 (text+ko) ==== @@ -193,16 +193,43 @@ ndp->ni_rootdir = fdp->fd_rdir; ndp->ni_topdir = fdp->fd_jdir; - if (ndp->ni_startdir) - dp = ndp->ni_startdir; - else { + if (ndp->ni_dirfd != AT_FDCWD) { + struct vnode *dvp; + + error = fgetvp(td, ndp->ni_dirfd, &dvp); + /* XXX: should we check for relative path too? */ + if (error) { + FILEDESC_SUNLOCK(fdp); + uma_zfree(namei_zone, cnp->cn_pnbuf); +#ifdef DIAGNOSTIC + cnp->cn_pnbuf = NULL; + cnp->cn_nameptr = NULL; +#endif + return (error); + } + if (dvp->v_type != VDIR) { + vrele(dvp); + if (cnp->cn_pnbuf[0] != '/') { + FILEDESC_SUNLOCK(fdp); + uma_zfree(namei_zone, cnp->cn_pnbuf); +#ifdef DIAGNOSTIC + cnp->cn_pnbuf = NULL; + cnp->cn_nameptr = NULL; +#endif + return (ENOTDIR); + } else { + dvp = fdp->fd_cdir; + VREF(dvp); + } + } + dp = dvp; + } else { dp = fdp->fd_cdir; - /* we might have raced so check it */ - if ((cnp->cn_flags & ATBADF) && (cnp->cn_pnbuf[0] != '/')) - return (EBADF); } vfslocked = VFS_LOCK_GIANT(dp->v_mount); - VREF(dp); + /* the vnode for the other case was already referenced */ + if (ndp->ni_dirfd == AT_FDCWD) + VREF(dp); FILEDESC_SUNLOCK(fdp); for (;;) { /* @@ -1023,7 +1050,6 @@ char *ptr, *buf, *cp; size_t len, sz; int error; - struct vnode *dir_vn; buf = (char *) malloc(MAXPATHLEN, M_TEMP, M_WAITOK); *pathbuf = buf; @@ -1056,10 +1082,8 @@ goto keeporig; } - if (dirfd == AT_FDCWD) - dir_vn = NULL; - else { - /* + if (dirfd != AT_FDCWD) { + /* * we want the original because the "prefix" * is included in the already opened dirfd */ @@ -1067,7 +1091,6 @@ return (0); } - /* * We know that there is a / somewhere in this pathname. * Search backwards for it, to find the file's parent dir @@ -1080,13 +1103,13 @@ for (cp = &ptr[len] - 1; *cp != '/'; cp--); *cp = '\0'; - NDINIT_AT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, buf, td, dir_vn); + NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, buf, td); error = namei(&nd); *cp = '/'; if (error != 0) goto keeporig; } else { - NDINIT_AT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, buf, td, dir_vn); + NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, buf, td); error = namei(&nd); if (error != 0) ==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_mount.c#7 (text+ko) ==== @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include ==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#54 (text+ko) ==== @@ -85,10 +85,8 @@ static int setfflags(struct thread *td, struct vnode *, int); static int setutimes(struct thread *td, struct vnode *, const struct timespec *, int, int); -static int kern_get_at(struct thread *td, int dirfd, struct vnode **dvpp); static int vn_access(struct vnode *vp, int user_flags, struct ucred *cred, struct thread *td); -static int kern_absolute_path(const char *path, enum uio_seg pathseg); /* * The module initialization routine for POSIX asynchronous I/O will @@ -1018,53 +1016,11 @@ return (kern_openat(td, AT_FDCWD, (const char *)path, pathseg, flags, mode)); } -static int -kern_get_at(struct thread *td, int dirfd, struct vnode **dvpp) -{ - int error; - - if (dirfd == AT_FDCWD) - *dvpp = NULL; - else { - error = fgetvp(td, dirfd, dvpp); - if (error) { - *dvpp = NULL; - return (error); - } - if ((*dvpp)->v_type != VDIR) { - vrele(*dvpp); - *dvpp = NULL; - return (ENOTDIR); - } - if (VFS_NEEDSGIANT((*dvpp)->v_mount)) - mtx_lock(&Giant); - } - - return (0); -} - -/* Check whether a path is an absolute path. */ -static int kern_absolute_path(const char *path, enum uio_seg pathseg) -{ - int error; - char buf[1]; - - if (pathseg == UIO_SYSSPACE) { - return (path[0] == '/'); - } else { - error = copyin(path, buf, 1); - if (error) - return 0; /* We want to fail. */ - return (buf[0] == '/'); - } -} - int kern_openat(struct thread *td, int fd, const char *path, enum uio_seg pathseg, int flags, int mode) { struct nameidata nd; - struct vnode *dvp; struct proc *p = td->td_proc; struct filedesc *fdp = p->p_fd; struct file *fp; @@ -1081,12 +1037,8 @@ AUDIT_ARG(mode, mode); /* XXX: audit dirfd */ - error = kern_get_at(td, fd, &dvp); - if (error && !kern_absolute_path(path, pathseg)) - return (error); - - NDINIT_AT(&nd, LOOKUP, ((error) ? ATBADF : 0) | FOLLOW | AUDITVNODE1 | - MPSAFE, pathseg, path, td, dvp); + NDINIT_AT(&nd, LOOKUP, 0 | FOLLOW | AUDITVNODE1 | + MPSAFE, pathseg, path, td, fd); if ((flags & O_ACCMODE) == O_ACCMODE) { error = EINVAL; @@ -1198,21 +1150,11 @@ td->td_retval[0] = indx; return (0); out: - if (dvp) { - vfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(vfslocked); - } return (error); bad: VFS_UNLOCK_GIANT(vfslocked); fdclose(fdp, fp, indx, td); fdrop(fp, td); - if (dvp) { - vfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(vfslocked); - } return (error); } @@ -1288,13 +1230,13 @@ kern_mknodat(struct thread *td, int fd, const char *path, enum uio_seg pathseg, int mode, int dev) { - struct vnode *vp, *dvp = NULL; + struct vnode *vp; struct mount *mp; struct vattr vattr; int error; int whiteout = 0; struct nameidata nd; - int vfslocked, dvfslocked; + int vfslocked; AUDIT_ARG(mode, mode); AUDIT_ARG(dev, dev); @@ -1317,25 +1259,10 @@ return (error); bwillwrite(); restart: - if (dvp) { - dvfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(dvfslocked); - bwillwrite(); - } - error = kern_get_at(td, fd, &dvp); - if (error && !kern_absolute_path(path, pathseg)) + NDINIT_AT(&nd, CREATE, 0 | LOCKPARENT | + SAVENAME | MPSAFE | AUDITVNODE1, pathseg, path, td, fd); + if ((error = namei(&nd)) != 0) return (error); - NDINIT_AT(&nd, CREATE, ((error) ? ATBADF : 0) | LOCKPARENT | - SAVENAME | MPSAFE | AUDITVNODE1, pathseg, path, td, dvp); - if ((error = namei(&nd)) != 0) { - if (dvp) { - dvfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(dvfslocked); - } - return (error); - } vfslocked = NDHASGIANT(&nd); vp = nd.ni_vp; if (vp != NULL) { @@ -1346,11 +1273,6 @@ vput(nd.ni_dvp); vrele(vp); VFS_UNLOCK_GIANT(vfslocked); - if (dvp) { - dvfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(dvfslocked); - } return (EEXIST); } else { VATTR_NULL(&vattr); @@ -1382,14 +1304,8 @@ NDFREE(&nd, NDF_ONLY_PNBUF); vput(nd.ni_dvp); VFS_UNLOCK_GIANT(vfslocked); - if ((error = vn_start_write(NULL, &mp, V_XSLEEP | PCATCH)) != 0) { - if (dvp) { - dvfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(dvfslocked); - } + if ((error = vn_start_write(NULL, &mp, V_XSLEEP | PCATCH)) != 0) return (error); - } goto restart; } #ifdef MAC @@ -1408,11 +1324,6 @@ vput(nd.ni_vp); } } - if (dvp) { - dvfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(dvfslocked); - } NDFREE(&nd, NDF_ONLY_PNBUF); vput(nd.ni_dvp); vn_finished_write(mp); @@ -1468,31 +1379,15 @@ struct vattr vattr; int error; struct nameidata nd; - int vfslocked, dvfslocked; - struct vnode *dvp = NULL; + int vfslocked; AUDIT_ARG(mode, mode); bwillwrite(); restart: - if (dvp) { - dvfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(dvfslocked); - bwillwrite(); - } - error = kern_get_at(td, fd, &dvp); - if (error && !kern_absolute_path(path, pathseg)) + NDINIT_AT(&nd, CREATE, 0 | LOCKPARENT | + SAVENAME | MPSAFE | AUDITVNODE1, pathseg, path, td, fd); + if ((error = namei(&nd)) != 0) return (error); - NDINIT_AT(&nd, CREATE, ((error) ? ATBADF : 0) | LOCKPARENT | - SAVENAME | MPSAFE | AUDITVNODE1, pathseg, path, td, dvp); - if ((error = namei(&nd)) != 0) { - if (dvp) { - dvfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(dvfslocked); - } - return (error); - } vfslocked = NDHASGIANT(&nd); if (nd.ni_vp != NULL) { NDFREE(&nd, NDF_ONLY_PNBUF); @@ -1502,25 +1397,14 @@ vput(nd.ni_dvp); vrele(nd.ni_vp); VFS_UNLOCK_GIANT(vfslocked); - if (dvp) { - dvfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(dvfslocked); - } return (EEXIST); } if (vn_start_write(nd.ni_dvp, &mp, V_NOWAIT) != 0) { NDFREE(&nd, NDF_ONLY_PNBUF); vput(nd.ni_dvp); VFS_UNLOCK_GIANT(vfslocked); - if ((error = vn_start_write(NULL, &mp, V_XSLEEP | PCATCH)) != 0) { - if (dvp) { - dvfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(dvfslocked); - } + if ((error = vn_start_write(NULL, &mp, V_XSLEEP | PCATCH)) != 0) return (error); - } goto restart; } VATTR_NULL(&vattr); @@ -1541,11 +1425,6 @@ #ifdef MAC out: #endif - if (dvp) { - dvfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(dvfslocked); - } vput(nd.ni_dvp); vn_finished_write(mp); VFS_UNLOCK_GIANT(vfslocked); @@ -1654,7 +1533,6 @@ enum uio_seg segflg, int follow) { struct nameidata nd; - struct vnode *pdvp = NULL, *ldvp = NULL; struct vnode *vp; struct mount *mp; int vfslocked; @@ -1662,22 +1540,8 @@ int error; bwillwrite(); - error = kern_get_at(td, fd1, &pdvp); - if (error && !kern_absolute_path(path1, segflg)) - return (error); - - NDINIT_AT(&nd, LOOKUP, ((error) ? ATBADF : 0) | follow | MPSAFE | - AUDITVNODE1, segflg, path1, td, pdvp); - - error = kern_get_at(td, fd2, &ldvp); - if (error && !kern_absolute_path(path2, segflg)) { - if (pdvp) { - vfslocked = VFS_NEEDSGIANT(pdvp->v_mount); - vrele(pdvp); - VFS_UNLOCK_GIANT(vfslocked); - } - return (error); - } + NDINIT_AT(&nd, LOOKUP, 0 | follow | MPSAFE | + AUDITVNODE1, segflg, path1, td, fd1); if ((error = namei(&nd)) != 0) goto out; @@ -1695,8 +1559,8 @@ VFS_UNLOCK_GIANT(vfslocked); goto out; } - NDINIT_AT(&nd, CREATE, ((error) ? ATBADF : 0) | LOCKPARENT | - SAVENAME | MPSAFE | AUDITVNODE1, segflg, path2, td, ldvp); + NDINIT_AT(&nd, CREATE, 0 | LOCKPARENT | + SAVENAME | MPSAFE | AUDITVNODE1, segflg, path2, td, fd2); if ((error = namei(&nd)) == 0) { lvfslocked = NDHASGIANT(&nd); if (nd.ni_vp != NULL) { @@ -1729,16 +1593,6 @@ VFS_UNLOCK_GIANT(vfslocked); out: - if (pdvp) { - vfslocked = VFS_NEEDSGIANT(pdvp->v_mount); - vrele(pdvp); - VFS_UNLOCK_GIANT(vfslocked); - } - if (ldvp) { - vfslocked = VFS_NEEDSGIANT(ldvp->v_mount); - vrele(ldvp); - VFS_UNLOCK_GIANT(vfslocked); - } return (error); } @@ -1792,8 +1646,7 @@ char *syspath; int error; struct nameidata nd; - int vfslocked, dvfslocked; - struct vnode *dvp = NULL; + int vfslocked; if (segflg == UIO_SYSSPACE) { syspath = __DECONST(char *, path1); @@ -1805,17 +1658,8 @@ AUDIT_ARG(text, syspath); bwillwrite(); restart: - if (dvp) { - dvfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(dvfslocked); - bwillwrite(); - } - error = kern_get_at(td, fd, &dvp); - if (error && !kern_absolute_path(path2, segflg)) - return (error); - NDINIT_AT(&nd, CREATE, ((error) ? ATBADF : 0) | LOCKPARENT | - SAVENAME | MPSAFE | AUDITVNODE1, segflg, path2, td, dvp); + NDINIT_AT(&nd, CREATE, 0 | LOCKPARENT | + SAVENAME | MPSAFE | AUDITVNODE1, segflg, path2, td, fd); if ((error = namei(&nd)) != 0) goto out; vfslocked = NDHASGIANT(&nd); @@ -1861,11 +1705,6 @@ vn_finished_write(mp); VFS_UNLOCK_GIANT(vfslocked); out: - if (dvp) { - dvfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(dvfslocked); - } if (segflg != UIO_SYSSPACE) uma_zfree(namei_zone, syspath); return (error); @@ -1977,32 +1816,17 @@ kern_unlinkat(struct thread *td, int fd, const char *path, enum uio_seg pathseg) { struct mount *mp; - struct vnode *vp, *dvp = NULL; + struct vnode *vp; int error; struct nameidata nd; - int vfslocked, dvfslocked; + int vfslocked; bwillwrite(); restart: - if (dvp) { - dvfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(dvfslocked); - bwillwrite(); - } - error = kern_get_at(td, fd, &dvp); - if (error && !kern_absolute_path(path, pathseg)) - return (error); - NDINIT_AT(&nd, DELETE, ((error) ? ATBADF : 0) | LOCKPARENT | - LOCKLEAF | MPSAFE | AUDITVNODE1, pathseg, path, td, dvp); - if ((error = namei(&nd)) != 0) { - if (dvp) { - dvfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(dvfslocked); - } + NDINIT_AT(&nd, DELETE, 0 | LOCKPARENT | + LOCKLEAF | MPSAFE | AUDITVNODE1, pathseg, path, td, fd); + if ((error = namei(&nd)) != 0) return (error == EINVAL ? EPERM : error); - } vfslocked = NDHASGIANT(&nd); vp = nd.ni_vp; if (vp->v_type == VDIR) @@ -2026,14 +1850,8 @@ vput(vp); VFS_UNLOCK_GIANT(vfslocked); if ((error = vn_start_write(NULL, &mp, - V_XSLEEP | PCATCH)) != 0) { - if (dvp) { - dvfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(dvfslocked); - } + V_XSLEEP | PCATCH)) != 0) return (error); - } goto restart; } #ifdef MAC @@ -2051,11 +1869,6 @@ } NDFREE(&nd, NDF_ONLY_PNBUF); vput(nd.ni_dvp); - if (dvp) { - dvfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(dvfslocked); - } if (vp == nd.ni_dvp) vrele(vp); else @@ -2279,19 +2092,14 @@ int flags) { struct nameidata nd; - struct vnode *dvp; struct ucred *cred, *tmpcred; struct vnode *vp; int vfslocked; int error; - error = kern_get_at(td, fd, &dvp); - if (error && !kern_absolute_path(path, pathseg)) - return (error); + NDINIT_AT(&nd, LOOKUP, 0 | FOLLOW | LOCKLEAF | + MPSAFE | AUDITVNODE1, pathseg, path, td, fd); - NDINIT_AT(&nd, LOOKUP, ((error) ? ATBADF : 0) | FOLLOW | LOCKLEAF | - MPSAFE | AUDITVNODE1, pathseg, path, td, dvp); - /* * Create and modify a temporary credential instead of one that * is potentially shared. This could also mess up socket @@ -2319,11 +2127,6 @@ out: td->td_ucred = cred; crfree(tmpcred); - if (dvp) { - vfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(vfslocked); - } return (error); } @@ -2520,16 +2323,11 @@ struct stat *sbp) { struct nameidata nd; - struct vnode *dvp; struct stat sb; int error, vfslocked; - error = kern_get_at(td, fd, &dvp); - if (error && !kern_absolute_path(path, pathseg)) - return (error); - - NDINIT_AT(&nd, LOOKUP, ((error) ? ATBADF : 0) | FOLLOW | LOCKSHARED | - LOCKLEAF | AUDITVNODE1 | MPSAFE, pathseg, path, td, dvp); + NDINIT_AT(&nd, LOOKUP, 0 | FOLLOW | LOCKSHARED | + LOCKLEAF | AUDITVNODE1 | MPSAFE, pathseg, path, td, fd); if ((error = namei(&nd)) != 0) goto out; @@ -2543,11 +2341,6 @@ if (error == 0) *sbp = sb; out: - if (dvp) { - vfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(vfslocked); - } return (error); } @@ -2588,17 +2381,12 @@ struct stat *sbp) { struct nameidata nd; - struct vnode *dvp; struct vnode *vp; struct stat sb; int error, vfslocked; - error = kern_get_at(td, fd, &dvp); - if (error && !kern_absolute_path(path, pathseg)) - return (error); - - NDINIT_AT(&nd, LOOKUP, ((error) ? ATBADF : 0) | NOFOLLOW | LOCKLEAF | - LOCKSHARED | MPSAFE | AUDITVNODE1, pathseg, path, td, dvp); + NDINIT_AT(&nd, LOOKUP, 0 | NOFOLLOW | LOCKLEAF | + LOCKSHARED | MPSAFE | AUDITVNODE1, pathseg, path, td, fd); if ((error = namei(&nd)) != 0) goto out; vfslocked = NDHASGIANT(&nd); @@ -2610,11 +2398,6 @@ if (error == 0) *sbp = sb; out: - if (dvp) { - vfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(vfslocked); - } return (error); } @@ -2795,18 +2578,13 @@ char *buf, enum uio_seg bufseg, int count) { struct nameidata nd; - struct vnode *dvp; struct vnode *vp; struct iovec aiov; struct uio auio; int error, vfslocked; - error = kern_get_at(td, fd, &dvp); - if (error && !kern_absolute_path(path, pathseg)) - return (error); - - NDINIT_AT(&nd, LOOKUP, ((error) ? ATBADF : 0) | NOFOLLOW | LOCKLEAF | - MPSAFE | AUDITVNODE1, pathseg, path, td, dvp); + NDINIT_AT(&nd, LOOKUP, 0 | NOFOLLOW | LOCKLEAF | + MPSAFE | AUDITVNODE1, pathseg, path, td, fd); if ((error = namei(&nd)) != 0) goto out; @@ -2839,11 +2617,6 @@ VFS_UNLOCK_GIANT(vfslocked); td->td_retval[0] = count - auio.uio_resid; out: - if (dvp) { - vfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(vfslocked); - } return (error); } @@ -3074,16 +2847,11 @@ mode_t mode) { struct nameidata nd; - struct vnode *dvp; int error, vfslocked; - error = kern_get_at(td, fd, &dvp); - if (error && !kern_absolute_path(path, pathseg)) - return (error); + NDINIT_AT(&nd, LOOKUP, 0 | FOLLOW | MPSAFE | + AUDITVNODE1, pathseg, path, td, fd); - NDINIT_AT(&nd, LOOKUP, ((error) ? ATBADF : 0) | FOLLOW | MPSAFE | - AUDITVNODE1, pathseg, path, td, dvp); - if ((error = namei(&nd)) != 0) goto out; vfslocked = NDHASGIANT(&nd); @@ -3092,11 +2860,6 @@ vrele(nd.ni_vp); VFS_UNLOCK_GIANT(vfslocked); out: - if (dvp) { - vfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(vfslocked); - } return (error); } @@ -3128,15 +2891,10 @@ int error; struct nameidata nd; int vfslocked; - struct vnode *dvp; - error = kern_get_at(td, fd, &dvp); - if (error && !kern_absolute_path(path, pathseg)) - return (error); - AUDIT_ARG(mode, mode); NDINIT_AT(&nd, LOOKUP, NOFOLLOW | MPSAFE | AUDITVNODE1, pathseg, - path, td, dvp); + path, td, fd); if ((error = namei(&nd)) != 0) goto out; vfslocked = NDHASGIANT(&nd); @@ -3145,12 +2903,6 @@ vrele(nd.ni_vp); VFS_UNLOCK_GIANT(vfslocked); out: - if (dvp) { - vfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(vfslocked); - } - return (error); } @@ -3278,15 +3030,10 @@ int uid, int gid) { struct nameidata nd; - struct vnode *dvp; int error, vfslocked; - error = kern_get_at(td, fd, &dvp); - if (error && !kern_absolute_path(path, pathseg)) - return (error); - - NDINIT_AT(&nd, LOOKUP, ((error) ? ATBADF : 0) | FOLLOW | MPSAFE | - AUDITVNODE1, pathseg, path, td, dvp); + NDINIT_AT(&nd, LOOKUP, 0 | FOLLOW | MPSAFE | + AUDITVNODE1, pathseg, path, td, fd); if ((error = namei(&nd)) != 0) goto out; @@ -3296,11 +3043,6 @@ vrele(nd.ni_vp); VFS_UNLOCK_GIANT(vfslocked); out: - if (dvp) { - vfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(vfslocked); - } return (error); } @@ -3339,16 +3081,11 @@ int uid, int gid) { struct nameidata nd; - struct vnode *dvp; int error, vfslocked; - error = kern_get_at(td, fd, &dvp); - if (error && !kern_absolute_path(path, pathseg)) - return (error); + NDINIT_AT(&nd, LOOKUP, 0 | NOFOLLOW | MPSAFE | + AUDITVNODE1, pathseg, path, td, fd); - NDINIT_AT(&nd, LOOKUP, ((error) ? ATBADF : 0) | NOFOLLOW | MPSAFE | - AUDITVNODE1, pathseg, path, td, dvp); - if ((error = namei(&nd)) != 0) goto out; vfslocked = NDHASGIANT(&nd); @@ -3357,11 +3094,6 @@ vrele(nd.ni_vp); VFS_UNLOCK_GIANT(vfslocked); out: - if (dvp) { - vfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(vfslocked); - } return (error); } @@ -3526,17 +3258,12 @@ const struct timeval *tptr, enum uio_seg tptrseg) { struct nameidata nd; - struct vnode *dvp; struct timespec ts[2]; int error, vfslocked; - error = kern_get_at(td, fd, &dvp); - if (error && !kern_absolute_path(path, pathseg)) - return (error); + NDINIT_AT(&nd, LOOKUP, 0 | FOLLOW | MPSAFE | + AUDITVNODE1, pathseg, path, td, fd); - NDINIT_AT(&nd, LOOKUP, ((error) ? ATBADF : 0) | FOLLOW | MPSAFE | - AUDITVNODE1, pathseg, path, td, dvp); - if ((error = getutimes(tptr, tptrseg, ts)) != 0) goto out; if ((error = namei(&nd)) != 0) @@ -3547,11 +3274,6 @@ vrele(nd.ni_vp); VFS_UNLOCK_GIANT(vfslocked); out: - if (dvp) { - vfslocked = VFS_NEEDSGIANT(dvp->v_mount); - vrele(dvp); - VFS_UNLOCK_GIANT(vfslocked); - } return (error); } @@ -3947,7 +3669,6 @@ const char *new, enum uio_seg pathseg) { struct nameidata fromnd, tond; - struct vnode *frdvp = NULL, *todvp = NULL; struct mount *mp = NULL; struct vnode *tvp, *fvp, *tdvp; int tvfslocked; @@ -3955,30 +3676,17 @@ int error; bwillwrite(); - error = kern_get_at(td, oldfd, &frdvp); - if (error && !kern_absolute_path(old, pathseg)) - return (error); - - error = kern_get_at(td, newfd, &todvp); - if (error && !kern_absolute_path(new, pathseg)) { - if (frdvp) { - fvfslocked = VFS_NEEDSGIANT(frdvp->v_mount); - vrele(frdvp); - VFS_UNLOCK_GIANT(fvfslocked); - } - return (error); - } #ifdef MAC - NDINIT_AT(&fromnd, DELETE, ((error) ? ATBADF : 0) | LOCKPARENT | - LOCKLEAF | SAVESTART | MPSAFE | AUDITVNODE1, pathseg, old, td, frdvp); + NDINIT_AT(&fromnd, DELETE, 0 | LOCKPARENT | + LOCKLEAF | SAVESTART | MPSAFE | AUDITVNODE1, pathseg, old, td, oldfd); #else - NDINIT_AT(&fromnd, DELETE, ((error) ? ATBADF : 0) | WANTPARENT | - SAVESTART | MPSAFE | AUDITVNODE1, pathseg, old, td, frdvp); + NDINIT_AT(&fromnd, DELETE, 0 | WANTPARENT | + SAVESTART | MPSAFE | AUDITVNODE1, pathseg, old, td, oldfd); #endif - NDINIT_AT(&tond, RENAME, ((error) ? ATBADF : 0) | LOCKPARENT | + NDINIT_AT(&tond, RENAME, 0 | LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART | MPSAFE | AUDITVNODE2, - pathseg, new, td, todvp); + pathseg, new, td, newfd); if ((error = namei(&fromnd)) != 0) goto out2; @@ -4071,16 +3779,6 @@ VFS_UNLOCK_GIANT(tvfslocked); >>> TRUNCATED FOR MAIL (1000 lines) <<<