summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorassar <assar@NetBSD.org>2001-07-24 15:39:30 +0000
committerassar <assar@NetBSD.org>2001-07-24 15:39:30 +0000
commitbec71dc090fea8d431f9840f12fef5f85ceed7e3 (patch)
tree6621be8029079ac2ede2ffa016d334552b5ff922
parent8dc13781cbb64b12ff739e564c2c43462566f50b (diff)
change vop_symlink and vop_mknod to return vpp (the created node)
refed, so that the caller can actually use it. update callers and file systems that implement these vnode operations
-rw-r--r--sys/coda/coda_vnops.c17
-rw-r--r--sys/kern/vfs_syscalls.c11
-rw-r--r--sys/kern/vnode_if.c6
-rw-r--r--sys/kern/vnode_if.src14
-rw-r--r--sys/lkm/netinet/if_ipl/mln_ipl.c3
-rw-r--r--sys/miscfs/genfs/layer_vnops.c7
-rw-r--r--sys/miscfs/union/union_vnops.c17
-rw-r--r--sys/nfs/nfs_serv.c39
-rw-r--r--sys/nfs/nfs_vnops.c31
-rw-r--r--sys/ufs/ext2fs/ext2fs_vnops.c15
-rw-r--r--sys/ufs/lfs/lfs_vnops.c12
-rw-r--r--sys/ufs/ufs/ufs_vnops.c17
12 files changed, 96 insertions, 93 deletions
diff --git a/sys/coda/coda_vnops.c b/sys/coda/coda_vnops.c
index 33123b16811..6fbd425ab4b 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 $ */
/*
*
@@ -1655,21 +1655,6 @@ coda_symlink(v)
}
/*
- * 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
*/
if ((cnp->cn_flags & SAVESTART) == 0) {
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 4825e88b36c..2e408327cef 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 5cf9b1f582f..4fc2d9335b1 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 9f3e4740c1e..496bc976a15 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 c008743c444..c840fbd6993 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 a9fda71a1eb..733c2aeac9d 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 37711a93e16..2736b3fde65 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 291f7fb0345..acf90d18d7b 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 c4bb892bbac..17370baf1c2 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 e27b135bbeb..f84dedc7070 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 bd24cd0fa5f..72d729e9409 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 dd4cabc306c..82583e89ccc 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);
}