summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/imgact_elf.c3
-rw-r--r--sys/kern/kern_acct.c3
-rw-r--r--sys/kern/kern_exec.c6
-rw-r--r--sys/kern/kern_ktrace.c3
-rw-r--r--sys/kern/kern_linker.c3
-rw-r--r--sys/kern/kern_sig.c3
-rw-r--r--sys/kern/link_aout.c3
-rw-r--r--sys/kern/link_elf.c4
-rw-r--r--sys/kern/link_elf_obj.c4
-rw-r--r--sys/kern/uipc_usrreq.c4
-rw-r--r--sys/kern/vfs_default.c1
-rw-r--r--sys/kern/vfs_extattr.c82
-rw-r--r--sys/kern/vfs_lookup.c7
-rw-r--r--sys/kern/vfs_syscalls.c82
-rw-r--r--sys/kern/vfs_vnops.c13
-rw-r--r--sys/kern/vnode_if.src8
16 files changed, 149 insertions, 80 deletions
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c
index da938c5..c541147 100644
--- a/sys/kern/imgact_elf.c
+++ b/sys/kern/imgact_elf.c
@@ -60,6 +60,7 @@
#include <vm/vm_map.h>
#include <vm/vm_object.h>
#include <vm/vm_extern.h>
+#include <vm/vm_zone.h>
#include <machine/elf.h>
#include <machine/md_var.h>
@@ -332,7 +333,7 @@ elf_load_file(struct proc *p, const char *file, u_long *addr, u_long *entry)
nd.ni_vp = NULL;
goto fail;
}
-
+ NDFREE(&nd, NDF_ONLY_PNBUF);
imgp->vp = nd.ni_vp;
/*
diff --git a/sys/kern/kern_acct.c b/sys/kern/kern_acct.c
index 3222b16..6f0cfb5 100644
--- a/sys/kern/kern_acct.c
+++ b/sys/kern/kern_acct.c
@@ -56,6 +56,8 @@
#include <sys/resourcevar.h>
#include <sys/tty.h>
+#include <vm/vm_zone.h>
+
/*
* The routines implemented in this file are described in:
* Leffler, et al.: The Design and Implementation of the 4.3BSD
@@ -133,6 +135,7 @@ acct(a1, uap)
error = vn_open(&nd, FWRITE, 0);
if (error)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
VOP_UNLOCK(nd.ni_vp, 0, p);
if (nd.ni_vp->v_type != VREG) {
vn_close(nd.ni_vp, FWRITE, p->p_ucred, p);
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
index d78f562..60c7f55 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -193,9 +193,9 @@ interpret:
goto exec_fail_dealloc;
if (imgp->interpreted) {
exec_unmap_first_page(imgp);
- /* free old vnode and name buffer */
+ /* free name buffer and old vnode */
+ NDFREE(ndp, NDF_ONLY_PNBUF);
vrele(ndp->ni_vp);
- zfree(namei_zone, ndp->ni_cnd.cn_pnbuf);
/* set new name to that of the interpreter */
NDINIT(ndp, LOOKUP, LOCKLEAF | FOLLOW | SAVENAME,
UIO_SYSSPACE, imgp->interpreter_name, p);
@@ -353,8 +353,8 @@ exec_fail_dealloc:
ARG_MAX + PAGE_SIZE);
if (imgp->vp) {
+ NDFREE(ndp, NDF_ONLY_PNBUF);
vrele(imgp->vp);
- zfree(namei_zone, ndp->ni_cnd.cn_pnbuf);
}
if (error == 0)
diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c
index 266ea31..8258271 100644
--- a/sys/kern/kern_ktrace.c
+++ b/sys/kern/kern_ktrace.c
@@ -49,6 +49,8 @@
#include <sys/malloc.h>
#include <sys/syslog.h>
+#include <vm/vm_zone.h>
+
#include <stddef.h>
static MALLOC_DEFINE(M_KTRACE, "KTRACE", "KTRACE");
@@ -280,6 +282,7 @@ ktrace(curp, uap)
curp->p_traceflag &= ~KTRFAC_ACTIVE;
return (error);
}
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vp = nd.ni_vp;
VOP_UNLOCK(vp, 0, curp);
if (vp->v_type != VREG) {
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c
index 9262e54..13a2491 100644
--- a/sys/kern/kern_linker.c
+++ b/sys/kern/kern_linker.c
@@ -44,6 +44,8 @@
#include <sys/vnode.h>
#include <sys/sysctl.h>
+#include <vm/vm_zone.h>
+
#ifdef KLD_DEBUG
int kld_debug = 0;
#endif
@@ -1017,6 +1019,7 @@ linker_search_path(const char *name)
NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, result, p);
error = vn_open(&nd, FREAD, 0);
if (error == 0) {
+ NDFREE(&nd, NDF_ONLY_PNBUF);
type = nd.ni_vp->v_type;
VOP_UNLOCK(nd.ni_vp, 0, p);
vn_close(nd.ni_vp, FREAD, p->p_ucred, p);
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index cf27029..6bb03de 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -62,6 +62,8 @@
#include <sys/sysctl.h>
#include <sys/malloc.h>
+#include <vm/vm_zone.h>
+
#include <machine/cpu.h>
#ifdef SMP
#include <machine/smp.h>
@@ -1604,6 +1606,7 @@ coredump(p)
free(name, M_TEMP);
if (error)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vp = nd.ni_vp;
/* Don't dump to non-regular files or files with links. */
diff --git a/sys/kern/link_aout.c b/sys/kern/link_aout.c
index bc46101..605a812 100644
--- a/sys/kern/link_aout.c
+++ b/sys/kern/link_aout.c
@@ -40,6 +40,8 @@
#include <sys/vnode.h>
#include <sys/linker.h>
+#include <vm/vm_zone.h>
+
#ifndef __ELF__
#include <vm/vm.h>
#include <vm/pmap.h>
@@ -201,6 +203,7 @@ link_aout_load_file(const char* filename, linker_file_t* result)
free(pathname, M_LINKER);
if (error)
return error;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
/*
* Read the a.out header from the file.
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
index ab4abf8..0fefb50 100644
--- a/sys/kern/link_elf.c
+++ b/sys/kern/link_elf.c
@@ -38,9 +38,8 @@
#include <machine/elf.h>
#include <vm/vm.h>
-#ifdef SPARSE_MAPPING
-#endif
#include <vm/vm_param.h>
+#include <vm/vm_zone.h>
#include <sys/lock.h>
#ifdef SPARSE_MAPPING
#include <vm/vm_object.h>
@@ -430,6 +429,7 @@ link_elf_load_file(const char* filename, linker_file_t* result)
free(pathname, M_LINKER);
if (error)
return error;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
/*
* Read the elf header from the file.
diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c
index ab4abf8..0fefb50 100644
--- a/sys/kern/link_elf_obj.c
+++ b/sys/kern/link_elf_obj.c
@@ -38,9 +38,8 @@
#include <machine/elf.h>
#include <vm/vm.h>
-#ifdef SPARSE_MAPPING
-#endif
#include <vm/vm_param.h>
+#include <vm/vm_zone.h>
#include <sys/lock.h>
#ifdef SPARSE_MAPPING
#include <vm/vm_object.h>
@@ -430,6 +429,7 @@ link_elf_load_file(const char* filename, linker_file_t* result)
free(pathname, M_LINKER);
if (error)
return error;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
/*
* Read the elf header from the file.
diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c
index 34222b2..4876889 100644
--- a/sys/kern/uipc_usrreq.c
+++ b/sys/kern/uipc_usrreq.c
@@ -559,7 +559,7 @@ unp_bind(unp, nam, p)
return (error);
vp = nd.ni_vp;
if (vp != NULL) {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == vp)
vrele(nd.ni_dvp);
else
@@ -572,6 +572,7 @@ unp_bind(unp, nam, p)
vattr.va_mode = (ACCESSPERMS & ~p->p_fd->fd_cmask);
VOP_LEASE(nd.ni_dvp, p, p->p_ucred, LEASE_WRITE);
error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vput(nd.ni_dvp);
if (error)
return (error);
@@ -608,6 +609,7 @@ unp_connect(so, nam, p)
if (error)
return (error);
vp = nd.ni_vp;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (vp->v_type != VSOCK) {
error = ENOTSOCK;
goto bad;
diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c
index 600df41..35df911 100644
--- a/sys/kern/vfs_default.c
+++ b/sys/kern/vfs_default.c
@@ -63,7 +63,6 @@ static int vop_nostrategy __P((struct vop_strategy_args *));
vop_t **default_vnodeop_p;
static struct vnodeopv_entry_desc default_vnodeop_entries[] = {
{ &vop_default_desc, (vop_t *) vop_eopnotsupp },
- { &vop_abortop_desc, (vop_t *) vop_null },
{ &vop_advlock_desc, (vop_t *) vop_einval },
{ &vop_bwrite_desc, (vop_t *) vop_stdbwrite },
{ &vop_close_desc, (vop_t *) vop_null },
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c
index 4d5d394..1de7cf1 100644
--- a/sys/kern/vfs_extattr.c
+++ b/sys/kern/vfs_extattr.c
@@ -142,6 +142,7 @@ mount(p, uap)
SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vp = nd.ni_vp;
if (SCARG(uap, flags) & MNT_UPDATE) {
if ((vp->v_flag & VROOT) == 0) {
@@ -264,8 +265,7 @@ mount(p, uap)
/*
* Allocate and initialize the filesystem.
*/
- mp = (struct mount *)malloc((u_long)sizeof(struct mount),
- M_MOUNT, M_WAITOK);
+ mp = malloc(sizeof(struct mount), M_MOUNT, M_WAITOK);
bzero((char *)mp, (u_long)sizeof(struct mount));
lockinit(&mp->mnt_lock, PVFS, "vfslock", 0, LK_NOPAUSE);
(void)vfs_busy(mp, LK_NOWAIT, 0, p);
@@ -297,6 +297,8 @@ update:
MNT_NOATIME | MNT_NOCLUSTERR | MNT_NOCLUSTERW | MNT_SUIDDIR);
/*
* Mount the filesystem.
+ * XXX The final recipients of VFS_MOUNT just overwrite the ndp they
+ * get. No freeing of cn_pnbuf.
*/
error = VFS_MOUNT(mp, SCARG(uap, path), SCARG(uap, data), &nd, p);
if (mp->mnt_flag & MNT_UPDATE) {
@@ -421,6 +423,7 @@ unmount(p, uap)
if ((error = namei(&nd)) != 0)
return (error);
vp = nd.ni_vp;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
mp = vp->v_mount;
/*
@@ -602,6 +605,7 @@ quotactl(p, uap)
if ((error = namei(&nd)) != 0)
return (error);
mp = nd.ni_vp->v_mount;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vrele(nd.ni_vp);
return (VFS_QUOTACTL(mp, SCARG(uap, cmd), SCARG(uap, uid),
SCARG(uap, arg), p));
@@ -636,6 +640,7 @@ statfs(p, uap)
return (error);
mp = nd.ni_vp->v_mount;
sp = &mp->mnt_stat;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vrele(nd.ni_vp);
error = VFS_STATFS(mp, sp, p);
if (error)
@@ -833,6 +838,7 @@ chdir(p, uap)
SCARG(uap, path), p);
if ((error = change_dir(&nd, p)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vrele(fdp->fd_cdir);
fdp->fd_cdir = nd.ni_vp;
return (0);
@@ -908,6 +914,7 @@ chroot(p, uap)
SCARG(uap, path), p);
if ((error = change_dir(&nd, p)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vrele(fdp->fd_rdir);
fdp->fd_rdir = nd.ni_vp;
if (!fdp->fd_jdir) {
@@ -999,6 +1006,7 @@ open(p, uap)
return (error);
}
p->p_dupfd = 0;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vp = nd.ni_vp;
fp->f_data = (caddr_t)vp;
@@ -1134,20 +1142,18 @@ mknod(p, uap)
}
if (!error) {
VOP_LEASE(nd.ni_dvp, p, p->p_ucred, LEASE_WRITE);
- if (whiteout) {
+ if (whiteout)
error = VOP_WHITEOUT(nd.ni_dvp, &nd.ni_cnd, CREATE);
- if (error)
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
- vput(nd.ni_dvp);
- } else {
+ else {
error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp,
&nd.ni_cnd, &vattr);
if (error == 0)
vput(nd.ni_vp);
- vput(nd.ni_dvp);
}
+ NDFREE(&nd, NDF_ONLY_PNBUF);
+ vput(nd.ni_dvp);
} else {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == vp)
vrele(nd.ni_dvp);
else
@@ -1186,7 +1192,7 @@ mkfifo(p, uap)
if ((error = namei(&nd)) != 0)
return (error);
if (nd.ni_vp != NULL) {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == nd.ni_vp)
vrele(nd.ni_dvp);
else
@@ -1201,6 +1207,7 @@ mkfifo(p, uap)
error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr);
if (error == 0)
vput(nd.ni_vp);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vput(nd.ni_dvp);
return (error);
}
@@ -1230,6 +1237,7 @@ link(p, uap)
NDINIT(&nd, LOOKUP, FOLLOW|NOOBJ, UIO_USERSPACE, SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vp = nd.ni_vp;
if (vp->v_type == VDIR)
error = EPERM; /* POSIX */
@@ -1238,7 +1246,6 @@ link(p, uap)
error = namei(&nd);
if (!error) {
if (nd.ni_vp != NULL) {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
if (nd.ni_vp)
vrele(nd.ni_vp);
error = EEXIST;
@@ -1248,6 +1255,7 @@ link(p, uap)
VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE);
error = VOP_LINK(nd.ni_dvp, vp, &nd.ni_cnd);
}
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == nd.ni_vp)
vrele(nd.ni_dvp);
else
@@ -1290,7 +1298,7 @@ symlink(p, uap)
if ((error = namei(&nd)) != 0)
goto out;
if (nd.ni_vp) {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == nd.ni_vp)
vrele(nd.ni_dvp);
else
@@ -1303,6 +1311,7 @@ symlink(p, uap)
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);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (error == 0)
vput(nd.ni_vp);
vput(nd.ni_dvp);
@@ -1334,7 +1343,7 @@ undelete(p, uap)
return (error);
if (nd.ni_vp != NULLVP || !(nd.ni_cnd.cn_flags & ISWHITEOUT)) {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == nd.ni_vp)
vrele(nd.ni_dvp);
else
@@ -1345,8 +1354,8 @@ undelete(p, uap)
}
VOP_LEASE(nd.ni_dvp, p, p->p_ucred, LEASE_WRITE);
- if ((error = VOP_WHITEOUT(nd.ni_dvp, &nd.ni_cnd, DELETE)) != 0)
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
+ error = VOP_WHITEOUT(nd.ni_dvp, &nd.ni_cnd, DELETE);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vput(nd.ni_dvp);
ASSERT_VOP_UNLOCKED(nd.ni_dvp, "undelete");
ASSERT_VOP_UNLOCKED(nd.ni_vp, "undelete");
@@ -1395,9 +1404,8 @@ unlink(p, uap)
if (!error) {
VOP_LEASE(nd.ni_dvp, p, p->p_ucred, LEASE_WRITE);
error = VOP_REMOVE(nd.ni_dvp, vp, &nd.ni_cnd);
- } else {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
}
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == vp)
vrele(nd.ni_dvp);
else
@@ -1541,6 +1549,7 @@ access(p, uap)
if ((flags & VWRITE) == 0 || (error = vn_writechk(vp)) == 0)
error = VOP_ACCESS(vp, flags, cred, p);
}
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vput(vp);
out1:
cred->cr_uid = t_uid;
@@ -1576,6 +1585,7 @@ ostat(p, uap)
SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = vn_stat(nd.ni_vp, &sb, p);
vput(nd.ni_vp);
if (error)
@@ -1615,6 +1625,7 @@ olstat(p, uap)
return (error);
vp = nd.ni_vp;
error = vn_stat(vp, &sb, p);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vput(vp);
if (error)
return (error);
@@ -1680,6 +1691,7 @@ stat(p, uap)
if ((error = namei(&nd)) != 0)
return (error);
error = vn_stat(nd.ni_vp, &sb, p);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vput(nd.ni_vp);
if (error)
return (error);
@@ -1716,6 +1728,7 @@ lstat(p, uap)
return (error);
vp = nd.ni_vp;
error = vn_stat(vp, &sb, p);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vput(vp);
if (error)
return (error);
@@ -1771,6 +1784,7 @@ nstat(p, uap)
SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = vn_stat(nd.ni_vp, &sb, p);
vput(nd.ni_vp);
if (error)
@@ -1809,6 +1823,7 @@ nlstat(p, uap)
if ((error = namei(&nd)) != 0)
return (error);
vp = nd.ni_vp;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = vn_stat(vp, &sb, p);
vput(vp);
if (error)
@@ -1843,6 +1858,7 @@ pathconf(p, uap)
SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = VOP_PATHCONF(nd.ni_vp, SCARG(uap, name), p->p_retval);
vput(nd.ni_vp);
return (error);
@@ -1878,6 +1894,7 @@ readlink(p, uap)
SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vp = nd.ni_vp;
if (vp->v_type != VLNK)
error = EINVAL;
@@ -1950,6 +1967,7 @@ chflags(p, uap)
NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = setfflags(p, nd.ni_vp, SCARG(uap, flags));
vrele(nd.ni_vp);
return error;
@@ -2023,6 +2041,7 @@ chmod(p, uap)
NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = setfmode(p, nd.ni_vp, SCARG(uap, mode));
vrele(nd.ni_vp);
return error;
@@ -2052,6 +2071,7 @@ lchmod(p, uap)
NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = setfmode(p, nd.ni_vp, SCARG(uap, mode));
vrele(nd.ni_vp);
return error;
@@ -2129,9 +2149,9 @@ chown(p, uap)
NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = setfown(p, nd.ni_vp, SCARG(uap, uid), SCARG(uap, gid));
vrele(nd.ni_vp);
-
return (error);
}
@@ -2161,6 +2181,7 @@ lchown(p, uap)
NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = setfown(p, nd.ni_vp, SCARG(uap, uid), SCARG(uap, gid));
vrele(nd.ni_vp);
return (error);
@@ -2267,6 +2288,7 @@ utimes(p, uap)
NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = setutimes(p, nd.ni_vp, ts, usrtvp == NULL);
vrele(nd.ni_vp);
return (error);
@@ -2301,6 +2323,7 @@ lutimes(p, uap)
NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = setutimes(p, nd.ni_vp, ts, usrtvp == NULL);
vrele(nd.ni_vp);
return (error);
@@ -2368,6 +2391,7 @@ truncate(p, uap)
if ((error = namei(&nd)) != 0)
return (error);
vp = nd.ni_vp;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE);
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
if (vp->v_type == VDIR)
@@ -2557,7 +2581,7 @@ rename(p, uap)
/* Translate error code for rename("dir1", "dir2/."). */
if (error == EISDIR && fvp->v_type == VDIR)
error = EINVAL;
- VOP_ABORTOP(fromnd.ni_dvp, &fromnd.ni_cnd);
+ NDFREE(&fromnd, NDF_ONLY_PNBUF);
vrele(fromnd.ni_dvp);
vrele(fvp);
goto out1;
@@ -2596,15 +2620,17 @@ out:
}
error = VOP_RENAME(fromnd.ni_dvp, fromnd.ni_vp, &fromnd.ni_cnd,
tond.ni_dvp, tond.ni_vp, &tond.ni_cnd);
+ NDFREE(&fromnd, NDF_ONLY_PNBUF);
+ NDFREE(&tond, NDF_ONLY_PNBUF);
} else {
- VOP_ABORTOP(tond.ni_dvp, &tond.ni_cnd);
+ NDFREE(&fromnd, NDF_ONLY_PNBUF);
+ NDFREE(&tond, NDF_ONLY_PNBUF);
if (tdvp == tvp)
vrele(tdvp);
else
vput(tdvp);
if (tvp)
vput(tvp);
- VOP_ABORTOP(fromnd.ni_dvp, &fromnd.ni_cnd);
vrele(fromnd.ni_dvp);
vrele(fvp);
}
@@ -2613,11 +2639,9 @@ out:
ASSERT_VOP_UNLOCKED(fromnd.ni_vp, "rename");
ASSERT_VOP_UNLOCKED(tond.ni_dvp, "rename");
ASSERT_VOP_UNLOCKED(tond.ni_vp, "rename");
- zfree(namei_zone, tond.ni_cnd.cn_pnbuf);
out1:
if (fromnd.ni_startdir)
vrele(fromnd.ni_startdir);
- zfree(namei_zone, fromnd.ni_cnd.cn_pnbuf);
if (error == -1)
return (0);
return (error);
@@ -2652,7 +2676,7 @@ mkdir(p, uap)
return (error);
vp = nd.ni_vp;
if (vp != NULL) {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == vp)
vrele(nd.ni_dvp);
else
@@ -2665,6 +2689,7 @@ mkdir(p, uap)
vattr.va_mode = (SCARG(uap, mode) & ACCESSPERMS) &~ p->p_fd->fd_cmask;
VOP_LEASE(nd.ni_dvp, p, p->p_ucred, LEASE_WRITE);
error = VOP_MKDIR(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vput(nd.ni_dvp);
if (!error)
vput(nd.ni_vp);
@@ -2714,14 +2739,13 @@ rmdir(p, uap)
*/
if (vp->v_flag & VROOT)
error = EBUSY;
-out:
- if (!error) {
+ else {
VOP_LEASE(nd.ni_dvp, p, p->p_ucred, LEASE_WRITE);
VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE);
error = VOP_RMDIR(nd.ni_dvp, nd.ni_vp, &nd.ni_cnd);
- } else {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
}
+out:
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == vp)
vrele(nd.ni_dvp);
else
@@ -3013,6 +3037,7 @@ revoke(p, uap)
if ((error = namei(&nd)) != 0)
return (error);
vp = nd.ni_vp;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (vp->v_type != VCHR && vp->v_type != VBLK) {
error = EINVAL;
goto out;
@@ -3077,6 +3102,7 @@ getfh(p, uap)
error = namei(&nd);
if (error)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vp = nd.ni_vp;
bzero(&fh, sizeof(fh));
fh.fh_fsid = vp->v_mount->mnt_stat.f_fsid;
diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c
index 18e0bda..4cdec9e 100644
--- a/sys/kern/vfs_lookup.c
+++ b/sys/kern/vfs_lookup.c
@@ -372,6 +372,7 @@ dirloop:
ndp->ni_vp = dp;
if (!(cnp->cn_flags & (LOCKPARENT | LOCKLEAF)))
VOP_UNLOCK(dp, 0, p);
+ /* XXX This should probably move to the top of function. */
if (cnp->cn_flags & SAVESTART)
panic("lookup: SAVESTART");
return (0);
@@ -527,9 +528,8 @@ nextname:
cnp->cn_nameptr++;
ndp->ni_pathlen--;
}
- if (ndp->ni_dvp != ndp->ni_vp) {
- ASSERT_VOP_UNLOCKED(ndp->ni_dvp, "lookup");
- }
+ if (ndp->ni_dvp != ndp->ni_vp)
+ ASSERT_VOP_UNLOCKED(ndp->ni_dvp, "lookup");
vrele(ndp->ni_dvp);
goto dirloop;
}
@@ -629,6 +629,7 @@ relookup(dvp, vpp, cnp)
if (!(cnp->cn_flags & LOCKLEAF))
VOP_UNLOCK(dp, 0, p);
*vpp = dp;
+ /* XXX This should probably move to the top of function. */
if (cnp->cn_flags & SAVESTART)
panic("lookup: SAVESTART");
return (0);
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 4d5d394..1de7cf1 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -142,6 +142,7 @@ mount(p, uap)
SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vp = nd.ni_vp;
if (SCARG(uap, flags) & MNT_UPDATE) {
if ((vp->v_flag & VROOT) == 0) {
@@ -264,8 +265,7 @@ mount(p, uap)
/*
* Allocate and initialize the filesystem.
*/
- mp = (struct mount *)malloc((u_long)sizeof(struct mount),
- M_MOUNT, M_WAITOK);
+ mp = malloc(sizeof(struct mount), M_MOUNT, M_WAITOK);
bzero((char *)mp, (u_long)sizeof(struct mount));
lockinit(&mp->mnt_lock, PVFS, "vfslock", 0, LK_NOPAUSE);
(void)vfs_busy(mp, LK_NOWAIT, 0, p);
@@ -297,6 +297,8 @@ update:
MNT_NOATIME | MNT_NOCLUSTERR | MNT_NOCLUSTERW | MNT_SUIDDIR);
/*
* Mount the filesystem.
+ * XXX The final recipients of VFS_MOUNT just overwrite the ndp they
+ * get. No freeing of cn_pnbuf.
*/
error = VFS_MOUNT(mp, SCARG(uap, path), SCARG(uap, data), &nd, p);
if (mp->mnt_flag & MNT_UPDATE) {
@@ -421,6 +423,7 @@ unmount(p, uap)
if ((error = namei(&nd)) != 0)
return (error);
vp = nd.ni_vp;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
mp = vp->v_mount;
/*
@@ -602,6 +605,7 @@ quotactl(p, uap)
if ((error = namei(&nd)) != 0)
return (error);
mp = nd.ni_vp->v_mount;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vrele(nd.ni_vp);
return (VFS_QUOTACTL(mp, SCARG(uap, cmd), SCARG(uap, uid),
SCARG(uap, arg), p));
@@ -636,6 +640,7 @@ statfs(p, uap)
return (error);
mp = nd.ni_vp->v_mount;
sp = &mp->mnt_stat;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vrele(nd.ni_vp);
error = VFS_STATFS(mp, sp, p);
if (error)
@@ -833,6 +838,7 @@ chdir(p, uap)
SCARG(uap, path), p);
if ((error = change_dir(&nd, p)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vrele(fdp->fd_cdir);
fdp->fd_cdir = nd.ni_vp;
return (0);
@@ -908,6 +914,7 @@ chroot(p, uap)
SCARG(uap, path), p);
if ((error = change_dir(&nd, p)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vrele(fdp->fd_rdir);
fdp->fd_rdir = nd.ni_vp;
if (!fdp->fd_jdir) {
@@ -999,6 +1006,7 @@ open(p, uap)
return (error);
}
p->p_dupfd = 0;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vp = nd.ni_vp;
fp->f_data = (caddr_t)vp;
@@ -1134,20 +1142,18 @@ mknod(p, uap)
}
if (!error) {
VOP_LEASE(nd.ni_dvp, p, p->p_ucred, LEASE_WRITE);
- if (whiteout) {
+ if (whiteout)
error = VOP_WHITEOUT(nd.ni_dvp, &nd.ni_cnd, CREATE);
- if (error)
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
- vput(nd.ni_dvp);
- } else {
+ else {
error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp,
&nd.ni_cnd, &vattr);
if (error == 0)
vput(nd.ni_vp);
- vput(nd.ni_dvp);
}
+ NDFREE(&nd, NDF_ONLY_PNBUF);
+ vput(nd.ni_dvp);
} else {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == vp)
vrele(nd.ni_dvp);
else
@@ -1186,7 +1192,7 @@ mkfifo(p, uap)
if ((error = namei(&nd)) != 0)
return (error);
if (nd.ni_vp != NULL) {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == nd.ni_vp)
vrele(nd.ni_dvp);
else
@@ -1201,6 +1207,7 @@ mkfifo(p, uap)
error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr);
if (error == 0)
vput(nd.ni_vp);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vput(nd.ni_dvp);
return (error);
}
@@ -1230,6 +1237,7 @@ link(p, uap)
NDINIT(&nd, LOOKUP, FOLLOW|NOOBJ, UIO_USERSPACE, SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vp = nd.ni_vp;
if (vp->v_type == VDIR)
error = EPERM; /* POSIX */
@@ -1238,7 +1246,6 @@ link(p, uap)
error = namei(&nd);
if (!error) {
if (nd.ni_vp != NULL) {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
if (nd.ni_vp)
vrele(nd.ni_vp);
error = EEXIST;
@@ -1248,6 +1255,7 @@ link(p, uap)
VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE);
error = VOP_LINK(nd.ni_dvp, vp, &nd.ni_cnd);
}
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == nd.ni_vp)
vrele(nd.ni_dvp);
else
@@ -1290,7 +1298,7 @@ symlink(p, uap)
if ((error = namei(&nd)) != 0)
goto out;
if (nd.ni_vp) {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == nd.ni_vp)
vrele(nd.ni_dvp);
else
@@ -1303,6 +1311,7 @@ symlink(p, uap)
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);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (error == 0)
vput(nd.ni_vp);
vput(nd.ni_dvp);
@@ -1334,7 +1343,7 @@ undelete(p, uap)
return (error);
if (nd.ni_vp != NULLVP || !(nd.ni_cnd.cn_flags & ISWHITEOUT)) {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == nd.ni_vp)
vrele(nd.ni_dvp);
else
@@ -1345,8 +1354,8 @@ undelete(p, uap)
}
VOP_LEASE(nd.ni_dvp, p, p->p_ucred, LEASE_WRITE);
- if ((error = VOP_WHITEOUT(nd.ni_dvp, &nd.ni_cnd, DELETE)) != 0)
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
+ error = VOP_WHITEOUT(nd.ni_dvp, &nd.ni_cnd, DELETE);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vput(nd.ni_dvp);
ASSERT_VOP_UNLOCKED(nd.ni_dvp, "undelete");
ASSERT_VOP_UNLOCKED(nd.ni_vp, "undelete");
@@ -1395,9 +1404,8 @@ unlink(p, uap)
if (!error) {
VOP_LEASE(nd.ni_dvp, p, p->p_ucred, LEASE_WRITE);
error = VOP_REMOVE(nd.ni_dvp, vp, &nd.ni_cnd);
- } else {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
}
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == vp)
vrele(nd.ni_dvp);
else
@@ -1541,6 +1549,7 @@ access(p, uap)
if ((flags & VWRITE) == 0 || (error = vn_writechk(vp)) == 0)
error = VOP_ACCESS(vp, flags, cred, p);
}
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vput(vp);
out1:
cred->cr_uid = t_uid;
@@ -1576,6 +1585,7 @@ ostat(p, uap)
SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = vn_stat(nd.ni_vp, &sb, p);
vput(nd.ni_vp);
if (error)
@@ -1615,6 +1625,7 @@ olstat(p, uap)
return (error);
vp = nd.ni_vp;
error = vn_stat(vp, &sb, p);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vput(vp);
if (error)
return (error);
@@ -1680,6 +1691,7 @@ stat(p, uap)
if ((error = namei(&nd)) != 0)
return (error);
error = vn_stat(nd.ni_vp, &sb, p);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vput(nd.ni_vp);
if (error)
return (error);
@@ -1716,6 +1728,7 @@ lstat(p, uap)
return (error);
vp = nd.ni_vp;
error = vn_stat(vp, &sb, p);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vput(vp);
if (error)
return (error);
@@ -1771,6 +1784,7 @@ nstat(p, uap)
SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = vn_stat(nd.ni_vp, &sb, p);
vput(nd.ni_vp);
if (error)
@@ -1809,6 +1823,7 @@ nlstat(p, uap)
if ((error = namei(&nd)) != 0)
return (error);
vp = nd.ni_vp;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = vn_stat(vp, &sb, p);
vput(vp);
if (error)
@@ -1843,6 +1858,7 @@ pathconf(p, uap)
SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = VOP_PATHCONF(nd.ni_vp, SCARG(uap, name), p->p_retval);
vput(nd.ni_vp);
return (error);
@@ -1878,6 +1894,7 @@ readlink(p, uap)
SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vp = nd.ni_vp;
if (vp->v_type != VLNK)
error = EINVAL;
@@ -1950,6 +1967,7 @@ chflags(p, uap)
NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = setfflags(p, nd.ni_vp, SCARG(uap, flags));
vrele(nd.ni_vp);
return error;
@@ -2023,6 +2041,7 @@ chmod(p, uap)
NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = setfmode(p, nd.ni_vp, SCARG(uap, mode));
vrele(nd.ni_vp);
return error;
@@ -2052,6 +2071,7 @@ lchmod(p, uap)
NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = setfmode(p, nd.ni_vp, SCARG(uap, mode));
vrele(nd.ni_vp);
return error;
@@ -2129,9 +2149,9 @@ chown(p, uap)
NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = setfown(p, nd.ni_vp, SCARG(uap, uid), SCARG(uap, gid));
vrele(nd.ni_vp);
-
return (error);
}
@@ -2161,6 +2181,7 @@ lchown(p, uap)
NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = setfown(p, nd.ni_vp, SCARG(uap, uid), SCARG(uap, gid));
vrele(nd.ni_vp);
return (error);
@@ -2267,6 +2288,7 @@ utimes(p, uap)
NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = setutimes(p, nd.ni_vp, ts, usrtvp == NULL);
vrele(nd.ni_vp);
return (error);
@@ -2301,6 +2323,7 @@ lutimes(p, uap)
NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
error = setutimes(p, nd.ni_vp, ts, usrtvp == NULL);
vrele(nd.ni_vp);
return (error);
@@ -2368,6 +2391,7 @@ truncate(p, uap)
if ((error = namei(&nd)) != 0)
return (error);
vp = nd.ni_vp;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE);
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
if (vp->v_type == VDIR)
@@ -2557,7 +2581,7 @@ rename(p, uap)
/* Translate error code for rename("dir1", "dir2/."). */
if (error == EISDIR && fvp->v_type == VDIR)
error = EINVAL;
- VOP_ABORTOP(fromnd.ni_dvp, &fromnd.ni_cnd);
+ NDFREE(&fromnd, NDF_ONLY_PNBUF);
vrele(fromnd.ni_dvp);
vrele(fvp);
goto out1;
@@ -2596,15 +2620,17 @@ out:
}
error = VOP_RENAME(fromnd.ni_dvp, fromnd.ni_vp, &fromnd.ni_cnd,
tond.ni_dvp, tond.ni_vp, &tond.ni_cnd);
+ NDFREE(&fromnd, NDF_ONLY_PNBUF);
+ NDFREE(&tond, NDF_ONLY_PNBUF);
} else {
- VOP_ABORTOP(tond.ni_dvp, &tond.ni_cnd);
+ NDFREE(&fromnd, NDF_ONLY_PNBUF);
+ NDFREE(&tond, NDF_ONLY_PNBUF);
if (tdvp == tvp)
vrele(tdvp);
else
vput(tdvp);
if (tvp)
vput(tvp);
- VOP_ABORTOP(fromnd.ni_dvp, &fromnd.ni_cnd);
vrele(fromnd.ni_dvp);
vrele(fvp);
}
@@ -2613,11 +2639,9 @@ out:
ASSERT_VOP_UNLOCKED(fromnd.ni_vp, "rename");
ASSERT_VOP_UNLOCKED(tond.ni_dvp, "rename");
ASSERT_VOP_UNLOCKED(tond.ni_vp, "rename");
- zfree(namei_zone, tond.ni_cnd.cn_pnbuf);
out1:
if (fromnd.ni_startdir)
vrele(fromnd.ni_startdir);
- zfree(namei_zone, fromnd.ni_cnd.cn_pnbuf);
if (error == -1)
return (0);
return (error);
@@ -2652,7 +2676,7 @@ mkdir(p, uap)
return (error);
vp = nd.ni_vp;
if (vp != NULL) {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == vp)
vrele(nd.ni_dvp);
else
@@ -2665,6 +2689,7 @@ mkdir(p, uap)
vattr.va_mode = (SCARG(uap, mode) & ACCESSPERMS) &~ p->p_fd->fd_cmask;
VOP_LEASE(nd.ni_dvp, p, p->p_ucred, LEASE_WRITE);
error = VOP_MKDIR(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vput(nd.ni_dvp);
if (!error)
vput(nd.ni_vp);
@@ -2714,14 +2739,13 @@ rmdir(p, uap)
*/
if (vp->v_flag & VROOT)
error = EBUSY;
-out:
- if (!error) {
+ else {
VOP_LEASE(nd.ni_dvp, p, p->p_ucred, LEASE_WRITE);
VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE);
error = VOP_RMDIR(nd.ni_dvp, nd.ni_vp, &nd.ni_cnd);
- } else {
- VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
}
+out:
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (nd.ni_dvp == vp)
vrele(nd.ni_dvp);
else
@@ -3013,6 +3037,7 @@ revoke(p, uap)
if ((error = namei(&nd)) != 0)
return (error);
vp = nd.ni_vp;
+ NDFREE(&nd, NDF_ONLY_PNBUF);
if (vp->v_type != VCHR && vp->v_type != VBLK) {
error = EINVAL;
goto out;
@@ -3077,6 +3102,7 @@ getfh(p, uap)
error = namei(&nd);
if (error)
return (error);
+ NDFREE(&nd, NDF_ONLY_PNBUF);
vp = nd.ni_vp;
bzero(&fh, sizeof(fh));
fh.fh_fsid = vp->v_mount->mnt_stat.f_fsid;
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index ebe3497..7013308 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -52,6 +52,7 @@
#include <sys/filio.h>
#include <sys/ttycom.h>
#include <sys/conf.h>
+#include <vm/vm_zone.h>
static int vn_closefile __P((struct file *fp, struct proc *p));
static int vn_ioctl __P((struct file *fp, u_long com, caddr_t data,
@@ -70,6 +71,9 @@ struct fileops vnops =
/*
* Common code for vnode open operations.
* Check permissions, and call the VOP_OPEN or VOP_CREATE routine.
+ *
+ * Note that this do NOT free nameidata for the successful case,
+ * due to the NDINIT being done elsewhere.
*/
int
vn_open(ndp, fmode, cmode)
@@ -100,15 +104,17 @@ vn_open(ndp, fmode, cmode)
VOP_LEASE(ndp->ni_dvp, p, cred, LEASE_WRITE);
error = VOP_CREATE(ndp->ni_dvp, &ndp->ni_vp,
&ndp->ni_cnd, vap);
- vput(ndp->ni_dvp);
- if (error)
+ if (error) {
+ NDFREE(ndp, NDF_ONLY_PNBUF);
+ vput(ndp->ni_dvp);
return (error);
+ }
+ vput(ndp->ni_dvp);
ASSERT_VOP_UNLOCKED(ndp->ni_dvp, "create");
ASSERT_VOP_LOCKED(ndp->ni_vp, "create");
fmode &= ~O_TRUNC;
vp = ndp->ni_vp;
} else {
- VOP_ABORTOP(ndp->ni_dvp, &ndp->ni_cnd);
if (ndp->ni_dvp == ndp->ni_vp)
vrele(ndp->ni_dvp);
else
@@ -183,6 +189,7 @@ vn_open(ndp, fmode, cmode)
vp->v_writecount++;
return (0);
bad:
+ NDFREE(ndp, NDF_ONLY_PNBUF);
vput(vp);
return (error);
}
diff --git a/sys/kern/vnode_if.src b/sys/kern/vnode_if.src
index c418164..9fd57af 100644
--- a/sys/kern/vnode_if.src
+++ b/sys/kern/vnode_if.src
@@ -339,14 +339,6 @@ vop_readlink {
};
#
-#% abortop dvp = = =
-#
-vop_abortop {
- IN struct vnode *dvp;
- IN struct componentname *cnp;
-};
-
-#
#% inactive vp L U U
#
vop_inactive {
OpenPOWER on IntegriCloud