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.8 diff -p -u -4 -r1.8 zfs_replay.c --- external/cddl/osnet/dist/uts/common/fs/zfs/zfs_replay.c 17 Jan 2014 10:55:01 -0000 1.8 +++ external/cddl/osnet/dist/uts/common/fs/zfs/zfs_replay.c 20 Jan 2014 09:10:46 -0000 @@ -517,8 +517,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; @@ -530,12 +532,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.15 diff -p -u -4 -r1.15 zfs_vnops.c --- external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c 17 Jan 2014 10:55:01 -0000 1.15 +++ external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c 20 Jan 2014 09:10:46 -0000 @@ -4945,9 +4945,9 @@ out: static int zfs_netbsd_create(void *v) { - struct vop_create_v2_args /* { + struct vop_create_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -4980,22 +4980,11 @@ 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)); return (error); } @@ -5050,9 +5039,9 @@ zfs_netbsd_remove(void *v) static int zfs_netbsd_mkdir(void *v) { - struct vop_mkdir_v2_args /* { + struct vop_mkdir_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -5082,22 +5071,11 @@ 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)); return (error); } @@ -5360,9 +5338,9 @@ zfs_netbsd_rename(void *v) static int zfs_netbsd_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -5396,23 +5374,11 @@ 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)); return (error); } Index: lib/libp2k/p2k.c =================================================================== RCS file: /cvsroot/src/lib/libp2k/p2k.c,v retrieving revision 1.61 diff -p -u -4 -r1.61 p2k.c --- lib/libp2k/p2k.c 17 Jan 2014 10:55:01 -0000 1.61 +++ lib/libp2k/p2k.c 20 Jan 2014 09:10:50 -0000 @@ -807,9 +807,8 @@ do_makenode(struct puffs_usermount *pu, RUMP_VOP_UNLOCK(dvp); 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.92 diff -p -u -4 -r1.92 coda_vnops.c --- sys/coda/coda_vnops.c 17 Jan 2014 10:55:01 -0000 1.92 +++ sys/coda/coda_vnops.c 20 Jan 2014 09:10:51 -0000 @@ -1023,9 +1023,9 @@ coda_lookup(void *v) int coda_create(void *v) { /* true args */ - struct vop_create_v2_args *ap = v; + struct vop_create_v3_args *ap = v; vnode_t *dvp = ap->a_dvp; struct cnode *dcp = VTOC(dvp); struct vattr *va = ap->a_vap; int exclusive = 1; @@ -1100,12 +1100,8 @@ coda_create(void *v) #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); @@ -1351,9 +1347,9 @@ coda_rename(void *v) int coda_mkdir(void *v) { /* true args */ - struct vop_mkdir_v2_args *ap = v; + struct vop_mkdir_v3_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; @@ -1414,14 +1410,8 @@ coda_mkdir(void *v) *vpp = (vnode_t *)0; CODADEBUG(CODA_MKDIR, myprintf(("%s error %d\n", __func__, error));) } - if (!error) { - if ((error = vn_lock(*ap->a_vpp, LK_EXCLUSIVE))) { - panic("%s: couldn't lock child", __func__); - } - } - return(error); } int @@ -1494,9 +1484,9 @@ exit: int coda_symlink(void *v) { /* true args */ - struct vop_symlink_v2_args *ap = v; + struct vop_symlink_v3_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; @@ -1563,10 +1553,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 (error == 0) + VOP_UNLOCK(*ap->a_vpp); cnp->cn_flags = saved_cn_flags; - /* Either an error occurs, or ap->a_vpp is locked. */ } exit: CODADEBUG(CODA_SYMLINK, myprintf(("in symlink result %d\n",error)); ) Index: sys/fs/adosfs/advnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/adosfs/advnops.c,v retrieving revision 1.42 diff -p -u -4 -r1.42 advnops.c --- sys/fs/adosfs/advnops.c 17 Jan 2014 10:55:01 -0000 1.42 +++ sys/fs/adosfs/advnops.c 20 Jan 2014 09:10:51 -0000 @@ -420,9 +420,9 @@ adosfs_link(void *v) int adosfs_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_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.46 diff -p -u -4 -r1.46 cd9660_vnops.c --- sys/fs/cd9660/cd9660_vnops.c 17 Jan 2014 10:55:01 -0000 1.46 +++ sys/fs/cd9660/cd9660_vnops.c 20 Jan 2014 09:10:51 -0000 @@ -677,9 +677,9 @@ cd9660_link(void *v) int cd9660_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_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.40 diff -p -u -4 -r1.40 filecore_vnops.c --- sys/fs/filecorefs/filecore_vnops.c 17 Jan 2014 10:55:01 -0000 1.40 +++ sys/fs/filecorefs/filecore_vnops.c 20 Jan 2014 09:10:51 -0000 @@ -432,9 +432,9 @@ filecore_link(void *v) int filecore_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_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 20 Jan 2014 09:10:51 -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.88 diff -p -u -4 -r1.88 msdosfs_vnops.c --- sys/fs/msdosfs/msdosfs_vnops.c 17 Jan 2014 10:55:02 -0000 1.88 +++ sys/fs/msdosfs/msdosfs_vnops.c 20 Jan 2014 09:10:51 -0000 @@ -103,9 +103,9 @@ __KERNEL_RCSID(0, "$NetBSD: msdosfs_vnop */ int msdosfs_create(void *v) { - struct vop_create_v2_args /* { + struct vop_create_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1165,9 +1165,9 @@ static const struct { int msdosfs_mkdir(void *v) { - struct vop_mkdir_v2_args /* { + struct vop_mkdir_v3_args /* { struct vnode *a_dvp; struvt vnode **a_vpp; struvt componentname *a_cnp; struct vattr *a_vap; Index: sys/fs/nilfs/nilfs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/nilfs/nilfs_vnops.c,v retrieving revision 1.25 diff -p -u -4 -r1.25 nilfs_vnops.c --- sys/fs/nilfs/nilfs_vnops.c 17 Jan 2014 10:55:02 -0000 1.25 +++ sys/fs/nilfs/nilfs_vnops.c 20 Jan 2014 09:10:52 -0000 @@ -1082,9 +1082,9 @@ nilfs_access(void *v) int nilfs_create(void *v) { - struct vop_create_v2_args /* { + struct vop_create_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1105,9 +1105,9 @@ nilfs_create(void *v) int nilfs_mknod(void *v) { - struct vop_mknod_v2_args /* { + struct vop_mknod_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1128,9 +1128,9 @@ nilfs_mknod(void *v) int nilfs_mkdir(void *v) { - struct vop_mkdir_v2_args /* { + struct vop_mkdir_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1224,9 +1224,9 @@ nilfs_do_symlink(struct nilfs_node *nilf int nilfs_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_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 20 Jan 2014 09:10:52 -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.178 diff -p -u -4 -r1.178 puffs_vnops.c --- sys/fs/puffs/puffs_vnops.c 17 Jan 2014 10:55:02 -0000 1.178 +++ sys/fs/puffs/puffs_vnops.c 20 Jan 2014 09:10:52 -0000 @@ -754,9 +754,9 @@ do { \ int puffs_vnop_create(void *v) { - struct vop_create_v2_args /* { + struct vop_create_v3_args /* { const struct vnodeop_desc *a_desc; struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; @@ -816,9 +816,9 @@ puffs_vnop_create(void *v) int puffs_vnop_mknod(void *v) { - struct vop_mknod_v2_args /* { + struct vop_mknod_v3_args /* { const struct vnodeop_desc *a_desc; struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; @@ -1812,9 +1812,9 @@ puffs_vnop_remove(void *v) int puffs_vnop_mkdir(void *v) { - struct vop_mkdir_v2_args /* { + struct vop_mkdir_v3_args /* { const struct vnodeop_desc *a_desc; struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; @@ -1976,9 +1976,9 @@ puffs_vnop_link(void *v) int puffs_vnop_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_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.87 diff -p -u -4 -r1.87 smbfs_vnops.c --- sys/fs/smbfs/smbfs_vnops.c 17 Jan 2014 10:55:02 -0000 1.87 +++ sys/fs/smbfs/smbfs_vnops.c 20 Jan 2014 09:10:52 -0000 @@ -572,9 +572,9 @@ smbfs_write(void *v) */ int smbfs_create(void *v) { - struct vop_create_v2_args /* { + struct vop_create_v3_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 (error == 0) + VOP_UNLOCK(*ap->a_vpp); if (error) goto out; cache_enter(dvp, *ap->a_vpp, cnp->cn_nameptr, cnp->cn_namelen, @@ -773,9 +775,9 @@ smbfs_symlink(void *v) int smbfs_mkdir(void *v) { - struct vop_mkdir_v2_args /* { + struct vop_mkdir_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -803,8 +805,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.51 diff -p -u -4 -r1.51 sysvbfs_vnops.c --- sys/fs/sysvbfs/sysvbfs_vnops.c 17 Jan 2014 10:55:02 -0000 1.51 +++ sys/fs/sysvbfs/sysvbfs_vnops.c 20 Jan 2014 09:10:52 -0000 @@ -126,9 +126,9 @@ sysvbfs_lookup(void *arg) int sysvbfs_create(void *arg) { - struct vop_create_v2_args /* { + struct vop_create_v3_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); return err; } Index: sys/fs/tmpfs/tmpfs_subr.c =================================================================== RCS file: /cvsroot/src/sys/fs/tmpfs/tmpfs_subr.c,v retrieving revision 1.95 diff -p -u -4 -r1.95 tmpfs_subr.c --- sys/fs/tmpfs/tmpfs_subr.c 17 Jan 2014 10:55:02 -0000 1.95 +++ sys/fs/tmpfs/tmpfs_subr.c 20 Jan 2014 09:10:52 -0000 @@ -423,8 +423,11 @@ tmpfs_construct_node(vnode_t *dvp, vnode /* Update the parent's timestamps. */ tmpfs_update(dvp, TMPFS_UPDATE_MTIME | TMPFS_UPDATE_CTIME); out: + if (error == 0) + VOP_UNLOCK(*vpp); + return error; } /* Index: sys/fs/tmpfs/tmpfs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/tmpfs/tmpfs_vnops.c,v retrieving revision 1.113 diff -p -u -4 -r1.113 tmpfs_vnops.c --- sys/fs/tmpfs/tmpfs_vnops.c 17 Jan 2014 10:55:02 -0000 1.113 +++ sys/fs/tmpfs/tmpfs_vnops.c 20 Jan 2014 09:10:52 -0000 @@ -310,9 +310,9 @@ out: int tmpfs_create(void *v) { - struct vop_create_v2_args /* { + struct vop_create_v3_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_v2_args /* { + struct vop_mknod_v3_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_v2_args /* { + struct vop_mkdir_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -915,9 +915,9 @@ out: int tmpfs_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_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 20 Jan 2014 09:10:52 -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.88 diff -p -u -4 -r1.88 udf_vnops.c --- sys/fs/udf/udf_vnops.c 17 Jan 2014 10:55:02 -0000 1.88 +++ sys/fs/udf/udf_vnops.c 20 Jan 2014 09:10:52 -0000 @@ -1452,9 +1452,9 @@ udf_access(void *v) int udf_create(void *v) { - struct vop_create_v2_args /* { + struct vop_create_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1475,9 +1475,9 @@ udf_create(void *v) int udf_mknod(void *v) { - struct vop_mknod_v2_args /* { + struct vop_mknod_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1498,9 +1498,9 @@ udf_mknod(void *v) int udf_mkdir(void *v) { - struct vop_mkdir_v2_args /* { + struct vop_mkdir_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1695,9 +1695,9 @@ udf_do_symlink(struct udf_node *udf_node int udf_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_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.58 diff -p -u -4 -r1.58 union_subr.c --- sys/fs/union/union_subr.c 17 Jan 2014 10:55:02 -0000 1.58 +++ sys/fs/union/union_subr.c 20 Jan 2014 09:10:52 -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.50 diff -p -u -4 -r1.50 union_vnops.c --- sys/fs/union/union_vnops.c 17 Jan 2014 10:55:02 -0000 1.50 +++ sys/fs/union/union_vnops.c 20 Jan 2014 09:10:52 -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_v2_args /* { + struct vop_create_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -504,12 +509,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); } return (EROFS); @@ -534,9 +542,9 @@ union_whiteout(void *v) int union_mknod(void *v) { - struct vop_mknod_v2_args /* { + struct vop_mknod_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -554,12 +562,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); } return (EROFS); @@ -1340,9 +1351,9 @@ out: int union_mkdir(void *v) { - struct vop_mkdir_v2_args /* { + struct vop_mkdir_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1360,12 +1371,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); return (error); } return (EROFS); @@ -1423,9 +1437,9 @@ union_rmdir(void *v) int union_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; Index: sys/fs/v7fs/v7fs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/fs/v7fs/v7fs_vnops.c,v retrieving revision 1.14 diff -p -u -4 -r1.14 v7fs_vnops.c --- sys/fs/v7fs/v7fs_vnops.c 17 Jan 2014 10:55:02 -0000 1.14 +++ sys/fs/v7fs/v7fs_vnops.c 20 Jan 2014 09:10:52 -0000 @@ -188,9 +188,9 @@ v7fs_lookup(void *v) int v7fs_create(void *v) { - struct vop_create_v2_args /* { + struct vop_create_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -237,15 +237,18 @@ v7fs_create(void *v) newnode->update_mtime = true; newnode->update_atime = true; DPRINTF("allocated %s->#%d\n", a->a_cnp->cn_nameptr, ino); + if (error == 0) + VOP_UNLOCK(*a->a_vpp); + return error; } int v7fs_mknod(void *v) { - struct vop_mknod_v2_args /* { + struct vop_mknod_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -285,8 +288,11 @@ v7fs_mknod(void *v) newnode->update_ctime = true; newnode->update_mtime = true; newnode->update_atime = true; + if (error == 0) + VOP_UNLOCK(*a->a_vpp); + return error; } int @@ -802,9 +808,9 @@ out: int v7fs_mkdir(void *v) { - struct vop_mkdir_v2_args /* { + struct vop_mkdir_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -840,8 +846,11 @@ v7fs_mkdir(void *v) newnode->update_ctime = true; newnode->update_mtime = true; newnode->update_atime = true; + if (error == 0) + VOP_UNLOCK(*a->a_vpp); + return error; } int @@ -1224,9 +1233,9 @@ v7fs_update(struct vnode *vp, const stru int v7fs_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1275,8 +1284,11 @@ v7fs_symlink(void *v) newnode->update_ctime = true; newnode->update_mtime = true; newnode->update_atime = true; + if (error == 0) + VOP_UNLOCK(*a->a_vpp); + return error; } int Index: sys/kern/uipc_usrreq.c =================================================================== RCS file: /cvsroot/src/sys/kern/uipc_usrreq.c,v retrieving revision 1.149 diff -p -u -4 -r1.149 uipc_usrreq.c --- sys/kern/uipc_usrreq.c 17 Jan 2014 10:55:02 -0000 1.149 +++ sys/kern/uipc_usrreq.c 20 Jan 2014 09:10:52 -0000 @@ -966,8 +966,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.472 diff -p -u -4 -r1.472 vfs_syscalls.c --- sys/kern/vfs_syscalls.c 17 Jan 2014 10:55:02 -0000 1.472 +++ sys/kern/vfs_syscalls.c 20 Jan 2014 09:10:52 -0000 @@ -2252,17 +2252,17 @@ 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); vput(nd.ni_dvp); 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); vput(nd.ni_dvp); break; } } else { @@ -2342,9 +2342,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); vput(nd.ni_dvp); pathbuf_destroy(pb); return (error); } @@ -2500,9 +2500,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); vput(nd.ni_dvp); out2: pathbuf_destroy(linkpb); out1: @@ -4560,9 +4560,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); vput(nd.ni_dvp); pathbuf_destroy(pb); return (error); } Index: sys/kern/vfs_vnops.c =================================================================== RCS file: /cvsroot/src/sys/kern/vfs_vnops.c,v retrieving revision 1.187 diff -p -u -4 -r1.187 vfs_vnops.c --- sys/kern/vfs_vnops.c 17 Jan 2014 10:55:02 -0000 1.187 +++ sys/kern/vfs_vnops.c 20 Jan 2014 09:10:52 -0000 @@ -188,8 +188,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.90 diff -p -u -4 -r1.90 vnode_if.c --- sys/kern/vnode_if.c 17 Jan 2014 10:55:02 -0000 1.90 +++ sys/kern/vnode_if.c 20 Jan 2014 09:10:52 -0000 @@ -1,5 +1,5 @@ -/* $NetBSD: vnode_if.c,v 1.90 2014/01/17 10:55:02 hannken 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.90 2014/01/17 10:55:02 hannken 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_v2_args,a_dvp), + VOPARG_OFFSETOF(struct vop_create_v3_args,a_dvp), VDESC_NO_OFFSET }; const struct vnodeop_desc vop_create_desc = { VOP_CREATE_DESCOFFSET, "vop_create", 0, vop_create_vp_offsets, - VOPARG_OFFSETOF(struct vop_create_v2_args, a_vpp), + VOPARG_OFFSETOF(struct vop_create_v3_args, a_vpp), VDESC_NO_OFFSET, - VOPARG_OFFSETOF(struct vop_create_v2_args, a_cnp), + VOPARG_OFFSETOF(struct vop_create_v3_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_v2_args a; + struct vop_create_v3_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_v2_args,a_dvp), + VOPARG_OFFSETOF(struct vop_mknod_v3_args,a_dvp), VDESC_NO_OFFSET }; const struct vnodeop_desc vop_mknod_desc = { VOP_MKNOD_DESCOFFSET, "vop_mknod", 0, vop_mknod_vp_offsets, - VOPARG_OFFSETOF(struct vop_mknod_v2_args, a_vpp), + VOPARG_OFFSETOF(struct vop_mknod_v3_args, a_vpp), VDESC_NO_OFFSET, - VOPARG_OFFSETOF(struct vop_mknod_v2_args, a_cnp), + VOPARG_OFFSETOF(struct vop_mknod_v3_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_v2_args a; + struct vop_mknod_v3_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_v2_args,a_dvp), + VOPARG_OFFSETOF(struct vop_mkdir_v3_args,a_dvp), VDESC_NO_OFFSET }; const struct vnodeop_desc vop_mkdir_desc = { VOP_MKDIR_DESCOFFSET, "vop_mkdir", 0, vop_mkdir_vp_offsets, - VOPARG_OFFSETOF(struct vop_mkdir_v2_args, a_vpp), + VOPARG_OFFSETOF(struct vop_mkdir_v3_args, a_vpp), VDESC_NO_OFFSET, - VOPARG_OFFSETOF(struct vop_mkdir_v2_args, a_cnp), + VOPARG_OFFSETOF(struct vop_mkdir_v3_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_v2_args a; + struct vop_mkdir_v3_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_v2_args,a_dvp), + VOPARG_OFFSETOF(struct vop_symlink_v3_args,a_dvp), VDESC_NO_OFFSET }; const struct vnodeop_desc vop_symlink_desc = { VOP_SYMLINK_DESCOFFSET, "vop_symlink", 0, vop_symlink_vp_offsets, - VOPARG_OFFSETOF(struct vop_symlink_v2_args, a_vpp), + VOPARG_OFFSETOF(struct vop_symlink_v3_args, a_vpp), VDESC_NO_OFFSET, - VOPARG_OFFSETOF(struct vop_symlink_v2_args, a_cnp), + VOPARG_OFFSETOF(struct vop_symlink_v3_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_v2_args a; + struct vop_symlink_v3_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.src =================================================================== RCS file: /cvsroot/src/sys/kern/vnode_if.src,v retrieving revision 1.64 diff -p -u -4 -r1.64 vnode_if.src --- sys/kern/vnode_if.src 17 Jan 2014 10:52:36 -0000 1.64 +++ sys/kern/vnode_if.src 20 Jan 2014 09:10:52 -0000 @@ -88,28 +88,28 @@ vop_lookup { }; # #% create dvp L L L -#% create vpp - L - +#% create vpp - U - # #! create cnp CREATE, LOCKPARENT # vop_create { - VERSION 2 + VERSION 3 IN LOCKED=YES struct vnode *dvp; OUT WILLMAKE struct vnode **vpp; IN struct componentname *cnp; IN struct vattr *vap; }; # #% mknod dvp L L L -#% mknod vpp - L - +#% mknod vpp - U - # #! mknod cnp CREATE, LOCKPARENT # vop_mknod { - VERSION 2 + VERSION 3 IN LOCKED=YES struct vnode *dvp; OUT WILLMAKE struct vnode **vpp; IN struct componentname *cnp; IN struct vattr *vap; @@ -300,14 +300,14 @@ vop_rename { }; # #% mkdir dvp L L L -#% mkdir vpp - L - +#% mkdir vpp - U - # #! mkdir cnp CREATE, LOCKPARENT # vop_mkdir { - VERSION 2 + VERSION 3 IN LOCKED=YES struct vnode *dvp; OUT WILLMAKE struct vnode **vpp; IN struct componentname *cnp; IN struct vattr *vap; @@ -326,14 +326,14 @@ vop_rmdir { }; # #% symlink dvp L L L -#% symlink vpp - L - +#% symlink vpp - U - # #! symlink cnp CREATE, LOCKPARENT # vop_symlink { - VERSION 2 + VERSION 3 IN LOCKED=YES struct vnode *dvp; OUT WILLMAKE struct vnode **vpp; IN struct componentname *cnp; IN struct vattr *vap; Index: sys/miscfs/fdesc/fdesc_vnops.c =================================================================== RCS file: /cvsroot/src/sys/miscfs/fdesc/fdesc_vnops.c,v retrieving revision 1.115 diff -p -u -4 -r1.115 fdesc_vnops.c --- sys/miscfs/fdesc/fdesc_vnops.c 17 Jan 2014 10:55:02 -0000 1.115 +++ sys/miscfs/fdesc/fdesc_vnops.c 20 Jan 2014 09:10:52 -0000 @@ -1034,9 +1034,9 @@ fdesc_link(void *v) int fdesc_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; Index: sys/miscfs/genfs/layer_vnops.c =================================================================== RCS file: /cvsroot/src/sys/miscfs/genfs/layer_vnops.c,v retrieving revision 1.51 diff -p -u -4 -r1.51 layer_vnops.c --- sys/miscfs/genfs/layer_vnops.c 10 Oct 2012 06:55:25 -0000 1.51 +++ sys/miscfs/genfs/layer_vnops.c 20 Jan 2014 09:10:52 -0000 @@ -315,18 +315,19 @@ layer_bypass(void *v) if (descp->vdesc_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.148 diff -p -u -4 -r1.148 kernfs_vnops.c --- sys/miscfs/kernfs/kernfs_vnops.c 17 Jan 2014 10:55:02 -0000 1.148 +++ sys/miscfs/kernfs/kernfs_vnops.c 20 Jan 2014 09:10:52 -0000 @@ -1154,9 +1154,9 @@ kernfs_link(void *v) int kernfs_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_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.187 diff -p -u -4 -r1.187 procfs_vnops.c --- sys/miscfs/procfs/procfs_vnops.c 17 Jan 2014 10:55:02 -0000 1.187 +++ sys/miscfs/procfs/procfs_vnops.c 20 Jan 2014 09:10:52 -0000 @@ -517,9 +517,9 @@ procfs_link(void *v) int procfs_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_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.169 diff -p -u -4 -r1.169 nfs_serv.c --- sys/nfs/nfs_serv.c 17 Jan 2014 10:55:02 -0000 1.169 +++ sys/nfs/nfs_serv.c 20 Jan 2014 09:10:52 -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); @@ -1744,8 +1747,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); @@ -2340,14 +2346,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); } } vput(nd.ni_dvp); out: @@ -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.302 diff -p -u -4 -r1.302 nfs_vnops.c --- sys/nfs/nfs_vnops.c 17 Jan 2014 10:55:02 -0000 1.302 +++ sys/nfs/nfs_vnops.c 20 Jan 2014 09:10:53 -0000 @@ -1548,8 +1548,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)); @@ -1563,9 +1564,9 @@ nfs_mknodrpc(struct vnode *dvp, struct v /* ARGSUSED */ int nfs_mknod(void *v) { - struct vop_mknod_v2_args /* { + struct vop_mknod_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1586,9 +1587,9 @@ nfs_mknod(void *v) */ int nfs_create(void *v) { - struct vop_create_v2_args /* { + struct vop_create_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1705,8 +1706,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) @@ -2080,9 +2082,9 @@ nfs_link(void *v) */ int nfs_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -2155,8 +2157,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)); @@ -2169,9 +2172,9 @@ nfs_symlink(void *v) */ int nfs_mkdir(void *v) { - struct vop_mkdir_v2_args /* { + struct vop_mkdir_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -2249,8 +2252,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); } 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.14 diff -p -u -4 -r1.14 rumpvnode_if.h --- sys/rump/include/rump/rumpvnode_if.h 17 Jan 2014 10:55:03 -0000 1.14 +++ sys/rump/include/rump/rumpvnode_if.h 20 Jan 2014 09:10:53 -0000 @@ -1,5 +1,5 @@ -/* $NetBSD: rumpvnode_if.h,v 1.14 2014/01/17 10:55:03 hannken 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.122 diff -p -u -4 -r1.122 rumpfs.c --- sys/rump/librump/rumpvfs/rumpfs.c 17 Jan 2014 10:55:03 -0000 1.122 +++ sys/rump/librump/rumpvfs/rumpfs.c 20 Jan 2014 09:10:53 -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_v2_args /* { + struct vop_mkdir_v3_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) return rv; makedir(rnd, cnp, rn); @@ -1088,9 +1090,9 @@ rump_vop_remove(void *v) static int rump_vop_mknod(void *v) { - struct vop_mknod_v2_args /* { + struct vop_mknod_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1105,9 +1107,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) return rv; makedir(rnd, cnp, rn); @@ -1117,9 +1119,9 @@ rump_vop_mknod(void *v) static int rump_vop_create(void *v) { - struct vop_create_v2_args /* { + struct vop_create_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1136,9 +1138,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) return rv; makedir(rnd, cnp, rn); @@ -1148,9 +1150,9 @@ rump_vop_create(void *v) static int rump_vop_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1169,9 +1171,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) return rv; makedir(rnd, cnp, rn); @@ -1756,9 +1758,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.13 diff -p -u -4 -r1.13 rumpvnode_if.c --- sys/rump/librump/rumpvfs/rumpvnode_if.c 17 Jan 2014 10:55:03 -0000 1.13 +++ sys/rump/librump/rumpvfs/rumpvnode_if.c 20 Jan 2014 09:10:53 -0000 @@ -1,5 +1,5 @@ -/* $NetBSD: rumpvnode_if.c,v 1.13 2014/01/17 10:55:03 hannken 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.13 2014/01/17 10:55:03 hannken 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.85 diff -p -u -4 -r1.85 vnode_if.h --- sys/sys/vnode_if.h 17 Jan 2014 10:55:03 -0000 1.85 +++ sys/sys/vnode_if.h 20 Jan 2014 09:10:53 -0000 @@ -1,5 +1,5 @@ -/* $NetBSD: vnode_if.h,v 1.85 2014/01/17 10:55:03 hannken 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_v2_args { +struct vop_create_v3_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_v2_args { +struct vop_mknod_v3_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_v2_args { +struct vop_mkdir_v3_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_v2_args { +struct vop_symlink_v3_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.9 diff -p -u -4 -r1.9 chfs_vnode.c --- sys/ufs/chfs/chfs_vnode.c 17 Jan 2014 10:55:03 -0000 1.9 +++ sys/ufs/chfs/chfs_vnode.c 20 Jan 2014 09:10:53 -0000 @@ -297,8 +297,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.19 diff -p -u -4 -r1.19 chfs_vnops.c --- sys/ufs/chfs/chfs_vnops.c 17 Jan 2014 10:55:03 -0000 1.19 +++ sys/ufs/chfs/chfs_vnops.c 20 Jan 2014 09:10:53 -0000 @@ -173,9 +173,9 @@ out: int chfs_create(void *v) { - struct vop_create_v2_args /* { + struct vop_create_v3_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_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; + struct vnode *dvp = ((struct vop_mknod_v3_args *) v)->a_dvp; + struct vnode **vpp = ((struct vop_mknod_v3_args *) v)->a_vpp; + struct componentname *cnp = ((struct vop_mknod_v3_args *) v)->a_cnp; + struct vattr *vap = ((struct vop_mknod_v3_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_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; + struct vnode *dvp = ((struct vop_mkdir_v3_args *) v)->a_dvp; + struct vnode **vpp = ((struct vop_mkdir_v3_args *)v)->a_vpp; + struct componentname *cnp = ((struct vop_mkdir_v3_args *) v)->a_cnp; + struct vattr *vap = ((struct vop_mkdir_v3_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_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 vnode *dvp = ((struct vop_symlink_v3_args *) v)->a_dvp; + struct vnode **vpp = ((struct vop_symlink_v3_args *) v)->a_vpp; + struct componentname *cnp = ((struct vop_symlink_v3_args *) v)->a_cnp; + struct vattr *vap = ((struct vop_symlink_v3_args *) v)->a_vap; + char *target = ((struct vop_symlink_v3_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.108 diff -p -u -4 -r1.108 ext2fs_vnops.c --- sys/ufs/ext2fs/ext2fs_vnops.c 17 Jan 2014 10:55:03 -0000 1.108 +++ sys/ufs/ext2fs/ext2fs_vnops.c 20 Jan 2014 09:10:53 -0000 @@ -125,9 +125,9 @@ union _qcvt { */ int ext2fs_create(void *v) { - struct vop_create_v2_args /* { + struct vop_create_v3_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_v2_args /* { + struct vop_mknod_v3_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_v2_args /* { + struct vop_mkdir_v3_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: return (error); @@ -863,9 +866,9 @@ out: */ int ext2fs_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -897,10 +900,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.260 diff -p -u -4 -r1.260 lfs_vnops.c --- sys/ufs/lfs/lfs_vnops.c 17 Jan 2014 10:55:03 -0000 1.260 +++ sys/ufs/lfs/lfs_vnops.c 20 Jan 2014 09:10:53 -0000 @@ -552,9 +552,9 @@ lfs_unmark_vnode(struct vnode *vp) int lfs_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -572,9 +572,9 @@ lfs_symlink(void *v) int lfs_mknod(void *v) { - struct vop_mknod_v2_args /* { + struct vop_mknod_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -660,15 +660,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_v2_args /* { + struct vop_create_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -685,9 +686,9 @@ lfs_create(void *v) int lfs_mkdir(void *v) { - struct vop_mkdir_v2_args /* { + struct vop_mkdir_v3_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.19 diff -p -u -4 -r1.19 ulfs_vnops.c --- sys/ufs/lfs/ulfs_vnops.c 17 Jan 2014 10:55:03 -0000 1.19 +++ sys/ufs/lfs/ulfs_vnops.c 20 Jan 2014 09:10:53 -0000 @@ -126,9 +126,9 @@ static const struct lfs_dirtemplate mast */ int ulfs_create(void *v) { - struct vop_create_v2_args /* { + struct vop_create_v3_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_v2_args /* { + struct vop_mkdir_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -839,8 +840,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; @@ -956,9 +958,9 @@ ulfs_rmdir(void *v) */ int ulfs_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -995,10 +997,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.219 diff -p -u -4 -r1.219 ufs_vnops.c --- sys/ufs/ufs/ufs_vnops.c 17 Jan 2014 10:55:03 -0000 1.219 +++ sys/ufs/ufs/ufs_vnops.c 20 Jan 2014 09:10:53 -0000 @@ -133,9 +133,9 @@ static const struct dirtemplate masterte */ int ufs_create(void *v) { - struct vop_create_v2_args /* { + struct vop_create_v3_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_v2_args /* { + struct vop_mknod_v3_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_v2_args /* { + struct vop_mkdir_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1100,8 +1102,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); @@ -1229,9 +1232,9 @@ ufs_rmdir(void *v) */ int ufs_symlink(void *v) { - struct vop_symlink_v2_args /* { + struct vop_symlink_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; struct vattr *a_vap; @@ -1281,10 +1284,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); }