diff options
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/imgact_elf.c | 3 | ||||
-rw-r--r-- | sys/kern/kern_acct.c | 3 | ||||
-rw-r--r-- | sys/kern/kern_exec.c | 6 | ||||
-rw-r--r-- | sys/kern/kern_ktrace.c | 3 | ||||
-rw-r--r-- | sys/kern/kern_linker.c | 3 | ||||
-rw-r--r-- | sys/kern/kern_sig.c | 3 | ||||
-rw-r--r-- | sys/kern/link_aout.c | 3 | ||||
-rw-r--r-- | sys/kern/link_elf.c | 4 | ||||
-rw-r--r-- | sys/kern/link_elf_obj.c | 4 | ||||
-rw-r--r-- | sys/kern/uipc_usrreq.c | 4 | ||||
-rw-r--r-- | sys/kern/vfs_default.c | 1 | ||||
-rw-r--r-- | sys/kern/vfs_extattr.c | 82 | ||||
-rw-r--r-- | sys/kern/vfs_lookup.c | 7 | ||||
-rw-r--r-- | sys/kern/vfs_syscalls.c | 82 | ||||
-rw-r--r-- | sys/kern/vfs_vnops.c | 13 | ||||
-rw-r--r-- | sys/kern/vnode_if.src | 8 |
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 { |