Index: external/cddl/osnet/dist/uts/common/fs/zfs/zfs_replay.c =================================================================== RCS file: /cvsroot/src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_replay.c,v retrieving revision 1.7 diff -p -u -4 -r1.7 zfs_replay.c --- external/cddl/osnet/dist/uts/common/fs/zfs/zfs_replay.c 30 Nov 2010 10:45:27 -0000 1.7 +++ external/cddl/osnet/dist/uts/common/fs/zfs/zfs_replay.c 7 Jan 2014 11:24:20 -0000 @@ -515,8 +515,10 @@ zfs_replay_create(zfsvfs_t *zfsvfs, lr_c error = VOP_MKDIR(ZTOV(dzp), &vp, &cn, &xva.xva_vattr /*,vflg*/); break; case TX_MKXATTR: error = zfs_make_xattrdir(dzp, &xva.xva_vattr, &vp, kcred); + if (error == 0 && vp != NULL) + VOP_UNLOCK(vp); break; case TX_SYMLINK: name = (char *)(lr + 1); link = name + strlen(name) + 1; @@ -528,12 +530,10 @@ zfs_replay_create(zfsvfs_t *zfsvfs, lr_c } VOP_UNLOCK(ZTOV(dzp)); out: - if (error == 0 && vp != NULL) { - VOP_UNLOCK(vp); + if (error == 0 && vp != NULL) VN_RELE(vp); - } VN_RELE(ZTOV(dzp)); if (zfsvfs->z_fuid_replay) Index: external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c =================================================================== RCS file: /cvsroot/src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c,v retrieving revision 1.14 diff -p -u -4 -r1.14 zfs_vnops.c --- external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c 18 Oct 2012 14:22:57 -0000 1.14 +++ external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c 7 Jan 2014 11:24:21 -0000 @@ -4945,9 +4945,9 @@ out: static int zfs_netbsd_create(void *v) { - struct vop_create_args /* { + struct vop_create_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -4980,22 +4980,10 @@ zfs_netbsd_create(void *v) /* XXX !EXCL is wrong here... */ error = zfs_create(dvp, __UNCONST(cnp->cn_nameptr), vap, !EXCL, mode, vpp, cnp->cn_cred); - if (error) { - KASSERT(*vpp == NULL); - goto out; - } - KASSERT(*vpp != NULL); - - /* - * Lock *vpp in conformance to the VOP_CREATE protocol. - */ - vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY); - -out: + KASSERT((error == 0) == (*vpp != NULL)); KASSERT(VOP_ISLOCKED(dvp) == LK_EXCLUSIVE); - KASSERT((*vpp == NULL) || (VOP_ISLOCKED(*vpp) == LK_EXCLUSIVE)); /* * Unlock and release dvp because the VOP_CREATE protocol is insane. */ @@ -5056,9 +5044,9 @@ zfs_netbsd_remove(void *v) static int zfs_netbsd_mkdir(void *v) { - struct vop_mkdir_args /* { + struct vop_mkdir_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -5088,22 +5076,10 @@ zfs_netbsd_mkdir(void *v) vattr_init_mask(vap); error = zfs_mkdir(dvp, __UNCONST(cnp->cn_nameptr), vap, vpp, cnp->cn_cred, NULL, 0, NULL); - if (error) { - KASSERT(*vpp == NULL); - goto out; - } - KASSERT(*vpp != NULL); - - /* - * Lock *vpp in conformance to the VOP_MKDIR protocol. - */ - vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY); - -out: + KASSERT((error == 0) == (*vpp != NULL)); KASSERT(VOP_ISLOCKED(dvp) == LK_EXCLUSIVE); - KASSERT((*vpp == NULL) || (VOP_ISLOCKED(*vpp) == LK_EXCLUSIVE)); /* * Unlock and release dvp because the VOP_MKDIR protocol is insane. */ @@ -5372,9 +5348,9 @@ zfs_netbsd_rename(void *v) static int zfs_netbsd_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -5408,23 +5384,10 @@ zfs_netbsd_symlink(void *v) vattr_init_mask(vap); error = zfs_symlink(dvp, vpp, __UNCONST(cnp->cn_nameptr), vap, target, cnp->cn_cred, 0); - if (error) { - KASSERT(*vpp == NULL); - goto out; - } - KASSERT(*vpp != NULL); - - - /* - * Lock *vpp in conformance to the VOP_SYMLINK protocol. - */ - vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY); - -out: + KASSERT((error == 0) == (*vpp != NULL)); KASSERT(VOP_ISLOCKED(dvp) == LK_EXCLUSIVE); - KASSERT((*vpp == NULL) || (VOP_ISLOCKED(*vpp) == LK_EXCLUSIVE)); /* * Unlock and release dvp because the VOP_SYMLINK protocol is insane. */ Index: lib/libp2k/p2k.c =================================================================== RCS file: /cvsroot/src/lib/libp2k/p2k.c,v retrieving revision 1.60 diff -p -u -4 -r1.60 p2k.c --- lib/libp2k/p2k.c 23 Nov 2012 14:27:14 -0000 1.60 +++ lib/libp2k/p2k.c 7 Jan 2014 11:25:06 -0000 @@ -807,9 +807,8 @@ do_makenode(struct puffs_usermount *pu, assert(RUMP_VOP_ISLOCKED(dvp) == 0); freecn(cn); if (rv == 0) { - RUMP_VOP_UNLOCK(vp); p2n = getp2n(p2m, vp, true, p2n); puffs_newinfo_setcookie(pni, p2n); } else { free(p2n); Index: sys/coda/coda_vnops.c =================================================================== RCS file: /cvsroot/src/sys/coda/coda_vnops.c,v retrieving revision 1.91 diff -p -u -4 -r1.91 coda_vnops.c --- sys/coda/coda_vnops.c 17 Oct 2013 20:55:30 -0000 1.91 +++ sys/coda/coda_vnops.c 7 Jan 2014 11:25:11 -0000 @@ -1023,9 +1023,9 @@ coda_lookup(void *v) int coda_create(void *v) { /* true args */ - struct vop_create_args *ap = v; + struct vop_create_v2_args *ap = v; vnode_t *dvp = ap->a_dvp; struct cnode *dcp = VTOC(dvp); struct vattr *va = ap->a_vap; int exclusive = 1; @@ -1096,21 +1096,16 @@ coda_create(void *v) error));) } /* - * vnodeops(9) says that we must unlock the parent and lock the child. - * XXX Should we lock the child first? + * vnodeops(9) says that we must unlock the parent. */ vput(dvp); if (!error) { #ifdef CODA_VERBOSE if ((cnp->cn_flags & LOCKLEAF) == 0) /* This should not happen; flags are for lookup only. */ printf("%s: LOCKLEAF not set!\n", __func__); - - if ((error = vn_lock(*ap->a_vpp, LK_EXCLUSIVE))) - /* XXX Perhaps avoid this panic. */ - panic("%s: couldn't lock child", __func__); #endif } return(error); @@ -1356,9 +1351,9 @@ coda_rename(void *v) int coda_mkdir(void *v) { /* true args */ - struct vop_mkdir_args *ap = v; + struct vop_mkdir_v2_args *ap = v; vnode_t *dvp = ap->a_dvp; struct cnode *dcp = VTOC(dvp); struct componentname *cnp = ap->a_cnp; struct vattr *va = ap->a_vap; @@ -1421,18 +1416,10 @@ coda_mkdir(void *v) } /* * Currently, all mkdirs explicitly vput their dvp's. - * It also appears that we *must* lock the vpp, since - * lockleaf isn't set, but someone down the road is going - * to try to unlock the new directory. */ vput(dvp); - if (!error) { - if ((error = vn_lock(*ap->a_vpp, LK_EXCLUSIVE))) { - panic("%s: couldn't lock child", __func__); - } - } return(error); } @@ -1506,9 +1493,9 @@ exit: int coda_symlink(void *v) { /* true args */ - struct vop_symlink_args *ap = v; + struct vop_symlink_v2_args *ap = v; vnode_t *dvp = ap->a_dvp; struct cnode *dcp = VTOC(dvp); /* a_vpp is used in place below */ struct componentname *cnp = ap->a_cnp; @@ -1575,10 +1562,11 @@ coda_symlink(void *v) saved_cn_flags = cnp->cn_flags; cnp->cn_flags &= ~(MODMASK | OPMASK); cnp->cn_flags |= LOOKUP; error = VOP_LOOKUP(dvp, ap->a_vpp, cnp); + if (ap->a_vpp != NULL && error == 0) + VOP_UNLOCK(*ap->a_vpp); cnp->cn_flags = saved_cn_flags; - /* Either an error occurs, or ap->a_vpp is locked. */ } exit: /* unlock and deference parent */ Index: sys/fs/adosfs/advnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/adosfs/advnops.c,v retrieving revision 1.41 diff -p -u -4 -r1.41 advnops.c --- sys/fs/adosfs/advnops.c 18 Mar 2013 19:35:35 -0000 1.41 +++ sys/fs/adosfs/advnops.c 7 Jan 2014 11:25:14 -0000 @@ -420,9 +420,9 @@ adosfs_link(void *v) int adosfs_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; Index: sys/fs/cd9660/cd9660_vnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/cd9660/cd9660_vnops.c,v retrieving revision 1.45 diff -p -u -4 -r1.45 cd9660_vnops.c --- sys/fs/cd9660/cd9660_vnops.c 23 Jun 2013 07:28:36 -0000 1.45 +++ sys/fs/cd9660/cd9660_vnops.c 7 Jan 2014 11:25:14 -0000 @@ -677,9 +677,9 @@ cd9660_link(void *v) int cd9660_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; Index: sys/fs/filecorefs/filecore_vnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/filecorefs/filecore_vnops.c,v retrieving revision 1.39 diff -p -u -4 -r1.39 filecore_vnops.c --- sys/fs/filecorefs/filecore_vnops.c 20 Oct 2013 17:14:48 -0000 1.39 +++ sys/fs/filecorefs/filecore_vnops.c 7 Jan 2014 11:25:14 -0000 @@ -432,9 +432,9 @@ filecore_link(void *v) int filecore_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; Index: sys/fs/msdosfs/msdosfs_lookup.c =================================================================== RCS file: /cvsroot/src/sys/fs/msdosfs/msdosfs_lookup.c,v retrieving revision 1.30 diff -p -u -4 -r1.30 msdosfs_lookup.c --- sys/fs/msdosfs/msdosfs_lookup.c 24 Dec 2013 16:51:24 -0000 1.30 +++ sys/fs/msdosfs/msdosfs_lookup.c 7 Jan 2014 11:25:15 -0000 @@ -710,9 +710,14 @@ createde(struct denode *dep, struct deno diroffset = MSDOSFSROOT_OFS; else diroffset = 0; } - return deget(pmp, dirclust, diroffset, depp); + error = deget(pmp, dirclust, diroffset, depp); +#ifndef MAKEFS + if (error == 0) + VOP_UNLOCK(DETOV(*depp)); +#endif + return error; } return 0; Index: sys/fs/msdosfs/msdosfs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/msdosfs/msdosfs_vnops.c,v retrieving revision 1.87 diff -p -u -4 -r1.87 msdosfs_vnops.c --- sys/fs/msdosfs/msdosfs_vnops.c 2 Nov 2013 10:30:18 -0000 1.87 +++ sys/fs/msdosfs/msdosfs_vnops.c 7 Jan 2014 11:25:15 -0000 @@ -103,9 +103,9 @@ __KERNEL_RCSID(0, "$NetBSD: msdosfs_vnop */ int msdosfs_create(void *v) { - struct vop_create_args /* { + struct vop_create_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1167,9 +1167,9 @@ static const struct { int msdosfs_mkdir(void *v) { - struct vop_mkdir_args /* { + struct vop_mkdir_v2_args /* { struct vnode *a_dvp; struvt vnode **a_vpp; struvt componentname *a_cnp; struct vattr *a_vap; Index: sys/fs/nfs/client/nfs_clvnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/nfs/client/nfs_clvnops.c,v retrieving revision 1.1.1.1 diff -p -u -4 -r1.1.1.1 nfs_clvnops.c --- sys/fs/nfs/client/nfs_clvnops.c 30 Sep 2013 07:19:20 -0000 1.1.1.1 +++ sys/fs/nfs/client/nfs_clvnops.c 7 Jan 2014 11:25:16 -0000 @@ -1502,9 +1502,9 @@ nfs_mknodrpc(struct vnode *dvp, struct v * just call nfs_mknodrpc() to do the work. */ /* ARGSUSED */ static int -nfs_mknod(struct vop_mknod_args *ap) +nfs_mknod(struct vop_mknod_v2_args *ap) { return (nfs_mknodrpc(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap)); } @@ -1535,9 +1535,9 @@ nfs_get_cverf(void) /* * nfs file create call */ static int -nfs_create(struct vop_create_args *ap) +nfs_create(struct vop_create_v2_args *ap) { struct vnode *dvp = ap->a_dvp; struct vattr *vap = ap->a_vap; struct componentname *cnp = ap->a_cnp; @@ -2030,9 +2030,9 @@ nfs_link(struct vop_link_args *ap) /* * nfs symbolic link create call */ static int -nfs_symlink(struct vop_symlink_args *ap) +nfs_symlink(struct vop_symlink_v2_args *ap) { struct vnode *dvp = ap->a_dvp; struct vattr *vap = ap->a_vap; struct componentname *cnp = ap->a_cnp; @@ -2106,9 +2106,9 @@ nfs_symlink(struct vop_symlink_args *ap) /* * nfs make dir call */ static int -nfs_mkdir(struct vop_mkdir_args *ap) +nfs_mkdir(struct vop_mkdir_v2_args *ap) { struct vnode *dvp = ap->a_dvp; struct vattr *vap = ap->a_vap; struct componentname *cnp = ap->a_cnp; Index: sys/fs/nilfs/nilfs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/nilfs/nilfs_vnops.c,v retrieving revision 1.24 diff -p -u -4 -r1.24 nilfs_vnops.c --- sys/fs/nilfs/nilfs_vnops.c 18 Oct 2013 19:57:28 -0000 1.24 +++ sys/fs/nilfs/nilfs_vnops.c 7 Jan 2014 11:25:17 -0000 @@ -1082,9 +1082,9 @@ nilfs_access(void *v) int nilfs_create(void *v) { - struct vop_create_args /* { + struct vop_create_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1106,9 +1106,9 @@ nilfs_create(void *v) int nilfs_mknod(void *v) { - struct vop_mknod_args /* { + struct vop_mknod_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1130,9 +1130,9 @@ nilfs_mknod(void *v) int nilfs_mkdir(void *v) { - struct vop_mkdir_args /* { + struct vop_mkdir_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1227,9 +1227,9 @@ nilfs_do_symlink(struct nilfs_node *nilf int nilfs_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; Index: sys/fs/puffs/puffs_node.c =================================================================== RCS file: /cvsroot/src/sys/fs/puffs/puffs_node.c,v retrieving revision 1.30 diff -p -u -4 -r1.30 puffs_node.c --- sys/fs/puffs/puffs_node.c 17 Oct 2013 21:03:27 -0000 1.30 +++ sys/fs/puffs/puffs_node.c 7 Jan 2014 11:25:18 -0000 @@ -242,9 +242,8 @@ puffs_newnode(struct mount *mp, struct v if (error) return error; vp->v_type = type; - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); *vpp = vp; if (PUFFS_USE_NAMECACHE(pmp)) cache_enter(dvp, vp, cnp->cn_nameptr, cnp->cn_namelen, Index: sys/fs/puffs/puffs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/puffs/puffs_vnops.c,v retrieving revision 1.177 diff -p -u -4 -r1.177 puffs_vnops.c --- sys/fs/puffs/puffs_vnops.c 17 Oct 2013 21:03:27 -0000 1.177 +++ sys/fs/puffs/puffs_vnops.c 7 Jan 2014 11:25:18 -0000 @@ -754,9 +754,9 @@ do { \ int puffs_vnop_create(void *v) { - struct vop_create_args /* { + struct vop_create_v2_args /* { const struct vnodeop_desc *a_desc; struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; @@ -818,9 +818,9 @@ puffs_vnop_create(void *v) int puffs_vnop_mknod(void *v) { - struct vop_mknod_args /* { + struct vop_mknod_v2_args /* { const struct vnodeop_desc *a_desc; struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; @@ -1815,9 +1815,9 @@ puffs_vnop_remove(void *v) int puffs_vnop_mkdir(void *v) { - struct vop_mkdir_args /* { + struct vop_mkdir_v2_args /* { const struct vnodeop_desc *a_desc; struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; @@ -1980,9 +1980,9 @@ puffs_vnop_link(void *v) int puffs_vnop_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { const struct vnodeop_desc *a_desc; struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; Index: sys/fs/smbfs/smbfs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/smbfs/smbfs_vnops.c,v retrieving revision 1.86 diff -p -u -4 -r1.86 smbfs_vnops.c --- sys/fs/smbfs/smbfs_vnops.c 18 Mar 2013 19:35:39 -0000 1.86 +++ sys/fs/smbfs/smbfs_vnops.c 7 Jan 2014 11:25:19 -0000 @@ -572,9 +572,9 @@ smbfs_write(void *v) */ int smbfs_create(void *v) { - struct vop_create_args /* { + struct vop_create_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -601,8 +601,10 @@ smbfs_create(void *v) error = smbfs_smb_lookup(dnp, name, nmlen, &fattr, &scred); if (error) goto out; error = smbfs_nget(VTOVFS(dvp), dvp, name, nmlen, &fattr, ap->a_vpp); + if (ap->a_vpp != NULL && error == 0) + VOP_UNLOCK(*ap->a_vpp); if (error) goto out; cache_enter(dvp, *ap->a_vpp, cnp->cn_nameptr, cnp->cn_namelen, @@ -774,9 +776,9 @@ smbfs_symlink(void *v) int smbfs_mkdir(void *v) { - struct vop_mkdir_args /* { + struct vop_mkdir_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -804,8 +806,10 @@ smbfs_mkdir(void *v) error = smbfs_smb_lookup(dnp, name, len, &fattr, &scred); if (error) goto out; error = smbfs_nget(VTOVFS(dvp), dvp, name, len, &fattr, &vp); + if (error == 0) + VOP_UNLOCK(vp); if (error) goto out; *ap->a_vpp = vp; Index: sys/fs/sysvbfs/sysvbfs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/sysvbfs/sysvbfs_vnops.c,v retrieving revision 1.49 diff -p -u -4 -r1.49 sysvbfs_vnops.c --- sys/fs/sysvbfs/sysvbfs_vnops.c 24 Dec 2013 09:56:18 -0000 1.49 +++ sys/fs/sysvbfs/sysvbfs_vnops.c 7 Jan 2014 11:25:19 -0000 @@ -126,9 +126,9 @@ sysvbfs_lookup(void *arg) int sysvbfs_create(void *arg) { - struct vop_create_args /* { + struct vop_create_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -165,8 +165,9 @@ sysvbfs_create(void *arg) bnode = (*a->a_vpp)->v_data; bnode->update_ctime = true; bnode->update_mtime = true; bnode->update_atime = true; + VOP_UNLOCK(*a->a_vpp); unlock_exit: /* unlock parent directory */ vput(a->a_dvp); /* locked at sysvbfs_lookup(); */ Index: sys/fs/tmpfs/tmpfs_subr.c =================================================================== RCS file: /cvsroot/src/sys/fs/tmpfs/tmpfs_subr.c,v retrieving revision 1.93 diff -p -u -4 -r1.93 tmpfs_subr.c --- sys/fs/tmpfs/tmpfs_subr.c 3 Jan 2014 09:53:12 -0000 1.93 +++ sys/fs/tmpfs/tmpfs_subr.c 7 Jan 2014 11:25:20 -0000 @@ -423,8 +423,10 @@ tmpfs_construct_node(vnode_t *dvp, vnode /* Update the parent's timestamps. */ tmpfs_update(dvp, TMPFS_UPDATE_MTIME | TMPFS_UPDATE_CTIME); out: + if (vpp != NULL && error == 0) + VOP_UNLOCK(*vpp); vput(dvp); return error; } Index: sys/fs/tmpfs/tmpfs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/tmpfs/tmpfs_vnops.c,v retrieving revision 1.111 diff -p -u -4 -r1.111 tmpfs_vnops.c --- sys/fs/tmpfs/tmpfs_vnops.c 3 Jan 2014 09:53:12 -0000 1.111 +++ sys/fs/tmpfs/tmpfs_vnops.c 7 Jan 2014 11:25:20 -0000 @@ -310,9 +310,9 @@ out: int tmpfs_create(void *v) { - struct vop_create_args /* { + struct vop_create_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -328,9 +328,9 @@ tmpfs_create(void *v) int tmpfs_mknod(void *v) { - struct vop_mknod_args /* { + struct vop_mknod_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -803,9 +803,9 @@ out: int tmpfs_mkdir(void *v) { - struct vop_mkdir_args /* { + struct vop_mkdir_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -914,9 +914,9 @@ out: int tmpfs_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; Index: sys/fs/udf/udf_subr.c =================================================================== RCS file: /cvsroot/src/sys/fs/udf/udf_subr.c,v retrieving revision 1.122 diff -p -u -4 -r1.122 udf_subr.c --- sys/fs/udf/udf_subr.c 21 Nov 2013 23:42:09 -0000 1.122 +++ sys/fs/udf/udf_subr.c 7 Jan 2014 11:25:21 -0000 @@ -5780,19 +5780,14 @@ udf_create_node_raw(struct vnode *dvp, s error = getnewvnode(VT_UDF, ump->vfs_mountp, vnodeops, NULL, &nvp); if (error) return error; - /* lock node */ - error = vn_lock(nvp, LK_EXCLUSIVE | LK_RETRY); - if (error) - goto error_out_unget; - /* reserve space for one logical block */ vpart_num = ump->node_part; error = udf_reserve_space(ump, NULL, UDF_C_NODE, vpart_num, 1, /* can_fail */ true); if (error) - goto error_out_unlock; + goto error_out_unget; /* allocate node */ error = udf_allocate_space(ump, NULL, UDF_C_NODE, vpart_num, 1, &lmapping); @@ -5875,9 +5870,9 @@ udf_create_node_raw(struct vnode *dvp, s udf_free_allocated_space(ump, lb_num, vpart_num, 1); /* recycle udf_node */ udf_dispose_node(udf_node); - vput(nvp); + vrele(nvp); *vpp = NULL; return error; } @@ -5892,11 +5887,8 @@ udf_create_node_raw(struct vnode *dvp, s error_out_unreserve: udf_do_unreserve_space(ump, NULL, vpart_num, 1); -error_out_unlock: - VOP_UNLOCK(nvp); - error_out_unget: nvp->v_data = NULL; ungetnewvnode(nvp); Index: sys/fs/udf/udf_vnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/udf/udf_vnops.c,v retrieving revision 1.87 diff -p -u -4 -r1.87 udf_vnops.c --- sys/fs/udf/udf_vnops.c 18 Oct 2013 19:56:55 -0000 1.87 +++ sys/fs/udf/udf_vnops.c 7 Jan 2014 11:25:22 -0000 @@ -1452,9 +1452,9 @@ udf_access(void *v) int udf_create(void *v) { - struct vop_create_args /* { + struct vop_create_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1476,9 +1476,9 @@ udf_create(void *v) int udf_mknod(void *v) { - struct vop_mknod_args /* { + struct vop_mknod_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1500,9 +1500,9 @@ udf_mknod(void *v) int udf_mkdir(void *v) { - struct vop_mkdir_args /* { + struct vop_mkdir_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1698,9 +1698,9 @@ udf_do_symlink(struct udf_node *udf_node int udf_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; Index: sys/fs/union/union_subr.c =================================================================== RCS file: /cvsroot/src/sys/fs/union/union_subr.c,v retrieving revision 1.57 diff -p -u -4 -r1.57 union_subr.c --- sys/fs/union/union_subr.c 17 Oct 2013 21:03:50 -0000 1.57 +++ sys/fs/union/union_subr.c 7 Jan 2014 11:25:22 -0000 @@ -933,8 +933,9 @@ union_vn_create(struct vnode **vpp, stru error = VOP_CREATE(un->un_dirvp, &vp, &cn, vap); if (error) return error; + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); error = VOP_OPEN(vp, fmode, cred); if (error) { vput(vp); return error; Index: sys/fs/union/union_vnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/union/union_vnops.c,v retrieving revision 1.49 diff -p -u -4 -r1.49 union_vnops.c --- sys/fs/union/union_vnops.c 21 Nov 2011 18:29:22 -0000 1.49 +++ sys/fs/union/union_vnops.c 7 Jan 2014 11:25:22 -0000 @@ -449,13 +449,18 @@ start: uerror = union_mkshadow(um, upperdvp, cnp, &uppervp); vn_lock(upperdvp, LK_EXCLUSIVE | LK_RETRY); if (uerror == 0 && cnp->cn_nameiop != LOOKUP) { - vput(uppervp); + vrele(uppervp); if (lowervp != NULLVP) vput(lowervp); goto start; } + /* + * XXX: lock upper node until lookup returns + * unlocked nodes. + */ + vn_lock(uppervp, LK_EXCLUSIVE | LK_RETRY); } if (uerror) { if (lowervp != NULLVP) { vput(lowervp); @@ -484,9 +489,9 @@ start: int union_create(void *v) { - struct vop_create_args /* { + struct vop_create_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -507,12 +512,15 @@ union_create(void *v) error = VOP_CREATE(dvp, &vp, cnp, ap->a_vap); if (error) return (error); + /* XXX: lock upper node until lookup returns unlocked nodes. */ + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); error = union_allocvp(ap->a_vpp, mp, NULLVP, NULLVP, cnp, vp, NULLVP, 1); + VOP_UNLOCK(vp); if (error) - vput(vp); + vrele(vp); return (error); } vput(ap->a_dvp); @@ -538,9 +546,9 @@ union_whiteout(void *v) int union_mknod(void *v) { - struct vop_mknod_args /* { + struct vop_mknod_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -561,12 +569,15 @@ union_mknod(void *v) error = VOP_MKNOD(dvp, &vp, cnp, ap->a_vap); if (error) return (error); + /* XXX: lock upper node until lookup returns unlocked nodes. */ + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); error = union_allocvp(ap->a_vpp, mp, NULLVP, NULLVP, cnp, vp, NULLVP, 1); + VOP_UNLOCK(vp); if (error) - vput(vp); + vrele(vp); return (error); } vput(ap->a_dvp); @@ -1348,9 +1359,9 @@ out: int union_mkdir(void *v) { - struct vop_mkdir_args /* { + struct vop_mkdir_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1371,12 +1382,15 @@ union_mkdir(void *v) vrele(ap->a_dvp); return (error); } + /* XXX: lock upper node until lookup returns unlocked nodes. */ + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); error = union_allocvp(ap->a_vpp, ap->a_dvp->v_mount, ap->a_dvp, NULLVP, cnp, vp, NULLVP, 1); + VOP_UNLOCK(vp); if (error) - vput(vp); + vrele(vp); vrele(ap->a_dvp); return (error); } @@ -1436,9 +1450,9 @@ union_rmdir(void *v) int union_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; Index: sys/fs/unionfs/unionfs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/unionfs/unionfs_vnops.c,v retrieving revision 1.7 diff -p -u -4 -r1.7 unionfs_vnops.c --- sys/fs/unionfs/unionfs_vnops.c 5 Nov 2012 17:27:39 -0000 1.7 +++ sys/fs/unionfs/unionfs_vnops.c 7 Jan 2014 11:25:23 -0000 @@ -290,9 +290,9 @@ unionfs_lookup_out: static int unionfs_create(void *v) { - struct vop_create_args *ap = v; + struct vop_create_v2_args *ap = v; struct unionfs_node *dunp; struct componentname *cnp; struct vnode *udvp; struct vnode *vp; @@ -358,9 +358,9 @@ unionfs_whiteout(void *v) static int unionfs_mknod(void *v) { - struct vop_mknod_args *ap = v; + struct vop_mknod_v2_args *ap = v; struct unionfs_node *dunp; struct componentname *cnp; struct vnode *udvp; struct vnode *vp; @@ -1161,9 +1161,9 @@ unionfs_rename_abort: static int unionfs_mkdir(void *v) { - struct vop_mkdir_args *ap = v; + struct vop_mkdir_v2_args *ap = v; int error; struct unionfs_node *dunp; struct componentname *cnp; struct vnode *udvp; @@ -1258,9 +1258,9 @@ unionfs_rmdir(void *v) static int unionfs_symlink(void *v) { - struct vop_symlink_args *ap = v; + struct vop_symlink_v2_args *ap = v; int error; struct unionfs_node *dunp; struct componentname *cnp; struct vnode *udvp; Index: sys/fs/v7fs/v7fs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/v7fs/v7fs_vnops.c,v retrieving revision 1.13 diff -p -u -4 -r1.13 v7fs_vnops.c --- sys/fs/v7fs/v7fs_vnops.c 20 Nov 2013 23:44:23 -0000 1.13 +++ sys/fs/v7fs/v7fs_vnops.c 7 Jan 2014 11:25:24 -0000 @@ -188,9 +188,9 @@ v7fs_lookup(void *v) int v7fs_create(void *v) { - struct vop_create_args /* { + struct vop_create_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -238,8 +238,10 @@ v7fs_create(void *v) newnode->update_atime = true; DPRINTF("allocated %s->#%d\n", a->a_cnp->cn_nameptr, ino); unlock_exit: + if (a->a_vpp != NULL && error == 0) + VOP_UNLOCK(*a->a_vpp); /* unlock parent directory */ vput(a->a_dvp); /* locked at v7fs_lookup(); */ return error; @@ -247,9 +249,9 @@ unlock_exit: int v7fs_mknod(void *v) { - struct vop_mknod_args /* { + struct vop_mknod_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -290,8 +292,10 @@ v7fs_mknod(void *v) newnode->update_mtime = true; newnode->update_atime = true; unlock_exit: + if (a->a_vpp != NULL && error == 0) + VOP_UNLOCK(*a->a_vpp); vput(dvp); return error; } @@ -809,9 +813,9 @@ out: int v7fs_mkdir(void *v) { - struct vop_mkdir_args /* { + struct vop_mkdir_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -848,8 +852,10 @@ v7fs_mkdir(void *v) newnode->update_mtime = true; newnode->update_atime = true; unlock_exit: + if (a->a_vpp != NULL && error == 0) + VOP_UNLOCK(*a->a_vpp); vput(dvp); return error; } @@ -1234,9 +1240,9 @@ v7fs_update(struct vnode *vp, const stru int v7fs_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1285,8 +1291,10 @@ v7fs_symlink(void *v) newnode->update_ctime = true; newnode->update_mtime = true; newnode->update_atime = true; unlock_exit: + if (a->a_vpp != NULL && error == 0) + VOP_UNLOCK(*a->a_vpp); /* unlock parent directory */ vput(a->a_dvp); return error; Index: sys/kern/uipc_usrreq.c =================================================================== RCS file: /cvsroot/src/sys/kern/uipc_usrreq.c,v retrieving revision 1.148 diff -p -u -4 -r1.148 uipc_usrreq.c --- sys/kern/uipc_usrreq.c 29 Oct 2013 09:53:51 -0000 1.148 +++ sys/kern/uipc_usrreq.c 7 Jan 2014 11:25:24 -0000 @@ -965,8 +965,9 @@ unp_bind(struct socket *so, struct mbuf pathbuf_destroy(pb); goto bad; } vp = nd.ni_vp; + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); solock(so); vp->v_socket = unp->unp_socket; unp->unp_vnode = vp; unp->unp_addrlen = addrlen; Index: sys/kern/vfs_syscalls.c =================================================================== RCS file: /cvsroot/src/sys/kern/vfs_syscalls.c,v retrieving revision 1.471 diff -p -u -4 -r1.471 vfs_syscalls.c --- sys/kern/vfs_syscalls.c 27 Nov 2013 17:24:44 -0000 1.471 +++ sys/kern/vfs_syscalls.c 7 Jan 2014 11:25:26 -0000 @@ -2252,16 +2252,16 @@ do_sys_mknodat(struct lwp *l, int fdat, case VOP_MKNOD_DESCOFFSET: error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr); if (error == 0) - vput(nd.ni_vp); + vrele(nd.ni_vp); break; case VOP_CREATE_DESCOFFSET: error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr); if (error == 0) - vput(nd.ni_vp); + vrele(nd.ni_vp); break; } } else { VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd); @@ -2340,9 +2340,9 @@ do_sys_mkfifoat(struct lwp *l, int fdat, /* We will read cwdi->cwdi_cmask unlocked. */ vattr.va_mode = (mode & ALLPERMS) &~ p->p_cwdi->cwdi_cmask; error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr); if (error == 0) - vput(nd.ni_vp); + vrele(nd.ni_vp); pathbuf_destroy(pb); return (error); } @@ -2497,9 +2497,9 @@ do_sys_symlinkat(struct lwp *l, const ch /* We will read cwdi->cwdi_cmask unlocked. */ vattr.va_mode = ACCESSPERMS &~ p->p_cwdi->cwdi_cmask; error = VOP_SYMLINK(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr, path); if (error == 0) - vput(nd.ni_vp); + vrele(nd.ni_vp); out2: pathbuf_destroy(linkpb); out1: PNBUF_PUT(path); @@ -4556,9 +4556,9 @@ do_sys_mkdirat(struct lwp *l, int fdat, /* We will read cwdi->cwdi_cmask unlocked. */ vattr.va_mode = (mode & ACCESSPERMS) &~ p->p_cwdi->cwdi_cmask; error = VOP_MKDIR(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr); if (!error) - vput(nd.ni_vp); + vrele(nd.ni_vp); pathbuf_destroy(pb); return (error); } Index: sys/kern/vfs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/kern/vfs_vnops.c,v retrieving revision 1.186 diff -p -u -4 -r1.186 vfs_vnops.c --- sys/kern/vfs_vnops.c 12 Nov 2012 11:00:07 -0000 1.186 +++ sys/kern/vfs_vnops.c 7 Jan 2014 11:25:26 -0000 @@ -187,8 +187,9 @@ vn_open(struct nameidata *ndp, int fmode if (error) goto out; fmode &= ~O_TRUNC; vp = ndp->ni_vp; + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); } else { VOP_ABORTOP(ndp->ni_dvp, &ndp->ni_cnd); if (ndp->ni_dvp == ndp->ni_vp) vrele(ndp->ni_dvp); Index: sys/kern/vnode_if.c =================================================================== RCS file: /cvsroot/src/sys/kern/vnode_if.c,v retrieving revision 1.89 diff -p -u -4 -r1.89 vnode_if.c --- sys/kern/vnode_if.c 17 Jul 2013 21:21:34 -0000 1.89 +++ sys/kern/vnode_if.c 7 Jan 2014 11:25:26 -0000 @@ -1,5 +1,5 @@ -/* $NetBSD: vnode_if.c,v 1.89 2013/07/17 21:21:34 pooka Exp $ */ +/* $NetBSD$ */ /* * Warning: DO NOT EDIT! This file is automatically generated! * (Modifications made here may easily be lost!) @@ -39,9 +39,9 @@ * SUCH DAMAGE. */ #include -__KERNEL_RCSID(0, "$NetBSD: vnode_if.c,v 1.89 2013/07/17 21:21:34 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD$"); #include #include #include @@ -126,19 +126,19 @@ VOP_LOOKUP(struct vnode *dvp, return error; } const int vop_create_vp_offsets[] = { - VOPARG_OFFSETOF(struct vop_create_args,a_dvp), + VOPARG_OFFSETOF(struct vop_create_v2_args,a_dvp), VDESC_NO_OFFSET }; const struct vnodeop_desc vop_create_desc = { VOP_CREATE_DESCOFFSET, "vop_create", 0 | VDESC_VP0_WILLPUT, vop_create_vp_offsets, - VOPARG_OFFSETOF(struct vop_create_args, a_vpp), + VOPARG_OFFSETOF(struct vop_create_v2_args, a_vpp), VDESC_NO_OFFSET, - VOPARG_OFFSETOF(struct vop_create_args, a_cnp), + VOPARG_OFFSETOF(struct vop_create_v2_args, a_cnp), }; int VOP_CREATE(struct vnode *dvp, struct vnode **vpp, @@ -146,9 +146,9 @@ VOP_CREATE(struct vnode *dvp, struct vattr *vap) { int error; bool mpsafe; - struct vop_create_args a; + struct vop_create_v2_args a; a.a_desc = VDESC(vop_create); a.a_dvp = dvp; a.a_vpp = vpp; a.a_cnp = cnp; @@ -165,19 +165,19 @@ VOP_CREATE(struct vnode *dvp, return error; } const int vop_mknod_vp_offsets[] = { - VOPARG_OFFSETOF(struct vop_mknod_args,a_dvp), + VOPARG_OFFSETOF(struct vop_mknod_v2_args,a_dvp), VDESC_NO_OFFSET }; const struct vnodeop_desc vop_mknod_desc = { VOP_MKNOD_DESCOFFSET, "vop_mknod", 0 | VDESC_VP0_WILLPUT, vop_mknod_vp_offsets, - VOPARG_OFFSETOF(struct vop_mknod_args, a_vpp), + VOPARG_OFFSETOF(struct vop_mknod_v2_args, a_vpp), VDESC_NO_OFFSET, - VOPARG_OFFSETOF(struct vop_mknod_args, a_cnp), + VOPARG_OFFSETOF(struct vop_mknod_v2_args, a_cnp), }; int VOP_MKNOD(struct vnode *dvp, struct vnode **vpp, @@ -185,9 +185,9 @@ VOP_MKNOD(struct vnode *dvp, struct vattr *vap) { int error; bool mpsafe; - struct vop_mknod_args a; + struct vop_mknod_v2_args a; a.a_desc = VDESC(vop_mknod); a.a_dvp = dvp; a.a_vpp = vpp; a.a_cnp = cnp; @@ -803,19 +803,19 @@ VOP_RENAME(struct vnode *fdvp, return error; } const int vop_mkdir_vp_offsets[] = { - VOPARG_OFFSETOF(struct vop_mkdir_args,a_dvp), + VOPARG_OFFSETOF(struct vop_mkdir_v2_args,a_dvp), VDESC_NO_OFFSET }; const struct vnodeop_desc vop_mkdir_desc = { VOP_MKDIR_DESCOFFSET, "vop_mkdir", 0 | VDESC_VP0_WILLPUT, vop_mkdir_vp_offsets, - VOPARG_OFFSETOF(struct vop_mkdir_args, a_vpp), + VOPARG_OFFSETOF(struct vop_mkdir_v2_args, a_vpp), VDESC_NO_OFFSET, - VOPARG_OFFSETOF(struct vop_mkdir_args, a_cnp), + VOPARG_OFFSETOF(struct vop_mkdir_v2_args, a_cnp), }; int VOP_MKDIR(struct vnode *dvp, struct vnode **vpp, @@ -823,9 +823,9 @@ VOP_MKDIR(struct vnode *dvp, struct vattr *vap) { int error; bool mpsafe; - struct vop_mkdir_args a; + struct vop_mkdir_v2_args a; a.a_desc = VDESC(vop_mkdir); a.a_dvp = dvp; a.a_vpp = vpp; a.a_cnp = cnp; @@ -875,19 +875,19 @@ VOP_RMDIR(struct vnode *dvp, return error; } const int vop_symlink_vp_offsets[] = { - VOPARG_OFFSETOF(struct vop_symlink_args,a_dvp), + VOPARG_OFFSETOF(struct vop_symlink_v2_args,a_dvp), VDESC_NO_OFFSET }; const struct vnodeop_desc vop_symlink_desc = { VOP_SYMLINK_DESCOFFSET, "vop_symlink", 0 | VDESC_VP0_WILLPUT, vop_symlink_vp_offsets, - VOPARG_OFFSETOF(struct vop_symlink_args, a_vpp), + VOPARG_OFFSETOF(struct vop_symlink_v2_args, a_vpp), VDESC_NO_OFFSET, - VOPARG_OFFSETOF(struct vop_symlink_args, a_cnp), + VOPARG_OFFSETOF(struct vop_symlink_v2_args, a_cnp), }; int VOP_SYMLINK(struct vnode *dvp, struct vnode **vpp, @@ -896,9 +896,9 @@ VOP_SYMLINK(struct vnode *dvp, char *target) { int error; bool mpsafe; - struct vop_symlink_args a; + struct vop_symlink_v2_args a; a.a_desc = VDESC(vop_symlink); a.a_dvp = dvp; a.a_vpp = vpp; a.a_cnp = cnp; Index: sys/kern/vnode_if.sh =================================================================== RCS file: /cvsroot/src/sys/kern/vnode_if.sh,v retrieving revision 1.59 diff -p -u -4 -r1.59 vnode_if.sh --- sys/kern/vnode_if.sh 17 Jul 2013 21:20:53 -0000 1.59 +++ sys/kern/vnode_if.sh 7 Jan 2014 11:25:26 -0000 @@ -96,8 +96,9 @@ awk_parser=' /^#/ { next; } # First line of description /^vop_/ { name=$1; + args_name=$1; argc=0; willmake=-1; next; } @@ -107,8 +108,13 @@ awk_parser=' next; } # Middle lines of description { + if ($1 == "VERSION") { + args_name=args_name "_v" $2; + next; + } + argdir[argc] = $1; i=2; if ($2 == "LOCKED=YES") { lockstate[argc] = 1; @@ -221,9 +227,9 @@ function doit() { # Declare arg struct, descriptor. if (!rump) { printf("\n#define %s_DESCOFFSET %d\n", toupper(name), vop_offset++); - printf("struct %s_args {\n", name); + printf("struct %s_args {\n", args_name); printf("\tconst struct vnodeop_desc * a_desc;\n"); for (i=0; ivdesc_vpp_offset != VDESC_NO_OFFSET && !error) { vppp = VOPARG_OFFSETTO(struct vnode***, descp->vdesc_vpp_offset, ap); /* - * Only vop_lookup, vop_create, vop_makedir, 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_lookup doesn't call bypass + * Only vop_lookup, vop_create, vop_makedir, vop_mknod + * and vop_symlink return vpp's. vop_lookup doesn't call bypass * as a lookup on "." would generate a locking error. - * So all the calls which get us here have a locked vpp. :-) + * So all the calls which get us here have a unlocked vpp. :-) */ + /* XXX: lock node until lookup returns unlocked nodes. */ + vn_lock(**vppp, LK_EXCLUSIVE | LK_RETRY); error = layer_node_create(mp, **vppp, *vppp); + VOP_UNLOCK(**vppp); if (error) { - vput(**vppp); + vrele(**vppp); **vppp = NULL; } } return error; Index: sys/miscfs/kernfs/kernfs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/miscfs/kernfs/kernfs_vnops.c,v retrieving revision 1.147 diff -p -u -4 -r1.147 kernfs_vnops.c --- sys/miscfs/kernfs/kernfs_vnops.c 18 Mar 2013 19:35:44 -0000 1.147 +++ sys/miscfs/kernfs/kernfs_vnops.c 7 Jan 2014 11:25:27 -0000 @@ -1154,9 +1154,9 @@ kernfs_link(void *v) int kernfs_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; Index: sys/miscfs/procfs/procfs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/miscfs/procfs/procfs_vnops.c,v retrieving revision 1.186 diff -p -u -4 -r1.186 procfs_vnops.c --- sys/miscfs/procfs/procfs_vnops.c 18 Mar 2013 19:35:44 -0000 1.186 +++ sys/miscfs/procfs/procfs_vnops.c 7 Jan 2014 11:25:27 -0000 @@ -517,9 +517,9 @@ procfs_link(void *v) int procfs_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; Index: sys/nfs/nfs_serv.c =================================================================== RCS file: /cvsroot/src/sys/nfs/nfs_serv.c,v retrieving revision 1.168 diff -p -u -4 -r1.168 nfs_serv.c --- sys/nfs/nfs_serv.c 14 Dec 2013 22:04:03 -0000 1.168 +++ sys/nfs/nfs_serv.c 7 Jan 2014 11:25:29 -0000 @@ -1505,8 +1505,9 @@ nfsrv_create(struct nfsrv_descript *nfsd if (va.va_type == VREG || va.va_type == VSOCK) { nqsrv_getl(nd.ni_dvp, ND_WRITE); error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &va); if (!error) { + vn_lock(nd.ni_vp, LK_EXCLUSIVE | LK_RETRY); if (exclusive_flag) { exclusive_flag = 0; vattr_null(&va); /* @@ -1539,9 +1540,11 @@ nfsrv_create(struct nfsrv_descript *nfsd va.va_rdev = (dev_t)rdev; nqsrv_getl(nd.ni_dvp, ND_WRITE); error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &va); - if (error) { + if (!error) { + vn_lock(nd.ni_vp, LK_EXCLUSIVE | LK_RETRY); + } else { nfsm_reply(0); } } else { VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd); @@ -1749,8 +1752,11 @@ abort: error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &va); if (error) goto out; } + if (!error) { + vn_lock(nd.ni_vp, LK_EXCLUSIVE | LK_RETRY); + } out: vp = nd.ni_vp; if (!error) { error = nfsrv_composefh(vp, &nsfh, true); @@ -2341,14 +2347,15 @@ abortop: nqsrv_getl(nd.ni_dvp, ND_WRITE); error = VOP_SYMLINK(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &va, pathcp); if (!error) { if (v3) { + vn_lock(nd.ni_vp, LK_SHARED | LK_RETRY); error = nfsrv_composefh(nd.ni_vp, &nsfh, v3); if (!error) error = VOP_GETATTR(nd.ni_vp, &va, cred); vput(nd.ni_vp); } else { - vput(nd.ni_vp); + vrele(nd.ni_vp); } } out: if (pathcp) @@ -2469,8 +2476,9 @@ nfsrv_mkdir(struct nfsrv_descript *nfsd, nqsrv_getl(nd.ni_dvp, ND_WRITE); error = VOP_MKDIR(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &va); if (!error) { vp = nd.ni_vp; + vn_lock(vp, LK_SHARED | LK_RETRY); error = nfsrv_composefh(vp, &nsfh, v3); if (!error) error = VOP_GETATTR(vp, &va, cred); vput(vp); Index: sys/nfs/nfs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/nfs/nfs_vnops.c,v retrieving revision 1.301 diff -p -u -4 -r1.301 nfs_vnops.c --- sys/nfs/nfs_vnops.c 15 Nov 2013 14:39:53 -0000 1.301 +++ sys/nfs/nfs_vnops.c 7 Jan 2014 11:25:29 -0000 @@ -1549,8 +1549,9 @@ nfs_mknodrpc(struct vnode *dvp, struct v vput(newvp); } else { nfs_cache_enter(dvp, newvp, cnp); *vpp = newvp; + VOP_UNLOCK(newvp); } VTONFS(dvp)->n_flag |= NMODIFIED; if (!wccflag) NFS_INVALIDATE_ATTRCACHE(VTONFS(dvp)); @@ -1565,9 +1566,9 @@ nfs_mknodrpc(struct vnode *dvp, struct v /* ARGSUSED */ int nfs_mknod(void *v) { - struct vop_mknod_args /* { + struct vop_mknod_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1588,9 +1589,9 @@ nfs_mknod(void *v) */ int nfs_create(void *v) { - struct vop_create_args /* { + struct vop_create_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1707,8 +1708,9 @@ again: nfs_cache_enter(dvp, newvp, cnp); else cache_purge1(dvp, cnp->cn_nameptr, cnp->cn_namelen, 0); *ap->a_vpp = newvp; + VOP_UNLOCK(newvp); } else { if (newvp) vput(newvp); if (error == EEXIST) @@ -2083,9 +2085,9 @@ nfs_link(void *v) */ int nfs_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -2158,8 +2160,9 @@ nfs_symlink(void *v) if (newvp != NULL) vput(newvp); } else { *ap->a_vpp = newvp; + VOP_UNLOCK(newvp); } VTONFS(dvp)->n_flag |= NMODIFIED; if (!wccflag) NFS_INVALIDATE_ATTRCACHE(VTONFS(dvp)); @@ -2173,9 +2176,9 @@ nfs_symlink(void *v) */ int nfs_mkdir(void *v) { - struct vop_mkdir_args /* { + struct vop_mkdir_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -2253,8 +2256,9 @@ nfs_mkdir(void *v) } else { VN_KNOTE(dvp, NOTE_WRITE | NOTE_LINK); nfs_cache_enter(dvp, newvp, cnp); *ap->a_vpp = newvp; + VOP_UNLOCK(newvp); } vput(dvp); return (error); } Index: sys/rump/include/rump/rumpvnode_if.h =================================================================== RCS file: /cvsroot/src/sys/rump/include/rump/rumpvnode_if.h,v retrieving revision 1.13 diff -p -u -4 -r1.13 rumpvnode_if.h --- sys/rump/include/rump/rumpvnode_if.h 17 Jul 2013 21:21:34 -0000 1.13 +++ sys/rump/include/rump/rumpvnode_if.h 7 Jan 2014 11:25:30 -0000 @@ -1,5 +1,5 @@ -/* $NetBSD: rumpvnode_if.h,v 1.13 2013/07/17 21:21:34 pooka Exp $ */ +/* $NetBSD$ */ /* * Warning: DO NOT EDIT! This file is automatically generated! * (Modifications made here may easily be lost!) Index: sys/rump/librump/rumpvfs/rumpfs.c =================================================================== RCS file: /cvsroot/src/sys/rump/librump/rumpvfs/rumpfs.c,v retrieving revision 1.121 diff -p -u -4 -r1.121 rumpfs.c --- sys/rump/librump/rumpvfs/rumpfs.c 23 Nov 2013 13:35:36 -0000 1.121 +++ sys/rump/librump/rumpvfs/rumpfs.c 7 Jan 2014 11:25:30 -0000 @@ -564,9 +564,10 @@ makeprivate(enum vtype vt, mode_t mode, return rn; } static int -makevnode(struct mount *mp, struct rumpfs_node *rn, struct vnode **vpp) +makevnode(struct mount *mp, struct rumpfs_node *rn, struct vnode **vpp, + bool lock_result) { struct vnode *vp; int (**vpops)(void *); struct vattr *va = &rn->rn_va; @@ -592,9 +593,10 @@ makevnode(struct mount *mp, struct rumpf } vp->v_data = rn; genfs_node_init(vp, &rumpfs_genfsops); - vn_lock(vp, LK_RETRY | LK_EXCLUSIVE); + if (lock_result) + vn_lock(vp, LK_RETRY | LK_EXCLUSIVE); mutex_enter(&reclock); rn->rn_vp = vp; mutex_exit(&reclock); @@ -810,9 +812,9 @@ rump_vop_lookup(void *v) } *vpp = vp; } else { mutex_exit(&reclock); - rv = makevnode(dvp->v_mount, rn, vpp); + rv = makevnode(dvp->v_mount, rn, vpp, true); } if (dotdot) vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY); @@ -992,9 +994,9 @@ rump_vop_setattr(void *v) static int rump_vop_mkdir(void *v) { - struct vop_mkdir_args /* { + struct vop_mkdir_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1009,9 +1011,9 @@ rump_vop_mkdir(void *v) rn = makeprivate(VDIR, va->va_mode & ALLPERMS, NODEV, DEV_BSIZE, false); if ((cnp->cn_flags & ISWHITEOUT) != 0) rn->rn_va.va_flags |= UF_OPAQUE; rn->rn_parent = rnd; - rv = makevnode(dvp->v_mount, rn, vpp); + rv = makevnode(dvp->v_mount, rn, vpp, false); if (rv) goto out; makedir(rnd, cnp, rn); @@ -1090,9 +1092,9 @@ rump_vop_remove(void *v) static int rump_vop_mknod(void *v) { - struct vop_mknod_args /* { + struct vop_mknod_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1107,9 +1109,9 @@ rump_vop_mknod(void *v) rn = makeprivate(va->va_type, va->va_mode & ALLPERMS, va->va_rdev, DEV_BSIZE, false); if ((cnp->cn_flags & ISWHITEOUT) != 0) rn->rn_va.va_flags |= UF_OPAQUE; - rv = makevnode(dvp->v_mount, rn, vpp); + rv = makevnode(dvp->v_mount, rn, vpp, false); if (rv) goto out; makedir(rnd, cnp, rn); @@ -1121,9 +1123,9 @@ rump_vop_mknod(void *v) static int rump_vop_create(void *v) { - struct vop_create_args /* { + struct vop_create_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1140,9 +1142,9 @@ rump_vop_create(void *v) rn = makeprivate(va->va_type, va->va_mode & ALLPERMS, NODEV, newsize, false); if ((cnp->cn_flags & ISWHITEOUT) != 0) rn->rn_va.va_flags |= UF_OPAQUE; - rv = makevnode(dvp->v_mount, rn, vpp); + rv = makevnode(dvp->v_mount, rn, vpp, false); if (rv) goto out; makedir(rnd, cnp, rn); @@ -1154,9 +1156,9 @@ rump_vop_create(void *v) static int rump_vop_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1175,9 +1177,9 @@ rump_vop_symlink(void *v) KASSERT(linklen < MAXPATHLEN); rn = makeprivate(VLNK, va->va_mode & ALLPERMS, NODEV, linklen, false); if ((cnp->cn_flags & ISWHITEOUT) != 0) rn->rn_va.va_flags |= UF_OPAQUE; - rv = makevnode(dvp->v_mount, rn, vpp); + rv = makevnode(dvp->v_mount, rn, vpp, false); if (rv) goto out; makedir(rnd, cnp, rn); @@ -1764,9 +1766,9 @@ rumpfs_mountfs(struct mount *mp) rfsmp = kmem_alloc(sizeof(*rfsmp), KM_SLEEP); rn = makeprivate(VDIR, RUMPFS_DEFAULTMODE, NODEV, DEV_BSIZE, false); rn->rn_parent = rn; - if ((error = makevnode(mp, rn, &rfsmp->rfsmp_rvp)) != 0) + if ((error = makevnode(mp, rn, &rfsmp->rfsmp_rvp, true)) != 0) return error; rfsmp->rfsmp_rvp->v_vflag |= VV_ROOT; VOP_UNLOCK(rfsmp->rfsmp_rvp); Index: sys/rump/librump/rumpvfs/rumpvnode_if.c =================================================================== RCS file: /cvsroot/src/sys/rump/librump/rumpvfs/rumpvnode_if.c,v retrieving revision 1.12 diff -p -u -4 -r1.12 rumpvnode_if.c --- sys/rump/librump/rumpvfs/rumpvnode_if.c 17 Jul 2013 21:21:34 -0000 1.12 +++ sys/rump/librump/rumpvfs/rumpvnode_if.c 7 Jan 2014 11:25:30 -0000 @@ -1,5 +1,5 @@ -/* $NetBSD: rumpvnode_if.c,v 1.12 2013/07/17 21:21:34 pooka Exp $ */ +/* $NetBSD$ */ /* * Warning: DO NOT EDIT! This file is automatically generated! * (Modifications made here may easily be lost!) @@ -39,9 +39,9 @@ * SUCH DAMAGE. */ #include -__KERNEL_RCSID(0, "$NetBSD: rumpvnode_if.c,v 1.12 2013/07/17 21:21:34 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD$"); #include #include #include Index: sys/sys/vnode_if.h =================================================================== RCS file: /cvsroot/src/sys/sys/vnode_if.h,v retrieving revision 1.84 diff -p -u -4 -r1.84 vnode_if.h --- sys/sys/vnode_if.h 17 Jul 2013 21:21:34 -0000 1.84 +++ sys/sys/vnode_if.h 7 Jan 2014 11:25:30 -0000 @@ -1,5 +1,5 @@ -/* $NetBSD: vnode_if.h,v 1.84 2013/07/17 21:21:34 pooka Exp $ */ +/* $NetBSD$ */ /* * Warning: DO NOT EDIT! This file is automatically generated! * (Modifications made here may easily be lost!) @@ -69,9 +69,9 @@ struct vop_lookup_args { extern const struct vnodeop_desc vop_lookup_desc; int VOP_LOOKUP(struct vnode *, struct vnode **, struct componentname *); #define VOP_CREATE_DESCOFFSET 3 -struct vop_create_args { +struct vop_create_v2_args { const struct vnodeop_desc *a_desc; struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; @@ -81,9 +81,9 @@ extern const struct vnodeop_desc vop_cre int VOP_CREATE(struct vnode *, struct vnode **, struct componentname *, struct vattr *); #define VOP_MKNOD_DESCOFFSET 4 -struct vop_mknod_args { +struct vop_mknod_v2_args { const struct vnodeop_desc *a_desc; struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; @@ -283,9 +283,9 @@ extern const struct vnodeop_desc vop_ren int VOP_RENAME(struct vnode *, struct vnode *, struct componentname *, struct vnode *, struct vnode *, struct componentname *); #define VOP_MKDIR_DESCOFFSET 23 -struct vop_mkdir_args { +struct vop_mkdir_v2_args { const struct vnodeop_desc *a_desc; struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; @@ -305,9 +305,9 @@ struct vop_rmdir_args { extern const struct vnodeop_desc vop_rmdir_desc; int VOP_RMDIR(struct vnode *, struct vnode *, struct componentname *); #define VOP_SYMLINK_DESCOFFSET 25 -struct vop_symlink_args { +struct vop_symlink_v2_args { const struct vnodeop_desc *a_desc; struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; Index: sys/ufs/chfs/chfs_vnode.c =================================================================== RCS file: /cvsroot/src/sys/ufs/chfs/chfs_vnode.c,v retrieving revision 1.8 diff -p -u -4 -r1.8 chfs_vnode.c --- sys/ufs/chfs/chfs_vnode.c 19 Oct 2012 12:44:39 -0000 1.8 +++ sys/ufs/chfs/chfs_vnode.c 7 Jan 2014 11:25:30 -0000 @@ -300,8 +300,9 @@ chfs_makeinode(int mode, struct vnode *d pdir->chvc->nlink++; mutex_exit(&chmp->chm_lock_mountfields); + VOP_UNLOCK(vp); *vpp = vp; return (0); } Index: sys/ufs/chfs/chfs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/ufs/chfs/chfs_vnops.c,v retrieving revision 1.18 diff -p -u -4 -r1.18 chfs_vnops.c --- sys/ufs/chfs/chfs_vnops.c 20 Oct 2013 17:18:38 -0000 1.18 +++ sys/ufs/chfs/chfs_vnops.c 7 Jan 2014 11:25:31 -0000 @@ -173,9 +173,9 @@ out: int chfs_create(void *v) { - struct vop_create_args /* { + struct vop_create_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -206,12 +206,12 @@ chfs_create(void *v) int chfs_mknod(void *v) { - struct vnode *dvp = ((struct vop_mknod_args *) v)->a_dvp; - struct vnode **vpp = ((struct vop_mknod_args *) v)->a_vpp; - struct componentname *cnp = ((struct vop_mknod_args *) v)->a_cnp; - struct vattr *vap = ((struct vop_mknod_args *) v)->a_vap; + struct vnode *dvp = ((struct vop_mknod_v2_args *) v)->a_dvp; + struct vnode **vpp = ((struct vop_mknod_v2_args *) v)->a_vpp; + struct componentname *cnp = ((struct vop_mknod_v2_args *) v)->a_cnp; + struct vattr *vap = ((struct vop_mknod_v2_args *) v)->a_vap; int mode, err = 0; struct chfs_inode *ip; struct vnode *vp; @@ -1178,12 +1178,12 @@ out_unlocked: int chfs_mkdir(void *v) { - struct vnode *dvp = ((struct vop_mkdir_args *) v)->a_dvp; - struct vnode **vpp = ((struct vop_mkdir_args *)v)->a_vpp; - struct componentname *cnp = ((struct vop_mkdir_args *) v)->a_cnp; - struct vattr *vap = ((struct vop_mkdir_args *) v)->a_vap; + struct vnode *dvp = ((struct vop_mkdir_v2_args *) v)->a_dvp; + struct vnode **vpp = ((struct vop_mkdir_v2_args *)v)->a_vpp; + struct componentname *cnp = ((struct vop_mkdir_v2_args *) v)->a_cnp; + struct vattr *vap = ((struct vop_mkdir_v2_args *) v)->a_vap; dbg("mkdir()\n"); int mode; @@ -1243,13 +1243,13 @@ out: int chfs_symlink(void *v) { - struct vnode *dvp = ((struct vop_symlink_args *) v)->a_dvp; - struct vnode **vpp = ((struct vop_symlink_args *) v)->a_vpp; - struct componentname *cnp = ((struct vop_symlink_args *) v)->a_cnp; - struct vattr *vap = ((struct vop_symlink_args *) v)->a_vap; - char *target = ((struct vop_symlink_args *) v)->a_target; + struct vnode *dvp = ((struct vop_symlink_v2_args *) v)->a_dvp; + struct vnode **vpp = ((struct vop_symlink_v2_args *) v)->a_vpp; + struct componentname *cnp = ((struct vop_symlink_v2_args *) v)->a_cnp; + struct vattr *vap = ((struct vop_symlink_v2_args *) v)->a_vap; + char *target = ((struct vop_symlink_v2_args *) v)->a_target; struct ufsmount *ump; struct chfs_mount *chmp; struct vnode *vp; @@ -1314,9 +1314,9 @@ chfs_symlink(void *v) } out: if (err) - vput(vp); + vrele(vp); return (err); } Index: sys/ufs/ext2fs/ext2fs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/ufs/ext2fs/ext2fs_vnops.c,v retrieving revision 1.107 diff -p -u -4 -r1.107 ext2fs_vnops.c --- sys/ufs/ext2fs/ext2fs_vnops.c 18 Mar 2013 19:35:47 -0000 1.107 +++ sys/ufs/ext2fs/ext2fs_vnops.c 7 Jan 2014 11:25:31 -0000 @@ -125,9 +125,9 @@ union _qcvt { */ int ext2fs_create(void *v) { - struct vop_create_args /* { + struct vop_create_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -140,8 +140,9 @@ ext2fs_create(void *v) if (error) return (error); VN_KNOTE(ap->a_dvp, NOTE_WRITE); + VOP_UNLOCK(*ap->a_vpp); return (0); } /* @@ -150,9 +151,9 @@ ext2fs_create(void *v) /* ARGSUSED */ int ext2fs_mknod(void *v) { - struct vop_mknod_args /* { + struct vop_mknod_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -183,16 +184,17 @@ ext2fs_mknod(void *v) * Remove inode so that it will be reloaded by VFS_VGET and * checked to see if it is an alias of an existing entry in * the inode cache. */ - VOP_UNLOCK(*vpp); (*vpp)->v_type = VNON; + VOP_UNLOCK(*vpp); vgone(*vpp); error = VFS_VGET(mp, ino, vpp); if (error != 0) { *vpp = NULL; return (error); } + VOP_UNLOCK(*vpp); return (0); } /* @@ -648,9 +650,9 @@ out2: */ int ext2fs_mkdir(void *v) { - struct vop_mkdir_args /* { + struct vop_mkdir_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -764,8 +766,9 @@ bad: ip->i_flag |= IN_CHANGE; vput(tvp); } else { VN_KNOTE(dvp, NOTE_WRITE | NOTE_LINK); + VOP_UNLOCK(tvp); *ap->a_vpp = tvp; } out: vput(dvp); @@ -864,9 +867,9 @@ out: */ int ext2fs_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -898,10 +901,11 @@ ext2fs_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, (size_t *)0, NULL); bad: + VOP_UNLOCK(vp); if (error) - vput(vp); + vrele(vp); return (error); } /* Index: sys/ufs/lfs/lfs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/ufs/lfs/lfs_vnops.c,v retrieving revision 1.259 diff -p -u -4 -r1.259 lfs_vnops.c --- sys/ufs/lfs/lfs_vnops.c 18 Oct 2013 15:15:22 -0000 1.259 +++ sys/ufs/lfs/lfs_vnops.c 7 Jan 2014 11:25:31 -0000 @@ -552,9 +552,9 @@ lfs_unmark_vnode(struct vnode *vp) int lfs_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -573,9 +573,9 @@ lfs_symlink(void *v) int lfs_mknod(void *v) { - struct vop_mknod_args /* { + struct vop_mknod_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -662,15 +662,16 @@ lfs_mknod(void *v) if (error != 0) { *vpp = NULL; return (error); } + VOP_UNLOCK(*vpp); return (0); } int lfs_create(void *v) { - struct vop_create_args /* { + struct vop_create_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -688,9 +689,9 @@ lfs_create(void *v) int lfs_mkdir(void *v) { - struct vop_mkdir_args /* { + struct vop_mkdir_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; Index: sys/ufs/lfs/ulfs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/ufs/lfs/ulfs_vnops.c,v retrieving revision 1.18 diff -p -u -4 -r1.18 ulfs_vnops.c --- sys/ufs/lfs/ulfs_vnops.c 28 Jul 2013 01:10:49 -0000 1.18 +++ sys/ufs/lfs/ulfs_vnops.c 7 Jan 2014 11:25:31 -0000 @@ -126,9 +126,9 @@ static const struct lfs_dirtemplate mast */ int ulfs_create(void *v) { - struct vop_create_args /* { + struct vop_create_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -150,8 +150,9 @@ ulfs_create(void *v) return (error); } fstrans_done(dvp->v_mount); VN_KNOTE(dvp, NOTE_WRITE); + VOP_UNLOCK(*ap->a_vpp); return (0); } /* @@ -713,9 +714,9 @@ ulfs_whiteout(void *v) int ulfs_mkdir(void *v) { - struct vop_mkdir_args /* { + struct vop_mkdir_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -840,8 +841,9 @@ ulfs_mkdir(void *v) pool_cache_put(ulfs_direct_cache, newdir); bad: if (error == 0) { VN_KNOTE(dvp, NOTE_WRITE | NOTE_LINK); + VOP_UNLOCK(tvp); } else { dp->i_nlink--; DIP_ASSIGN(dp, nlink, dp->i_nlink); dp->i_flag |= IN_CHANGE; @@ -958,9 +960,9 @@ ulfs_rmdir(void *v) */ int ulfs_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -997,10 +999,11 @@ ulfs_symlink(void *v) } else error = vn_rdwr(UIO_WRITE, vp, ap->a_target, len, (off_t)0, UIO_SYSSPACE, IO_NODELOCKED | IO_JOURNALLOCKED, ap->a_cnp->cn_cred, NULL, NULL); + VOP_UNLOCK(vp); if (error) - vput(vp); + vrele(vp); out: fstrans_done(ap->a_dvp->v_mount); return (error); } Index: sys/ufs/ufs/ufs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/ufs/ufs/ufs_vnops.c,v retrieving revision 1.218 diff -p -u -4 -r1.218 ufs_vnops.c --- sys/ufs/ufs/ufs_vnops.c 15 Sep 2013 15:32:18 -0000 1.218 +++ sys/ufs/ufs/ufs_vnops.c 7 Jan 2014 11:25:32 -0000 @@ -133,9 +133,9 @@ static const struct dirtemplate masterte */ int ufs_create(void *v) { - struct vop_create_args /* { + struct vop_create_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -162,8 +162,9 @@ ufs_create(void *v) } UFS_WAPBL_END1(dvp->v_mount, dvp); fstrans_done(dvp->v_mount); VN_KNOTE(dvp, NOTE_WRITE); + VOP_UNLOCK(*ap->a_vpp); return (0); } /* @@ -172,9 +173,9 @@ ufs_create(void *v) /* ARGSUSED */ int ufs_mknod(void *v) { - struct vop_mknod_args /* { + struct vop_mknod_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -237,8 +238,9 @@ out: if (error != 0) { *vpp = NULL; return (error); } + VOP_UNLOCK(*vpp); return (0); } /* @@ -968,9 +970,9 @@ ufs_whiteout(void *v) int ufs_mkdir(void *v) { - struct vop_mkdir_args /* { + struct vop_mkdir_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1101,8 +1103,9 @@ ufs_mkdir(void *v) pool_cache_put(ufs_direct_cache, newdir); bad: if (error == 0) { VN_KNOTE(dvp, NOTE_WRITE | NOTE_LINK); + VOP_UNLOCK(tvp); UFS_WAPBL_END(dvp->v_mount); } else { dp->i_nlink--; DIP_ASSIGN(dp, nlink, dp->i_nlink); @@ -1231,9 +1234,9 @@ ufs_rmdir(void *v) */ int ufs_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1283,10 +1286,11 @@ ufs_symlink(void *v) error = vn_rdwr(UIO_WRITE, vp, ap->a_target, len, (off_t)0, UIO_SYSSPACE, IO_NODELOCKED | IO_JOURNALLOCKED, ap->a_cnp->cn_cred, NULL, NULL); UFS_WAPBL_END1(ap->a_dvp->v_mount, ap->a_dvp); + VOP_UNLOCK(vp); if (error) - vput(vp); + vrele(vp); out: fstrans_done(ap->a_dvp->v_mount); return (error); }