summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2002-02-18 16:18:02 +0000
committerphk <phk@FreeBSD.org>2002-02-18 16:18:02 +0000
commit68389bd8ba20d29b81d779b5922db3b6423ef1fc (patch)
tree3b46d8c9f974baf92e1ec3c09c6301af1e7b4f35 /sys
parent22b5668b60a5150b12d80aa76bf37c0e39ace09f (diff)
downloadFreeBSD-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.c10
-rw-r--r--sys/sys/vnode.h1
-rw-r--r--sys/ufs/ufs/ufs_vnops.c7
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);
OpenPOWER on IntegriCloud