Module Name: src Committed By: riastradh Date: Wed Apr 26 03:02:49 UTC 2017
Modified Files: src/external/cddl/osnet/dist/uts/common/fs/zfs: zfs_vnops.c src/lib/libp2k: p2k.c src/sys/coda: coda_vnops.c src/sys/compat/svr4: svr4_stream.c src/sys/fs/msdosfs: msdosfs_vnops.c src/sys/fs/nilfs: nilfs_vnops.c src/sys/fs/puffs: puffs_vnops.c src/sys/fs/smbfs: smbfs_vnops.c src/sys/fs/sysvbfs: sysvbfs_vnops.c src/sys/fs/tmpfs: tmpfs_vnops.c src/sys/fs/udf: udf_vnops.c src/sys/fs/union: union_vnops.c src/sys/fs/unionfs: unionfs_vnops.c src/sys/fs/v7fs: v7fs_vnops.c src/sys/kern: vfs_syscalls.c vnode_if.src src/sys/miscfs/deadfs: dead_vnops.c src/sys/miscfs/genfs: layer_vnops.c src/sys/nfs: nfs_serv.c nfs_vnops.c src/sys/rump/librump/rumpvfs: rumpfs.c src/sys/ufs/chfs: chfs_vnops.c src/sys/ufs/ext2fs: ext2fs_vnops.c src/sys/ufs/lfs: lfs_vnops.c ulfs_vnops.c src/sys/ufs/ufs: ufs_vnops.c Log Message: Change VOP_REMOVE and VOP_RMDIR to preserve lock/ref on dvp. No change to vp -- the plan is to replace the node by the componentname in the vop parameters, and let all directory vops do lookups internally. Proposed on tech-kern with no objections: https://mail-index.netbsd.org/tech-kern/2017/04/17/msg021825.html To generate a diff of this commit: cvs rdiff -u -r1.24 -r1.25 \ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c cvs rdiff -u -r1.69 -r1.70 src/lib/libp2k/p2k.c cvs rdiff -u -r1.104 -r1.105 src/sys/coda/coda_vnops.c cvs rdiff -u -r1.87 -r1.88 src/sys/compat/svr4/svr4_stream.c cvs rdiff -u -r1.97 -r1.98 src/sys/fs/msdosfs/msdosfs_vnops.c cvs rdiff -u -r1.34 -r1.35 src/sys/fs/nilfs/nilfs_vnops.c cvs rdiff -u -r1.209 -r1.210 src/sys/fs/puffs/puffs_vnops.c cvs rdiff -u -r1.93 -r1.94 src/sys/fs/smbfs/smbfs_vnops.c cvs rdiff -u -r1.61 -r1.62 src/sys/fs/sysvbfs/sysvbfs_vnops.c cvs rdiff -u -r1.131 -r1.132 src/sys/fs/tmpfs/tmpfs_vnops.c cvs rdiff -u -r1.103 -r1.104 src/sys/fs/udf/udf_vnops.c cvs rdiff -u -r1.66 -r1.67 src/sys/fs/union/union_vnops.c cvs rdiff -u -r1.10 -r1.11 src/sys/fs/unionfs/unionfs_vnops.c cvs rdiff -u -r1.24 -r1.25 src/sys/fs/v7fs/v7fs_vnops.c cvs rdiff -u -r1.512 -r1.513 src/sys/kern/vfs_syscalls.c cvs rdiff -u -r1.73 -r1.74 src/sys/kern/vnode_if.src cvs rdiff -u -r1.60 -r1.61 src/sys/miscfs/deadfs/dead_vnops.c cvs rdiff -u -r1.62 -r1.63 src/sys/miscfs/genfs/layer_vnops.c cvs rdiff -u -r1.172 -r1.173 src/sys/nfs/nfs_serv.c cvs rdiff -u -r1.309 -r1.310 src/sys/nfs/nfs_vnops.c cvs rdiff -u -r1.147 -r1.148 src/sys/rump/librump/rumpvfs/rumpfs.c cvs rdiff -u -r1.31 -r1.32 src/sys/ufs/chfs/chfs_vnops.c cvs rdiff -u -r1.125 -r1.126 src/sys/ufs/ext2fs/ext2fs_vnops.c cvs rdiff -u -r1.313 -r1.314 src/sys/ufs/lfs/lfs_vnops.c cvs rdiff -u -r1.47 -r1.48 src/sys/ufs/lfs/ulfs_vnops.c cvs rdiff -u -r1.236 -r1.237 src/sys/ufs/ufs/ufs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c:1.24 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c:1.25 --- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c:1.24 Tue Apr 11 14:25:01 2017 +++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c Wed Apr 26 03:02:47 2017 @@ -4975,7 +4975,7 @@ zfs_netbsd_create(void *v) static int zfs_netbsd_remove(void *v) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -5002,13 +5002,6 @@ zfs_netbsd_remove(void *v) 0); KASSERT(VOP_ISLOCKED(dvp) == LK_EXCLUSIVE); - - /* - * Unlock and release dvp because the VOP_REMOVE protocol is insane. - */ - VOP_UNLOCK(dvp); - VN_RELE(dvp); - return (error); } @@ -5048,7 +5041,7 @@ zfs_netbsd_mkdir(void *v) static int zfs_netbsd_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -5075,12 +5068,6 @@ zfs_netbsd_rmdir(void *v) NULL, 0); KASSERT(VOP_ISLOCKED(dvp) == LK_EXCLUSIVE); - - /* - * Unlock and release dvp because the VOP_RMDIR protocol is insane. - */ - VOP_UNLOCK(dvp); - VN_RELE(dvp); return error; } Index: src/lib/libp2k/p2k.c diff -u src/lib/libp2k/p2k.c:1.69 src/lib/libp2k/p2k.c:1.70 --- src/lib/libp2k/p2k.c:1.69 Tue Apr 11 14:25:02 2017 +++ src/lib/libp2k/p2k.c Wed Apr 26 03:02:48 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: p2k.c,v 1.69 2017/04/11 14:25:02 riastradh Exp $ */ +/* $NetBSD: p2k.c,v 1.70 2017/04/26 03:02:48 riastradh Exp $ */ /* * Copyright (c) 2007, 2008, 2009 Antti Kantee. All Rights Reserved. @@ -1026,8 +1026,11 @@ do_nukenode(struct p2k_node *p2n_dir, st RUMP_VOP_LOCK(vp, LK_EXCLUSIVE); rump_pub_vp_incref(vp); rv = nukefn(dvp, vp, cn); - assert(RUMP_VOP_ISLOCKED(dvp) == 0); + assert(dvp != vp); + assert(RUMP_VOP_ISLOCKED(dvp) == LK_EXCLUSIVE); assert(RUMP_VOP_ISLOCKED(vp) == 0); + rump_pub_vp_rele(dvp); + RUMP_VOP_UNLOCK(dvp); freecn(cn); return rv; Index: src/sys/coda/coda_vnops.c diff -u src/sys/coda/coda_vnops.c:1.104 src/sys/coda/coda_vnops.c:1.105 --- src/sys/coda/coda_vnops.c:1.104 Tue Apr 11 14:24:59 2017 +++ src/sys/coda/coda_vnops.c Wed Apr 26 03:02:48 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: coda_vnops.c,v 1.104 2017/04/11 14:24:59 riastradh Exp $ */ +/* $NetBSD: coda_vnops.c,v 1.105 2017/04/26 03:02:48 riastradh Exp $ */ /* * @@ -46,7 +46,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: coda_vnops.c,v 1.104 2017/04/11 14:24:59 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: coda_vnops.c,v 1.105 2017/04/26 03:02:48 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1071,7 +1071,7 @@ int coda_remove(void *v) { /* true args */ - struct vop_remove_args *ap = v; + struct vop_remove_v2_args *ap = v; vnode_t *dvp = ap->a_dvp; struct cnode *cp = VTOC(dvp); vnode_t *vp = ap->a_vp; @@ -1124,14 +1124,13 @@ coda_remove(void *v) CODADEBUG(CODA_REMOVE, myprintf(("in remove result %d\n",error)); ) /* - * Unlock parent and child (avoiding double if "."). + * Unlock and release child (avoiding double if "."). */ if (dvp == vp) { vrele(vp); } else { vput(vp); } - vput(dvp); return(error); } @@ -1377,7 +1376,7 @@ int coda_rmdir(void *v) { /* true args */ - struct vop_rmdir_args *ap = v; + struct vop_rmdir_v2_args *ap = v; vnode_t *dvp = ap->a_dvp; struct cnode *dcp = VTOC(dvp); vnode_t *vp = ap->a_vp; @@ -1429,8 +1428,7 @@ coda_rmdir(void *v) CODADEBUG(CODA_RMDIR, myprintf(("in rmdir result %d\n", error)); ) exit: - /* vput both vnodes */ - vput(dvp); + /* unlock and release child */ if (dvp == vp) { vrele(vp); } else { Index: src/sys/compat/svr4/svr4_stream.c diff -u src/sys/compat/svr4/svr4_stream.c:1.87 src/sys/compat/svr4/svr4_stream.c:1.88 --- src/sys/compat/svr4/svr4_stream.c:1.87 Tue Sep 13 07:01:08 2016 +++ src/sys/compat/svr4/svr4_stream.c Wed Apr 26 03:02:48 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: svr4_stream.c,v 1.87 2016/09/13 07:01:08 martin Exp $ */ +/* $NetBSD: svr4_stream.c,v 1.88 2017/04/26 03:02:48 riastradh Exp $ */ /*- * Copyright (c) 1994, 2008 The NetBSD Foundation, Inc. @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: svr4_stream.c,v 1.87 2016/09/13 07:01:08 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: svr4_stream.c,v 1.88 2017/04/26 03:02:48 riastradh Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -328,6 +328,7 @@ clean_pipe(struct lwp *l, const char *pa goto bad; error = VOP_REMOVE(nd.ni_dvp, nd.ni_vp, &nd.ni_cnd); + vput(nd.ni_dvp); pathbuf_destroy(pb); return error; Index: src/sys/fs/msdosfs/msdosfs_vnops.c diff -u src/sys/fs/msdosfs/msdosfs_vnops.c:1.97 src/sys/fs/msdosfs/msdosfs_vnops.c:1.98 --- src/sys/fs/msdosfs/msdosfs_vnops.c:1.97 Wed Mar 1 10:41:28 2017 +++ src/sys/fs/msdosfs/msdosfs_vnops.c Wed Apr 26 03:02:48 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_vnops.c,v 1.97 2017/03/01 10:41:28 hannken Exp $ */ +/* $NetBSD: msdosfs_vnops.c,v 1.98 2017/04/26 03:02:48 riastradh Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -48,7 +48,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.97 2017/03/01 10:41:28 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.98 2017/04/26 03:02:48 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -715,7 +715,7 @@ msdosfs_update(struct vnode *vp, const s int msdosfs_remove(void *v) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -739,7 +739,7 @@ msdosfs_remove(void *v) else vput(ap->a_vp); /* causes msdosfs_inactive() to be called * via vrele() */ - vput(ap->a_dvp); + return (error); } @@ -1266,7 +1266,7 @@ bad2: int msdosfs_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -1283,8 +1283,7 @@ msdosfs_rmdir(void *v) * No rmdir "." please. */ if (dp == ip) { - vrele(dvp); - vput(vp); + vrele(vp); return (EINVAL); } /* @@ -1316,8 +1315,6 @@ msdosfs_rmdir(void *v) */ VN_KNOTE(dvp, NOTE_WRITE | NOTE_LINK); cache_purge(dvp); - vput(dvp); - dvp = NULL; /* * Truncate the directory that is being deleted. */ @@ -1325,8 +1322,6 @@ msdosfs_rmdir(void *v) cache_purge(vp); out: VN_KNOTE(vp, NOTE_DELETE); - if (dvp) - vput(dvp); vput(vp); return (error); } Index: src/sys/fs/nilfs/nilfs_vnops.c diff -u src/sys/fs/nilfs/nilfs_vnops.c:1.34 src/sys/fs/nilfs/nilfs_vnops.c:1.35 --- src/sys/fs/nilfs/nilfs_vnops.c:1.34 Tue Apr 11 14:24:59 2017 +++ src/sys/fs/nilfs/nilfs_vnops.c Wed Apr 26 03:02:48 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: nilfs_vnops.c,v 1.34 2017/04/11 14:24:59 riastradh Exp $ */ +/* $NetBSD: nilfs_vnops.c,v 1.35 2017/04/26 03:02:48 riastradh Exp $ */ /* * Copyright (c) 2008, 2009 Reinoud Zandijk @@ -28,7 +28,7 @@ #include <sys/cdefs.h> #ifndef lint -__KERNEL_RCSID(0, "$NetBSD: nilfs_vnops.c,v 1.34 2017/04/11 14:24:59 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nilfs_vnops.c,v 1.35 2017/04/26 03:02:48 riastradh Exp $"); #endif /* not lint */ @@ -1404,7 +1404,7 @@ out_unlocked: int nilfs_remove(void *v) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -1435,7 +1435,6 @@ nilfs_remove(void *v) vrele(vp); else vput(vp); - vput(dvp); return error; } @@ -1445,7 +1444,7 @@ nilfs_remove(void *v) int nilfs_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -1462,8 +1461,7 @@ nilfs_rmdir(void *v) /* don't allow '.' to be deleted */ if (dir_node == nilfs_node) { - vrele(dvp); - vput(vp); + vrele(vp); return EINVAL; } @@ -1472,7 +1470,6 @@ nilfs_rmdir(void *v) refcnt = 2; /* XXX */ if (refcnt > 1) { /* NOT empty */ - vput(dvp); vput(vp); return ENOTEMPTY; } @@ -1486,8 +1483,7 @@ nilfs_rmdir(void *v) } DPRINTFIF(NODE, error, ("\tgot error removing file\n")); - /* unput the nodes and exit */ - vput(dvp); + /* put the node and exit */ vput(vp); return error; Index: src/sys/fs/puffs/puffs_vnops.c diff -u src/sys/fs/puffs/puffs_vnops.c:1.209 src/sys/fs/puffs/puffs_vnops.c:1.210 --- src/sys/fs/puffs/puffs_vnops.c:1.209 Tue Apr 11 14:24:59 2017 +++ src/sys/fs/puffs/puffs_vnops.c Wed Apr 26 03:02:48 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_vnops.c,v 1.209 2017/04/11 14:24:59 riastradh Exp $ */ +/* $NetBSD: puffs_vnops.c,v 1.210 2017/04/26 03:02:48 riastradh Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.209 2017/04/11 14:24:59 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.210 2017/04/26 03:02:48 riastradh Exp $"); #include <sys/param.h> #include <sys/buf.h> @@ -1829,7 +1829,7 @@ callremove(struct puffs_mount *pmp, puff int puffs_vnop_remove(void *v) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { const struct vnodeop_desc *a_desc; struct vnode *a_dvp; struct vnode *a_vp; @@ -1853,7 +1853,8 @@ puffs_vnop_remove(void *v) PUFFS_VN_REMOVE, VPTOPNC(dvp)); puffs_msg_enqueue(pmp, park_remove); - REFPN_AND_UNLOCKVP(dvp, dpn); + vref(dvp); /* hang onto caller's reference at end */ + REFPN(dpn); if (dvp == vp) REFPN(pn); else @@ -1952,7 +1953,7 @@ callrmdir(struct puffs_mount *pmp, puffs int puffs_vnop_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { const struct vnodeop_desc *a_desc; struct vnode *a_dvp; struct vnode *a_vp; @@ -1975,7 +1976,9 @@ puffs_vnop_rmdir(void *v) PUFFS_VN_RMDIR, VPTOPNC(dvp)); puffs_msg_enqueue(pmp, park_rmdir); - REFPN_AND_UNLOCKVP(dvp, dpn); + vref(dvp); /* hang onto caller's reference at end */ + KASSERTMSG((dvp != vp), "rmdir ."); + REFPN(dpn); REFPN_AND_UNLOCKVP(vp, pn); error = puffs_msg_wait2(pmp, park_rmdir, dpn, pn); Index: src/sys/fs/smbfs/smbfs_vnops.c diff -u src/sys/fs/smbfs/smbfs_vnops.c:1.93 src/sys/fs/smbfs/smbfs_vnops.c:1.94 --- src/sys/fs/smbfs/smbfs_vnops.c:1.93 Sun Dec 21 10:48:53 2014 +++ src/sys/fs/smbfs/smbfs_vnops.c Wed Apr 26 03:02:48 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: smbfs_vnops.c,v 1.93 2014/12/21 10:48:53 hannken Exp $ */ +/* $NetBSD: smbfs_vnops.c,v 1.94 2017/04/26 03:02:48 riastradh Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -64,7 +64,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: smbfs_vnops.c,v 1.93 2014/12/21 10:48:53 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: smbfs_vnops.c,v 1.94 2017/04/26 03:02:48 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -618,7 +618,7 @@ smbfs_create(void *v) int smbfs_remove(void *v) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { struct vnodeop_desc *a_desc; struct vnode * a_dvp; struct vnode * a_vp; @@ -648,7 +648,6 @@ smbfs_remove(void *v) vrele(vp); else vput(vp); - vput(dvp); return (error); } @@ -822,7 +821,7 @@ smbfs_mkdir(void *v) int smbfs_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -837,8 +836,7 @@ smbfs_rmdir(void *v) int error; if (dvp == vp) { - vrele(dvp); - vput(dvp); + vrele(vp); return (EINVAL); } @@ -853,7 +851,6 @@ smbfs_rmdir(void *v) cache_purge(dvp); cache_purge(vp); vput(vp); - vput(dvp); return (error); } Index: src/sys/fs/sysvbfs/sysvbfs_vnops.c diff -u src/sys/fs/sysvbfs/sysvbfs_vnops.c:1.61 src/sys/fs/sysvbfs/sysvbfs_vnops.c:1.62 --- src/sys/fs/sysvbfs/sysvbfs_vnops.c:1.61 Tue Apr 11 14:25:00 2017 +++ src/sys/fs/sysvbfs/sysvbfs_vnops.c Wed Apr 26 03:02:48 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: sysvbfs_vnops.c,v 1.61 2017/04/11 14:25:00 riastradh Exp $ */ +/* $NetBSD: sysvbfs_vnops.c,v 1.62 2017/04/26 03:02:48 riastradh Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sysvbfs_vnops.c,v 1.61 2017/04/11 14:25:00 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysvbfs_vnops.c,v 1.62 2017/04/26 03:02:48 riastradh Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -508,7 +508,7 @@ sysvbfs_write(void *arg) int sysvbfs_remove(void *arg) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { struct vnodeop_desc *a_desc; struct vnode * a_dvp; struct vnode * a_vp; @@ -523,8 +523,10 @@ sysvbfs_remove(void *arg) DPRINTF("%s: delete %s\n", __func__, ap->a_cnp->cn_nameptr); - if (vp->v_type == VDIR) + if (vp->v_type == VDIR) { + vrele(vp); return EPERM; + } if ((err = bfs_file_delete(bfs, ap->a_cnp->cn_nameptr, true)) != 0) DPRINTF("%s: bfs_file_delete failed.\n", __func__); @@ -535,7 +537,6 @@ sysvbfs_remove(void *arg) vrele(vp); else vput(vp); - vput(dvp); if (err == 0) { bnode->removed = 1; Index: src/sys/fs/tmpfs/tmpfs_vnops.c diff -u src/sys/fs/tmpfs/tmpfs_vnops.c:1.131 src/sys/fs/tmpfs/tmpfs_vnops.c:1.132 --- src/sys/fs/tmpfs/tmpfs_vnops.c:1.131 Tue Apr 11 14:25:00 2017 +++ src/sys/fs/tmpfs/tmpfs_vnops.c Wed Apr 26 03:02:48 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tmpfs_vnops.c,v 1.131 2017/04/11 14:25:00 riastradh Exp $ */ +/* $NetBSD: tmpfs_vnops.c,v 1.132 2017/04/26 03:02:48 riastradh Exp $ */ /* * Copyright (c) 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tmpfs_vnops.c,v 1.131 2017/04/11 14:25:00 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tmpfs_vnops.c,v 1.132 2017/04/26 03:02:48 riastradh Exp $"); #include <sys/param.h> #include <sys/dirent.h> @@ -652,7 +652,7 @@ tmpfs_fsync(void *v) int tmpfs_remove(void *v) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -716,12 +716,11 @@ tmpfs_remove(void *v) tmpfs_update(dvp, TMPFS_UPDATE_MTIME | TMPFS_UPDATE_CTIME); error = 0; out: - /* Drop the references and unlock the vnodes. */ - vput(vp); + /* Drop the reference and unlock the node. */ if (dvp == vp) { - vrele(dvp); + vrele(vp); } else { - vput(dvp); + vput(vp); } return error; } @@ -813,7 +812,7 @@ tmpfs_mkdir(void *v) int tmpfs_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -898,8 +897,8 @@ tmpfs_rmdir(void *v) KASSERT(node->tn_size == 0); KASSERT(node->tn_links == 0); out: - /* Release the nodes. */ - vput(dvp); + /* Release the node. */ + KASSERT(dvp != vp); vput(vp); return error; } Index: src/sys/fs/udf/udf_vnops.c diff -u src/sys/fs/udf/udf_vnops.c:1.103 src/sys/fs/udf/udf_vnops.c:1.104 --- src/sys/fs/udf/udf_vnops.c:1.103 Tue Apr 11 14:25:00 2017 +++ src/sys/fs/udf/udf_vnops.c Wed Apr 26 03:02:48 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: udf_vnops.c,v 1.103 2017/04/11 14:25:00 riastradh Exp $ */ +/* $NetBSD: udf_vnops.c,v 1.104 2017/04/26 03:02:48 riastradh Exp $ */ /* * Copyright (c) 2006, 2008 Reinoud Zandijk @@ -32,7 +32,7 @@ #include <sys/cdefs.h> #ifndef lint -__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.103 2017/04/11 14:25:00 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.104 2017/04/26 03:02:48 riastradh Exp $"); #endif /* not lint */ @@ -1941,7 +1941,7 @@ udf_readlink(void *v) int udf_remove(void *v) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -1972,7 +1972,6 @@ udf_remove(void *v) vrele(vp); else vput(vp); - vput(dvp); return error; } @@ -1982,7 +1981,7 @@ udf_remove(void *v) int udf_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -1999,8 +1998,7 @@ udf_rmdir(void *v) /* don't allow '.' to be deleted */ if (dir_node == udf_node) { - vrele(dvp); - vput(vp); + vrele(vp); return EINVAL; } @@ -2017,7 +2015,6 @@ udf_rmdir(void *v) dirhash_put(udf_node->dir_hash); if (!isempty) { - vput(dvp); vput(vp); return ENOTEMPTY; } @@ -2040,8 +2037,7 @@ udf_rmdir(void *v) } DPRINTFIF(NODE, error, ("\tgot error removing dir\n")); - /* unput the nodes and exit */ - vput(dvp); + /* put the node and exit */ vput(vp); return error; Index: src/sys/fs/union/union_vnops.c diff -u src/sys/fs/union/union_vnops.c:1.66 src/sys/fs/union/union_vnops.c:1.67 --- src/sys/fs/union/union_vnops.c:1.66 Mon Apr 17 08:32:01 2017 +++ src/sys/fs/union/union_vnops.c Wed Apr 26 03:02:48 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: union_vnops.c,v 1.66 2017/04/17 08:32:01 hannken Exp $ */ +/* $NetBSD: union_vnops.c,v 1.67 2017/04/26 03:02:48 riastradh Exp $ */ /* * Copyright (c) 1992, 1993, 1994, 1995 @@ -72,7 +72,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: union_vnops.c,v 1.66 2017/04/17 08:32:01 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: union_vnops.c,v 1.67 2017/04/26 03:02:48 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1153,7 +1153,7 @@ union_seek(void *v) int union_remove(void *v) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -1170,24 +1170,18 @@ union_remove(void *v) struct vnode *dvp = dun->un_uppervp; struct vnode *vp = un->un_uppervp; - /* - * Account for VOP_REMOVE to vrele dvp and vp. - * Note: VOP_REMOVE will unlock dvp and vp. - */ - vref(dvp); + /* Account for VOP_REMOVE to vrele vp. */ vref(vp); if (union_dowhiteout(un, cnp->cn_cred)) cnp->cn_flags |= DOWHITEOUT; error = VOP_REMOVE(dvp, vp, cnp); if (!error) union_removed_upper(un); - vrele(ap->a_dvp); vrele(ap->a_vp); } else { error = union_mkwhiteout( MOUNTTOUNIONMOUNT(UNIONTOV(dun)->v_mount), dun->un_uppervp, ap->a_cnp, un); - vput(ap->a_dvp); vput(ap->a_vp); } @@ -1417,7 +1411,7 @@ union_mkdir(void *v) int union_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -1432,7 +1426,6 @@ union_rmdir(void *v) error = union_check_rmdir(un, cnp->cn_cred); if (error) { - vput(ap->a_dvp); vput(ap->a_vp); return error; } @@ -1441,24 +1434,18 @@ union_rmdir(void *v) struct vnode *dvp = dun->un_uppervp; struct vnode *vp = un->un_uppervp; - /* - * Account for VOP_RMDIR to vrele dvp and vp. - * Note: VOP_RMDIR will unlock dvp and vp. - */ - vref(dvp); + /* Account for VOP_RMDIR to vrele vp. */ vref(vp); if (union_dowhiteout(un, cnp->cn_cred)) cnp->cn_flags |= DOWHITEOUT; error = VOP_RMDIR(dvp, vp, ap->a_cnp); if (!error) union_removed_upper(un); - vrele(ap->a_dvp); vrele(ap->a_vp); } else { error = union_mkwhiteout( MOUNTTOUNIONMOUNT(UNIONTOV(dun)->v_mount), dun->un_uppervp, ap->a_cnp, un); - vput(ap->a_dvp); vput(ap->a_vp); } Index: src/sys/fs/unionfs/unionfs_vnops.c diff -u src/sys/fs/unionfs/unionfs_vnops.c:1.10 src/sys/fs/unionfs/unionfs_vnops.c:1.11 --- src/sys/fs/unionfs/unionfs_vnops.c:1.10 Tue Apr 11 14:25:00 2017 +++ src/sys/fs/unionfs/unionfs_vnops.c Wed Apr 26 03:02:48 2017 @@ -857,7 +857,7 @@ unionfs_fsync(void *v) static int unionfs_remove(void *v) { - struct vop_remove_args *ap = v; + struct vop_remove_v2_args *ap = v; int error; struct unionfs_node *dunp; struct unionfs_node *unp; @@ -877,8 +877,10 @@ unionfs_remove(void *v) lvp = unp->un_lowervp; cnp = ap->a_cnp; - if (udvp == NULLVP) + if (udvp == NULLVP) { + vput(ap->a_vp); return (EROFS); + } if (uvp != NULLVP) { ump = MOUNTTOUNIONFSMOUNT(ap->a_vp->v_mount); @@ -1206,7 +1208,7 @@ unionfs_mkdir(void *v) static int unionfs_rmdir(void *v) { - struct vop_rmdir_args *ap = v; + struct vop_rmdir_v2_args *ap = v; int error; struct unionfs_node *dunp; struct unionfs_node *unp; @@ -1226,8 +1228,10 @@ unionfs_rmdir(void *v) uvp = unp->un_uppervp; lvp = unp->un_lowervp; - if (udvp == NULLVP) + if (udvp == NULLVP) { + vput(ap->a_vp); return (EROFS); + } if (udvp == uvp) return (EOPNOTSUPP); Index: src/sys/fs/v7fs/v7fs_vnops.c diff -u src/sys/fs/v7fs/v7fs_vnops.c:1.24 src/sys/fs/v7fs/v7fs_vnops.c:1.25 --- src/sys/fs/v7fs/v7fs_vnops.c:1.24 Tue Apr 11 14:25:00 2017 +++ src/sys/fs/v7fs/v7fs_vnops.c Wed Apr 26 03:02:49 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: v7fs_vnops.c,v 1.24 2017/04/11 14:25:00 riastradh Exp $ */ +/* $NetBSD: v7fs_vnops.c,v 1.25 2017/04/26 03:02:49 riastradh Exp $ */ /*- * Copyright (c) 2004, 2011 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: v7fs_vnops.c,v 1.24 2017/04/11 14:25:00 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: v7fs_vnops.c,v 1.25 2017/04/26 03:02:49 riastradh Exp $"); #if defined _KERNEL_OPT #include "opt_v7fs.h" #endif @@ -680,7 +680,7 @@ v7fs_fsync(void *v) int v7fs_remove(void *v) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { struct vnodeop_desc *a_desc; struct vnode * a_dvp; struct vnode * a_vp; @@ -717,7 +717,6 @@ out: vrele(vp); /* v_usecount-- of unlocked vp */ else vput(vp); /* unlock vp and then v_usecount-- */ - vput(dvp); return error; } @@ -865,7 +864,7 @@ v7fs_mkdir(void *v) int v7fs_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -895,7 +894,6 @@ v7fs_rmdir(void *v) uvm_vnp_setsize(dvp, v7fs_inode_filesize(&parent_node->inode)); out: vput(vp); - vput(dvp); return error; } Index: src/sys/kern/vfs_syscalls.c diff -u src/sys/kern/vfs_syscalls.c:1.512 src/sys/kern/vfs_syscalls.c:1.513 --- src/sys/kern/vfs_syscalls.c:1.512 Mon Apr 17 08:32:01 2017 +++ src/sys/kern/vfs_syscalls.c Wed Apr 26 03:02:49 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_syscalls.c,v 1.512 2017/04/17 08:32:01 hannken Exp $ */ +/* $NetBSD: vfs_syscalls.c,v 1.513 2017/04/26 03:02:49 riastradh Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -70,7 +70,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.512 2017/04/17 08:32:01 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.513 2017/04/26 03:02:49 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_fileassoc.h" @@ -2696,6 +2696,7 @@ do_sys_unlinkat(struct lwp *l, int fdat, goto abort; } else { error = VOP_RMDIR(nd.ni_dvp, nd.ni_vp, &nd.ni_cnd); + vput(nd.ni_dvp); goto out; } } @@ -2719,6 +2720,7 @@ do_sys_unlinkat(struct lwp *l, int fdat, (void)fileassoc_file_delete(vp); #endif /* FILEASSOC */ error = VOP_REMOVE(nd.ni_dvp, nd.ni_vp, &nd.ni_cnd); + vput(nd.ni_dvp); goto out; abort: Index: src/sys/kern/vnode_if.src diff -u src/sys/kern/vnode_if.src:1.73 src/sys/kern/vnode_if.src:1.74 --- src/sys/kern/vnode_if.src:1.73 Sun Apr 16 16:48:08 2017 +++ src/sys/kern/vnode_if.src Wed Apr 26 03:02:49 2017 @@ -1,4 +1,4 @@ -# $NetBSD: vnode_if.src,v 1.73 2017/04/16 16:48:08 riastradh Exp $ +# $NetBSD: vnode_if.src,v 1.74 2017/04/26 03:02:49 riastradh Exp $ # # Copyright (c) 1992, 1993 # The Regents of the University of California. All rights reserved. @@ -269,13 +269,14 @@ vop_seek { }; # -#% remove dvp L U U +#% remove dvp L L L #% remove vp L U U # #! remove cnp DELETE, LOCKPARENT | LOCKLEAF # vop_remove { - IN LOCKED=YES WILLPUT struct vnode *dvp; + VERSION 2 + IN LOCKED=YES struct vnode *dvp; IN LOCKED=YES WILLPUT struct vnode *vp; IN struct componentname *cnp; }; @@ -326,13 +327,14 @@ vop_mkdir { }; # -#% rmdir dvp L U U +#% rmdir dvp L L L #% rmdir vp L U U # #! rmdir cnp DELETE, LOCKPARENT | LOCKLEAF # vop_rmdir { - IN LOCKED=YES WILLPUT struct vnode *dvp; + VERSION 2 + IN LOCKED=YES struct vnode *dvp; IN LOCKED=YES WILLPUT struct vnode *vp; IN struct componentname *cnp; }; Index: src/sys/miscfs/deadfs/dead_vnops.c diff -u src/sys/miscfs/deadfs/dead_vnops.c:1.60 src/sys/miscfs/deadfs/dead_vnops.c:1.61 --- src/sys/miscfs/deadfs/dead_vnops.c:1.60 Tue Apr 11 14:25:00 2017 +++ src/sys/miscfs/deadfs/dead_vnops.c Wed Apr 26 03:02:49 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: dead_vnops.c,v 1.60 2017/04/11 14:25:00 riastradh Exp $ */ +/* $NetBSD: dead_vnops.c,v 1.61 2017/04/26 03:02:49 riastradh Exp $ */ /* * Copyright (c) 1989, 1993 @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dead_vnops.c,v 1.60 2017/04/11 14:25:00 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dead_vnops.c,v 1.61 2017/04/26 03:02:49 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -234,13 +234,12 @@ dead_poll(void *v) int dead_remove(void *v) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; } */ *ap = v; - vput(ap->a_dvp); vput(ap->a_vp); return EIO; @@ -286,13 +285,12 @@ dead_rename(void *v) int dead_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; } */ *ap = v; - vput(ap->a_dvp); vput(ap->a_vp); return EIO; Index: src/sys/miscfs/genfs/layer_vnops.c diff -u src/sys/miscfs/genfs/layer_vnops.c:1.62 src/sys/miscfs/genfs/layer_vnops.c:1.63 --- src/sys/miscfs/genfs/layer_vnops.c:1.62 Tue Apr 11 14:25:00 2017 +++ src/sys/miscfs/genfs/layer_vnops.c Wed Apr 26 03:02:49 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: layer_vnops.c,v 1.62 2017/04/11 14:25:00 riastradh Exp $ */ +/* $NetBSD: layer_vnops.c,v 1.63 2017/04/26 03:02:49 riastradh Exp $ */ /* * Copyright (c) 1999 National Aeronautics & Space Administration @@ -170,7 +170,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: layer_vnops.c,v 1.62 2017/04/11 14:25:00 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: layer_vnops.c,v 1.63 2017/04/26 03:02:49 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -609,8 +609,8 @@ layer_inactive(void *v) int layer_remove(void *v) { - struct vop_remove_args /* { - struct vonde *a_dvp; + struct vop_remove_v2_args /* { + struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; } */ *ap = v; @@ -660,7 +660,7 @@ layer_rename(void *v) int layer_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; Index: src/sys/nfs/nfs_serv.c diff -u src/sys/nfs/nfs_serv.c:1.172 src/sys/nfs/nfs_serv.c:1.173 --- src/sys/nfs/nfs_serv.c:1.172 Tue Apr 21 03:19:03 2015 +++ src/sys/nfs/nfs_serv.c Wed Apr 26 03:02:49 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: nfs_serv.c,v 1.172 2015/04/21 03:19:03 riastradh Exp $ */ +/* $NetBSD: nfs_serv.c,v 1.173 2017/04/26 03:02:49 riastradh Exp $ */ /* * Copyright (c) 1989, 1993 @@ -55,7 +55,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nfs_serv.c,v 1.172 2015/04/21 03:19:03 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nfs_serv.c,v 1.173 2017/04/26 03:02:49 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1859,6 +1859,7 @@ out: nqsrv_getl(nd.ni_dvp, ND_WRITE); nqsrv_getl(vp, ND_WRITE); error = VOP_REMOVE(nd.ni_dvp, nd.ni_vp, &nd.ni_cnd); + vput(nd.ni_dvp); } else { VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd); if (nd.ni_dvp == vp) @@ -2601,6 +2602,7 @@ out: nqsrv_getl(nd.ni_dvp, ND_WRITE); nqsrv_getl(vp, ND_WRITE); error = VOP_RMDIR(nd.ni_dvp, nd.ni_vp, &nd.ni_cnd); + vput(nd.ni_dvp); } else { VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd); if (nd.ni_dvp == nd.ni_vp) Index: src/sys/nfs/nfs_vnops.c diff -u src/sys/nfs/nfs_vnops.c:1.309 src/sys/nfs/nfs_vnops.c:1.310 --- src/sys/nfs/nfs_vnops.c:1.309 Tue Jan 19 10:56:59 2016 +++ src/sys/nfs/nfs_vnops.c Wed Apr 26 03:02:49 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: nfs_vnops.c,v 1.309 2016/01/19 10:56:59 hannken Exp $ */ +/* $NetBSD: nfs_vnops.c,v 1.310 2017/04/26 03:02:49 riastradh Exp $ */ /* * Copyright (c) 1989, 1993 @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nfs_vnops.c,v 1.309 2016/01/19 10:56:59 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nfs_vnops.c,v 1.310 2017/04/26 03:02:49 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_nfs.h" @@ -1738,7 +1738,7 @@ again: int nfs_remove(void *v) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { struct vnodeop_desc *a_desc; struct vnode * a_dvp; struct vnode * a_vp; @@ -1790,7 +1790,6 @@ nfs_remove(void *v) vrele(vp); else vput(vp); - vput(dvp); return (error); } @@ -2265,7 +2264,7 @@ nfs_mkdir(void *v) int nfs_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -2288,8 +2287,7 @@ nfs_rmdir(void *v) struct nfsnode *dnp; if (dvp == vp) { - vrele(dvp); - vput(dvp); + vrele(vp); return (EINVAL); } nfsstats.rpccnt[NFSPROC_RMDIR]++; @@ -2311,7 +2309,6 @@ nfs_rmdir(void *v) VN_KNOTE(vp, NOTE_DELETE); cache_purge(vp); vput(vp); - vput(dvp); /* * Kludge: Map ENOENT => 0 assuming that you have a reply to a retry. */ Index: src/sys/rump/librump/rumpvfs/rumpfs.c diff -u src/sys/rump/librump/rumpvfs/rumpfs.c:1.147 src/sys/rump/librump/rumpvfs/rumpfs.c:1.148 --- src/sys/rump/librump/rumpvfs/rumpfs.c:1.147 Mon Apr 17 08:32:01 2017 +++ src/sys/rump/librump/rumpvfs/rumpfs.c Wed Apr 26 03:02:49 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpfs.c,v 1.147 2017/04/17 08:32:01 hannken Exp $ */ +/* $NetBSD: rumpfs.c,v 1.148 2017/04/26 03:02:49 riastradh Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.147 2017/04/17 08:32:01 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.148 2017/04/26 03:02:49 riastradh Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -983,7 +983,7 @@ rump_vop_mkdir(void *v) static int rump_vop_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -1015,16 +1015,14 @@ rump_vop_rmdir(void *v) rn->rn_va.va_nlink = 0; out: - vput(dvp); vput(vp); - return rv; } static int rump_vop_remove(void *v) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -1043,9 +1041,7 @@ rump_vop_remove(void *v) rn->rn_flags |= RUMPNODE_CANRECLAIM; rn->rn_va.va_nlink = 0; - vput(dvp); vput(vp); - return rv; } Index: src/sys/ufs/chfs/chfs_vnops.c diff -u src/sys/ufs/chfs/chfs_vnops.c:1.31 src/sys/ufs/chfs/chfs_vnops.c:1.32 --- src/sys/ufs/chfs/chfs_vnops.c:1.31 Tue Apr 11 14:25:01 2017 +++ src/sys/ufs/chfs/chfs_vnops.c Wed Apr 26 03:02:49 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: chfs_vnops.c,v 1.31 2017/04/11 14:25:01 riastradh Exp $ */ +/* $NetBSD: chfs_vnops.c,v 1.32 2017/04/26 03:02:49 riastradh Exp $ */ /*- * Copyright (c) 2010 Department of Software Engineering, @@ -1032,9 +1032,9 @@ chfs_fsync(void *v) int chfs_remove(void *v) { - struct vnode *dvp = ((struct vop_remove_args *) v)->a_dvp; - struct vnode *vp = ((struct vop_remove_args *) v)->a_vp; - struct componentname *cnp = (((struct vop_remove_args *) v)->a_cnp); + struct vnode *dvp = ((struct vop_remove_v2_args *) v)->a_dvp; + struct vnode *vp = ((struct vop_remove_v2_args *) v)->a_vp; + struct componentname *cnp = (((struct vop_remove_v2_args *) v)->a_cnp); dbg("remove\n"); KASSERT(VOP_ISLOCKED(dvp)); @@ -1056,7 +1056,6 @@ chfs_remove(void *v) parent, cnp->cn_nameptr, cnp->cn_namelen); out: - vput(dvp); vput(vp); return error; @@ -1195,9 +1194,9 @@ chfs_mkdir(void *v) int chfs_rmdir(void *v) { - struct vnode *dvp = ((struct vop_rmdir_args *) v)->a_dvp; - struct vnode *vp = ((struct vop_rmdir_args *) v)->a_vp; - struct componentname *cnp = ((struct vop_rmdir_args *) v)->a_cnp; + struct vnode *dvp = ((struct vop_rmdir_v2_args *) v)->a_dvp; + struct vnode *vp = ((struct vop_rmdir_v2_args *) v)->a_vp; + struct componentname *cnp = ((struct vop_rmdir_v2_args *) v)->a_cnp; dbg("rmdir()\n"); KASSERT(VOP_ISLOCKED(dvp)); @@ -1226,7 +1225,6 @@ chfs_rmdir(void *v) parent, cnp->cn_nameptr, cnp->cn_namelen); out: - vput(dvp); vput(vp); return error; Index: src/sys/ufs/ext2fs/ext2fs_vnops.c diff -u src/sys/ufs/ext2fs/ext2fs_vnops.c:1.125 src/sys/ufs/ext2fs/ext2fs_vnops.c:1.126 --- src/sys/ufs/ext2fs/ext2fs_vnops.c:1.125 Mon Aug 15 18:38:10 2016 +++ src/sys/ufs/ext2fs/ext2fs_vnops.c Wed Apr 26 03:02:49 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: ext2fs_vnops.c,v 1.125 2016/08/15 18:38:10 jdolecek Exp $ */ +/* $NetBSD: ext2fs_vnops.c,v 1.126 2017/04/26 03:02:49 riastradh Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 @@ -65,7 +65,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ext2fs_vnops.c,v 1.125 2016/08/15 18:38:10 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ext2fs_vnops.c,v 1.126 2017/04/26 03:02:49 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -556,7 +556,7 @@ ext2fs_chown(struct vnode *vp, uid_t uid int ext2fs_remove(void *v) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -590,7 +590,6 @@ ext2fs_remove(void *v) vrele(vp); else vput(vp); - vput(dvp); return error; } @@ -787,7 +786,7 @@ out: int ext2fs_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -810,8 +809,7 @@ ext2fs_rmdir(void *v) * No rmdir "." please. */ if (dp == ip) { - vrele(dvp); - vput(vp); + vrele(vp); return EINVAL; } /* @@ -845,8 +843,6 @@ ext2fs_rmdir(void *v) dp->i_flag |= IN_CHANGE; VN_KNOTE(dvp, NOTE_WRITE | NOTE_LINK); cache_purge(dvp); - vput(dvp); - dvp = NULL; /* * Truncate inode. The only stuff left * in the directory is "." and "..". The @@ -863,8 +859,6 @@ ext2fs_rmdir(void *v) cache_purge(ITOV(ip)); out: VN_KNOTE(vp, NOTE_DELETE); - if (dvp) - vput(dvp); vput(vp); return error; } Index: src/sys/ufs/lfs/lfs_vnops.c diff -u src/sys/ufs/lfs/lfs_vnops.c:1.313 src/sys/ufs/lfs/lfs_vnops.c:1.314 --- src/sys/ufs/lfs/lfs_vnops.c:1.313 Tue Apr 11 14:25:01 2017 +++ src/sys/ufs/lfs/lfs_vnops.c Wed Apr 26 03:02:49 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_vnops.c,v 1.313 2017/04/11 14:25:01 riastradh Exp $ */ +/* $NetBSD: lfs_vnops.c,v 1.314 2017/04/26 03:02:49 riastradh Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. @@ -125,7 +125,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.313 2017/04/11 14:25:01 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.314 2017/04/26 03:02:49 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" @@ -1083,7 +1083,7 @@ out: int lfs_remove(void *v) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -1104,7 +1104,6 @@ lfs_remove(void *v) vrele(vp); else vput(vp); - vput(dvp); return error; } error = ulfs_remove(ap); @@ -1127,7 +1126,7 @@ lfs_remove(void *v) int lfs_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { struct vnodeop_desc *a_desc; struct vnode *a_dvp; struct vnode *a_vp; @@ -1145,10 +1144,9 @@ lfs_rmdir(void *v) ip = VTOI(vp); if ((error = lfs_set_dirop(ap->a_dvp, ap->a_vp)) != 0) { if (ap->a_dvp == vp) - vrele(ap->a_dvp); + vrele(vp); else - vput(ap->a_dvp); - vput(vp); + vput(vp); return error; } error = ulfs_rmdir(ap); Index: src/sys/ufs/lfs/ulfs_vnops.c diff -u src/sys/ufs/lfs/ulfs_vnops.c:1.47 src/sys/ufs/lfs/ulfs_vnops.c:1.48 --- src/sys/ufs/lfs/ulfs_vnops.c:1.47 Tue Apr 11 05:48:04 2017 +++ src/sys/ufs/lfs/ulfs_vnops.c Wed Apr 26 03:02:49 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: ulfs_vnops.c,v 1.47 2017/04/11 05:48:04 riastradh Exp $ */ +/* $NetBSD: ulfs_vnops.c,v 1.48 2017/04/26 03:02:49 riastradh Exp $ */ /* from NetBSD: ufs_vnops.c,v 1.232 2016/05/19 18:32:03 riastradh Exp */ /*- @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ulfs_vnops.c,v 1.47 2017/04/11 05:48:04 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ulfs_vnops.c,v 1.48 2017/04/26 03:02:49 riastradh Exp $"); #if defined(_KERNEL_OPT) #include "opt_lfs.h" @@ -500,7 +500,7 @@ ulfs_chown(struct vnode *vp, uid_t uid, int ulfs_remove(void *v) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -536,7 +536,6 @@ ulfs_remove(void *v) vrele(vp); else vput(vp); - vput(dvp); return (error); } @@ -667,7 +666,7 @@ ulfs_whiteout(void *v) int ulfs_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -697,10 +696,9 @@ ulfs_rmdir(void *v) */ if (dp == ip || vp->v_mountedhere != NULL) { if (dp == ip) - vrele(dvp); + vrele(vp); else - vput(dvp); - vput(vp); + vput(vp); return (EINVAL); } @@ -752,7 +750,6 @@ ulfs_rmdir(void *v) out: VN_KNOTE(vp, NOTE_DELETE); vput(vp); - vput(dvp); return (error); } Index: src/sys/ufs/ufs/ufs_vnops.c diff -u src/sys/ufs/ufs/ufs_vnops.c:1.236 src/sys/ufs/ufs/ufs_vnops.c:1.237 --- src/sys/ufs/ufs/ufs_vnops.c:1.236 Sat Mar 18 05:39:06 2017 +++ src/sys/ufs/ufs/ufs_vnops.c Wed Apr 26 03:02:49 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_vnops.c,v 1.236 2017/03/18 05:39:06 riastradh Exp $ */ +/* $NetBSD: ufs_vnops.c,v 1.237 2017/04/26 03:02:49 riastradh Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,v 1.236 2017/03/18 05:39:06 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,v 1.237 2017/04/26 03:02:49 riastradh Exp $"); #if defined(_KERNEL_OPT) #include "opt_ffs.h" @@ -714,7 +714,7 @@ ufs_chown(struct vnode *vp, uid_t uid, g int ufs_remove(void *v) { - struct vop_remove_args /* { + struct vop_remove_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -752,7 +752,6 @@ ufs_remove(void *v) vrele(vp); else vput(vp); - vput(dvp); return (error); } @@ -1047,7 +1046,7 @@ ufs_mkdir(void *v) int ufs_rmdir(void *v) { - struct vop_rmdir_args /* { + struct vop_rmdir_v2_args /* { struct vnode *a_dvp; struct vnode *a_vp; struct componentname *a_cnp; @@ -1073,10 +1072,9 @@ ufs_rmdir(void *v) */ if (dp == ip || vp->v_mountedhere != NULL) { if (dp == ip) - vrele(dvp); + vrele(vp); else - vput(dvp); - vput(vp); + vput(vp); return (EINVAL); } @@ -1138,7 +1136,6 @@ ufs_rmdir(void *v) out: VN_KNOTE(vp, NOTE_DELETE); vput(vp); - vput(dvp); return (error); }