diff --git a/sys/coda/coda_vnops.c b/sys/coda/coda_vnops.c index 33123b168119..6fbd425ab4b1 100644 --- a/sys/coda/coda_vnops.c +++ b/sys/coda/coda_vnops.c @@ -6,7 +6,7 @@ mkdir rmdir symlink */ -/* $NetBSD: coda_vnops.c,v 1.25 2001/07/03 06:46:52 chs Exp $ */ +/* $NetBSD: coda_vnops.c,v 1.26 2001/07/24 15:39:30 assar Exp $ */ /* * @@ -1654,21 +1654,6 @@ coda_symlink(v) *ap->a_vpp = nd.ni_vp; } - /* - * Okay, now we have to drop locks on dvp. vpp is unlocked, but - * ref'd. It doesn't matter what happens in either symlink or - * lookup. Furthermore, there isn't any way for (dvp == *vpp), so - * we don't bother checking. - */ -/* vput(ap->a_dvp); released earlier */ - if (*ap->a_vpp) { - VOP_UNLOCK(*ap->a_vpp, 0); /* this line is new!! It is necessary because lookup() calls - VOP_LOOKUP (coda_lookup) which returns vpp locked. cfs_nb_lookup - merged with coda_lookup() to become coda_lookup so UNLOCK is - necessary */ - vrele(*ap->a_vpp); - } - /* * Free the name buffer */ diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 4825e88b36c5..2e408327cef5 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_syscalls.c,v 1.167 2001/06/28 08:04:18 jdolecek Exp $ */ +/* $NetBSD: vfs_syscalls.c,v 1.168 2001/07/24 15:39:31 assar Exp $ */ /* * Copyright (c) 1989, 1993 @@ -1381,6 +1381,8 @@ sys_mknod(p, v, retval) } else { error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr); + if (error == 0) + vput(nd.ni_vp); } } else { VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd); @@ -1428,7 +1430,10 @@ sys_mkfifo(p, v, retval) vattr.va_type = VFIFO; vattr.va_mode = (SCARG(uap, mode) & ALLPERMS) &~ p->p_cwdi->cwdi_cmask; VOP_LEASE(nd.ni_dvp, p, p->p_ucred, LEASE_WRITE); - return (VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr)); + error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr); + if (error == 0) + vput(nd.ni_vp); + return (error); } /* @@ -1514,6 +1519,8 @@ sys_symlink(p, v, retval) vattr.va_mode = ACCESSPERMS &~ p->p_cwdi->cwdi_cmask; VOP_LEASE(nd.ni_dvp, p, p->p_ucred, LEASE_WRITE); error = VOP_SYMLINK(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr, path); + if (error == 0) + vput(nd.ni_vp); out: PNBUF_PUT(path); return (error); diff --git a/sys/kern/vnode_if.c b/sys/kern/vnode_if.c index 5cf9b1f582f1..4fc2d9335b13 100644 --- a/sys/kern/vnode_if.c +++ b/sys/kern/vnode_if.c @@ -1,4 +1,4 @@ -/* $NetBSD: vnode_if.c,v 1.36 2001/05/26 21:34:04 chs Exp $ */ +/* $NetBSD: vnode_if.c,v 1.37 2001/07/24 15:39:31 assar Exp $ */ /* * Warning: This file is generated automatically. @@ -198,7 +198,7 @@ const int vop_mknod_vp_offsets[] = { const struct vnodeop_desc vop_mknod_desc = { 5, "vop_mknod", - 0 | VDESC_VP0_WILLPUT | VDESC_VPP_WILLRELE, + 0 | VDESC_VP0_WILLPUT, vop_mknod_vp_offsets, VOPARG_OFFSETOF(struct vop_mknod_args, a_vpp), VDESC_NO_OFFSET, @@ -868,7 +868,7 @@ const int vop_symlink_vp_offsets[] = { const struct vnodeop_desc vop_symlink_desc = { 25, "vop_symlink", - 0 | VDESC_VP0_WILLPUT | VDESC_VPP_WILLRELE, + 0 | VDESC_VP0_WILLPUT, vop_symlink_vp_offsets, VOPARG_OFFSETOF(struct vop_symlink_args, a_vpp), VDESC_NO_OFFSET, diff --git a/sys/kern/vnode_if.src b/sys/kern/vnode_if.src index 9f3e4740c1e4..496bc976a15b 100644 --- a/sys/kern/vnode_if.src +++ b/sys/kern/vnode_if.src @@ -1,4 +1,4 @@ -# $NetBSD: vnode_if.src,v 1.28 2001/05/26 21:33:11 chs Exp $ +# $NetBSD: vnode_if.src,v 1.29 2001/07/24 15:39:31 assar Exp $ # # Copyright (c) 1992, 1993 # The Regents of the University of California. All rights reserved. @@ -113,13 +113,13 @@ vop_create { # #% mknod dvp L U U -#% mknod vpp - X - +#% mknod vpp - L - # #! mknod cnp CREATE, LOCKPARENT # vop_mknod { IN WILLPUT struct vnode *dvp; - OUT WILLRELE struct vnode **vpp; + OUT struct vnode **vpp; IN struct componentname *cnp; IN struct vattr *vap; }; @@ -338,17 +338,13 @@ vop_rmdir { # #% symlink dvp L U U -#% symlink vpp - U - +#% symlink vpp - L - # #! symlink cnp CREATE, LOCKPARENT # -# XXX - note that the return vnode has already been VRELE'ed -# by the filesystem layer. To use it you must use vget, -# possibly with a further namei. -# vop_symlink { IN WILLPUT struct vnode *dvp; - OUT WILLRELE struct vnode **vpp; + OUT struct vnode **vpp; IN struct componentname *cnp; IN struct vattr *vap; IN char *target; diff --git a/sys/lkm/netinet/if_ipl/mln_ipl.c b/sys/lkm/netinet/if_ipl/mln_ipl.c index c008743c4446..c840fbd69939 100644 --- a/sys/lkm/netinet/if_ipl/mln_ipl.c +++ b/sys/lkm/netinet/if_ipl/mln_ipl.c @@ -1,4 +1,4 @@ -/* $NetBSD: mln_ipl.c,v 1.24 2001/02/05 10:42:42 chs Exp $ */ +/* $NetBSD: mln_ipl.c,v 1.25 2001/07/24 15:39:32 assar Exp $ */ /* * Copyright (C) 1993-2000 by Darren Reed. @@ -253,6 +253,7 @@ static int ipl_load() error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr); if (error) return error; + vput(nd.ni_vp); } return error; } diff --git a/sys/miscfs/genfs/layer_vnops.c b/sys/miscfs/genfs/layer_vnops.c index a9fda71a1ebc..733c2aeac9da 100644 --- a/sys/miscfs/genfs/layer_vnops.c +++ b/sys/miscfs/genfs/layer_vnops.c @@ -1,4 +1,4 @@ -/* $NetBSD: layer_vnops.c,v 1.6 2001/06/07 13:32:47 wiz Exp $ */ +/* $NetBSD: layer_vnops.c,v 1.7 2001/07/24 15:39:32 assar Exp $ */ /* * Copyright (c) 1999 National Aeronautics & Space Administration @@ -71,7 +71,7 @@ * * Ancestors: * @(#)lofs_vnops.c 1.2 (Berkeley) 6/18/92 - * $Id: layer_vnops.c,v 1.6 2001/06/07 13:32:47 wiz Exp $ + * $Id: layer_vnops.c,v 1.7 2001/07/24 15:39:32 assar Exp $ * ...and... * @(#)null_vnodeops.c 1.20 92/07/07 UCLA Ficus project */ @@ -393,8 +393,7 @@ layer_bypass(v) descp->vdesc_vpp_offset,ap); /* * Only vop_lookup, vop_create, vop_makedir, vop_bmap, - * vop_mknod, and vop_symlink return vpp's. The latter - * two are VPP_WILLRELE, so we won't get here, and vop_bmap + * vop_mknod, and vop_symlink return vpp's. vop_bmap * doesn't call bypass as the lower vpp is fine (we're just * going to do i/o on it). vop_loookup doesn't call bypass * as a lookup on "." would generate a locking error. diff --git a/sys/miscfs/union/union_vnops.c b/sys/miscfs/union/union_vnops.c index 37711a93e169..2736b3fde65c 100644 --- a/sys/miscfs/union/union_vnops.c +++ b/sys/miscfs/union/union_vnops.c @@ -1,4 +1,4 @@ -/* $NetBSD: union_vnops.c,v 1.53 2001/07/04 21:38:00 chs Exp $ */ +/* $NetBSD: union_vnops.c,v 1.54 2001/07/24 15:39:32 assar Exp $ */ /* * Copyright (c) 1992, 1993, 1994, 1995 Jan-Simon Pendry. @@ -610,12 +610,10 @@ union_mknod(v) if (error) return (error); - if (vp != NULLVP) { - error = union_allocvp(ap->a_vpp, mp, NULLVP, NULLVP, - cnp, vp, NULLVP, 1); - if (error) - vput(vp); - } + error = union_allocvp(ap->a_vpp, mp, NULLVP, NULLVP, + cnp, vp, NULLVP, 1); + if (error) + vput(vp); return (error); } @@ -1527,14 +1525,13 @@ union_symlink(v) if (dvp != NULLVP) { int error; - struct vnode *vp; FIXUP(un); VREF(dvp); un->un_flags |= UN_KLOCK; vput(ap->a_dvp); - error = VOP_SYMLINK(dvp, &vp, cnp, ap->a_vap, ap->a_target); - *ap->a_vpp = NULLVP; + error = VOP_SYMLINK(dvp, ap->a_vpp, cnp, ap->a_vap, + ap->a_target); return (error); } diff --git a/sys/nfs/nfs_serv.c b/sys/nfs/nfs_serv.c index 291f7fb0345b..acf90d18d7b7 100644 --- a/sys/nfs/nfs_serv.c +++ b/sys/nfs/nfs_serv.c @@ -1,4 +1,4 @@ -/* $NetBSD: nfs_serv.c,v 1.59 2000/11/27 08:39:49 chs Exp $ */ +/* $NetBSD: nfs_serv.c,v 1.60 2001/07/24 15:39:33 assar Exp $ */ /* * Copyright (c) 1989, 1993 @@ -1417,14 +1417,6 @@ nfsrv_create(nfsd, slp, procp, mrq) vrele(nd.ni_startdir); nfsm_reply(0); } - nd.ni_cnd.cn_nameiop = LOOKUP; - nd.ni_cnd.cn_flags &= ~(LOCKPARENT | SAVESTART); - nd.ni_cnd.cn_proc = procp; - nd.ni_cnd.cn_cred = cred; - if ((error = lookup(&nd)) != 0) { - PNBUF_PUT(nd.ni_cnd.cn_pnbuf); - nfsm_reply(0); - } PNBUF_PUT(nd.ni_cnd.cn_pnbuf); if (nd.ni_cnd.cn_flags & ISSYMLINK) { vrele(nd.ni_dvp); @@ -1618,11 +1610,6 @@ nfsrv_mknod(nfsd, slp, procp, mrq) vrele(nd.ni_startdir); goto out; } - nd.ni_cnd.cn_nameiop = LOOKUP; - nd.ni_cnd.cn_flags &= ~(LOCKPARENT | SAVESTART); - nd.ni_cnd.cn_proc = procp; - nd.ni_cnd.cn_cred = procp->p_ucred; - error = lookup(&nd); PNBUF_PUT(nd.ni_cnd.cn_pnbuf); if (error) goto out; @@ -2146,23 +2133,17 @@ nfsrv_symlink(nfsd, slp, procp, mrq) vrele(nd.ni_startdir); else { if (v3) { - nd.ni_cnd.cn_nameiop = LOOKUP; - nd.ni_cnd.cn_flags &= ~(LOCKPARENT | SAVESTART | FOLLOW); - nd.ni_cnd.cn_flags |= (NOFOLLOW | LOCKLEAF); - nd.ni_cnd.cn_proc = procp; - nd.ni_cnd.cn_cred = cred; - error = lookup(&nd); - if (!error) { - memset((caddr_t)fhp, 0, sizeof(nfh)); - fhp->fh_fsid = nd.ni_vp->v_mount->mnt_stat.f_fsid; - error = VFS_VPTOFH(nd.ni_vp, &fhp->fh_fid); - if (!error) - error = VOP_GETATTR(nd.ni_vp, &va, cred, + memset((caddr_t)fhp, 0, sizeof(nfh)); + fhp->fh_fsid = nd.ni_vp->v_mount->mnt_stat.f_fsid; + error = VFS_VPTOFH(nd.ni_vp, &fhp->fh_fid); + if (!error) + error = VOP_GETATTR(nd.ni_vp, &va, cred, procp); - vput(nd.ni_vp); - } - } else + vput(nd.ni_vp); + } else { vrele(nd.ni_startdir); + vput(nd.ni_vp); + } PNBUF_PUT(nd.ni_cnd.cn_pnbuf); } out: diff --git a/sys/nfs/nfs_vnops.c b/sys/nfs/nfs_vnops.c index c4bb892bbacd..17370baf1c28 100644 --- a/sys/nfs/nfs_vnops.c +++ b/sys/nfs/nfs_vnops.c @@ -1,4 +1,4 @@ -/* $NetBSD: nfs_vnops.c,v 1.134 2001/06/07 01:04:40 lukem Exp $ */ +/* $NetBSD: nfs_vnops.c,v 1.135 2001/07/24 15:39:33 assar Exp $ */ /* * Copyright (c) 1989, 1993 @@ -1407,8 +1407,6 @@ nfs_mknod(v) int error; error = nfs_mknodrpc(ap->a_dvp, &newvp, ap->a_cnp, ap->a_vap); - if (!error) - vput(newvp); return (error); } @@ -1869,6 +1867,7 @@ nfs_symlink(v) struct vnode *newvp = (struct vnode *)0; const int v3 = NFS_ISV3(dvp); + *ap->a_vpp = NULL; nfsstats.rpccnt[NFSPROC_SYMLINK]++; slen = strlen(ap->a_target); nfsm_reqhead(dvp, NFSPROC_SYMLINK, NFSX_FH(v3) + 2*NFSX_UNSIGNED + @@ -1894,18 +1893,30 @@ nfs_symlink(v) nfsm_wcc_data(dvp, wccflag); } nfsm_reqdone; - if (newvp) - vput(newvp); - PNBUF_PUT(cnp->cn_pnbuf); - VTONFS(dvp)->n_flag |= NMODIFIED; - if (!wccflag) - VTONFS(dvp)->n_attrstamp = 0; - vput(dvp); /* * Kludge: Map EEXIST => 0 assuming that it is a reply to a retry. */ if (error == EEXIST) error = 0; + if (error == 0 && newvp == NULL) { + struct nfsnode *np = NULL; + + error = nfs_lookitup(dvp, cnp->cn_nameptr, cnp->cn_namelen, + cnp->cn_cred, cnp->cn_proc, &np); + if (error == 0) + newvp = NFSTOV(np); + } + if (error) { + if (newvp != NULL) + vput(newvp); + } else { + *ap->a_vpp = newvp; + } + PNBUF_PUT(cnp->cn_pnbuf); + VTONFS(dvp)->n_flag |= NMODIFIED; + if (!wccflag) + VTONFS(dvp)->n_attrstamp = 0; + vput(dvp); return (error); } diff --git a/sys/ufs/ext2fs/ext2fs_vnops.c b/sys/ufs/ext2fs/ext2fs_vnops.c index e27b135bbebe..f84dedc70707 100644 --- a/sys/ufs/ext2fs/ext2fs_vnops.c +++ b/sys/ufs/ext2fs/ext2fs_vnops.c @@ -1,4 +1,4 @@ -/* $NetBSD: ext2fs_vnops.c,v 1.33 2001/03/23 21:11:08 fvdl Exp $ */ +/* $NetBSD: ext2fs_vnops.c,v 1.34 2001/07/24 15:39:34 assar Exp $ */ /* * Copyright (c) 1997 Manuel Bouyer. @@ -132,11 +132,15 @@ ext2fs_mknod(v) struct vnode **vpp = ap->a_vpp; struct inode *ip; int error; + struct mount *mp; + ino_t ino; if ((error = ext2fs_makeinode(MAKEIMODE(vap->va_type, vap->va_mode), ap->a_dvp, vpp, ap->a_cnp)) != 0) return (error); ip = VTOI(*vpp); + mp = (*vpp)->v_mount; + ino = ip->i_number; ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE; if (vap->va_rdev != VNOVAL) { /* @@ -153,7 +157,11 @@ ext2fs_mknod(v) vput(*vpp); (*vpp)->v_type = VNON; vgone(*vpp); - *vpp = 0; + error = VFS_VGET(mp, ino, vpp); + if (error != 0) { + *vpp = NULL; + return (error); + } return (0); } @@ -1206,7 +1214,8 @@ ext2fs_symlink(v) error = vn_rdwr(UIO_WRITE, vp, ap->a_target, len, (off_t)0, UIO_SYSSPACE, IO_NODELOCKED, ap->a_cnp->cn_cred, (size_t *)0, (struct proc *)0); - vput(vp); + if (error) + vput(vp); return (error); } diff --git a/sys/ufs/lfs/lfs_vnops.c b/sys/ufs/lfs/lfs_vnops.c index bd24cd0fa5fa..72d729e94098 100644 --- a/sys/ufs/lfs/lfs_vnops.c +++ b/sys/ufs/lfs/lfs_vnops.c @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_vnops.c,v 1.51 2001/07/13 20:30:25 perseant Exp $ */ +/* $NetBSD: lfs_vnops.c,v 1.52 2001/07/24 15:39:34 assar Exp $ */ /*- * Copyright (c) 1999, 2000 The NetBSD Foundation, Inc. @@ -450,6 +450,8 @@ lfs_mknod(void *v) struct vnode **vpp = ap->a_vpp; struct inode *ip; int error; + struct mount *mp; + ino_t ino; if ((error = SET_DIROP(ap->a_dvp)) != 0) { vput(ap->a_dvp); @@ -469,6 +471,8 @@ lfs_mknod(void *v) return (error); ip = VTOI(*vpp); + mp = (*vpp)->v_mount; + ino = ip->i_number; ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE; if (vap->va_rdev != VNOVAL) { /* @@ -505,7 +509,11 @@ lfs_mknod(void *v) lfs_vunref(*vpp); (*vpp)->v_type = VNON; vgone(*vpp); - *vpp = 0; + error = VFS_VGET(mp, ino, vpp); + if (error != 0) { + *vpp = NULL; + return (error); + } return (0); } diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c index dd4cabc306c7..82583e89ccc6 100644 --- a/sys/ufs/ufs/ufs_vnops.c +++ b/sys/ufs/ufs/ufs_vnops.c @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_vnops.c,v 1.78 2001/05/28 02:50:53 chs Exp $ */ +/* $NetBSD: ufs_vnops.c,v 1.79 2001/07/24 15:39:35 assar Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993, 1995 @@ -138,6 +138,8 @@ ufs_mknod(void *v) struct vnode **vpp; struct inode *ip; int error; + struct mount *mp; + ino_t ino; vap = ap->a_vap; vpp = ap->a_vpp; @@ -146,6 +148,8 @@ ufs_mknod(void *v) ap->a_dvp, vpp, ap->a_cnp)) != 0) return (error); ip = VTOI(*vpp); + mp = (*vpp)->v_mount; + ino = ip->i_number; ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE; if (vap->va_rdev != VNOVAL) { /* @@ -153,7 +157,7 @@ ufs_mknod(void *v) * inodes, so don't truncate the dev number. */ ip->i_ffs_rdev = ufs_rw32(vap->va_rdev, - UFS_MPNEEDSWAP((*vpp)->v_mount)); + UFS_MPNEEDSWAP(mp)); } /* * Remove inode so that it will be reloaded by VFS_VGET and @@ -163,7 +167,11 @@ ufs_mknod(void *v) vput(*vpp); (*vpp)->v_type = VNON; vgone(*vpp); - *vpp = 0; + error = VFS_VGET(mp, ino, vpp); + if (error != 0) { + *vpp = NULL; + return (error); + } return (0); } @@ -1450,7 +1458,8 @@ ufs_symlink(void *v) error = vn_rdwr(UIO_WRITE, vp, ap->a_target, len, (off_t)0, UIO_SYSSPACE, IO_NODELOCKED, ap->a_cnp->cn_cred, NULL, (struct proc *)0); - vput(vp); + if (error) + vput(vp); return (error); }