diff options
author | 1998-08-06 19:34:18 +0000 | |
---|---|---|
committer | 1998-08-06 19:34:18 +0000 | |
commit | 49e90f704e6505506772b877647c4b34e66d67e9 (patch) | |
tree | 07066b4a6914a2a42642e9734d912d1800507749 | |
parent | Mention new extened help and some minor cleanups (diff) | |
download | wireguard-openbsd-49e90f704e6505506772b877647c4b34e66d67e9.tar.xz wireguard-openbsd-49e90f704e6505506772b877647c4b34e66d67e9.zip |
Rename vop_revoke, vn_bwrite, vop_noislocked, vop_nolock, vop_nounlock
to be vop_generic_revoke, vop_generic_bwrite, vop_generic_islocked,
vop_generic_lock and vop_generic_unlock.
Create vop_generic_abortop and propogate change to all file systems.
Fix PR/371.
Get rid of locking in NULLFS (should be mostly unnecessary now except for
forced unmounts).
31 files changed, 311 insertions, 629 deletions
diff --git a/sys/adosfs/advnops.c b/sys/adosfs/advnops.c index 1daac26acc6..50628f1d583 100644 --- a/sys/adosfs/advnops.c +++ b/sys/adosfs/advnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: advnops.c,v 1.12 1998/07/20 00:49:21 espie Exp $ */ +/* $OpenBSD: advnops.c,v 1.13 1998/08/06 19:34:18 csapuntz Exp $ */ /* $NetBSD: advnops.c,v 1.32 1996/10/13 02:52:09 christos Exp $ */ /* @@ -63,7 +63,6 @@ int adosfs_select __P((void *)); int adosfs_strategy __P((void *)); int adosfs_link __P((void *)); int adosfs_symlink __P((void *)); -int adosfs_abortop __P((void *)); int adosfs_lock __P((void *)); int adosfs_unlock __P((void *)); int adosfs_bmap __P((void *)); @@ -129,7 +128,7 @@ struct vnodeopv_entry_desc adosfs_vnodeop_entries[] = { { &vop_symlink_desc, adosfs_symlink }, /* symlink */ { &vop_readdir_desc, adosfs_readdir }, /* readdir */ { &vop_readlink_desc, adosfs_readlink }, /* readlink */ - { &vop_abortop_desc, adosfs_abortop }, /* abortop */ + { &vop_abortop_desc, vop_generic_abortop }, /* abortop */ { &vop_inactive_desc, adosfs_inactive }, /* inactive */ { &vop_reclaim_desc, adosfs_reclaim }, /* reclaim */ { &vop_lock_desc, adosfs_lock }, /* lock */ @@ -499,20 +498,6 @@ adosfs_symlink(v) return (EROFS); } -int -adosfs_abortop(v) - void *v; -{ - struct vop_abortop_args /* { - struct vnode *a_dvp; - struct componentname *a_cnp; - } */ *ap = v; - - if ((ap->a_cnp->cn_flags & (HASBUF | SAVESTART)) == HASBUF) - FREE(ap->a_cnp->cn_pnbuf, M_NAMEI); - return (0); -} - /* * lock the anode */ diff --git a/sys/isofs/cd9660/cd9660_vnops.c b/sys/isofs/cd9660/cd9660_vnops.c index 7310d19bd02..c8e9ee08298 100644 --- a/sys/isofs/cd9660/cd9660_vnops.c +++ b/sys/isofs/cd9660/cd9660_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cd9660_vnops.c,v 1.9 1997/11/08 17:21:08 niklas Exp $ */ +/* $OpenBSD: cd9660_vnops.c,v 1.10 1998/08/06 19:34:22 csapuntz Exp $ */ /* $NetBSD: cd9660_vnops.c,v 1.42 1997/10/16 23:56:57 christos Exp $ */ /*- @@ -825,23 +825,6 @@ cd9660_symlink(v) } /* - * cd9660 abort op, called after namei() when a CREATE/DELETE isn't actually - * done. If a buffer has been saved in anticipation of a CREATE, delete it. - */ -int -cd9660_abortop(v) - void *v; -{ - struct vop_abortop_args /* { - struct vnode *a_dvp; - struct componentname *a_cnp; - } */ *ap = v; - if ((ap->a_cnp->cn_flags & (HASBUF | SAVESTART)) == HASBUF) - FREE(ap->a_cnp->cn_pnbuf, M_NAMEI); - return (0); -} - -/* * Lock an inode. */ int @@ -1002,7 +985,7 @@ int lease_check __P((void *)); #define cd9660_truncate eopnotsupp #define cd9660_update eopnotsupp #define cd9660_bwrite eopnotsupp -#define cd9660_revoke vop_revoke +#define cd9660_revoke vop_generic_revoke /* * Global vfs data structures for cd9660 @@ -1035,7 +1018,7 @@ struct vnodeopv_entry_desc cd9660_vnodeop_entries[] = { { &vop_symlink_desc, cd9660_symlink }, /* symlink */ { &vop_readdir_desc, cd9660_readdir }, /* readdir */ { &vop_readlink_desc, cd9660_readlink },/* readlink */ - { &vop_abortop_desc, cd9660_abortop }, /* abortop */ + { &vop_abortop_desc, vop_generic_abortop }, /* abortop */ { &vop_inactive_desc, cd9660_inactive },/* inactive */ { &vop_reclaim_desc, cd9660_reclaim }, /* reclaim */ { &vop_lock_desc, cd9660_lock }, /* lock */ @@ -1051,7 +1034,7 @@ struct vnodeopv_entry_desc cd9660_vnodeop_entries[] = { { &vop_vfree_desc, cd9660_vfree }, /* vfree */ { &vop_truncate_desc, cd9660_truncate },/* truncate */ { &vop_update_desc, cd9660_update }, /* update */ - { &vop_bwrite_desc, vn_bwrite }, + { &vop_bwrite_desc, vop_generic_bwrite }, { (struct vnodeop_desc*)NULL, (int(*) __P((void *)))NULL } }; struct vnodeopv_desc cd9660_vnodeop_opv_desc = @@ -1104,7 +1087,7 @@ struct vnodeopv_entry_desc cd9660_specop_entries[] = { { &vop_vfree_desc, spec_vfree }, /* vfree */ { &vop_truncate_desc, spec_truncate }, /* truncate */ { &vop_update_desc, cd9660_update }, /* update */ - { &vop_bwrite_desc, vn_bwrite }, + { &vop_bwrite_desc, vop_generic_bwrite }, { (struct vnodeop_desc*)NULL, (int(*) __P((void *)))NULL } }; struct vnodeopv_desc cd9660_specop_opv_desc = @@ -1155,7 +1138,7 @@ struct vnodeopv_entry_desc cd9660_fifoop_entries[] = { { &vop_vfree_desc, fifo_vfree }, /* vfree */ { &vop_truncate_desc, fifo_truncate }, /* truncate */ { &vop_update_desc, cd9660_update }, /* update */ - { &vop_bwrite_desc, vn_bwrite }, + { &vop_bwrite_desc, vop_generic_bwrite }, { (struct vnodeop_desc*)NULL, (int(*) __P((void *)))NULL } }; struct vnodeopv_desc cd9660_fifoop_opv_desc = diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c index 66811990ef2..26c9e49a5a2 100644 --- a/sys/kern/vfs_default.c +++ b/sys/kern/vfs_default.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_default.c,v 1.2 1998/01/11 02:10:44 csapuntz Exp $ */ +/* $OpenBSD: vfs_default.c,v 1.3 1998/08/06 19:34:24 csapuntz Exp $ */ /* @@ -47,7 +47,8 @@ #include <sys/proc.h> #include <sys/mount.h> #include <sys/vnode.h> - +#include <sys/namei.h> +#include <sys/malloc.h> #include <miscfs/specfs/specdev.h> @@ -58,7 +59,7 @@ extern struct simplelock spechash_slock; * and with all vnodes aliased to the requested vnode. */ int -vop_revoke(v) +vop_generic_revoke(v) void *v; { struct vop_revoke_args /* { @@ -70,7 +71,7 @@ vop_revoke(v) #ifdef DIAGNOSTIC if ((ap->a_flags & REVOKEALL) == 0) - panic("vop_revoke"); + panic("vop_generic_revoke"); #endif vp = ap->a_vp; @@ -84,7 +85,7 @@ vop_revoke(v) if (vp->v_flag & VXLOCK) { vp->v_flag |= VXWANT; simple_unlock(&vp->v_interlock); - tsleep((caddr_t)vp, PINOD, "vop_revokeall", 0); + tsleep((caddr_t)vp, PINOD, "vop_generic_revokeall", 0); return(0); } /* @@ -118,7 +119,7 @@ vop_revoke(v) int -vn_bwrite(v) +vop_generic_bwrite(v) void *v; { struct vop_bwrite_args *ap = v; @@ -126,6 +127,21 @@ vn_bwrite(v) return (bwrite(ap->a_bp)); } + +int +vop_generic_abortop(v) + void *v; +{ + struct vop_abortop_args /* { + struct vnode *a_dvp; + struct componentname *a_cnp; + } */ *ap = v; + + if ((ap->a_cnp->cn_flags & (HASBUF | SAVESTART)) == HASBUF) + FREE(ap->a_cnp->cn_pnbuf, M_NAMEI); + return (0); +} + /* * Stubs to use when there is no locking to be done on the underlying object. * A minimal shared lock is necessary to ensure that the underlying object @@ -133,7 +149,7 @@ vn_bwrite(v) * count is maintained in an auxillary vnode lock structure. */ int -vop_nolock(v) +vop_generic_lock(v) void *v; { struct vop_lock_args /* { @@ -181,7 +197,7 @@ vop_nolock(v) return (0); case LK_RELEASE: default: - panic("vop_nolock: bad operation %d", flags & LK_TYPE_MASK); + panic("vop_generic_lock: bad operation %d", flags & LK_TYPE_MASK); } if (flags & LK_INTERLOCK) vnflags |= LK_INTERLOCK; @@ -202,7 +218,7 @@ vop_nolock(v) */ int -vop_nounlock(v) +vop_generic_unlock(v) void *v; { struct vop_unlock_args /* { @@ -222,7 +238,7 @@ vop_nounlock(v) * Return whether or not the node is in use. */ int -vop_noislocked(v) +vop_generic_islocked(v) void *v; { struct vop_islocked_args /* { diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index cf94b1cb114..f991eb6f0ea 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_subr.c,v 1.20 1998/04/25 07:04:11 niklas Exp $ */ +/* $OpenBSD: vfs_subr.c,v 1.21 1998/08/06 19:34:26 csapuntz Exp $ */ /* $NetBSD: vfs_subr.c,v 1.53 1996/04/22 01:39:13 christos Exp $ */ /* @@ -103,12 +103,12 @@ struct simplelock spechash_slock; void insmntque __P((struct vnode *, struct mount *)); int getdevvp __P((dev_t, struct vnode **, enum vtype)); -int vunref __P((struct vnode *)); int vfs_hang_addrlist __P((struct mount *, struct netexport *, struct export_args *)); int vfs_free_netcred __P((struct radix_node *, void *)); void vfs_free_addrlist __P((struct netexport *)); +static __inline__ void vputonfreelist __P((struct vnode *)); #ifdef DEBUG void printlockedvnodes __P((void)); @@ -419,9 +419,10 @@ getnewvnode(tag, mp, vops, vpp) vprint("free vnode", vp); panic("free vnode isn't"); } + TAILQ_REMOVE(listhd, vp, v_freelist); - /* see comment on why 0xdeadb is set at end of vgone (below) */ - vp->v_flag |= VGONEHACK; + vp->v_flag &= ~VONFREELIST; + simple_unlock(&vnode_free_list_slock); vp->v_lease = NULL; if (vp->v_type != VBAD) @@ -643,18 +644,22 @@ vget(vp, flags, p) tsleep((caddr_t)vp, PINOD, "vget", 0); return (ENOENT); } - if (vp->v_usecount == 0) { + if ((vp->v_flag & VONFREELIST) && (vp->v_usecount == 0)) { simple_lock(&vnode_free_list_slock); if (vp->v_holdcnt > 0) TAILQ_REMOVE(&vnode_hold_list, vp, v_freelist); else TAILQ_REMOVE(&vnode_free_list, vp, v_freelist); simple_unlock(&vnode_free_list_slock); + vp->v_flag &= ~VONFREELIST; } vp->v_usecount++; if (flags & LK_TYPE_MASK) { if ((error = vn_lock(vp, flags | LK_INTERLOCK, p)) != 0) { - vunref(vp); + vp->v_usecount--; + if (vp->v_usecount == 0) + vputonfreelist(vp); + simple_unlock(&vp->v_interlock); } return (error); @@ -680,37 +685,34 @@ vref(vp) } #endif /* DIAGNOSTIC */ -int -vunref(vp) - struct vnode *vp; +static __inline__ void +vputonfreelist(vp) + struct vnode *vp; + { -#ifdef DIAGNOSTIC - if (vp == NULL) - panic("vrele: null vp"); -#endif - simple_lock (&vp->v_interlock); - vp->v_usecount--; - if (vp->v_usecount > 0) { - simple_unlock(&vp->v_interlock); - return (vp->v_usecount); - } -#ifdef DIAGNOSTIC - if (vp->v_usecount < 0 || vp->v_writecount != 0) { - vprint("vrele: bad ref count", vp); - panic("vrele: ref cnt"); - } -#endif + struct freelst *lst; + /* * insert at tail of LRU list */ + + vp->v_flag |= VONFREELIST; + simple_lock(&vnode_free_list_slock); - if (vp->v_holdcnt > 0) - TAILQ_INSERT_TAIL(&vnode_hold_list, vp, v_freelist); + + if (vp->v_holdcnt > 0) + lst = &vnode_hold_list; else - TAILQ_INSERT_TAIL(&vnode_free_list, vp, v_freelist); + lst = &vnode_free_list; + + + if (vp->v_type == VBAD) + TAILQ_INSERT_HEAD(lst, vp, v_freelist); + else + TAILQ_INSERT_TAIL(lst, vp, v_freelist); + simple_unlock(&vnode_free_list_slock); - return (0); } /* @@ -722,7 +724,7 @@ vput(vp) { struct proc *p = curproc; /* XXX */ -#ifdef DIGANOSTIC +#ifdef DIAGNOSTIC if (vp == NULL) panic("vput: null vp"); #endif @@ -739,17 +741,12 @@ vput(vp) panic("vput: ref cnt"); } #endif - /* - * insert at tail of LRU list - */ - simple_lock(&vnode_free_list_slock); - if (vp->v_holdcnt > 0) - TAILQ_INSERT_TAIL(&vnode_hold_list, vp, v_freelist); - else - TAILQ_INSERT_TAIL(&vnode_free_list, vp, v_freelist); - simple_unlock(&vnode_free_list_slock); - simple_unlock(&vp->v_interlock); VOP_INACTIVE(vp, p); + + if (vp->v_usecount == 0) + vputonfreelist(vp); + + simple_unlock(&vp->v_interlock); } /* @@ -760,11 +757,31 @@ void vrele(vp) register struct vnode *vp; { - struct proc *p = curproc; + struct proc *p = curproc; /* XXX */ - if (vunref(vp) == 0 && - vn_lock(vp, LK_EXCLUSIVE |LK_INTERLOCK, p) == 0) +#ifdef DIAGNOSTIC + if (vp == NULL) + panic("vrele: null vp"); +#endif + simple_lock(&vp->v_interlock); + vp->v_usecount--; + if (vp->v_usecount > 0) { + simple_unlock(&vp->v_interlock); + return; + } +#ifdef DIAGNOSTIC + if (vp->v_usecount < 0 || vp->v_writecount != 0) { + vprint("vrele: bad ref count", vp); + panic("vrele: ref cnt"); + } +#endif + if (vn_lock(vp, LK_EXCLUSIVE |LK_INTERLOCK, p) == 0) VOP_INACTIVE(vp, p); + + if (vp->v_usecount == 0) + vputonfreelist(vp); + + simple_unlock(&vp->v_interlock); } #ifdef DIAGNOSTIC @@ -779,16 +796,9 @@ vhold(vp) /* * If it is on the freelist and the hold count is currently * zero, move it to the hold list. - * - * The VGONEHACK flag reflects a call from getnewvnode, - * which will remove the vnode from the free list, but - * will not increment the ref count until after it calls vgone - * If the ref count we're incremented first, vgone would - * (incorrectly) try to close the previous instance of the - * underlying object. */ simple_lock(&vp->v_interlock); - if (!(vp->v_flag & VGONEHACK) && + if ((vp->v_flag & VONFREELIST) && vp->v_holdcnt == 0 && vp->v_usecount == 0) { simple_lock(&vnode_free_list_slock); TAILQ_REMOVE(&vnode_free_list, vp, v_freelist); @@ -814,10 +824,8 @@ holdrele(vp) /* * If it is on the holdlist and the hold count drops to * zero, move it to the free list. - * - * See above for VGONEHACK */ - if (!(vp->v_flag & VGONEHACK) && + if ((vp->v_flag & VONFREELIST) && vp->v_holdcnt == 0 && vp->v_usecount == 0) { simple_lock(&vnode_free_list_slock); TAILQ_REMOVE(&vnode_hold_list, vp, v_freelist); @@ -987,9 +995,13 @@ vclean(vp, flags, p) if (VOP_RECLAIM(vp, p)) panic("vclean: cannot reclaim"); if (active) { - if (vunref(vp) == 0 && - vp->v_holdcnt > 0) - panic("vclean: not clean"); + vp->v_usecount--; + if (vp->v_usecount == 0) { + if (vp->v_holdcnt > 0) + panic("vclean: not clean"); + vputonfreelist(vp); + } + simple_unlock(&vp->v_interlock); } cache_purge(vp); @@ -1121,21 +1133,20 @@ vgonel(vp, p) /* * If it is on the freelist and not already at the head, * move it to the head of the list. - * - * See above about the VGONEHACK */ - if (vp->v_usecount == 0) { - simple_lock(&vnode_free_list_slock); + vp->v_type = VBAD; + + if ((vp->v_flag & VONFREELIST) && + vp->v_usecount == 0) { + simple_lock(&vnode_free_list_slock); if (vp->v_holdcnt > 0) panic("vgonel: not clean"); - if (!(vp->v_flag & VGONEHACK) && - TAILQ_FIRST(&vnode_free_list) != vp) { - TAILQ_REMOVE(&vnode_free_list, vp, v_freelist); - TAILQ_INSERT_HEAD(&vnode_free_list, vp, v_freelist); - } - simple_unlock(&vnode_free_list_slock); + if (TAILQ_FIRST(&vnode_free_list) != vp) { + TAILQ_REMOVE(&vnode_free_list, vp, v_freelist); + TAILQ_INSERT_HEAD(&vnode_free_list, vp, v_freelist); + } + simple_unlock(&vnode_free_list_slock); } - vp->v_type = VBAD; } /* diff --git a/sys/kern/vfs_sync.c b/sys/kern/vfs_sync.c index f3eb30f0b4a..6225232e57a 100644 --- a/sys/kern/vfs_sync.c +++ b/sys/kern/vfs_sync.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_sync.c,v 1.3 1998/03/14 19:32:59 millert Exp $ */ +/* $OpenBSD: vfs_sync.c,v 1.4 1998/08/06 19:34:27 csapuntz Exp $ */ /* @@ -208,10 +208,10 @@ sched_sync(p) int sync_fsync __P((void *)); int sync_inactive __P((void *)); #define sync_reclaim nullop -#define sync_lock vop_nolock -#define sync_unlock vop_nounlock +#define sync_lock vop_generic_lock +#define sync_unlock vop_generic_unlock int sync_print __P((void *)); -#define sync_islocked vop_noislocked +#define sync_islocked vop_generic_islocked int (**sync_vnodeop_p) __P((void *)); struct vnodeopv_entry_desc sync_vnodeop_entries[] = { diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index f900d77fc24..b0eb7368432 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_vnops.c,v 1.16 1998/07/28 00:13:04 millert Exp $ */ +/* $OpenBSD: vfs_vnops.c,v 1.17 1998/08/06 19:34:29 csapuntz Exp $ */ /* $NetBSD: vfs_vnops.c,v 1.20 1996/02/04 02:18:41 christos Exp $ */ /* @@ -465,7 +465,7 @@ vn_lock(vp, flags, p) tsleep((caddr_t)vp, PINOD, "vn_lock", 0); error = ENOENT; } else { - error = VOP_LOCK(vp, flags | LK_INTERLOCK, p); + error = VOP_LOCK(vp, flags | LK_INTERLOCK | LK_CANRECURSE, p); if (error == 0) return (error); } diff --git a/sys/miscfs/deadfs/dead_vnops.c b/sys/miscfs/deadfs/dead_vnops.c index 76b3dd78b91..e14eda13afa 100644 --- a/sys/miscfs/deadfs/dead_vnops.c +++ b/sys/miscfs/deadfs/dead_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dead_vnops.c,v 1.5 1997/11/06 05:58:31 csapuntz Exp $ */ +/* $OpenBSD: dead_vnops.c,v 1.6 1998/08/06 19:34:30 csapuntz Exp $ */ /* $NetBSD: dead_vnops.c,v 1.16 1996/02/13 13:12:48 mycroft Exp $ */ /* @@ -78,11 +78,11 @@ int dead_select __P((void *)); #define dead_inactive nullop #define dead_reclaim nullop int dead_lock __P((void *)); -#define dead_unlock vop_nounlock +#define dead_unlock vop_generic_unlock int dead_bmap __P((void *)); int dead_strategy __P((void *)); int dead_print __P((void *)); -#define dead_islocked vop_noislocked +#define dead_islocked vop_generic_islocked #define dead_pathconf dead_ebadf #define dead_advlock dead_ebadf #define dead_blkatoff dead_badop diff --git a/sys/miscfs/fdesc/fdesc_vnops.c b/sys/miscfs/fdesc/fdesc_vnops.c index decb05b8883..25e241c30e5 100644 --- a/sys/miscfs/fdesc/fdesc_vnops.c +++ b/sys/miscfs/fdesc/fdesc_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fdesc_vnops.c,v 1.11 1998/06/11 16:34:21 deraadt Exp $ */ +/* $OpenBSD: fdesc_vnops.c,v 1.12 1998/08/06 19:34:32 csapuntz Exp $ */ /* $NetBSD: fdesc_vnops.c,v 1.32 1996/04/11 11:24:29 mrg Exp $ */ /* @@ -108,7 +108,7 @@ int fdesc_select __P((void *)); #define fdesc_fsync nullop #define fdesc_seek nullop #define fdesc_remove eopnotsupp -#define fdesc_revoke vop_revoke +#define fdesc_revoke vop_generic_revoke int fdesc_link __P((void *)); #define fdesc_rename eopnotsupp #define fdesc_mkdir eopnotsupp @@ -116,16 +116,15 @@ int fdesc_link __P((void *)); int fdesc_symlink __P((void *)); int fdesc_readdir __P((void *)); int fdesc_readlink __P((void *)); -int fdesc_abortop __P((void *)); int fdesc_inactive __P((void *)); int fdesc_reclaim __P((void *)); -#define fdesc_lock vop_nolock -#define fdesc_unlock vop_nounlock +#define fdesc_lock vop_generic_lock +#define fdesc_unlock vop_generic_unlock #define fdesc_bmap fdesc_badop #define fdesc_strategy fdesc_badop int fdesc_print __P((void *)); int fdesc_pathconf __P((void *)); -#define fdesc_islocked vop_noislocked +#define fdesc_islocked vop_generic_islocked #define fdesc_advlock eopnotsupp #define fdesc_blkatoff eopnotsupp #define fdesc_valloc eopnotsupp @@ -163,7 +162,7 @@ struct vnodeopv_entry_desc fdesc_vnodeop_entries[] = { { &vop_symlink_desc, fdesc_symlink }, /* symlink */ { &vop_readdir_desc, fdesc_readdir }, /* readdir */ { &vop_readlink_desc, fdesc_readlink }, /* readlink */ - { &vop_abortop_desc, fdesc_abortop }, /* abortop */ + { &vop_abortop_desc, vop_generic_abortop }, /* abortop */ { &vop_inactive_desc, fdesc_inactive }, /* inactive */ { &vop_reclaim_desc, fdesc_reclaim }, /* reclaim */ { &vop_lock_desc, fdesc_lock }, /* lock */ @@ -1041,20 +1040,6 @@ fdesc_symlink(v) return (EROFS); } -int -fdesc_abortop(v) - void *v; -{ - struct vop_abortop_args /* { - struct vnode *a_dvp; - struct componentname *a_cnp; - } */ *ap = v; - - if ((ap->a_cnp->cn_flags & (HASBUF | SAVESTART)) == HASBUF) - FREE(ap->a_cnp->cn_pnbuf, M_NAMEI); - return (0); -} - /* * /dev/fd "should never get here" operation */ diff --git a/sys/miscfs/fifofs/fifo.h b/sys/miscfs/fifofs/fifo.h index 8a1f5ed33ba..088bb3232be 100644 --- a/sys/miscfs/fifofs/fifo.h +++ b/sys/miscfs/fifofs/fifo.h @@ -1,4 +1,4 @@ -/* $OpenBSD: fifo.h,v 1.5 1997/11/06 05:58:33 csapuntz Exp $ */ +/* $OpenBSD: fifo.h,v 1.6 1998/08/06 19:34:34 csapuntz Exp $ */ /* $NetBSD: fifo.h,v 1.10 1996/02/09 22:40:15 christos Exp $ */ /* @@ -60,7 +60,7 @@ int fifo_select __P((void *)); #define fifo_fsync nullop #define fifo_seek fifo_badop #define fifo_remove fifo_badop -#define fifo_revoke vop_revoke +#define fifo_revoke vop_generic_revoke #define fifo_link fifo_badop #define fifo_rename fifo_badop #define fifo_mkdir fifo_badop @@ -71,12 +71,12 @@ int fifo_select __P((void *)); #define fifo_abortop fifo_badop int fifo_inactive __P((void *)); #define fifo_reclaim nullop -#define fifo_lock vop_nolock -#define fifo_unlock vop_nounlock +#define fifo_lock vop_generic_lock +#define fifo_unlock vop_generic_unlock int fifo_bmap __P((void *)); #define fifo_strategy fifo_badop int fifo_print __P((void *)); -#define fifo_islocked vop_noislocked +#define fifo_islocked vop_generic_islocked int fifo_pathconf __P((void *)); int fifo_advlock __P((void *)); #define fifo_blkatoff fifo_badop diff --git a/sys/miscfs/kernfs/kernfs_vnops.c b/sys/miscfs/kernfs/kernfs_vnops.c index fb2f56a284d..5f5f7acbe6e 100644 --- a/sys/miscfs/kernfs/kernfs_vnops.c +++ b/sys/miscfs/kernfs/kernfs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kernfs_vnops.c,v 1.14 1998/06/11 16:34:23 deraadt Exp $ */ +/* $OpenBSD: kernfs_vnops.c,v 1.15 1998/08/06 19:34:36 csapuntz Exp $ */ /* $NetBSD: kernfs_vnops.c,v 1.43 1996/03/16 23:52:47 christos Exp $ */ /* @@ -137,21 +137,20 @@ int kernfs_write __P((void *)); #define kernfs_remove eopnotsupp int kernfs_link __P((void *)); #define kernfs_rename eopnotsupp -#define kernfs_revoke vop_revoke +#define kernfs_revoke vop_generic_revoke #define kernfs_mkdir eopnotsupp #define kernfs_rmdir eopnotsupp int kernfs_symlink __P((void *)); int kernfs_readdir __P((void *)); #define kernfs_readlink eopnotsupp -int kernfs_abortop __P((void *)); int kernfs_inactive __P((void *)); int kernfs_reclaim __P((void *)); -#define kernfs_lock vop_nolock -#define kernfs_unlock vop_nounlock +#define kernfs_lock vop_generic_lock +#define kernfs_unlock vop_generic_unlock #define kernfs_bmap kernfs_badop #define kernfs_strategy kernfs_badop int kernfs_print __P((void *)); -#define kernfs_islocked vop_noislocked +#define kernfs_islocked vop_generic_islocked int kernfs_pathconf __P((void *)); #define kernfs_advlock eopnotsupp #define kernfs_blkatoff eopnotsupp @@ -191,7 +190,7 @@ struct vnodeopv_entry_desc kernfs_vnodeop_entries[] = { { &vop_symlink_desc, kernfs_symlink }, /* symlink */ { &vop_readdir_desc, kernfs_readdir }, /* readdir */ { &vop_readlink_desc, kernfs_readlink },/* readlink */ - { &vop_abortop_desc, kernfs_abortop }, /* abortop */ + { &vop_abortop_desc, vop_generic_abortop }, /* abortop */ { &vop_inactive_desc, kernfs_inactive },/* inactive */ { &vop_reclaim_desc, kernfs_reclaim }, /* reclaim */ { &vop_lock_desc, kernfs_lock }, /* lock */ @@ -815,20 +814,6 @@ kernfs_symlink(v) return (EROFS); } -int -kernfs_abortop(v) - void *v; -{ - struct vop_abortop_args /* { - struct vnode *a_dvp; - struct componentname *a_cnp; - } */ *ap = v; - - if ((ap->a_cnp->cn_flags & (HASBUF | SAVESTART)) == HASBUF) - FREE(ap->a_cnp->cn_pnbuf, M_NAMEI); - return (0); -} - /* * /dev/fd "should never get here" operation */ diff --git a/sys/miscfs/nullfs/null.h b/sys/miscfs/nullfs/null.h index ae1ac9ed50a..673e48202f9 100644 --- a/sys/miscfs/nullfs/null.h +++ b/sys/miscfs/nullfs/null.h @@ -1,4 +1,4 @@ -/* $OpenBSD: null.h,v 1.9 1998/03/01 17:18:01 niklas Exp $ */ +/* $OpenBSD: null.h,v 1.10 1998/08/06 19:34:38 csapuntz Exp $ */ /* $NetBSD: null.h,v 1.7 1996/05/17 20:53:11 gwr Exp $ */ /* @@ -57,29 +57,8 @@ struct null_node { LIST_ENTRY(null_node) null_hash; /* Hash list */ struct vnode *null_lowervp; /* VREFed once */ struct vnode *null_vnode; /* Back pointer */ - unsigned int null_flags; /* locking, etc. */ -#ifdef DIAGNOSTIC - pid_t null_pid; /* who's locking it? */ - caddr_t null_lockpc; /* their return addr */ - caddr_t null_lockpc2; /* their return addr^2 */ -#endif }; -#if !defined(__GNUC__) || __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) -#define RETURN_PC(frameno) (void *)0 -#else -/* Some architectures can just get the current frame's return address */ -#if defined(__alpha__) || defined(__mips__) -#define RETURN_PC(frameno) (frameno ? 0 : __builtin_return_address(frameno)) -#else -#define RETURN_PC(frameno) __builtin_return_address(frameno) -#endif -#endif - -#define NULL_WANTED 0x01 -#define NULL_LOCKED 0x02 -#define NULL_LLOCK 0x04 - extern int null_node_create __P((struct mount *mp, struct vnode *target, struct vnode **vpp, int lockit)); #define MOUNTTONULLMOUNT(mp) ((struct null_mount *)((mp)->mnt_data)) diff --git a/sys/miscfs/nullfs/null_subr.c b/sys/miscfs/nullfs/null_subr.c index a2b9e9ec6e0..5d4fadc09d8 100644 --- a/sys/miscfs/nullfs/null_subr.c +++ b/sys/miscfs/nullfs/null_subr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: null_subr.c,v 1.7 1997/11/06 05:58:39 csapuntz Exp $ */ +/* $OpenBSD: null_subr.c,v 1.8 1998/08/06 19:34:41 csapuntz Exp $ */ /* $NetBSD: null_subr.c,v 1.6 1996/05/10 22:50:52 jtk Exp $ */ /* @@ -125,7 +125,7 @@ loop: } } - return NULL; + return NULLVP; } @@ -147,12 +147,18 @@ null_node_alloc(mp, lowervp, vpp) extern int (**dead_vnodeop_p) __P((void *)); struct proc *p = curproc; - if ((error = getnewvnode(VT_NULL, mp, null_vnodeop_p, &vp)) != 0) - return (error); - vp->v_type = lowervp->v_type; MALLOC(xp, struct null_node *, sizeof(struct null_node), M_TEMP, M_WAITOK); + + if ((error = getnewvnode(VT_NULL, mp, null_vnodeop_p, vpp)) != 0) { + FREE (xp, M_TEMP); + return (error); + } + + vp = *vpp; + vp->v_type = lowervp->v_type; + if (vp->v_type == VBLK || vp->v_type == VCHR) { MALLOC(vp->v_specinfo, struct specinfo *, sizeof(struct specinfo), M_VNODE, M_WAITOK); @@ -162,11 +168,6 @@ null_node_alloc(mp, lowervp, vpp) vp->v_data = xp; xp->null_vnode = vp; xp->null_lowervp = lowervp; - xp->null_flags = 0; -#ifdef DIAGNOSTIC - xp->null_pid = -1; - xp->null_lockpc = xp->null_lockpc2 = 0; -#endif /* * Before we insert our new node onto the hash chains, * check to see if someone else has beaten us to it. @@ -230,7 +231,6 @@ loop: } /* XXX end of transmogrified checkalias() */ - *vpp = vp; VREF(lowervp); /* Extra VREF will be vrele'd in null_node_create */ hd = NULL_NHASH(lowervp); LIST_INSERT_HEAD(hd, xp, null_hash); @@ -254,7 +254,6 @@ null_node_create(mp, lowervp, newvpp, takelock) int takelock; { struct vnode *aliasvp; - struct proc *p = curproc; /* XXX */ if ((aliasvp = null_node_find(mp, lowervp)) != NULL) { /* @@ -299,11 +298,6 @@ null_node_create(mp, lowervp, newvpp, takelock) #ifdef NULLFS_DIAGNOSTIC vprint("null_node_create: alias", aliasvp); #endif - /* lower node was locked: mark it as locked and take - upper layer lock */ - VTONULL(aliasvp)->null_flags |= NULL_LLOCK; - if (takelock) - vn_lock(aliasvp, LK_EXCLUSIVE | LK_RETRY, p); *newvpp = aliasvp; return (0); diff --git a/sys/miscfs/nullfs/null_vnops.c b/sys/miscfs/nullfs/null_vnops.c index c0a396850c1..127d7c51ef4 100644 --- a/sys/miscfs/nullfs/null_vnops.c +++ b/sys/miscfs/nullfs/null_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: null_vnops.c,v 1.9 1997/12/27 04:49:14 csapuntz Exp $ */ +/* $OpenBSD: null_vnops.c,v 1.10 1998/08/06 19:34:42 csapuntz Exp $ */ /* $NetBSD: null_vnops.c,v 1.7 1996/05/10 22:51:01 jtk Exp $ */ /* @@ -231,9 +231,9 @@ null_bypass(v) void *v; { struct vop_generic_args /* { - struct vnodeop_desc *a_desc; - <other random data follows, presumably> - } */ *ap = v; + struct vnodeop_desc *a_desc; + <other random data follows, presumably> + } */ *ap = v; register struct vnode **this_vp_p; int error; struct vnode *old_vps[VDESC_MAX_VPS]; @@ -271,7 +271,7 @@ null_bypass(v) * that aren't. (We must always map first vp or vclean fails.) */ if (i && (*this_vp_p == NULLVP || - (*this_vp_p)->v_op != null_vnodeop_p)) { + (*this_vp_p)->v_op != null_vnodeop_p)) { old_vps[i] = NULLVP; } else { old_vps[i] = *this_vp_p; @@ -305,57 +305,46 @@ null_bypass(v) if (old_vps[i] != NULLVP) { *(vps_p[i]) = old_vps[i]; if (reles & 1) { - /* they really vput them, so we must drop - our locks (but mark underneath as - unlocked first). - Beware of vnode duplication--put it once, - and rele the rest. Check this - by looking at our upper flag. */ - if (VTONULL(*(vps_p[i]))->null_flags & NULL_LOCKED) { - VTONULL(*(vps_p[i]))->null_flags &= ~NULL_LLOCK; - vput(*(vps_p[i])); - } else - vrele(*(vps_p[i])); + vrele(*(vps_p[i])); } } - } - /* - * Map the possible out-going vpp - * (Assumes that the lower layer always returns - * a VREF'ed vpp unless it gets an error.) - */ - if (descp->vdesc_vpp_offset != VDESC_NO_OFFSET && - !(descp->vdesc_flags & VDESC_NOMAP_VPP) && - !error) { /* - * XXX - even though some ops have vpp returned vp's, - * several ops actually vrele this before returning. - * We must avoid these ops. - * (This should go away when these ops are regularized.) + * Map the possible out-going vpp + * (Assumes that the lower layer always returns + * a VREF'ed vpp unless it gets an error.) */ - if (descp->vdesc_flags & VDESC_VPP_WILLRELE) - goto out; - vppp = VOPARG_OFFSETTO(struct vnode***, - descp->vdesc_vpp_offset,ap); - /* - * This assumes that **vppp is a locked vnode (it is always - * so as of this writing, NetBSD-current 1995/02/16) - */ - /* - * (don't want to lock it if being called on behalf - * of lookup--it plays weird locking games depending - * on whether or not it's looking up ".", "..", etc. - */ - error = null_node_create(old_vps[0]->v_mount, **vppp, *vppp, - descp == &vop_lookup_desc ? 0 : 1); + if (descp->vdesc_vpp_offset != VDESC_NO_OFFSET && + !(descp->vdesc_flags & VDESC_NOMAP_VPP) && + !error) { + /* + * XXX - even though some ops have vpp returned vp's, + * several ops actually vrele this before returning. + * We must avoid these ops. + * (This should go away when these ops are regularized.) + */ + if (descp->vdesc_flags & VDESC_VPP_WILLRELE) + goto out; + vppp = VOPARG_OFFSETTO(struct vnode***, + descp->vdesc_vpp_offset,ap); + /* + * This assumes that **vppp is a locked vnode (it is always + * so as of this writing, NetBSD-current 1995/02/16) + * + * (don't want to lock it if being called on behalf + * of lookup--it plays weird locking games depending + * on whether or not it's looking up ".", "..", etc. + */ + error = null_node_create(old_vps[0]->v_mount, **vppp, *vppp, + descp == &vop_lookup_desc ? 0 : 1); + } } out: return (error); + } - /* * We handle getattr only to change the fsid. */ @@ -434,19 +423,8 @@ null_print(v) struct vnode *a_vp; } */ *ap = v; register struct vnode *vp = ap->a_vp; - register struct null_node *nn = VTONULL(vp); printf ("\ttag VT_NULLFS, vp=%p, lowervp=%p\n", vp, NULLVPTOLOWERVP(vp)); -#ifdef DIAGNOSTIC - printf("%s%s owner pid %d retpc %p retret %p\n", - (nn->null_flags & NULL_LOCKED) ? "(LOCKED) " : "", - (nn->null_flags & NULL_LLOCK) ? "(LLOCK) " : "", - nn->null_pid, nn->null_lockpc, nn->null_lockpc2); -#else - printf("%s%s\n", - (nn->null_flags & NULL_LOCKED) ? "(LOCKED) " : "", - (nn->null_flags & NULL_LLOCK) ? "(LLOCK) " : ""); -#endif vprint("nullfs lowervp", NULLVPTOLOWERVP(vp)); return (0); } @@ -519,108 +497,34 @@ null_lock(v) void *v; { struct vop_lock_args *ap = v; - struct vnode *vp = ap->a_vp; - struct null_node *nn; - struct proc *p = ap->a_p; -#ifdef NULLFS_DIAGNOSTIC - vprint("null_lock_e", ap->a_vp); - printf("retpc=%p, retretpc=%p\n", - RETURN_PC(0), - RETURN_PC(1)); +#if 0 + vop_generic_lock(ap); + if ((ap->a_flags & LK_TYPE_MASK) == LK_DRAIN) + return (0); + ap->a_flags &= ~LK_INTERLOCK; #endif -start: - while (vp->v_flag & VXLOCK) { - vp->v_flag |= VXWANT; - tsleep((caddr_t)vp, PINOD, "nulllock1", 0); - } - - nn = VTONULL(vp); - - if ((nn->null_flags & NULL_LLOCK) == 0 && - (vp->v_usecount != 0)) { - /* - * only lock underlying node if we haven't locked it yet - * for null ops, and our refcount is nonzero. If usecount - * is zero, we are probably being reclaimed so we need to - * keep our hands off the lower node. - */ - vn_lock(nn->null_lowervp, LK_EXCLUSIVE | LK_RETRY, p); - nn->null_flags |= NULL_LLOCK; - } - - if (nn->null_flags & NULL_LOCKED) { -#ifdef DIAGNOSTIC - if (curproc && nn->null_pid == curproc->p_pid && - nn->null_pid > -1 && curproc->p_pid > -1) { - vprint("self-lock", vp); - panic("null: locking against myself"); - } -#endif - nn->null_flags |= NULL_WANTED; - tsleep((caddr_t)nn, PINOD, "nulllock2", 0); - goto start; - } - -#ifdef DIAGNOSTIC - if (curproc) - nn->null_pid = curproc->p_pid; - else - nn->null_pid = -1; - nn->null_lockpc = RETURN_PC(0); - nn->null_lockpc2 = RETURN_PC(1); -#endif - - nn->null_flags |= NULL_LOCKED; - return (0); + return (null_bypass((struct vop_generic_args *)ap)); } int null_unlock(v) void *v; { - struct vop_lock_args *ap = v; - struct proc *p = ap->a_p; - struct null_node *nn = VTONULL(ap->a_vp); - -#ifdef NULLFS_DIAGNOSTIC - vprint("null_unlock_e", ap->a_vp); -#endif -#ifdef DIAGNOSTIC - if ((nn->null_flags & NULL_LOCKED) == 0) { - vprint("null_unlock", ap->a_vp); - panic("null: unlocking unlocked node"); - } - if (curproc && nn->null_pid != curproc->p_pid && - curproc->p_pid > -1 && nn->null_pid > -1) { - vprint("null_unlock", ap->a_vp); - panic("null: unlocking other process's null node"); - } + struct vop_unlock_args *ap = v; +#if 0 + vop_generic_unlock(ap); + ap->a_flags &= ~LK_INTERLOCK; #endif - nn->null_flags &= ~NULL_LOCKED; - - if ((nn->null_flags & NULL_LLOCK) != 0) - VOP_UNLOCK(nn->null_lowervp, 0, p); - - nn->null_flags &= ~NULL_LLOCK; - - if (nn->null_flags & NULL_WANTED) { - nn->null_flags &= ~NULL_WANTED; - wakeup((caddr_t)nn); - } -#ifdef DIAGNOSTIC - nn->null_pid = 0; - nn->null_lockpc = nn->null_lockpc2 = 0; -#endif - return (0); + return (null_bypass((struct vop_generic_args *)ap)); } int null_islocked(v) void *v; { - struct vop_islocked_args *ap = v; - return ((VTONULL(ap->a_vp)->null_flags & NULL_LOCKED) ? 1 : 0); + /* XXX */ + return (0); } int @@ -634,130 +538,56 @@ null_lookup(v) struct componentname *a_cnp; } */ *ap = v; register int error; - register struct vnode *dvp; int flags = ap->a_cnp->cn_flags; struct componentname *cnp = ap->a_cnp; +#if 0 + register struct vnode *dvp, *vp; struct proc *p = cnp->cn_proc; + struct vop_unlock_args unlockargs; + struct vop_lock_args lockargs; +#endif + #ifdef NULLFS_DIAGNOSTIC printf("null_lookup: dvp=%lx, name='%s'\n", ap->a_dvp, cnp->cn_nameptr); #endif - /* - * the starting dir (ap->a_dvp) comes in locked. - */ - - /* set LOCKPARENT to hold on to it until done below */ - cnp->cn_flags |= LOCKPARENT; - error = null_bypass(ap); - if (!(flags & LOCKPARENT)) - cnp->cn_flags &= ~LOCKPARENT; - if (error) - /* - * starting dir is still locked/has been relocked - * on error return. - */ - return error; - - if (ap->a_dvp != *ap->a_vpp) { - /* - * Lookup returns node locked; we mark both lower and - * upper nodes as locked by setting the lower lock - * flag (it came back locked), and then call lock to - * set upper lock flag & record pid, etc. see - * null_node_create() - */ - VTONULL(*ap->a_vpp)->null_flags |= NULL_LLOCK; + if ((flags & ISLASTCN) && (ap->a_dvp->v_mount->mnt_flag & MNT_RDONLY) && + (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME)) + return (EROFS); + error = null_bypass((struct vop_generic_args *)ap); + if (error == EJUSTRETURN && (flags & ISLASTCN) && + (ap->a_dvp->v_mount->mnt_flag & MNT_RDONLY) && + (cnp->cn_nameiop == CREATE || cnp->cn_nameiop == RENAME)) + error = EROFS; - dvp = ap->a_dvp; - if (flags & ISDOTDOT) { - /* - * If we're looking up `..' and this isn't the - * last component, then the starting directory - * ("parent") is _unlocked_ as a side-effect - * of lookups. This is to avoid deadlocks: - * lock order is always parent, child, so - * looking up `..' requires dropping the lock - * on the starting directory. - */ - /* see ufs_lookup() for hairy ugly locking protocol - examples */ - /* - * underlying starting dir comes back locked if flags & - * LOCKPARENT (which we artificially set above) and - * ISLASTCN. - */ - if (flags & ISLASTCN) { - VTONULL(dvp)->null_flags |= NULL_LLOCK; /* no-op, right? */ -#ifdef NULLFS_DIAGNOSTIC - if (!VOP_ISLOCKED(VTONULL(dvp)->null_lowervp)) { - vprint("lowerdvp not locked after lookup\n", dvp); - panic("null_lookup not locked"); - } -#endif - } else { - VTONULL(dvp)->null_flags &= ~NULL_LLOCK; -#ifdef NULLFS_DIAGNOSTIC - if (VOP_ISLOCKED(VTONULL(dvp)->null_lowervp)) { - vprint("lowerdvp locked after lookup?\n", dvp); - panic("null_lookup locked"); - } -#endif - } - /* - * locking order: drop lock on lower-in-tree - * element, then get lock on higher-in-tree - * element, then (if needed) re-fetch lower - * lock. No need for vget() since we hold a - * refcount to the starting directory - */ - VOP_UNLOCK(dvp, 0, p); - vn_lock(*ap->a_vpp, LK_EXCLUSIVE | LK_RETRY, p); - /* - * we should return our directory locked if - * (flags & LOCKPARENT) and (flags & ISLASTCN) - */ - if ((flags & LOCKPARENT) && (flags & ISLASTCN)) - vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY, p); - } else { - /* - * Normal directory locking order: we hold the starting - * directory locked; now lock our layer of the target. - */ - vn_lock(*ap->a_vpp, LK_RETRY | LK_EXCLUSIVE, p); - /* - * underlying starting dir comes back locked - * if lockparent (we set it) and no error - * (this leg) and ISLASTCN - */ - if (flags & ISLASTCN) { - VTONULL(dvp)->null_flags |= NULL_LLOCK; /* no op, right? */ -#ifdef NULLFS_DIAGNOSTIC - if (!VOP_ISLOCKED(VTONULL(dvp)->null_lowervp)) { - vprint("lowerdvp not locked after lookup\n", dvp); - panic("null_lookup not locked"); - } -#endif - } else { - VTONULL(dvp)->null_flags &= ~NULL_LLOCK; -#ifdef NULLFS_DIAGNOSTIC - if (VOP_ISLOCKED(VTONULL(dvp)->null_lowervp)) { - vprint("lowerdvp locked after lookup?\n", dvp); - panic("null_lookup locked"); - } -#endif - } - /* - * we should return our directory unlocked if - * our caller didn't want the parent locked, - * !(flags & LOCKPARENT), or we're not at the - * end yet, !(flags & ISLASTCN) - */ - if (!(flags & LOCKPARENT) || !(flags & ISLASTCN)) - VOP_UNLOCK(dvp, 0, p); - } +#if 0 + /* + * We must do the same locking and unlocking at this layer as + * is done in the layers below us. We could figure this out + * based on the error return and the LASTCN, LOCKPARENT, and + * LOCKLEAF flags. However, it is more expidient to just find + * out the state of the lower level vnodes and set ours to the + * same state. + */ + dvp = ap->a_dvp; + vp = *ap->a_vpp; + if (dvp == vp) + return (error); + if (!VOP_ISLOCKED(dvp)) { + unlockargs.a_vp = dvp; + unlockargs.a_flags = 0; + unlockargs.a_p = p; + vop_generic_unlock(&unlockargs); + } + if (vp != NULLVP && VOP_ISLOCKED(vp)) { + lockargs.a_vp = vp; + lockargs.a_flags = LK_SHARED; + lockargs.a_p = p; + vop_generic_lock(&lockargs); } - return error; +#endif + return (error); } /* diff --git a/sys/miscfs/portal/portal_vnops.c b/sys/miscfs/portal/portal_vnops.c index a6dd01e21c8..d9bb2855517 100644 --- a/sys/miscfs/portal/portal_vnops.c +++ b/sys/miscfs/portal/portal_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: portal_vnops.c,v 1.6 1998/06/11 16:34:25 deraadt Exp $ */ +/* $OpenBSD: portal_vnops.c,v 1.7 1998/08/06 19:34:44 csapuntz Exp $ */ /* $NetBSD: portal_vnops.c,v 1.17 1996/02/13 13:12:57 mycroft Exp $ */ /* @@ -95,17 +95,16 @@ int portal_link __P((void *)); #define portal_rmdir eopnotsupp int portal_symlink __P((void *)); int portal_readdir __P((void *)); -#define portal_revoke vop_revoke +#define portal_revoke vop_generic_revoke #define portal_readlink eopnotsupp -int portal_abortop __P((void *)); int portal_inactive __P((void *)); int portal_reclaim __P((void *)); -#define portal_lock vop_nolock -#define portal_unlock vop_nounlock +#define portal_lock vop_generic_lock +#define portal_unlock vop_generic_unlock #define portal_bmap portal_badop #define portal_strategy portal_badop int portal_print __P((void *)); -#define portal_islocked vop_noislocked +#define portal_islocked vop_generic_islocked int portal_pathconf __P((void *)); #define portal_advlock eopnotsupp #define portal_blkatoff eopnotsupp @@ -142,7 +141,7 @@ struct vnodeopv_entry_desc portal_vnodeop_entries[] = { { &vop_symlink_desc, portal_symlink }, /* symlink */ { &vop_readdir_desc, portal_readdir }, /* readdir */ { &vop_readlink_desc, portal_readlink }, /* readlink */ - { &vop_abortop_desc, portal_abortop }, /* abortop */ + { &vop_abortop_desc, vop_generic_abortop }, /* abortop */ { &vop_inactive_desc, portal_inactive }, /* inactive */ { &vop_reclaim_desc, portal_reclaim }, /* reclaim */ { &vop_lock_desc, portal_lock }, /* lock */ @@ -729,20 +728,6 @@ portal_symlink(v) } int -portal_abortop(v) - void *v; -{ - struct vop_abortop_args /* { - struct vnode *a_dvp; - struct componentname *a_cnp; - } */ *ap = v; - - if ((ap->a_cnp->cn_flags & (HASBUF | SAVESTART)) == HASBUF) - FREE(ap->a_cnp->cn_pnbuf, M_NAMEI); - return (0); -} - -int portal_badop(v) void *v; { diff --git a/sys/miscfs/procfs/procfs_vnops.c b/sys/miscfs/procfs/procfs_vnops.c index a20716360a4..fcab3d33df1 100644 --- a/sys/miscfs/procfs/procfs_vnops.c +++ b/sys/miscfs/procfs/procfs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: procfs_vnops.c,v 1.11 1998/06/27 07:32:11 deraadt Exp $ */ +/* $OpenBSD: procfs_vnops.c,v 1.12 1998/08/06 19:34:46 csapuntz Exp $ */ /* $NetBSD: procfs_vnops.c,v 1.40 1996/03/16 23:52:55 christos Exp $ */ /* @@ -127,7 +127,6 @@ int procfs_link __P((void *)); int procfs_symlink __P((void *)); int procfs_readdir __P((void *)); int procfs_readlink __P((void *)); -int procfs_abortop __P((void *)); int procfs_inactive __P((void *)); int procfs_reclaim __P((void *)); #define procfs_lock nullop @@ -175,7 +174,7 @@ struct vnodeopv_entry_desc procfs_vnodeop_entries[] = { { &vop_symlink_desc, procfs_symlink }, /* symlink */ { &vop_readdir_desc, procfs_readdir }, /* readdir */ { &vop_readlink_desc, procfs_readlink }, /* readlink */ - { &vop_abortop_desc, procfs_abortop }, /* abortop */ + { &vop_abortop_desc, vop_generic_abortop }, /* abortop */ { &vop_inactive_desc, procfs_inactive }, /* inactive */ { &vop_reclaim_desc, procfs_reclaim }, /* reclaim */ { &vop_lock_desc, procfs_lock }, /* lock */ @@ -464,25 +463,6 @@ procfs_symlink(v) return (EROFS); } -/* - * _abortop is called when operations such as - * rename and create fail. this entry is responsible - * for undoing any side-effects caused by the lookup. - * this will always include freeing the pathname buffer. - */ -int -procfs_abortop(v) - void *v; -{ - struct vop_abortop_args /* { - struct vnode *a_dvp; - struct componentname *a_cnp; - } */ *ap = v; - - if ((ap->a_cnp->cn_flags & (HASBUF | SAVESTART)) == HASBUF) - FREE(ap->a_cnp->cn_pnbuf, M_NAMEI); - return (0); -} /* * generic entry point for unsupported operations diff --git a/sys/miscfs/specfs/specdev.h b/sys/miscfs/specfs/specdev.h index cf8193edee2..2f6db5186f2 100644 --- a/sys/miscfs/specfs/specdev.h +++ b/sys/miscfs/specfs/specdev.h @@ -1,4 +1,4 @@ -/* $OpenBSD: specdev.h,v 1.6 1997/11/06 05:58:45 csapuntz Exp $ */ +/* $OpenBSD: specdev.h,v 1.7 1998/08/06 19:34:48 csapuntz Exp $ */ /* $NetBSD: specdev.h,v 1.12 1996/02/13 13:13:01 mycroft Exp $ */ /* @@ -110,9 +110,9 @@ int spec_fsync __P((void *)); #define spec_abortop spec_badop int spec_inactive __P((void *)); #define spec_reclaim nullop -#define spec_lock vop_nolock -#define spec_unlock vop_nounlock -#define spec_islocked vop_noislocked +#define spec_lock vop_generic_lock +#define spec_unlock vop_generic_unlock +#define spec_islocked vop_generic_islocked int spec_bmap __P((void *)); int spec_strategy __P((void *)); int spec_print __P((void *)); @@ -124,5 +124,5 @@ int spec_advlock __P((void *)); #define spec_vfree spec_badop #define spec_truncate nullop #define spec_update nullop -#define spec_bwrite vn_bwrite -#define spec_revoke vop_revoke +#define spec_bwrite vop_generic_bwrite +#define spec_revoke vop_generic_revoke diff --git a/sys/miscfs/umapfs/umap_vnops.c b/sys/miscfs/umapfs/umap_vnops.c index 14a23102aed..a428b043354 100644 --- a/sys/miscfs/umapfs/umap_vnops.c +++ b/sys/miscfs/umapfs/umap_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: umap_vnops.c,v 1.9 1997/11/06 05:58:49 csapuntz Exp $ */ +/* $OpenBSD: umap_vnops.c,v 1.10 1998/08/06 19:34:50 csapuntz Exp $ */ /* $NetBSD: umap_vnops.c,v 1.5.4.1 1996/05/25 22:13:35 jtc Exp $ */ /* @@ -401,7 +401,7 @@ umap_lock(v) struct proc *a_p; } */ *ap = v; - vop_nolock(ap); + vop_generic_lock(ap); if ((ap->a_flags & LK_TYPE_MASK) == LK_DRAIN) return (0); ap->a_flags &= ~LK_INTERLOCK; @@ -423,7 +423,7 @@ umap_unlock(v) struct proc *a_p; } */ *ap = v; - vop_nounlock(ap); + vop_generic_unlock(ap); ap->a_flags &= ~LK_INTERLOCK; return (null_bypass(ap)); } diff --git a/sys/miscfs/union/union_vnops.c b/sys/miscfs/union/union_vnops.c index e0c76bf9d74..4c371d45b50 100644 --- a/sys/miscfs/union/union_vnops.c +++ b/sys/miscfs/union/union_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: union_vnops.c,v 1.10 1998/07/13 02:52:01 csapuntz Exp $ */ +/* $OpenBSD: union_vnops.c,v 1.11 1998/08/06 19:34:51 csapuntz Exp $ */ /* $NetBSD: union_vnops.c,v 1.30.4.1 1996/05/25 22:10:14 jtc Exp $ */ /* @@ -1623,7 +1623,7 @@ union_lock(v) int flags = ap->a_flags; int error = 0; - vop_nolock(ap); + vop_generic_lock(ap); /* * Need to do real lockmgr-style locking here. * in the mean time, draining won't work quite right, @@ -1720,7 +1720,7 @@ union_unlock(v) un->un_pid = 0; #endif - vop_nounlock(v); + vop_generic_unlock(v); return (0); } diff --git a/sys/msdosfs/msdosfs_vnops.c b/sys/msdosfs/msdosfs_vnops.c index 1c97ca4bdd1..052b5ac29e9 100644 --- a/sys/msdosfs/msdosfs_vnops.c +++ b/sys/msdosfs/msdosfs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: msdosfs_vnops.c,v 1.17 1998/06/09 17:56:03 deraadt Exp $ */ +/* $OpenBSD: msdosfs_vnops.c,v 1.18 1998/08/06 19:34:54 csapuntz Exp $ */ /* $NetBSD: msdosfs_vnops.c,v 1.63 1997/10/17 11:24:19 ws Exp $ */ /*- @@ -1753,20 +1753,6 @@ msdosfs_readlink(v) } int -msdosfs_abortop(v) - void *v; -{ - struct vop_abortop_args /* { - struct vnode *a_dvp; - struct componentname *a_cnp; - } */ *ap = v; - - if ((ap->a_cnp->cn_flags & (HASBUF | SAVESTART)) == HASBUF) - FREE(ap->a_cnp->cn_pnbuf, M_NAMEI); - return (0); -} - -int msdosfs_lock(v) void *v; { @@ -1998,7 +1984,7 @@ struct vnodeopv_entry_desc msdosfs_vnodeop_entries[] = { { &vop_symlink_desc, msdosfs_symlink }, /* symlink */ { &vop_readdir_desc, msdosfs_readdir }, /* readdir */ { &vop_readlink_desc, msdosfs_readlink }, /* readlink */ - { &vop_abortop_desc, msdosfs_abortop }, /* abortop */ + { &vop_abortop_desc, vop_generic_abortop }, /* abortop */ { &vop_inactive_desc, msdosfs_inactive }, /* inactive */ { &vop_reclaim_desc, msdosfs_reclaim }, /* reclaim */ { &vop_lock_desc, msdosfs_lock }, /* lock */ @@ -2011,7 +1997,7 @@ struct vnodeopv_entry_desc msdosfs_vnodeop_entries[] = { { &vop_advlock_desc, msdosfs_advlock }, /* advlock */ { &vop_reallocblks_desc, msdosfs_reallocblks }, /* reallocblks */ { &vop_update_desc, msdosfs_update }, /* update */ - { &vop_bwrite_desc, vn_bwrite }, /* bwrite */ + { &vop_bwrite_desc, vop_generic_bwrite }, /* bwrite */ { (struct vnodeop_desc *)NULL, (int (*) __P((void *)))NULL } }; struct vnodeopv_desc msdosfs_vnodeop_opv_desc = diff --git a/sys/nfs/nfs_node.c b/sys/nfs/nfs_node.c index bce4a38e96b..a2c96342b27 100644 --- a/sys/nfs/nfs_node.c +++ b/sys/nfs/nfs_node.c @@ -1,4 +1,4 @@ -/* $OpenBSD: nfs_node.c,v 1.10 1997/11/06 05:59:00 csapuntz Exp $ */ +/* $OpenBSD: nfs_node.c,v 1.11 1998/08/06 19:34:58 csapuntz Exp $ */ /* $NetBSD: nfs_node.c,v 1.16 1996/02/18 11:53:42 fvdl Exp $ */ /* @@ -239,21 +239,3 @@ nfs_reclaim(v) return (0); } -/* - * Nfs abort op, called after namei() when a CREATE/DELETE isn't actually - * done. Currently nothing to do. - */ -/* ARGSUSED */ -int -nfs_abortop(v) - void *v; -{ - struct vop_abortop_args /* { - struct vnode *a_dvp; - struct componentname *a_cnp; - } */ *ap = v; - - if ((ap->a_cnp->cn_flags & (HASBUF | SAVESTART)) == HASBUF) - FREE(ap->a_cnp->cn_pnbuf, M_NAMEI); - return (0); -} diff --git a/sys/nfs/nfs_var.h b/sys/nfs/nfs_var.h index 2b1980c14a5..6696f7f6bf7 100644 --- a/sys/nfs/nfs_var.h +++ b/sys/nfs/nfs_var.h @@ -1,4 +1,4 @@ -/* $OpenBSD: nfs_var.h,v 1.8 1998/02/22 01:21:32 niklas Exp $ */ +/* $OpenBSD: nfs_var.h,v 1.9 1998/08/06 19:34:59 csapuntz Exp $ */ /* $NetBSD: nfs_var.h,v 1.3 1996/02/18 11:53:54 fvdl Exp $ */ /* @@ -81,7 +81,6 @@ u_long nfs_hash __P((nfsfh_t *, int)); int nfs_nget __P((struct mount *, nfsfh_t *, int, struct nfsnode **)); int nfs_inactive __P((void *)); int nfs_reclaim __P((void *)); -int nfs_abortop __P((void *)); /* nfs_vnops.c */ int nfs_null __P((struct vnode *, struct ucred *, struct proc *)); diff --git a/sys/nfs/nfs_vnops.c b/sys/nfs/nfs_vnops.c index aaa1285a392..98d0dc709f5 100644 --- a/sys/nfs/nfs_vnops.c +++ b/sys/nfs/nfs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: nfs_vnops.c,v 1.20 1998/05/11 05:42:01 deraadt Exp $ */ +/* $OpenBSD: nfs_vnops.c,v 1.21 1998/08/06 19:35:00 csapuntz Exp $ */ /* $NetBSD: nfs_vnops.c,v 1.62.4.1 1996/07/08 20:26:52 jtc Exp $ */ /* @@ -115,7 +115,7 @@ struct vnodeopv_entry_desc nfsv2_vnodeop_entries[] = { { &vop_symlink_desc, nfs_symlink }, /* symlink */ { &vop_readdir_desc, nfs_readdir }, /* readdir */ { &vop_readlink_desc, nfs_readlink }, /* readlink */ - { &vop_abortop_desc, nfs_abortop }, /* abortop */ + { &vop_abortop_desc, vop_generic_abortop }, /* abortop */ { &vop_inactive_desc, nfs_inactive }, /* inactive */ { &vop_reclaim_desc, nfs_reclaim }, /* reclaim */ { &vop_lock_desc, nfs_lock }, /* lock */ @@ -186,7 +186,7 @@ struct vnodeopv_entry_desc spec_nfsv2nodeop_entries[] = { { &vop_vfree_desc, spec_vfree }, /* vfree */ { &vop_truncate_desc, spec_truncate }, /* truncate */ { &vop_update_desc, nfs_update }, /* update */ - { &vop_bwrite_desc, vn_bwrite }, + { &vop_bwrite_desc, vop_generic_bwrite }, { (struct vnodeop_desc*)NULL, (int(*) __P((void *)))NULL } }; struct vnodeopv_desc spec_nfsv2nodeop_opv_desc = @@ -238,7 +238,7 @@ struct vnodeopv_entry_desc fifo_nfsv2nodeop_entries[] = { { &vop_vfree_desc, fifo_vfree }, /* vfree */ { &vop_truncate_desc, fifo_truncate }, /* truncate */ { &vop_update_desc, nfs_update }, /* update */ - { &vop_bwrite_desc, vn_bwrite }, + { &vop_bwrite_desc, vop_generic_bwrite }, { (struct vnodeop_desc*)NULL, (int(*) __P((void *)))NULL } }; struct vnodeopv_desc fifo_nfsv2nodeop_opv_desc = @@ -3077,7 +3077,7 @@ nfs_bwrite(v) } /* - * This is a clone of vn_bwrite(), except that B_WRITEINPROG isn't set unless + * This is a clone of vop_generic_bwrite(), except that B_WRITEINPROG isn't set unless * the force flag is one and it also handles the B_NEEDCOMMIT flag. */ int diff --git a/sys/nfs/nfsnode.h b/sys/nfs/nfsnode.h index 11d3c517838..d74feea493a 100644 --- a/sys/nfs/nfsnode.h +++ b/sys/nfs/nfsnode.h @@ -1,4 +1,4 @@ -/* $OpenBSD: nfsnode.h,v 1.6 1997/11/06 05:59:06 csapuntz Exp $ */ +/* $OpenBSD: nfsnode.h,v 1.7 1998/08/06 19:35:02 csapuntz Exp $ */ /* $NetBSD: nfsnode.h,v 1.16 1996/02/18 11:54:04 fvdl Exp $ */ /* @@ -176,7 +176,7 @@ int nfsfifo_read __P((void *)); int nfsfifo_write __P((void *)); #define nfs_ioctl ((int (*) __P((void *)))enoioctl) #define nfs_select ((int (*) __P((void *)))seltrue) -#define nfs_revoke vop_revoke +#define nfs_revoke vop_generic_revoke int nfs_mmap __P((void *)); int nfs_fsync __P((void *)); #define nfs_seek ((int (*) __P((void *)))nullop) @@ -188,12 +188,11 @@ int nfs_rmdir __P((void *)); int nfs_symlink __P((void *)); int nfs_readdir __P((void *)); int nfs_readlink __P((void *)); -int nfs_abortop __P((void *)); int nfs_inactive __P((void *)); int nfs_reclaim __P((void *)); -#define nfs_lock ((int (*) __P((void *)))vop_nolock) -#define nfs_unlock ((int (*) __P((void *)))vop_nounlock) -#define nfs_islocked ((int (*) __P((void *)))vop_noislocked) +#define nfs_lock ((int (*) __P((void *)))vop_generic_lock) +#define nfs_unlock ((int (*) __P((void *)))vop_generic_unlock) +#define nfs_islocked ((int (*) __P((void *)))vop_generic_islocked) int nfs_bmap __P((void *)); int nfs_strategy __P((void *)); int nfs_print __P((void *)); diff --git a/sys/sys/specdev.h b/sys/sys/specdev.h index cf8193edee2..2f6db5186f2 100644 --- a/sys/sys/specdev.h +++ b/sys/sys/specdev.h @@ -1,4 +1,4 @@ -/* $OpenBSD: specdev.h,v 1.6 1997/11/06 05:58:45 csapuntz Exp $ */ +/* $OpenBSD: specdev.h,v 1.7 1998/08/06 19:34:48 csapuntz Exp $ */ /* $NetBSD: specdev.h,v 1.12 1996/02/13 13:13:01 mycroft Exp $ */ /* @@ -110,9 +110,9 @@ int spec_fsync __P((void *)); #define spec_abortop spec_badop int spec_inactive __P((void *)); #define spec_reclaim nullop -#define spec_lock vop_nolock -#define spec_unlock vop_nounlock -#define spec_islocked vop_noislocked +#define spec_lock vop_generic_lock +#define spec_unlock vop_generic_unlock +#define spec_islocked vop_generic_islocked int spec_bmap __P((void *)); int spec_strategy __P((void *)); int spec_print __P((void *)); @@ -124,5 +124,5 @@ int spec_advlock __P((void *)); #define spec_vfree spec_badop #define spec_truncate nullop #define spec_update nullop -#define spec_bwrite vn_bwrite -#define spec_revoke vop_revoke +#define spec_bwrite vop_generic_bwrite +#define spec_revoke vop_generic_revoke diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 6ab48aa7579..0f5538337c0 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -1,4 +1,4 @@ -/* $OpenBSD: vnode.h,v 1.15 1998/07/28 00:13:10 millert Exp $ */ +/* $OpenBSD: vnode.h,v 1.16 1998/08/06 19:35:17 csapuntz Exp $ */ /* $NetBSD: vnode.h,v 1.38 1996/02/29 20:59:05 cgd Exp $ */ /* @@ -132,7 +132,7 @@ struct vnode { #define VBWAIT 0x0400 /* waiting for output to complete */ #define VALIASED 0x0800 /* vnode has an alias */ #define VDIROP 0x1000 /* LFS: vnode is involved in a directory op */ -#define VGONEHACK 0x2000 /* vgone: don't put me on the head of the free list */ +#define VONFREELIST 0x2000 /* Vnode is on a free list */ /* * Vnode attributes. A field value of VNOVAL represents a field whose value @@ -241,7 +241,7 @@ holdrele(vp) { simple_lock(&vp->v_interlock); vp->v_holdcnt--; - if (!(vp->v_flag & VGONEHACK) && + if ((vp->v_flag & VONFREELIST) && vp->v_holdcnt == 0 && vp->v_usecount == 0) { simple_lock(&vnode_free_list_slock); TAILQ_REMOVE(&vnode_hold_list, vp, v_freelist); @@ -257,7 +257,7 @@ vhold(vp) struct vnode *vp; { simple_lock(&vp->v_interlock); - if (!(vp->v_flag & VGONEHACK) && + if ((vp->v_flag & VONFREELIST) && vp->v_holdcnt == 0 && vp->v_usecount == 0) { simple_lock(&vnode_free_list_slock); TAILQ_REMOVE(&vnode_free_list, vp, v_freelist); @@ -457,7 +457,7 @@ void vgoneall __P((struct vnode *vp)); int vinvalbuf __P((struct vnode *vp, int save, struct ucred *cred, struct proc *p, int slpflag, int slptimeo)); void vprint __P((char *label, struct vnode *vp)); -int vn_bwrite __P((void *ap)); +int vop_generic_bwrite __P((void *ap)); void vn_update __P((void)); int vn_close __P((struct vnode *vp, int flags, struct ucred *cred, struct proc *p)); @@ -471,10 +471,12 @@ int vn_rdwr __P((enum uio_rw rw, struct vnode *vp, caddr_t base, int len, off_t offset, enum uio_seg segflg, int ioflg, struct ucred *cred, size_t *aresid, struct proc *p)); int vn_lock __P((struct vnode *vp, int flags, struct proc *p)); -int vop_noislocked __P((void *)); -int vop_nolock __P((void *)); -int vop_nounlock __P((void *)); -int vop_revoke __P((void *)); + +int vop_generic_abortop __P((void *)); +int vop_generic_islocked __P((void *)); +int vop_generic_lock __P((void *)); +int vop_generic_unlock __P((void *)); +int vop_generic_revoke __P((void *)); int vn_read __P((struct file *fp, struct uio *uio, struct ucred *cred)); int vn_select __P((struct file *fp, int which, struct proc *p)); diff --git a/sys/ufs/ext2fs/ext2fs_vnops.c b/sys/ufs/ext2fs/ext2fs_vnops.c index 7a8755fb7a9..52ec17a9887 100644 --- a/sys/ufs/ext2fs/ext2fs_vnops.c +++ b/sys/ufs/ext2fs/ext2fs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ext2fs_vnops.c,v 1.7 1998/07/28 00:13:15 millert Exp $ */ +/* $OpenBSD: ext2fs_vnops.c,v 1.8 1998/08/06 19:35:04 csapuntz Exp $ */ /* $NetBSD: ext2fs_vnops.c,v 1.1 1997/06/11 09:34:09 bouyer Exp $ */ /* @@ -1440,7 +1440,7 @@ struct vnodeopv_entry_desc ext2fs_vnodeop_entries[] = { { &vop_symlink_desc, ext2fs_symlink }, /* symlink */ { &vop_readdir_desc, ext2fs_readdir }, /* readdir */ { &vop_readlink_desc, ext2fs_readlink },/* readlink */ - { &vop_abortop_desc, ufs_abortop }, /* abortop */ + { &vop_abortop_desc, vop_generic_abortop }, /* abortop */ { &vop_inactive_desc, ext2fs_inactive },/* inactive */ { &vop_reclaim_desc, ext2fs_reclaim }, /* reclaim */ { &vop_lock_desc, ufs_lock }, /* lock */ @@ -1456,7 +1456,7 @@ struct vnodeopv_entry_desc ext2fs_vnodeop_entries[] = { { &vop_vfree_desc, ext2fs_vfree }, /* vfree */ { &vop_truncate_desc, ext2fs_truncate },/* truncate */ { &vop_update_desc, ext2fs_update }, /* update */ - { &vop_bwrite_desc, vn_bwrite }, /* bwrite */ + { &vop_bwrite_desc, vop_generic_bwrite }, /* bwrite */ { (struct vnodeop_desc*)NULL, (int(*) __P((void*)))NULL } }; struct vnodeopv_desc ext2fs_vnodeop_opv_desc = @@ -1505,7 +1505,7 @@ struct vnodeopv_entry_desc ext2fs_specop_entries[] = { { &vop_vfree_desc, ext2fs_vfree }, /* vfree */ { &vop_truncate_desc, spec_truncate }, /* truncate */ { &vop_update_desc, ext2fs_update }, /* update */ - { &vop_bwrite_desc, vn_bwrite }, /* bwrite */ + { &vop_bwrite_desc, vop_generic_bwrite }, /* bwrite */ { (struct vnodeop_desc*)NULL, (int(*) __P((void *)))NULL } }; struct vnodeopv_desc ext2fs_specop_opv_desc = @@ -1555,7 +1555,7 @@ struct vnodeopv_entry_desc ext2fs_fifoop_entries[] = { { &vop_vfree_desc, ext2fs_vfree }, /* vfree */ { &vop_truncate_desc, fifo_truncate }, /* truncate */ { &vop_update_desc, ext2fs_update }, /* update */ - { &vop_bwrite_desc, vn_bwrite }, /* bwrite */ + { &vop_bwrite_desc, vop_generic_bwrite }, /* bwrite */ { (struct vnodeop_desc*)NULL, (int(*) __P((void *)))NULL } }; struct vnodeopv_desc ext2fs_fifoop_opv_desc = diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c index aed41770ab6..6224aad25a0 100644 --- a/sys/ufs/ffs/ffs_vnops.c +++ b/sys/ufs/ffs/ffs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ffs_vnops.c,v 1.6 1997/11/06 05:59:20 csapuntz Exp $ */ +/* $OpenBSD: ffs_vnops.c,v 1.7 1998/08/06 19:35:07 csapuntz Exp $ */ /* $NetBSD: ffs_vnops.c,v 1.7 1996/05/11 18:27:24 mycroft Exp $ */ /* @@ -94,7 +94,7 @@ struct vnodeopv_entry_desc ffs_vnodeop_entries[] = { { &vop_symlink_desc, ufs_symlink }, /* symlink */ { &vop_readdir_desc, ufs_readdir }, /* readdir */ { &vop_readlink_desc, ufs_readlink }, /* readlink */ - { &vop_abortop_desc, ufs_abortop }, /* abortop */ + { &vop_abortop_desc, vop_generic_abortop }, /* abortop */ { &vop_inactive_desc, ufs_inactive }, /* inactive */ { &vop_reclaim_desc, ffs_reclaim }, /* reclaim */ { &vop_lock_desc, ufs_lock }, /* lock */ @@ -112,7 +112,7 @@ struct vnodeopv_entry_desc ffs_vnodeop_entries[] = { { &vop_vfree_desc, ffs_vfree }, /* vfree */ { &vop_truncate_desc, ffs_truncate }, /* truncate */ { &vop_update_desc, ffs_update }, /* update */ - { &vop_bwrite_desc, vn_bwrite }, + { &vop_bwrite_desc, vop_generic_bwrite }, { (struct vnodeop_desc*)NULL, (int(*) __P((void*)))NULL } }; struct vnodeopv_desc ffs_vnodeop_opv_desc = @@ -134,7 +134,7 @@ struct vnodeopv_entry_desc ffs_specop_entries[] = { { &vop_lease_desc, spec_lease_check }, /* lease */ { &vop_ioctl_desc, spec_ioctl }, /* ioctl */ { &vop_select_desc, spec_select }, /* select */ - { &vop_revoke_desc, spec_revoke }, /* revoke */ + { &vop_revoke_desc, spec_revoke }, /* revoke */ { &vop_mmap_desc, spec_mmap }, /* mmap */ { &vop_fsync_desc, ffs_fsync }, /* fsync */ { &vop_seek_desc, spec_seek }, /* seek */ @@ -163,7 +163,7 @@ struct vnodeopv_entry_desc ffs_specop_entries[] = { { &vop_vfree_desc, ffs_vfree }, /* vfree */ { &vop_truncate_desc, spec_truncate }, /* truncate */ { &vop_update_desc, ffs_update }, /* update */ - { &vop_bwrite_desc, vn_bwrite }, + { &vop_bwrite_desc, vop_generic_bwrite }, { (struct vnodeop_desc*)NULL, (int(*) __P((void *)))NULL } }; struct vnodeopv_desc ffs_specop_opv_desc = @@ -215,7 +215,7 @@ struct vnodeopv_entry_desc ffs_fifoop_entries[] = { { &vop_vfree_desc, ffs_vfree }, /* vfree */ { &vop_truncate_desc, fifo_truncate }, /* truncate */ { &vop_update_desc, ffs_update }, /* update */ - { &vop_bwrite_desc, vn_bwrite }, + { &vop_bwrite_desc, vop_generic_bwrite }, { (struct vnodeop_desc*)NULL, (int(*) __P((void *)))NULL } }; struct vnodeopv_desc ffs_fifoop_opv_desc = diff --git a/sys/ufs/mfs/mfs_extern.h b/sys/ufs/mfs/mfs_extern.h index a2c7840b1aa..6adbf5a77f8 100644 --- a/sys/ufs/mfs/mfs_extern.h +++ b/sys/ufs/mfs/mfs_extern.h @@ -1,4 +1,4 @@ -/* $OpenBSD: mfs_extern.h,v 1.6 1998/02/08 22:41:52 tholo Exp $ */ +/* $OpenBSD: mfs_extern.h,v 1.7 1998/08/06 19:35:09 csapuntz Exp $ */ /* $NetBSD: mfs_extern.h,v 1.4 1996/02/09 22:31:27 christos Exp $ */ /*- @@ -66,7 +66,7 @@ int mfs_close __P((void *)); int mfs_inactive __P((void *)); int mfs_reclaim __P((void *)); int mfs_print __P((void *)); -#define mfs_revoke vop_revoke +#define mfs_revoke vop_generic_revoke int mfs_badop __P((void *)); __END_DECLS diff --git a/sys/ufs/mfs/mfsnode.h b/sys/ufs/mfs/mfsnode.h index a0c77d26fae..cdae3c783a2 100644 --- a/sys/ufs/mfs/mfsnode.h +++ b/sys/ufs/mfs/mfsnode.h @@ -1,4 +1,4 @@ -/* $OpenBSD: mfsnode.h,v 1.6 1997/11/06 05:59:24 csapuntz Exp $ */ +/* $OpenBSD: mfsnode.h,v 1.7 1998/08/06 19:35:11 csapuntz Exp $ */ /* $NetBSD: mfsnode.h,v 1.3 1996/02/09 22:31:31 christos Exp $ */ /* @@ -76,9 +76,9 @@ struct mfsnode { #define mfs_readdir mfs_badop #define mfs_readlink mfs_badop #define mfs_abortop mfs_badop -#define mfs_lock vop_nolock -#define mfs_unlock vop_nounlock -#define mfs_islocked vop_noislocked +#define mfs_lock vop_generic_lock +#define mfs_unlock vop_generic_unlock +#define mfs_islocked vop_generic_islocked #define mfs_pathconf mfs_badop #define mfs_advlock mfs_badop #define mfs_blkatoff mfs_badop @@ -86,4 +86,4 @@ struct mfsnode { #define mfs_vfree mfs_badop #define mfs_truncate mfs_badop #define mfs_update nullop -#define mfs_bwrite vn_bwrite +#define mfs_bwrite vop_generic_bwrite diff --git a/sys/ufs/ufs/ufs_extern.h b/sys/ufs/ufs/ufs_extern.h index 0eeb1cfb608..ee97c01a7c8 100644 --- a/sys/ufs/ufs/ufs_extern.h +++ b/sys/ufs/ufs/ufs_extern.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ufs_extern.h,v 1.7 1998/01/09 20:38:03 csapuntz Exp $ */ +/* $OpenBSD: ufs_extern.h,v 1.8 1998/08/06 19:35:13 csapuntz Exp $ */ /* $NetBSD: ufs_extern.h,v 1.5 1996/02/09 22:36:03 christos Exp $ */ /*- @@ -58,7 +58,6 @@ struct vfsconf; struct vnode; __BEGIN_DECLS -int ufs_abortop __P((void *)); int ufs_access __P((void *)); int ufs_advlock __P((void *)); int ufs_bmap __P((void *)); @@ -87,7 +86,7 @@ int ufs_readdir __P((void *)); int ufs_readlink __P((void *)); int ufs_remove __P((void *)); int ufs_rename __P((void *)); -#define ufs_revoke vop_revoke +#define ufs_revoke vop_generic_revoke int ufs_rmdir __P((void *)); int ufs_seek __P((void *)); int ufs_select __P((void *)); diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c index b2a9db37120..2c755bbc5b8 100644 --- a/sys/ufs/ufs/ufs_vnops.c +++ b/sys/ufs/ufs/ufs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ufs_vnops.c,v 1.19 1998/07/28 00:13:18 millert Exp $ */ +/* $OpenBSD: ufs_vnops.c,v 1.20 1998/08/06 19:35:15 csapuntz Exp $ */ /* $NetBSD: ufs_vnops.c,v 1.18 1996/05/11 18:28:04 mycroft Exp $ */ /* @@ -1613,24 +1613,6 @@ ufs_readlink(v) } /* - * Ufs abort op, called after namei() when a CREATE/DELETE isn't actually - * done. If a buffer has been saved in anticipation of a CREATE, delete it. - */ -/* ARGSUSED */ -int -ufs_abortop(v) - void *v; -{ - struct vop_abortop_args /* { - struct vnode *a_dvp; - struct componentname *a_cnp; - } */ *ap = v; - if ((ap->a_cnp->cn_flags & (HASBUF | SAVESTART)) == HASBUF) - FREE(ap->a_cnp->cn_pnbuf, M_NAMEI); - return (0); -} - -/* * Lock an inode. If its already locked, set the WANT bit and sleep. */ int |