diff options
author | phk <phk@FreeBSD.org> | 2002-02-18 16:18:02 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2002-02-18 16:18:02 +0000 |
commit | 68389bd8ba20d29b81d779b5922db3b6423ef1fc (patch) | |
tree | 3b46d8c9f974baf92e1ec3c09c6301af1e7b4f35 /sys | |
parent | 22b5668b60a5150b12d80aa76bf37c0e39ace09f (diff) | |
download | FreeBSD-src-68389bd8ba20d29b81d779b5922db3b6423ef1fc.zip FreeBSD-src-68389bd8ba20d29b81d779b5922db3b6423ef1fc.tar.gz |
Make v_addpollinfo() visible and non-inline.
Have callers only call it as needed.
Add necessary call in ufs_kqfilter().
Test-case found by: Andrew Gallatin <gallatin@cs.duke.edu>
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/vfs_subr.c | 10 | ||||
-rw-r--r-- | sys/sys/vnode.h | 1 | ||||
-rw-r--r-- | sys/ufs/ufs/ufs_vnops.c | 7 |
3 files changed, 8 insertions, 10 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 7d64295..b49717c 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -254,11 +254,9 @@ static int vnlru_nowhere; SYSCTL_INT(_debug, OID_AUTO, vnlru_nowhere, CTLFLAG_RW, &vnlru_nowhere, 0, "Number of times the vnlru process ran without success"); -static __inline void +void v_addpollinfo(struct vnode *vp) { - if (vp->v_pollinfo != NULL) - return; vp->v_pollinfo = zalloc(vnodepoll_zone); mtx_init(&vp->v_pollinfo->vpi_lock, "vnode pollinfo", MTX_DEF); } @@ -2725,7 +2723,8 @@ vn_pollrecord(vp, td, events) short events; { - v_addpollinfo(vp); + if (vp->v_pollinfo == NULL) + v_addpollinfo(vp); mtx_lock(&vp->v_pollinfo->vpi_lock); if (vp->v_pollinfo->vpi_revents & events) { /* @@ -2759,7 +2758,8 @@ vn_pollevent(vp, events) short events; { - v_addpollinfo(vp); + if (vp->v_pollinfo == NULL) + v_addpollinfo(vp); mtx_lock(&vp->v_pollinfo->vpi_lock); if (vp->v_pollinfo->vpi_events & events) { /* diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index dcd13f3..49473d5 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -682,6 +682,7 @@ void vput __P((struct vnode *vp)); void vrele __P((struct vnode *vp)); void vref __P((struct vnode *vp)); void vbusy __P((struct vnode *vp)); +void v_addpollinfo(struct vnode *vp); extern vop_t **default_vnodeop_p; extern vop_t **spec_vnodeop_p; diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c index b1d862d..cc66243 100644 --- a/sys/ufs/ufs/ufs_vnops.c +++ b/sys/ufs/ufs/ufs_vnops.c @@ -2473,11 +2473,8 @@ ufs_kqfilter(ap) kn->kn_hook = (caddr_t)vp; - if (vp->v_pollinfo == NULL) { - /* XXX: call v_addpollinfo(vp) ? */ - printf("ufs_kqfilter: vnode with no v_pollinfo\n"); - return (1); - } + if (vp->v_pollinfo == NULL) + v_addpollinfo(vp); mtx_lock(&vp->v_pollinfo->vpi_lock); SLIST_INSERT_HEAD(&vp->v_pollinfo->vpi_selinfo.si_note, kn, kn_selnext); mtx_unlock(&vp->v_pollinfo->vpi_lock); |