summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorassar <assar@openbsd.org>2001-07-26 02:10:41 +0000
committerassar <assar@openbsd.org>2001-07-26 02:10:41 +0000
commit78008e48afe9f85454a43e56024ddfe4386732ea (patch)
treeceb1c2d32aa538b8f6a7a0160228713b88002cfe
parentremove unused support for creating files and directories from (diff)
downloadwireguard-openbsd-78008e48afe9f85454a43e56024ddfe4386732ea.tar.xz
wireguard-openbsd-78008e48afe9f85454a43e56024ddfe4386732ea.zip
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 ok'd by art
-rw-r--r--sys/kern/vfs_syscalls.c11
-rw-r--r--sys/kern/vnode_if.c4
-rw-r--r--sys/kern/vnode_if.src14
-rw-r--r--sys/miscfs/union/union_vnops.c30
-rw-r--r--sys/nfs/nfs_serv.c45
-rw-r--r--sys/nfs/nfs_vnops.c30
-rw-r--r--sys/ufs/ext2fs/ext2fs_vnops.c12
-rw-r--r--sys/ufs/ufs/ufs_vnops.c13
8 files changed, 80 insertions, 79 deletions
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 9fabe83751d..a8db38f7ece 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfs_syscalls.c,v 1.78 2001/06/27 04:49:48 art Exp $ */
+/* $OpenBSD: vfs_syscalls.c,v 1.79 2001/07/26 02:10:41 assar Exp $ */
/* $NetBSD: vfs_syscalls.c,v 1.71 1996/04/23 10:29:02 mycroft Exp $ */
/*
@@ -1249,6 +1249,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);
@@ -1299,7 +1301,10 @@ sys_mkfifo(p, v, retval)
vattr.va_type = VFIFO;
vattr.va_mode = (SCARG(uap, mode) & ALLPERMS) &~ p->p_fd->fd_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);
#endif /* FIFO */
}
@@ -1393,6 +1398,8 @@ sys_symlink(p, v, retval)
vattr.va_mode = ACCESSPERMS &~ p->p_fd->fd_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:
FREE(path, M_NAMEI);
return (error);
diff --git a/sys/kern/vnode_if.c b/sys/kern/vnode_if.c
index 1f30d85c507..f5f698b6c13 100644
--- a/sys/kern/vnode_if.c
+++ b/sys/kern/vnode_if.c
@@ -154,7 +154,7 @@ int vop_mknod_vp_offsets[] = {
struct vnodeop_desc vop_mknod_desc = {
0,
"vop_mknod",
- 0 | VDESC_VP0_WILLRELE | VDESC_VPP_WILLRELE,
+ 0 | VDESC_VP0_WILLRELE,
vop_mknod_vp_offsets,
VOPARG_OFFSETOF(struct vop_mknod_args, a_vpp),
VDESC_NO_OFFSET,
@@ -797,7 +797,7 @@ int vop_symlink_vp_offsets[] = {
struct vnodeop_desc vop_symlink_desc = {
0,
"vop_symlink",
- 0 | VDESC_VP0_WILLRELE | VDESC_VPP_WILLRELE,
+ 0 | VDESC_VP0_WILLRELE,
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 91de785496f..e75c931d1a8 100644
--- a/sys/kern/vnode_if.src
+++ b/sys/kern/vnode_if.src
@@ -1,4 +1,4 @@
-# $OpenBSD: vnode_if.src,v 1.11 2001/06/23 02:21:05 csapuntz Exp $
+# $OpenBSD: vnode_if.src,v 1.12 2001/07/26 02:10:41 assar Exp $
# $NetBSD: vnode_if.src,v 1.10 1996/05/11 18:26:27 mycroft Exp $
#
# Copyright (c) 1992, 1993
@@ -102,12 +102,12 @@ vop_create {
#
#% mknod dvp L U U
-#% mknod vpp - X -
+#% mknod vpp - L -
#
vop_mknod {
IN SHOULDBELOCKED WILLRELE struct vnode *dvp;
- OUT WILLRELE struct vnode **vpp;
+ OUT struct vnode **vpp;
IN struct componentname *cnp;
IN struct vattr *vap;
};
@@ -314,16 +314,12 @@ vop_rmdir {
#
#% symlink dvp L U U
-#% symlink vpp - U -
-#
-# 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.
+#% symlink vpp - L -
#
vop_symlink {
IN SHOULDBELOCKED WILLRELE 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/miscfs/union/union_vnops.c b/sys/miscfs/union/union_vnops.c
index 240c1b70c44..cd5016d027a 100644
--- a/sys/miscfs/union/union_vnops.c
+++ b/sys/miscfs/union/union_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: union_vnops.c,v 1.13 2001/06/23 02:14:26 csapuntz Exp $ */
+/* $OpenBSD: union_vnops.c,v 1.14 2001/07/26 02:10:41 assar Exp $ */
/* $NetBSD: union_vnops.c,v 1.30.4.1 1996/05/25 22:10:14 jtc Exp $ */
/*
@@ -592,19 +592,17 @@ union_mknod(v)
if (error)
return (error);
- if (vp != NULLVP) {
- error = union_allocvp(
- ap->a_vpp,
- mp,
- NULLVP,
- NULLVP,
- ap->a_cnp,
- vp,
- NULLVP,
- 1);
- if (error)
- vput(vp);
- }
+ error = union_allocvp(
+ ap->a_vpp,
+ mp,
+ NULLVP,
+ NULLVP,
+ ap->a_cnp,
+ vp,
+ NULLVP,
+ 1);
+ if (error)
+ vput(vp);
return (error);
}
@@ -1398,15 +1396,13 @@ union_symlink(v)
if (dvp != NULLVP) {
int error;
- struct vnode *vp;
FIXUP(un, p);
VREF(dvp);
un->un_flags |= UN_KLOCK;
vput(ap->a_dvp);
- error = VOP_SYMLINK(dvp, &vp, ap->a_cnp,
+ error = VOP_SYMLINK(dvp, ap->a_vpp, ap->a_cnp,
ap->a_vap, ap->a_target);
- *ap->a_vpp = NULLVP;
return (error);
}
diff --git a/sys/nfs/nfs_serv.c b/sys/nfs/nfs_serv.c
index 95c6b87bc19..efd9972dd9c 100644
--- a/sys/nfs/nfs_serv.c
+++ b/sys/nfs/nfs_serv.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_serv.c,v 1.24 2001/07/06 21:51:13 niklas Exp $ */
+/* $OpenBSD: nfs_serv.c,v 1.25 2001/07/26 02:10:41 assar Exp $ */
/* $NetBSD: nfs_serv.c,v 1.34 1997/05/12 23:37:12 fvdl Exp $ */
/*
@@ -1362,16 +1362,6 @@ nfsrv_create(nfsd, slp, procp, mrq)
nfsm_reply(0);
return (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) {
- free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
- nfsm_reply(0);
- return (0);
- }
-
FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
if (nd.ni_cnd.cn_flags & ISSYMLINK) {
vrele(nd.ni_dvp);
@@ -1554,14 +1544,7 @@ 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);
FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
- if (error)
- goto out;
if (nd.ni_cnd.cn_flags & ISSYMLINK) {
vrele(nd.ni_dvp);
vput(nd.ni_vp);
@@ -2052,23 +2035,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) {
- bzero((caddr_t)fhp, 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
+ bzero((caddr_t)fhp, 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 {
vrele(nd.ni_startdir);
+ vput(nd.ni_vp);
+ }
FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
}
out:
diff --git a/sys/nfs/nfs_vnops.c b/sys/nfs/nfs_vnops.c
index a1fccab3408..c1bee0c45fb 100644
--- a/sys/nfs/nfs_vnops.c
+++ b/sys/nfs/nfs_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_vnops.c,v 1.35 2001/07/03 01:55:13 csapuntz Exp $ */
+/* $OpenBSD: nfs_vnops.c,v 1.36 2001/07/26 02:10:41 assar Exp $ */
/* $NetBSD: nfs_vnops.c,v 1.62.4.1 1996/07/08 20:26:52 jtc Exp $ */
/*
@@ -1155,8 +1155,6 @@ nfs_mknod(v)
int error;
error = nfs_mknodrpc(ap->a_dvp, &newvp, ap->a_cnp, ap->a_vap);
- if (!error)
- vrele(newvp);
return (error);
}
@@ -1633,18 +1631,30 @@ nfs_symlink(v)
nfsm_wcc_data(dvp, wccflag);
}
nfsm_reqdone;
- if (newvp)
- vrele(newvp);
- FREE(cnp->cn_pnbuf, M_NAMEI);
- VTONFS(dvp)->n_flag |= NMODIFIED;
- if (!wccflag)
- VTONFS(dvp)->n_attrstamp = 0;
- vrele(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;
+ }
+ FREE(cnp->cn_pnbuf, M_NAMEI);
+ VTONFS(dvp)->n_flag |= NMODIFIED;
+ if (!wccflag)
+ VTONFS(dvp)->n_attrstamp = 0;
+ vrele(dvp);
return (error);
}
diff --git a/sys/ufs/ext2fs/ext2fs_vnops.c b/sys/ufs/ext2fs/ext2fs_vnops.c
index ddc13044d71..0414ab59077 100644
--- a/sys/ufs/ext2fs/ext2fs_vnops.c
+++ b/sys/ufs/ext2fs/ext2fs_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ext2fs_vnops.c,v 1.14 2001/06/27 04:58:47 art Exp $ */
+/* $OpenBSD: ext2fs_vnops.c,v 1.15 2001/07/26 02:10:41 assar Exp $ */
/* $NetBSD: ext2fs_vnops.c,v 1.1 1997/06/11 09:34:09 bouyer Exp $ */
/*
@@ -134,6 +134,8 @@ ext2fs_mknod(v)
register struct vattr *vap = ap->a_vap;
register struct vnode **vpp = ap->a_vpp;
register struct inode *ip;
+ struct mount *mp;
+ ino_t ino;
int error;
if ((error =
@@ -158,6 +160,11 @@ ext2fs_mknod(v)
(*vpp)->v_type = VNON;
vgone(*vpp);
*vpp = 0;
+ error = VFS_VGET(mp, ino, vpp);
+ if (error != 0) {
+ *vpp = NULL;
+ return (error);
+ }
return (0);
}
@@ -1192,7 +1199,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, NULL,
(struct proc *)0);
- vput(vp);
+ if (error)
+ vput(vp);
return (error);
}
diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c
index 57bf5dc81c3..a2983450f9a 100644
--- a/sys/ufs/ufs/ufs_vnops.c
+++ b/sys/ufs/ufs/ufs_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ufs_vnops.c,v 1.34 2001/06/27 04:58:49 art Exp $ */
+/* $OpenBSD: ufs_vnops.c,v 1.35 2001/07/26 02:10:41 assar Exp $ */
/* $NetBSD: ufs_vnops.c,v 1.18 1996/05/11 18:28:04 mycroft Exp $ */
/*
@@ -152,6 +152,8 @@ ufs_mknod(v)
} */ *ap = v;
struct vattr *vap = ap->a_vap;
struct vnode **vpp = ap->a_vpp;
+ struct mount *mp;
+ ino_t ino;
struct inode *ip;
int error;
@@ -177,7 +179,11 @@ ufs_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);
}
@@ -1568,7 +1574,8 @@ ufs_symlink(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);
}